@avalabs/fusion-sdk 0.1.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 (398) hide show
  1. package/LICENSE +9 -0
  2. package/README.md +264 -0
  3. package/dist/_utils/chain.cjs +2 -0
  4. package/dist/_utils/chain.cjs.map +1 -0
  5. package/dist/_utils/chain.js +2 -0
  6. package/dist/_utils/chain.js.map +1 -0
  7. package/dist/_utils/math.cjs +2 -0
  8. package/dist/_utils/math.cjs.map +1 -0
  9. package/dist/_utils/math.js +2 -0
  10. package/dist/_utils/math.js.map +1 -0
  11. package/dist/_utils/merge-assets.cjs +2 -0
  12. package/dist/_utils/merge-assets.cjs.map +1 -0
  13. package/dist/_utils/merge-assets.js +2 -0
  14. package/dist/_utils/merge-assets.js.map +1 -0
  15. package/dist/_virtual/_rolldown/runtime.cjs +1 -0
  16. package/dist/constants.cjs +2 -0
  17. package/dist/constants.cjs.map +1 -0
  18. package/dist/constants.d.cts +102 -0
  19. package/dist/constants.d.ts +102 -0
  20. package/dist/constants.js +2 -0
  21. package/dist/constants.js.map +1 -0
  22. package/dist/errors.cjs +2 -0
  23. package/dist/errors.cjs.map +1 -0
  24. package/dist/errors.d.cts +115 -0
  25. package/dist/errors.d.ts +115 -0
  26. package/dist/errors.js +2 -0
  27. package/dist/errors.js.map +1 -0
  28. package/dist/mod.cjs +1 -0
  29. package/dist/mod.d.cts +19 -0
  30. package/dist/mod.d.ts +19 -0
  31. package/dist/mod.js +1 -0
  32. package/dist/quoter/_utils.cjs +2 -0
  33. package/dist/quoter/_utils.cjs.map +1 -0
  34. package/dist/quoter/_utils.js +2 -0
  35. package/dist/quoter/_utils.js.map +1 -0
  36. package/dist/quoter/constants.cjs +2 -0
  37. package/dist/quoter/constants.cjs.map +1 -0
  38. package/dist/quoter/constants.js +2 -0
  39. package/dist/quoter/constants.js.map +1 -0
  40. package/dist/quoter/quoter.cjs +2 -0
  41. package/dist/quoter/quoter.cjs.map +1 -0
  42. package/dist/quoter/quoter.d.cts +31 -0
  43. package/dist/quoter/quoter.d.ts +34 -0
  44. package/dist/quoter/quoter.js +2 -0
  45. package/dist/quoter/quoter.js.map +1 -0
  46. package/dist/transfer-manager.cjs +2 -0
  47. package/dist/transfer-manager.cjs.map +1 -0
  48. package/dist/transfer-manager.d.cts +17 -0
  49. package/dist/transfer-manager.d.ts +17 -0
  50. package/dist/transfer-manager.js +2 -0
  51. package/dist/transfer-manager.js.map +1 -0
  52. package/dist/transfer-service/_abis.cjs +2 -0
  53. package/dist/transfer-service/_abis.cjs.map +1 -0
  54. package/dist/transfer-service/_abis.js +2 -0
  55. package/dist/transfer-service/_abis.js.map +1 -0
  56. package/dist/transfer-service/_evm-gas.cjs +2 -0
  57. package/dist/transfer-service/_evm-gas.cjs.map +1 -0
  58. package/dist/transfer-service/_evm-gas.js +2 -0
  59. package/dist/transfer-service/_evm-gas.js.map +1 -0
  60. package/dist/transfer-service/_tracking-utilities.cjs +2 -0
  61. package/dist/transfer-service/_tracking-utilities.cjs.map +1 -0
  62. package/dist/transfer-service/_tracking-utilities.js +2 -0
  63. package/dist/transfer-service/_tracking-utilities.js.map +1 -0
  64. package/dist/transfer-service/_transfer-utilities.cjs +2 -0
  65. package/dist/transfer-service/_transfer-utilities.cjs.map +1 -0
  66. package/dist/transfer-service/_transfer-utilities.js +2 -0
  67. package/dist/transfer-service/_transfer-utilities.js.map +1 -0
  68. package/dist/transfer-service/_utils.cjs +2 -0
  69. package/dist/transfer-service/_utils.cjs.map +1 -0
  70. package/dist/transfer-service/_utils.js +2 -0
  71. package/dist/transfer-service/_utils.js.map +1 -0
  72. package/dist/transfer-service/_warden-config-schema.cjs +2 -0
  73. package/dist/transfer-service/_warden-config-schema.cjs.map +1 -0
  74. package/dist/transfer-service/_warden-config-schema.js +2 -0
  75. package/dist/transfer-service/_warden-config-schema.js.map +1 -0
  76. package/dist/transfer-service/_warden-config.cjs +2 -0
  77. package/dist/transfer-service/_warden-config.cjs.map +1 -0
  78. package/dist/transfer-service/_warden-config.js +2 -0
  79. package/dist/transfer-service/_warden-config.js.map +1 -0
  80. package/dist/transfer-service/avalanche-evm/_constants.cjs +2 -0
  81. package/dist/transfer-service/avalanche-evm/_constants.cjs.map +1 -0
  82. package/dist/transfer-service/avalanche-evm/_constants.js +2 -0
  83. package/dist/transfer-service/avalanche-evm/_constants.js.map +1 -0
  84. package/dist/transfer-service/avalanche-evm/_handlers/analyze-support.cjs +2 -0
  85. package/dist/transfer-service/avalanche-evm/_handlers/analyze-support.cjs.map +1 -0
  86. package/dist/transfer-service/avalanche-evm/_handlers/analyze-support.js +2 -0
  87. package/dist/transfer-service/avalanche-evm/_handlers/analyze-support.js.map +1 -0
  88. package/dist/transfer-service/avalanche-evm/_handlers/estimate-native-fee.cjs +2 -0
  89. package/dist/transfer-service/avalanche-evm/_handlers/estimate-native-fee.cjs.map +1 -0
  90. package/dist/transfer-service/avalanche-evm/_handlers/estimate-native-fee.js +2 -0
  91. package/dist/transfer-service/avalanche-evm/_handlers/estimate-native-fee.js.map +1 -0
  92. package/dist/transfer-service/avalanche-evm/_handlers/get-assets.cjs +2 -0
  93. package/dist/transfer-service/avalanche-evm/_handlers/get-assets.cjs.map +1 -0
  94. package/dist/transfer-service/avalanche-evm/_handlers/get-assets.js +2 -0
  95. package/dist/transfer-service/avalanche-evm/_handlers/get-assets.js.map +1 -0
  96. package/dist/transfer-service/avalanche-evm/_handlers/get-minimum-transfer-amount.cjs +2 -0
  97. package/dist/transfer-service/avalanche-evm/_handlers/get-minimum-transfer-amount.cjs.map +1 -0
  98. package/dist/transfer-service/avalanche-evm/_handlers/get-minimum-transfer-amount.js +2 -0
  99. package/dist/transfer-service/avalanche-evm/_handlers/get-minimum-transfer-amount.js.map +1 -0
  100. package/dist/transfer-service/avalanche-evm/_handlers/get-supported-chains.cjs +2 -0
  101. package/dist/transfer-service/avalanche-evm/_handlers/get-supported-chains.cjs.map +1 -0
  102. package/dist/transfer-service/avalanche-evm/_handlers/get-supported-chains.js +2 -0
  103. package/dist/transfer-service/avalanche-evm/_handlers/get-supported-chains.js.map +1 -0
  104. package/dist/transfer-service/avalanche-evm/_handlers/stream-quotes.cjs +2 -0
  105. package/dist/transfer-service/avalanche-evm/_handlers/stream-quotes.cjs.map +1 -0
  106. package/dist/transfer-service/avalanche-evm/_handlers/stream-quotes.js +2 -0
  107. package/dist/transfer-service/avalanche-evm/_handlers/stream-quotes.js.map +1 -0
  108. package/dist/transfer-service/avalanche-evm/_handlers/track-transfer.cjs +2 -0
  109. package/dist/transfer-service/avalanche-evm/_handlers/track-transfer.cjs.map +1 -0
  110. package/dist/transfer-service/avalanche-evm/_handlers/track-transfer.js +2 -0
  111. package/dist/transfer-service/avalanche-evm/_handlers/track-transfer.js.map +1 -0
  112. package/dist/transfer-service/avalanche-evm/_handlers/transfer-asset.cjs +2 -0
  113. package/dist/transfer-service/avalanche-evm/_handlers/transfer-asset.cjs.map +1 -0
  114. package/dist/transfer-service/avalanche-evm/_handlers/transfer-asset.js +2 -0
  115. package/dist/transfer-service/avalanche-evm/_handlers/transfer-asset.js.map +1 -0
  116. package/dist/transfer-service/avalanche-evm/_utils/fee.cjs +2 -0
  117. package/dist/transfer-service/avalanche-evm/_utils/fee.cjs.map +1 -0
  118. package/dist/transfer-service/avalanche-evm/_utils/fee.js +2 -0
  119. package/dist/transfer-service/avalanche-evm/_utils/fee.js.map +1 -0
  120. package/dist/transfer-service/avalanche-evm/_utils/get-config.cjs +2 -0
  121. package/dist/transfer-service/avalanche-evm/_utils/get-config.cjs.map +1 -0
  122. package/dist/transfer-service/avalanche-evm/_utils/get-config.js +2 -0
  123. package/dist/transfer-service/avalanche-evm/_utils/get-config.js.map +1 -0
  124. package/dist/transfer-service/avalanche-evm/_utils/transfer-data.cjs +2 -0
  125. package/dist/transfer-service/avalanche-evm/_utils/transfer-data.cjs.map +1 -0
  126. package/dist/transfer-service/avalanche-evm/_utils/transfer-data.js +2 -0
  127. package/dist/transfer-service/avalanche-evm/_utils/transfer-data.js.map +1 -0
  128. package/dist/transfer-service/avalanche-evm/_utils/unwrap.cjs +2 -0
  129. package/dist/transfer-service/avalanche-evm/_utils/unwrap.cjs.map +1 -0
  130. package/dist/transfer-service/avalanche-evm/_utils/unwrap.js +2 -0
  131. package/dist/transfer-service/avalanche-evm/_utils/unwrap.js.map +1 -0
  132. package/dist/transfer-service/avalanche-evm/_utils/validations.cjs +2 -0
  133. package/dist/transfer-service/avalanche-evm/_utils/validations.cjs.map +1 -0
  134. package/dist/transfer-service/avalanche-evm/_utils/validations.js +2 -0
  135. package/dist/transfer-service/avalanche-evm/_utils/validations.js.map +1 -0
  136. package/dist/transfer-service/avalanche-evm/_utils/wrap.cjs +2 -0
  137. package/dist/transfer-service/avalanche-evm/_utils/wrap.cjs.map +1 -0
  138. package/dist/transfer-service/avalanche-evm/_utils/wrap.js +2 -0
  139. package/dist/transfer-service/avalanche-evm/_utils/wrap.js.map +1 -0
  140. package/dist/transfer-service/avalanche-evm/avalanche-evm-service.cjs +2 -0
  141. package/dist/transfer-service/avalanche-evm/avalanche-evm-service.cjs.map +1 -0
  142. package/dist/transfer-service/avalanche-evm/avalanche-evm-service.js +2 -0
  143. package/dist/transfer-service/avalanche-evm/avalanche-evm-service.js.map +1 -0
  144. package/dist/transfer-service/fetch-utilities.cjs +4 -0
  145. package/dist/transfer-service/fetch-utilities.cjs.map +1 -0
  146. package/dist/transfer-service/fetch-utilities.js +4 -0
  147. package/dist/transfer-service/fetch-utilities.js.map +1 -0
  148. package/dist/transfer-service/lombard/_schema.cjs +2 -0
  149. package/dist/transfer-service/lombard/_schema.cjs.map +1 -0
  150. package/dist/transfer-service/lombard/_schema.js +2 -0
  151. package/dist/transfer-service/lombard/_schema.js.map +1 -0
  152. package/dist/transfer-service/lombard/_utils/asset.cjs +2 -0
  153. package/dist/transfer-service/lombard/_utils/asset.cjs.map +1 -0
  154. package/dist/transfer-service/lombard/_utils/asset.js +2 -0
  155. package/dist/transfer-service/lombard/_utils/asset.js.map +1 -0
  156. package/dist/transfer-service/lombard/_utils/chain.cjs +2 -0
  157. package/dist/transfer-service/lombard/_utils/chain.cjs.map +1 -0
  158. package/dist/transfer-service/lombard/_utils/chain.js +2 -0
  159. package/dist/transfer-service/lombard/_utils/chain.js.map +1 -0
  160. package/dist/transfer-service/lombard/_utils/fee.cjs +2 -0
  161. package/dist/transfer-service/lombard/_utils/fee.cjs.map +1 -0
  162. package/dist/transfer-service/lombard/_utils/fee.js +2 -0
  163. package/dist/transfer-service/lombard/_utils/fee.js.map +1 -0
  164. package/dist/transfer-service/lombard/_utils/metadata.cjs +2 -0
  165. package/dist/transfer-service/lombard/_utils/metadata.cjs.map +1 -0
  166. package/dist/transfer-service/lombard/_utils/metadata.js +2 -0
  167. package/dist/transfer-service/lombard/_utils/metadata.js.map +1 -0
  168. package/dist/transfer-service/lombard/_utils/utxo.cjs +2 -0
  169. package/dist/transfer-service/lombard/_utils/utxo.cjs.map +1 -0
  170. package/dist/transfer-service/lombard/_utils/utxo.js +2 -0
  171. package/dist/transfer-service/lombard/_utils/utxo.js.map +1 -0
  172. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/analyze-support.cjs +2 -0
  173. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/analyze-support.cjs.map +1 -0
  174. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/analyze-support.js +2 -0
  175. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/analyze-support.js.map +1 -0
  176. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/estimate-native-fee.cjs +2 -0
  177. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/estimate-native-fee.cjs.map +1 -0
  178. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/estimate-native-fee.js +2 -0
  179. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/estimate-native-fee.js.map +1 -0
  180. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/get-assets.cjs +2 -0
  181. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/get-assets.cjs.map +1 -0
  182. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/get-assets.js +2 -0
  183. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/get-assets.js.map +1 -0
  184. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/get-minimum-transfer-amount.cjs +2 -0
  185. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/get-minimum-transfer-amount.cjs.map +1 -0
  186. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/get-minimum-transfer-amount.js +2 -0
  187. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/get-minimum-transfer-amount.js.map +1 -0
  188. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/stream-quotes.cjs +2 -0
  189. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/stream-quotes.cjs.map +1 -0
  190. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/stream-quotes.js +2 -0
  191. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/stream-quotes.js.map +1 -0
  192. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/track-transfer.cjs +2 -0
  193. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/track-transfer.cjs.map +1 -0
  194. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/track-transfer.js +2 -0
  195. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/track-transfer.js.map +1 -0
  196. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/transfer-asset.cjs +2 -0
  197. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/transfer-asset.cjs.map +1 -0
  198. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/transfer-asset.js +2 -0
  199. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/transfer-asset.js.map +1 -0
  200. package/dist/transfer-service/lombard/btc-to-btcb-service.cjs +2 -0
  201. package/dist/transfer-service/lombard/btc-to-btcb-service.cjs.map +1 -0
  202. package/dist/transfer-service/lombard/btc-to-btcb-service.js +2 -0
  203. package/dist/transfer-service/lombard/btc-to-btcb-service.js.map +1 -0
  204. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/analyze-support.cjs +2 -0
  205. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/analyze-support.cjs.map +1 -0
  206. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/analyze-support.js +2 -0
  207. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/analyze-support.js.map +1 -0
  208. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/estimate-native-fee.cjs +2 -0
  209. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/estimate-native-fee.cjs.map +1 -0
  210. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/estimate-native-fee.js +2 -0
  211. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/estimate-native-fee.js.map +1 -0
  212. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/get-assets.cjs +2 -0
  213. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/get-assets.cjs.map +1 -0
  214. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/get-assets.js +2 -0
  215. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/get-assets.js.map +1 -0
  216. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/stream-quotes.cjs +2 -0
  217. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/stream-quotes.cjs.map +1 -0
  218. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/stream-quotes.js +2 -0
  219. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/stream-quotes.js.map +1 -0
  220. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/track-transfer.cjs +2 -0
  221. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/track-transfer.cjs.map +1 -0
  222. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/track-transfer.js +2 -0
  223. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/track-transfer.js.map +1 -0
  224. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/transfer-asset.cjs +2 -0
  225. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/transfer-asset.cjs.map +1 -0
  226. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/transfer-asset.js +2 -0
  227. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/transfer-asset.js.map +1 -0
  228. package/dist/transfer-service/lombard/btcb-to-btc-service.cjs +2 -0
  229. package/dist/transfer-service/lombard/btcb-to-btc-service.cjs.map +1 -0
  230. package/dist/transfer-service/lombard/btcb-to-btc-service.js +2 -0
  231. package/dist/transfer-service/lombard/btcb-to-btc-service.js.map +1 -0
  232. package/dist/transfer-service/lombard/constants.cjs +2 -0
  233. package/dist/transfer-service/lombard/constants.cjs.map +1 -0
  234. package/dist/transfer-service/lombard/constants.js +2 -0
  235. package/dist/transfer-service/lombard/constants.js.map +1 -0
  236. package/dist/transfer-service/markr/_abis/cross-chain-swap-wrapper-abi.cjs +2 -0
  237. package/dist/transfer-service/markr/_abis/cross-chain-swap-wrapper-abi.cjs.map +1 -0
  238. package/dist/transfer-service/markr/_abis/cross-chain-swap-wrapper-abi.js +2 -0
  239. package/dist/transfer-service/markr/_abis/cross-chain-swap-wrapper-abi.js.map +1 -0
  240. package/dist/transfer-service/markr/_abis/swap-wrapper-abi.cjs +2 -0
  241. package/dist/transfer-service/markr/_abis/swap-wrapper-abi.cjs.map +1 -0
  242. package/dist/transfer-service/markr/_abis/swap-wrapper-abi.js +2 -0
  243. package/dist/transfer-service/markr/_abis/swap-wrapper-abi.js.map +1 -0
  244. package/dist/transfer-service/markr/_api.cjs +2 -0
  245. package/dist/transfer-service/markr/_api.cjs.map +1 -0
  246. package/dist/transfer-service/markr/_api.js +2 -0
  247. package/dist/transfer-service/markr/_api.js.map +1 -0
  248. package/dist/transfer-service/markr/_handlers/analyze-support.cjs +2 -0
  249. package/dist/transfer-service/markr/_handlers/analyze-support.cjs.map +1 -0
  250. package/dist/transfer-service/markr/_handlers/analyze-support.js +2 -0
  251. package/dist/transfer-service/markr/_handlers/analyze-support.js.map +1 -0
  252. package/dist/transfer-service/markr/_handlers/estimate-native-fee.cjs +2 -0
  253. package/dist/transfer-service/markr/_handlers/estimate-native-fee.cjs.map +1 -0
  254. package/dist/transfer-service/markr/_handlers/estimate-native-fee.js +2 -0
  255. package/dist/transfer-service/markr/_handlers/estimate-native-fee.js.map +1 -0
  256. package/dist/transfer-service/markr/_handlers/get-assets.cjs +2 -0
  257. package/dist/transfer-service/markr/_handlers/get-assets.cjs.map +1 -0
  258. package/dist/transfer-service/markr/_handlers/get-assets.js +2 -0
  259. package/dist/transfer-service/markr/_handlers/get-assets.js.map +1 -0
  260. package/dist/transfer-service/markr/_handlers/get-minimum-transfer-amount.cjs +2 -0
  261. package/dist/transfer-service/markr/_handlers/get-minimum-transfer-amount.cjs.map +1 -0
  262. package/dist/transfer-service/markr/_handlers/get-minimum-transfer-amount.js +2 -0
  263. package/dist/transfer-service/markr/_handlers/get-minimum-transfer-amount.js.map +1 -0
  264. package/dist/transfer-service/markr/_handlers/stream-quotes.cjs +2 -0
  265. package/dist/transfer-service/markr/_handlers/stream-quotes.cjs.map +1 -0
  266. package/dist/transfer-service/markr/_handlers/stream-quotes.js +2 -0
  267. package/dist/transfer-service/markr/_handlers/stream-quotes.js.map +1 -0
  268. package/dist/transfer-service/markr/_handlers/track-transfer.cjs +2 -0
  269. package/dist/transfer-service/markr/_handlers/track-transfer.cjs.map +1 -0
  270. package/dist/transfer-service/markr/_handlers/track-transfer.js +2 -0
  271. package/dist/transfer-service/markr/_handlers/track-transfer.js.map +1 -0
  272. package/dist/transfer-service/markr/_handlers/transfer-asset.cjs +2 -0
  273. package/dist/transfer-service/markr/_handlers/transfer-asset.cjs.map +1 -0
  274. package/dist/transfer-service/markr/_handlers/transfer-asset.js +2 -0
  275. package/dist/transfer-service/markr/_handlers/transfer-asset.js.map +1 -0
  276. package/dist/transfer-service/markr/_schema.cjs +2 -0
  277. package/dist/transfer-service/markr/_schema.cjs.map +1 -0
  278. package/dist/transfer-service/markr/_schema.js +2 -0
  279. package/dist/transfer-service/markr/_schema.js.map +1 -0
  280. package/dist/transfer-service/markr/_type-guards.cjs +2 -0
  281. package/dist/transfer-service/markr/_type-guards.cjs.map +1 -0
  282. package/dist/transfer-service/markr/_type-guards.js +2 -0
  283. package/dist/transfer-service/markr/_type-guards.js.map +1 -0
  284. package/dist/transfer-service/markr/_utils.cjs +2 -0
  285. package/dist/transfer-service/markr/_utils.cjs.map +1 -0
  286. package/dist/transfer-service/markr/_utils.js +2 -0
  287. package/dist/transfer-service/markr/_utils.js.map +1 -0
  288. package/dist/transfer-service/markr/constants.cjs +2 -0
  289. package/dist/transfer-service/markr/constants.cjs.map +1 -0
  290. package/dist/transfer-service/markr/constants.js +2 -0
  291. package/dist/transfer-service/markr/constants.js.map +1 -0
  292. package/dist/transfer-service/markr/markr-service.cjs +2 -0
  293. package/dist/transfer-service/markr/markr-service.cjs.map +1 -0
  294. package/dist/transfer-service/markr/markr-service.js +2 -0
  295. package/dist/transfer-service/markr/markr-service.js.map +1 -0
  296. package/dist/transfer-service/service-schemas.cjs +2 -0
  297. package/dist/transfer-service/service-schemas.cjs.map +1 -0
  298. package/dist/transfer-service/service-schemas.js +2 -0
  299. package/dist/transfer-service/service-schemas.js.map +1 -0
  300. package/dist/transfer-service/wrap-unwrap/_handlers/analyze-support.cjs +2 -0
  301. package/dist/transfer-service/wrap-unwrap/_handlers/analyze-support.cjs.map +1 -0
  302. package/dist/transfer-service/wrap-unwrap/_handlers/analyze-support.js +2 -0
  303. package/dist/transfer-service/wrap-unwrap/_handlers/analyze-support.js.map +1 -0
  304. package/dist/transfer-service/wrap-unwrap/_handlers/estimate-native-fee.cjs +2 -0
  305. package/dist/transfer-service/wrap-unwrap/_handlers/estimate-native-fee.cjs.map +1 -0
  306. package/dist/transfer-service/wrap-unwrap/_handlers/estimate-native-fee.js +2 -0
  307. package/dist/transfer-service/wrap-unwrap/_handlers/estimate-native-fee.js.map +1 -0
  308. package/dist/transfer-service/wrap-unwrap/_handlers/get-assets.cjs +2 -0
  309. package/dist/transfer-service/wrap-unwrap/_handlers/get-assets.cjs.map +1 -0
  310. package/dist/transfer-service/wrap-unwrap/_handlers/get-assets.js +2 -0
  311. package/dist/transfer-service/wrap-unwrap/_handlers/get-assets.js.map +1 -0
  312. package/dist/transfer-service/wrap-unwrap/_handlers/get-minimum-transfer-amount.cjs +2 -0
  313. package/dist/transfer-service/wrap-unwrap/_handlers/get-minimum-transfer-amount.cjs.map +1 -0
  314. package/dist/transfer-service/wrap-unwrap/_handlers/get-minimum-transfer-amount.js +2 -0
  315. package/dist/transfer-service/wrap-unwrap/_handlers/get-minimum-transfer-amount.js.map +1 -0
  316. package/dist/transfer-service/wrap-unwrap/_handlers/stream-quotes.cjs +2 -0
  317. package/dist/transfer-service/wrap-unwrap/_handlers/stream-quotes.cjs.map +1 -0
  318. package/dist/transfer-service/wrap-unwrap/_handlers/stream-quotes.js +2 -0
  319. package/dist/transfer-service/wrap-unwrap/_handlers/stream-quotes.js.map +1 -0
  320. package/dist/transfer-service/wrap-unwrap/_handlers/track-transfer.cjs +2 -0
  321. package/dist/transfer-service/wrap-unwrap/_handlers/track-transfer.cjs.map +1 -0
  322. package/dist/transfer-service/wrap-unwrap/_handlers/track-transfer.js +2 -0
  323. package/dist/transfer-service/wrap-unwrap/_handlers/track-transfer.js.map +1 -0
  324. package/dist/transfer-service/wrap-unwrap/_handlers/transfer-asset.cjs +2 -0
  325. package/dist/transfer-service/wrap-unwrap/_handlers/transfer-asset.cjs.map +1 -0
  326. package/dist/transfer-service/wrap-unwrap/_handlers/transfer-asset.js +2 -0
  327. package/dist/transfer-service/wrap-unwrap/_handlers/transfer-asset.js.map +1 -0
  328. package/dist/transfer-service/wrap-unwrap/_utils.cjs +2 -0
  329. package/dist/transfer-service/wrap-unwrap/_utils.cjs.map +1 -0
  330. package/dist/transfer-service/wrap-unwrap/_utils.js +2 -0
  331. package/dist/transfer-service/wrap-unwrap/_utils.js.map +1 -0
  332. package/dist/transfer-service/wrap-unwrap/constants.cjs +2 -0
  333. package/dist/transfer-service/wrap-unwrap/constants.cjs.map +1 -0
  334. package/dist/transfer-service/wrap-unwrap/constants.js +2 -0
  335. package/dist/transfer-service/wrap-unwrap/constants.js.map +1 -0
  336. package/dist/transfer-service/wrap-unwrap/wrap-unwrap-service.cjs +2 -0
  337. package/dist/transfer-service/wrap-unwrap/wrap-unwrap-service.cjs.map +1 -0
  338. package/dist/transfer-service/wrap-unwrap/wrap-unwrap-service.js +2 -0
  339. package/dist/transfer-service/wrap-unwrap/wrap-unwrap-service.js.map +1 -0
  340. package/dist/type-guards.cjs +2 -0
  341. package/dist/type-guards.cjs.map +1 -0
  342. package/dist/type-guards.d.cts +16 -0
  343. package/dist/type-guards.d.ts +16 -0
  344. package/dist/type-guards.js +2 -0
  345. package/dist/type-guards.js.map +1 -0
  346. package/dist/types/asset.d.cts +61 -0
  347. package/dist/types/asset.d.ts +61 -0
  348. package/dist/types/bitcoin.d.cts +66 -0
  349. package/dist/types/bitcoin.d.ts +66 -0
  350. package/dist/types/caip.d.cts +30 -0
  351. package/dist/types/caip.d.ts +30 -0
  352. package/dist/types/chain.d.cts +17 -0
  353. package/dist/types/chain.d.ts +17 -0
  354. package/dist/types/fee.d.cts +13 -0
  355. package/dist/types/fee.d.ts +13 -0
  356. package/dist/types/quote.d.cts +140 -0
  357. package/dist/types/quote.d.ts +140 -0
  358. package/dist/types/service.d.cts +224 -0
  359. package/dist/types/service.d.ts +224 -0
  360. package/dist/types/signer.d.cts +50 -0
  361. package/dist/types/signer.d.ts +50 -0
  362. package/dist/types/transfer-manager.d.cts +115 -0
  363. package/dist/types/transfer-manager.d.ts +115 -0
  364. package/dist/types/transfer.d.cts +107 -0
  365. package/dist/types/transfer.d.ts +107 -0
  366. package/dist/types/utility-types.d.cts +21 -0
  367. package/dist/types/utility-types.d.ts +21 -0
  368. package/dist/utils/bitcoin-address.cjs +2 -0
  369. package/dist/utils/bitcoin-address.cjs.map +1 -0
  370. package/dist/utils/bitcoin-address.js +2 -0
  371. package/dist/utils/bitcoin-address.js.map +1 -0
  372. package/dist/utils/caip.cjs +2 -0
  373. package/dist/utils/caip.cjs.map +1 -0
  374. package/dist/utils/caip.d.cts +49 -0
  375. package/dist/utils/caip.d.ts +49 -0
  376. package/dist/utils/caip.js +2 -0
  377. package/dist/utils/caip.js.map +1 -0
  378. package/dist/utils/evm-address.cjs +2 -0
  379. package/dist/utils/evm-address.cjs.map +1 -0
  380. package/dist/utils/evm-address.js +2 -0
  381. package/dist/utils/evm-address.js.map +1 -0
  382. package/dist/utils/quote-fees.cjs +2 -0
  383. package/dist/utils/quote-fees.cjs.map +1 -0
  384. package/dist/utils/quote-fees.js +2 -0
  385. package/dist/utils/quote-fees.js.map +1 -0
  386. package/dist/utils/sol-address.cjs +2 -0
  387. package/dist/utils/sol-address.cjs.map +1 -0
  388. package/dist/utils/sol-address.js +2 -0
  389. package/dist/utils/sol-address.js.map +1 -0
  390. package/dist/utils/solana-transaction.d.cts +15 -0
  391. package/dist/utils/solana-transaction.d.ts +17 -0
  392. package/dist/utils/transfer-utils.cjs +2 -0
  393. package/dist/utils/transfer-utils.cjs.map +1 -0
  394. package/dist/utils/transfer-utils.d.cts +8 -0
  395. package/dist/utils/transfer-utils.d.ts +8 -0
  396. package/dist/utils/transfer-utils.js +2 -0
  397. package/dist/utils/transfer-utils.js.map +1 -0
  398. package/package.json +63 -0
@@ -0,0 +1,2 @@
1
+ function e(e,t){return{amountIn:e.amountIn,amountOut:e.amountOut,environment:t,fees:e.fees,fromAddress:e.fromAddress,id:e.id,partnerFeeBps:e.partnerFeeBps,sourceAsset:e.assetIn,sourceChain:e.sourceChain,targetAsset:e.assetOut,targetChain:e.targetChain,toAddress:e.toAddress,type:e.serviceType}}function t(t,n){return{...e(t,n.environment),status:`source-pending`,source:{confirmationCount:0,requiredConfirmationCount:n.requiredConfirmationCount,startedAtMs:n.startedAtMs,txHash:n.txHash}}}export{t as sourcePendingTransferFromQuote};
2
+ //# sourceMappingURL=_transfer-utilities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_transfer-utilities.js","names":[],"sources":["../../src/transfer-service/_transfer-utilities.ts"],"sourcesContent":["/**\n * @module\n * @internal\n *\n * Shared helpers for constructing Transfer objects from Quotes.\n */\nimport type { ErrorCode } from '../errors';\nimport type { Quote } from '../types/quote';\nimport type { FailedTransfer, SourcePendingTransfer, TransferBase } from '../types/transfer';\nimport type { Environment } from '../constants';\n\n/** Extract the common TransferBase fields from a Quote. */\nfunction transferBaseFromQuote(quote: Quote, environment: Environment): Omit<TransferBase, 'status'> {\n return {\n amountIn: quote.amountIn,\n amountOut: quote.amountOut,\n environment,\n fees: quote.fees,\n fromAddress: quote.fromAddress,\n id: quote.id,\n partnerFeeBps: quote.partnerFeeBps,\n sourceAsset: quote.assetIn,\n sourceChain: quote.sourceChain,\n targetAsset: quote.assetOut,\n targetChain: quote.targetChain,\n toAddress: quote.toAddress,\n type: quote.serviceType,\n };\n}\n\nexport function sourcePendingTransferFromQuote(\n quote: Quote,\n opts: {\n environment: Environment;\n txHash: string;\n startedAtMs: number;\n requiredConfirmationCount: number;\n },\n): SourcePendingTransfer {\n return {\n ...transferBaseFromQuote(quote, opts.environment),\n status: 'source-pending',\n source: {\n confirmationCount: 0,\n requiredConfirmationCount: opts.requiredConfirmationCount,\n startedAtMs: opts.startedAtMs,\n txHash: opts.txHash,\n },\n };\n}\n\n/**\n * Build a `FailedTransfer` from a quote.\n *\n * Centralises the boilerplate that every transfer-service handler repeats\n * when it needs to return a failed transfer before a source tx is recorded.\n */\nexport function failedTransferFromQuote(\n quote: Quote,\n options: {\n environment: Environment;\n errorCode: ErrorCode;\n errorReason: string;\n },\n): FailedTransfer {\n return {\n ...transferBaseFromQuote(quote, options.environment),\n status: 'failed',\n errorCode: options.errorCode,\n errorReason: options.errorReason,\n failedAtMs: Date.now(),\n };\n}\n"],"mappings":"AAYA,SAAS,EAAsB,EAAc,EAAwD,CACnG,MAAO,CACL,SAAU,EAAM,SAChB,UAAW,EAAM,UACjB,cACA,KAAM,EAAM,KACZ,YAAa,EAAM,YACnB,GAAI,EAAM,GACV,cAAe,EAAM,cACrB,YAAa,EAAM,QACnB,YAAa,EAAM,YACnB,YAAa,EAAM,SACnB,YAAa,EAAM,YACnB,UAAW,EAAM,UACjB,KAAM,EAAM,YACb,CAGH,SAAgB,EACd,EACA,EAMuB,CACvB,MAAO,CACL,GAAG,EAAsB,EAAO,EAAK,YAAY,CACjD,OAAQ,iBACR,OAAQ,CACN,kBAAmB,EACnB,0BAA2B,EAAK,0BAChC,YAAa,EAAK,YAClB,OAAQ,EAAK,OACd,CACF"}
@@ -0,0 +1,2 @@
1
+ require(`../_virtual/_rolldown/runtime.cjs`);const e=require(`../errors.cjs`),t=require(`../utils/caip.cjs`);let n=require(`viem`),r=require(`@solana/kit`);function i(n){let{namespace:r,reference:i}=t.splitCaip2ChainId(n.chainId);if(r!==`eip155`)throw new e.InvalidParamsError(`Can not get Viem chain for unsupported chain`,`Unsupported chain namespace: ${r}. Only eip155 chains are supported.`);return{id:Number(i),name:n.chainName,nativeCurrency:{decimals:n.networkToken.decimals,symbol:n.networkToken.symbol,name:n.networkToken.name},rpcUrls:{default:{http:[n.rpcUrl]},public:{http:[n.rpcUrl]}},...n.utilityAddresses?.multicall&&{contracts:{multicall3:{address:n.utilityAddresses.multicall}}}}}function a({chain:e}){return(0,n.createWalletClient)({chain:i(e),transport:(0,n.http)(e.rpcUrl,{batch:!0,retryCount:6,retryDelay:200,timeout:15e3})}).extend(n.publicActions)}function o({chain:e}){return(0,r.createSolanaRpc)(e.rpcUrl)}function s(t,n){if(n===void 0)return t;if(!Number.isInteger(n)||n<0)throw new e.InvalidParamsError(`Invalid feeUnitsMarginBps`,`feeUnitsMarginBps must be a non-negative integer, but got ${n}`);return t*BigInt(1e4+n)/10000n}function c(t){return t instanceof n.WaitForTransactionReceiptTimeoutError?e.ErrorCode.TIMEOUT:e.ErrorCode.TRANSACTION_REVERTED}function l(t){return(0,r.isSolanaError)(t,r.SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NODE_UNHEALTHY)||(0,r.isSolanaError)(t,r.SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR)?e.ErrorCode.SERVICE_NOT_AVAILABLE:(0,r.isSolanaError)(t,r.SOLANA_ERROR__BLOCK_HEIGHT_EXCEEDED)?e.ErrorCode.TIMEOUT:e.ErrorCode.UNKNOWN}function u({timeoutMs:e,signal:t}){return new Promise(n=>{let r=!1,i=()=>{r||(r=!0,clearTimeout(o),t.removeEventListener(`abort`,a),n())},a=()=>{i()},o=setTimeout(()=>{i()},e);t.addEventListener(`abort`,a,{once:!0}),t.aborted&&i()})}const d=Symbol(`aborted`);async function f(e,t){let n=await Promise.race([e,new Promise(e=>{t.addEventListener(`abort`,()=>e(d),{once:!0})})]);return n===d||t.aborted?{status:`aborted`}:{status:`ok`,value:n}}function p(e,t){return{amountIn:e.amountIn,amountOut:e.amountOut,environment:t.environment,errorCode:t.errorCode,errorReason:t.errorReason,failedAtMs:Date.now(),fees:e.fees,fromAddress:e.fromAddress,id:e.id,partnerFeeBps:e.partnerFeeBps,sourceAsset:e.assetIn,sourceChain:e.sourceChain,status:`failed`,targetAsset:e.assetOut,targetChain:e.targetChain,toAddress:e.toAddress,type:e.serviceType}}exports.applyFeeUnitsBpsMargin=s,exports.awaitOrAbort=f,exports.getErrorCodeForSolanaRpcError=l,exports.getErrorCodeForViemError=c,exports.getEvmClientForChain=a,exports.getSolanaRpcForChain=o,exports.makeFailedTransferFromQuote=p,exports.waitForTimeoutOrAbort=u;
2
+ //# sourceMappingURL=_utils.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_utils.cjs","names":["splitCaip2ChainId","InvalidParamsError","publicActions","WaitForTransactionReceiptTimeoutError","ErrorCode","SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NODE_UNHEALTHY","SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR","SOLANA_ERROR__BLOCK_HEIGHT_EXCEEDED"],"sources":["../../src/transfer-service/_utils.ts"],"sourcesContent":["/**\n * @module\n * @internal\n *\n * Internal utility functions for transfer services.\n */\nimport {\n createSolanaRpc,\n isSolanaError,\n SOLANA_ERROR__BLOCK_HEIGHT_EXCEEDED,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NODE_UNHEALTHY,\n SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR,\n type Rpc,\n type SolanaRpcApi,\n} from '@solana/kit';\nimport {\n createWalletClient,\n http,\n publicActions,\n WaitForTransactionReceiptTimeoutError,\n type Client,\n type HttpTransport,\n type PublicActions,\n type Chain as ViemChain,\n type WalletRpcSchema,\n} from 'viem';\nimport { splitCaip2ChainId } from '../utils/caip';\nimport type { Environment } from '../constants';\nimport { ErrorCode, InvalidParamsError } from '../errors';\nimport type { Chain } from '../types/chain';\nimport type { Quote } from '../types/quote';\nimport type { FailedTransfer } from '../types/transfer';\n\nfunction getViemChain(chain: Chain): ViemChain {\n const { namespace, reference: chainId } = splitCaip2ChainId(chain.chainId);\n\n if (namespace !== 'eip155') {\n throw new InvalidParamsError(\n 'Can not get Viem chain for unsupported chain',\n `Unsupported chain namespace: ${namespace}. Only eip155 chains are supported.`,\n );\n }\n\n return {\n id: Number(chainId),\n name: chain.chainName,\n nativeCurrency: {\n decimals: chain.networkToken.decimals,\n symbol: chain.networkToken.symbol,\n name: chain.networkToken.name,\n },\n rpcUrls: {\n default: {\n http: [chain.rpcUrl],\n },\n public: {\n http: [chain.rpcUrl],\n },\n },\n ...(chain.utilityAddresses?.multicall && {\n contracts: {\n multicall3: {\n address: chain.utilityAddresses.multicall,\n },\n },\n }),\n };\n}\n\nexport function getEvmClientForChain({\n chain,\n}: {\n chain: Chain;\n}): Client<HttpTransport, ViemChain, undefined, WalletRpcSchema, PublicActions> {\n const chainInfo = getViemChain(chain);\n\n const transport = http(chain.rpcUrl, {\n batch: true,\n retryCount: 6,\n retryDelay: 200,\n timeout: 15_000,\n });\n\n const client = createWalletClient({\n chain: chainInfo,\n transport,\n }).extend(publicActions);\n\n return client;\n}\n\nexport function getSolanaRpcForChain({ chain }: { chain: Chain }): Rpc<SolanaRpcApi> {\n return createSolanaRpc(chain.rpcUrl);\n}\n\nexport function applyFeeUnitsBpsMargin(feeUnits: bigint, feeUnitsMarginBps: number | undefined): bigint {\n if (feeUnitsMarginBps === undefined) {\n return feeUnits;\n }\n\n if (!Number.isInteger(feeUnitsMarginBps) || feeUnitsMarginBps < 0) {\n throw new InvalidParamsError(\n 'Invalid feeUnitsMarginBps',\n `feeUnitsMarginBps must be a non-negative integer, but got ${feeUnitsMarginBps}`,\n );\n }\n\n return (feeUnits * BigInt(10_000 + feeUnitsMarginBps)) / 10_000n;\n}\n\nexport function scaleAmount(amount: bigint, multiplier: number, precisionFactor = 1_000_000): bigint {\n // Verify precisionFactor is a positive integer\n if (!Number.isInteger(precisionFactor) || precisionFactor <= 0) {\n throw new Error('precisionFactor must be a positive integer');\n }\n\n return (amount * BigInt(multiplier * precisionFactor)) / BigInt(precisionFactor);\n}\n\n/**\n * Subtracts the partner fee from the given amount.\n *\n * @param amount - The original amount.\n * @param partnerFeeBps - Fee in basis points (1 bps = 0.01%)\n * @returns The amount after subtracting the partner fee.\n *\n * @throws {Error} If partnerFeeBps is not an integer or is out of range.\n */\nexport function subtractPartnerFee(amount: bigint, partnerFeeBps: number): bigint {\n if (!Number.isInteger(partnerFeeBps)) {\n throw new Error('partnerFeeBps must be an integer');\n }\n\n if (partnerFeeBps < 0 || partnerFeeBps > 10_000) {\n throw new Error('partnerFeeBps must be between 0 and 10,000');\n }\n\n return (amount * BigInt(10_000 - partnerFeeBps)) / 10_000n;\n}\n\n/**\n * Calculates the fee percentage given an input amount and a fee amount.\n *\n * @param inputAmount - The original input amount.\n * @param feeAmount - The fee amount to be calculated as a percentage of the input amount.\n * @returns An object containing the fee percentage and the number of decimal places.\n *\n * @throws {Error} If inputAmount is less than or equal to zero, or if feeAmount is negative.\n */\nexport function calculateFeePercentage(\n inputAmount: bigint,\n feeAmount: bigint,\n): { feePercentage: number; feePercentageDecimals: number } {\n if (inputAmount <= 0n) {\n throw new Error('Input amount must be greater than zero');\n }\n\n if (feeAmount < 0n) {\n throw new Error('Fee amount must be >= zero');\n }\n\n if (feeAmount === 0n) {\n return { feePercentage: 0, feePercentageDecimals: 0 };\n }\n\n const MAX_DECIMALS = 18;\n\n for (let decimals = 0; decimals <= MAX_DECIMALS; decimals++) {\n const scale = 10n ** BigInt(decimals);\n const numerator = feeAmount * 100n * scale;\n\n if (numerator % inputAmount === 0n) {\n const value = numerator / inputAmount;\n\n if (value > BigInt(Number.MAX_SAFE_INTEGER)) {\n throw new Error('feePercentage exceeds Number.MAX_SAFE_INTEGER');\n }\n\n return {\n feePercentage: Number(value),\n feePercentageDecimals: decimals,\n };\n }\n }\n\n // Fallback: highest precision, truncated\n const scale = 10n ** BigInt(MAX_DECIMALS);\n const value = (feeAmount * 100n * scale) / inputAmount;\n\n if (value > BigInt(Number.MAX_SAFE_INTEGER)) {\n throw new Error('feePercentage exceeds Number.MAX_SAFE_INTEGER');\n }\n\n return {\n feePercentage: Number(value),\n feePercentageDecimals: MAX_DECIMALS,\n };\n}\n\n/**\n * Maps Viem errors to corresponding ErrorCode values.\n *\n * @param error - The error thrown by Viem.\n * @returns The corresponding ErrorCode.\n */\nexport function getErrorCodeForViemError(error: unknown): ErrorCode {\n if (error instanceof WaitForTransactionReceiptTimeoutError) {\n return ErrorCode.TIMEOUT;\n }\n\n return ErrorCode.TRANSACTION_REVERTED;\n}\n\n/**\n * Maps `@solana/kit` errors to SDK ErrorCode values.\n *\n * `@solana/kit` throws typed `SolanaError` instances with numeric codes.\n * We use the `isSolanaError` type guard to match specific codes:\n *\n * - Transport / node-health errors → SERVICE_NOT_AVAILABLE\n * (HTTP transport failures, node-unhealthy JSON-RPC responses)\n *\n * - Block-height exceeded → TIMEOUT\n * (the transaction's blockhash has expired — the 150-slot validity\n * window has passed and the tx can no longer land)\n *\n * - Everything else → UNKNOWN\n * (unexpected JSON-RPC errors, malformed responses, internal errors, etc.)\n */\nexport function getErrorCodeForSolanaRpcError(error: unknown): ErrorCode {\n if (\n isSolanaError(error, SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NODE_UNHEALTHY) ||\n isSolanaError(error, SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR)\n ) {\n return ErrorCode.SERVICE_NOT_AVAILABLE;\n }\n\n if (isSolanaError(error, SOLANA_ERROR__BLOCK_HEIGHT_EXCEEDED)) {\n return ErrorCode.TIMEOUT;\n }\n\n return ErrorCode.UNKNOWN;\n}\n\n/**\n * Waits for either a timeout to elapse or an abort signal to be triggered.\n *\n * @param timeoutMs - The timeout duration in milliseconds.\n * @param signal - The AbortSignal to listen for abort events.\n *\n * @returns A promise that resolves when either the timeout elapses or the abort signal is triggered.\n */\nexport function waitForTimeoutOrAbort({\n timeoutMs,\n signal,\n}: Readonly<{\n timeoutMs: number;\n signal: AbortSignal;\n}>): Promise<void> {\n return new Promise((resolve) => {\n let settled = false;\n\n const finish = (): void => {\n if (settled) {\n return;\n }\n\n settled = true;\n clearTimeout(timeoutId);\n signal.removeEventListener('abort', onAbort);\n resolve();\n };\n\n const onAbort = (): void => {\n finish();\n };\n\n const timeoutId = setTimeout(() => {\n finish();\n }, timeoutMs);\n\n signal.addEventListener('abort', onAbort, { once: true });\n\n if (signal.aborted) {\n finish();\n }\n });\n}\n\nconst ABORT_TAG: unique symbol = Symbol('aborted');\n\n/**\n * @internal\n *\n * Waits for a promise to resolve or an abort signal to be triggered, whichever comes first.\n *\n * If the promise resolves first, returns an object with status 'ok' and the resolved value.\n * If the abort signal is triggered first, returns an object with status 'aborted'.\n *\n * @param awaitable - The promise to wait for.\n * @param signal - The AbortSignal to listen for abort events.\n * @returns A promise that resolves to an object indicating whether the operation was aborted or completed successfully.\n *\n * @throws Any error thrown by the awaitable promise will be propagated to the caller.\n *\n * @example\n * ```ts\n * const ac = new AbortController();\n * const result = await awaitOrAbort(someAsyncOperation(), ac.signal);\n *\n * if (result.status === 'aborted') {\n * console.log('Operation was aborted');\n * } else {\n * console.log('Operation completed with value:', result.value);\n * }\n * ```\n */\nexport async function awaitOrAbort<T>(\n awaitable: Promise<T>,\n signal: AbortSignal,\n): Promise<{ status: 'aborted' } | { status: 'ok'; value: T }> {\n const maybeAwaitable = await Promise.race([\n awaitable,\n new Promise<typeof ABORT_TAG>((resolve) => {\n signal.addEventListener('abort', () => resolve(ABORT_TAG), { once: true });\n }),\n ]);\n\n if (maybeAwaitable === ABORT_TAG || signal.aborted) {\n return { status: 'aborted' };\n }\n\n return { status: 'ok', value: maybeAwaitable };\n}\n\n/**\n * Build a `FailedTransfer` from a quote.\n *\n * Centralises the boilerplate that every transfer-service handler repeats\n * when it needs to return a failed transfer before a source tx is recorded.\n */\nexport function makeFailedTransferFromQuote(\n quote: Quote,\n options: {\n environment: Environment;\n errorCode: ErrorCode;\n errorReason: string;\n },\n): FailedTransfer {\n return {\n amountIn: quote.amountIn,\n amountOut: quote.amountOut,\n environment: options.environment,\n errorCode: options.errorCode,\n errorReason: options.errorReason,\n failedAtMs: Date.now(),\n fees: quote.fees,\n fromAddress: quote.fromAddress,\n id: quote.id,\n partnerFeeBps: quote.partnerFeeBps,\n sourceAsset: quote.assetIn,\n sourceChain: quote.sourceChain,\n status: 'failed',\n targetAsset: quote.assetOut,\n targetChain: quote.targetChain,\n toAddress: quote.toAddress,\n type: quote.serviceType,\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{ErrorCode as e,InvalidParamsError as t}from"../errors.js";import{splitCaip2ChainId as n}from"../utils/caip.js";import{WaitForTransactionReceiptTimeoutError as r,createWalletClient as i,http as a,publicActions as o}from"viem";import{SOLANA_ERROR__BLOCK_HEIGHT_EXCEEDED as s,SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NODE_UNHEALTHY as c,SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR as l,createSolanaRpc as u,isSolanaError as d}from"@solana/kit";function f(e){let{namespace:r,reference:i}=n(e.chainId);if(r!==`eip155`)throw new t(`Can not get Viem chain for unsupported chain`,`Unsupported chain namespace: ${r}. Only eip155 chains are supported.`);return{id:Number(i),name:e.chainName,nativeCurrency:{decimals:e.networkToken.decimals,symbol:e.networkToken.symbol,name:e.networkToken.name},rpcUrls:{default:{http:[e.rpcUrl]},public:{http:[e.rpcUrl]}},...e.utilityAddresses?.multicall&&{contracts:{multicall3:{address:e.utilityAddresses.multicall}}}}}function p({chain:e}){return i({chain:f(e),transport:a(e.rpcUrl,{batch:!0,retryCount:6,retryDelay:200,timeout:15e3})}).extend(o)}function m({chain:e}){return u(e.rpcUrl)}function h(e,n){if(n===void 0)return e;if(!Number.isInteger(n)||n<0)throw new t(`Invalid feeUnitsMarginBps`,`feeUnitsMarginBps must be a non-negative integer, but got ${n}`);return e*BigInt(1e4+n)/10000n}function g(t){return t instanceof r?e.TIMEOUT:e.TRANSACTION_REVERTED}function _(t){return d(t,c)||d(t,l)?e.SERVICE_NOT_AVAILABLE:d(t,s)?e.TIMEOUT:e.UNKNOWN}function v({timeoutMs:e,signal:t}){return new Promise(n=>{let r=!1,i=()=>{r||(r=!0,clearTimeout(o),t.removeEventListener(`abort`,a),n())},a=()=>{i()},o=setTimeout(()=>{i()},e);t.addEventListener(`abort`,a,{once:!0}),t.aborted&&i()})}const y=Symbol(`aborted`);async function b(e,t){let n=await Promise.race([e,new Promise(e=>{t.addEventListener(`abort`,()=>e(y),{once:!0})})]);return n===y||t.aborted?{status:`aborted`}:{status:`ok`,value:n}}function x(e,t){return{amountIn:e.amountIn,amountOut:e.amountOut,environment:t.environment,errorCode:t.errorCode,errorReason:t.errorReason,failedAtMs:Date.now(),fees:e.fees,fromAddress:e.fromAddress,id:e.id,partnerFeeBps:e.partnerFeeBps,sourceAsset:e.assetIn,sourceChain:e.sourceChain,status:`failed`,targetAsset:e.assetOut,targetChain:e.targetChain,toAddress:e.toAddress,type:e.serviceType}}export{h as applyFeeUnitsBpsMargin,b as awaitOrAbort,_ as getErrorCodeForSolanaRpcError,g as getErrorCodeForViemError,p as getEvmClientForChain,m as getSolanaRpcForChain,x as makeFailedTransferFromQuote,v as waitForTimeoutOrAbort};
2
+ //# sourceMappingURL=_utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_utils.js","names":[],"sources":["../../src/transfer-service/_utils.ts"],"sourcesContent":["/**\n * @module\n * @internal\n *\n * Internal utility functions for transfer services.\n */\nimport {\n createSolanaRpc,\n isSolanaError,\n SOLANA_ERROR__BLOCK_HEIGHT_EXCEEDED,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NODE_UNHEALTHY,\n SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR,\n type Rpc,\n type SolanaRpcApi,\n} from '@solana/kit';\nimport {\n createWalletClient,\n http,\n publicActions,\n WaitForTransactionReceiptTimeoutError,\n type Client,\n type HttpTransport,\n type PublicActions,\n type Chain as ViemChain,\n type WalletRpcSchema,\n} from 'viem';\nimport { splitCaip2ChainId } from '../utils/caip';\nimport type { Environment } from '../constants';\nimport { ErrorCode, InvalidParamsError } from '../errors';\nimport type { Chain } from '../types/chain';\nimport type { Quote } from '../types/quote';\nimport type { FailedTransfer } from '../types/transfer';\n\nfunction getViemChain(chain: Chain): ViemChain {\n const { namespace, reference: chainId } = splitCaip2ChainId(chain.chainId);\n\n if (namespace !== 'eip155') {\n throw new InvalidParamsError(\n 'Can not get Viem chain for unsupported chain',\n `Unsupported chain namespace: ${namespace}. Only eip155 chains are supported.`,\n );\n }\n\n return {\n id: Number(chainId),\n name: chain.chainName,\n nativeCurrency: {\n decimals: chain.networkToken.decimals,\n symbol: chain.networkToken.symbol,\n name: chain.networkToken.name,\n },\n rpcUrls: {\n default: {\n http: [chain.rpcUrl],\n },\n public: {\n http: [chain.rpcUrl],\n },\n },\n ...(chain.utilityAddresses?.multicall && {\n contracts: {\n multicall3: {\n address: chain.utilityAddresses.multicall,\n },\n },\n }),\n };\n}\n\nexport function getEvmClientForChain({\n chain,\n}: {\n chain: Chain;\n}): Client<HttpTransport, ViemChain, undefined, WalletRpcSchema, PublicActions> {\n const chainInfo = getViemChain(chain);\n\n const transport = http(chain.rpcUrl, {\n batch: true,\n retryCount: 6,\n retryDelay: 200,\n timeout: 15_000,\n });\n\n const client = createWalletClient({\n chain: chainInfo,\n transport,\n }).extend(publicActions);\n\n return client;\n}\n\nexport function getSolanaRpcForChain({ chain }: { chain: Chain }): Rpc<SolanaRpcApi> {\n return createSolanaRpc(chain.rpcUrl);\n}\n\nexport function applyFeeUnitsBpsMargin(feeUnits: bigint, feeUnitsMarginBps: number | undefined): bigint {\n if (feeUnitsMarginBps === undefined) {\n return feeUnits;\n }\n\n if (!Number.isInteger(feeUnitsMarginBps) || feeUnitsMarginBps < 0) {\n throw new InvalidParamsError(\n 'Invalid feeUnitsMarginBps',\n `feeUnitsMarginBps must be a non-negative integer, but got ${feeUnitsMarginBps}`,\n );\n }\n\n return (feeUnits * BigInt(10_000 + feeUnitsMarginBps)) / 10_000n;\n}\n\nexport function scaleAmount(amount: bigint, multiplier: number, precisionFactor = 1_000_000): bigint {\n // Verify precisionFactor is a positive integer\n if (!Number.isInteger(precisionFactor) || precisionFactor <= 0) {\n throw new Error('precisionFactor must be a positive integer');\n }\n\n return (amount * BigInt(multiplier * precisionFactor)) / BigInt(precisionFactor);\n}\n\n/**\n * Subtracts the partner fee from the given amount.\n *\n * @param amount - The original amount.\n * @param partnerFeeBps - Fee in basis points (1 bps = 0.01%)\n * @returns The amount after subtracting the partner fee.\n *\n * @throws {Error} If partnerFeeBps is not an integer or is out of range.\n */\nexport function subtractPartnerFee(amount: bigint, partnerFeeBps: number): bigint {\n if (!Number.isInteger(partnerFeeBps)) {\n throw new Error('partnerFeeBps must be an integer');\n }\n\n if (partnerFeeBps < 0 || partnerFeeBps > 10_000) {\n throw new Error('partnerFeeBps must be between 0 and 10,000');\n }\n\n return (amount * BigInt(10_000 - partnerFeeBps)) / 10_000n;\n}\n\n/**\n * Calculates the fee percentage given an input amount and a fee amount.\n *\n * @param inputAmount - The original input amount.\n * @param feeAmount - The fee amount to be calculated as a percentage of the input amount.\n * @returns An object containing the fee percentage and the number of decimal places.\n *\n * @throws {Error} If inputAmount is less than or equal to zero, or if feeAmount is negative.\n */\nexport function calculateFeePercentage(\n inputAmount: bigint,\n feeAmount: bigint,\n): { feePercentage: number; feePercentageDecimals: number } {\n if (inputAmount <= 0n) {\n throw new Error('Input amount must be greater than zero');\n }\n\n if (feeAmount < 0n) {\n throw new Error('Fee amount must be >= zero');\n }\n\n if (feeAmount === 0n) {\n return { feePercentage: 0, feePercentageDecimals: 0 };\n }\n\n const MAX_DECIMALS = 18;\n\n for (let decimals = 0; decimals <= MAX_DECIMALS; decimals++) {\n const scale = 10n ** BigInt(decimals);\n const numerator = feeAmount * 100n * scale;\n\n if (numerator % inputAmount === 0n) {\n const value = numerator / inputAmount;\n\n if (value > BigInt(Number.MAX_SAFE_INTEGER)) {\n throw new Error('feePercentage exceeds Number.MAX_SAFE_INTEGER');\n }\n\n return {\n feePercentage: Number(value),\n feePercentageDecimals: decimals,\n };\n }\n }\n\n // Fallback: highest precision, truncated\n const scale = 10n ** BigInt(MAX_DECIMALS);\n const value = (feeAmount * 100n * scale) / inputAmount;\n\n if (value > BigInt(Number.MAX_SAFE_INTEGER)) {\n throw new Error('feePercentage exceeds Number.MAX_SAFE_INTEGER');\n }\n\n return {\n feePercentage: Number(value),\n feePercentageDecimals: MAX_DECIMALS,\n };\n}\n\n/**\n * Maps Viem errors to corresponding ErrorCode values.\n *\n * @param error - The error thrown by Viem.\n * @returns The corresponding ErrorCode.\n */\nexport function getErrorCodeForViemError(error: unknown): ErrorCode {\n if (error instanceof WaitForTransactionReceiptTimeoutError) {\n return ErrorCode.TIMEOUT;\n }\n\n return ErrorCode.TRANSACTION_REVERTED;\n}\n\n/**\n * Maps `@solana/kit` errors to SDK ErrorCode values.\n *\n * `@solana/kit` throws typed `SolanaError` instances with numeric codes.\n * We use the `isSolanaError` type guard to match specific codes:\n *\n * - Transport / node-health errors → SERVICE_NOT_AVAILABLE\n * (HTTP transport failures, node-unhealthy JSON-RPC responses)\n *\n * - Block-height exceeded → TIMEOUT\n * (the transaction's blockhash has expired — the 150-slot validity\n * window has passed and the tx can no longer land)\n *\n * - Everything else → UNKNOWN\n * (unexpected JSON-RPC errors, malformed responses, internal errors, etc.)\n */\nexport function getErrorCodeForSolanaRpcError(error: unknown): ErrorCode {\n if (\n isSolanaError(error, SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NODE_UNHEALTHY) ||\n isSolanaError(error, SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR)\n ) {\n return ErrorCode.SERVICE_NOT_AVAILABLE;\n }\n\n if (isSolanaError(error, SOLANA_ERROR__BLOCK_HEIGHT_EXCEEDED)) {\n return ErrorCode.TIMEOUT;\n }\n\n return ErrorCode.UNKNOWN;\n}\n\n/**\n * Waits for either a timeout to elapse or an abort signal to be triggered.\n *\n * @param timeoutMs - The timeout duration in milliseconds.\n * @param signal - The AbortSignal to listen for abort events.\n *\n * @returns A promise that resolves when either the timeout elapses or the abort signal is triggered.\n */\nexport function waitForTimeoutOrAbort({\n timeoutMs,\n signal,\n}: Readonly<{\n timeoutMs: number;\n signal: AbortSignal;\n}>): Promise<void> {\n return new Promise((resolve) => {\n let settled = false;\n\n const finish = (): void => {\n if (settled) {\n return;\n }\n\n settled = true;\n clearTimeout(timeoutId);\n signal.removeEventListener('abort', onAbort);\n resolve();\n };\n\n const onAbort = (): void => {\n finish();\n };\n\n const timeoutId = setTimeout(() => {\n finish();\n }, timeoutMs);\n\n signal.addEventListener('abort', onAbort, { once: true });\n\n if (signal.aborted) {\n finish();\n }\n });\n}\n\nconst ABORT_TAG: unique symbol = Symbol('aborted');\n\n/**\n * @internal\n *\n * Waits for a promise to resolve or an abort signal to be triggered, whichever comes first.\n *\n * If the promise resolves first, returns an object with status 'ok' and the resolved value.\n * If the abort signal is triggered first, returns an object with status 'aborted'.\n *\n * @param awaitable - The promise to wait for.\n * @param signal - The AbortSignal to listen for abort events.\n * @returns A promise that resolves to an object indicating whether the operation was aborted or completed successfully.\n *\n * @throws Any error thrown by the awaitable promise will be propagated to the caller.\n *\n * @example\n * ```ts\n * const ac = new AbortController();\n * const result = await awaitOrAbort(someAsyncOperation(), ac.signal);\n *\n * if (result.status === 'aborted') {\n * console.log('Operation was aborted');\n * } else {\n * console.log('Operation completed with value:', result.value);\n * }\n * ```\n */\nexport async function awaitOrAbort<T>(\n awaitable: Promise<T>,\n signal: AbortSignal,\n): Promise<{ status: 'aborted' } | { status: 'ok'; value: T }> {\n const maybeAwaitable = await Promise.race([\n awaitable,\n new Promise<typeof ABORT_TAG>((resolve) => {\n signal.addEventListener('abort', () => resolve(ABORT_TAG), { once: true });\n }),\n ]);\n\n if (maybeAwaitable === ABORT_TAG || signal.aborted) {\n return { status: 'aborted' };\n }\n\n return { status: 'ok', value: maybeAwaitable };\n}\n\n/**\n * Build a `FailedTransfer` from a quote.\n *\n * Centralises the boilerplate that every transfer-service handler repeats\n * when it needs to return a failed transfer before a source tx is recorded.\n */\nexport function makeFailedTransferFromQuote(\n quote: Quote,\n options: {\n environment: Environment;\n errorCode: ErrorCode;\n errorReason: string;\n },\n): FailedTransfer {\n return {\n amountIn: quote.amountIn,\n amountOut: quote.amountOut,\n environment: options.environment,\n errorCode: options.errorCode,\n errorReason: options.errorReason,\n failedAtMs: Date.now(),\n fees: quote.fees,\n fromAddress: quote.fromAddress,\n id: quote.id,\n partnerFeeBps: quote.partnerFeeBps,\n sourceAsset: quote.assetIn,\n sourceChain: quote.sourceChain,\n status: 'failed',\n targetAsset: quote.assetOut,\n targetChain: quote.targetChain,\n toAddress: quote.toAddress,\n type: quote.serviceType,\n };\n}\n"],"mappings":"wbAiCA,SAAS,EAAa,EAAyB,CAC7C,GAAM,CAAE,YAAW,UAAW,GAAY,EAAkB,EAAM,QAAQ,CAE1E,GAAI,IAAc,SAChB,MAAM,IAAI,EACR,+CACA,gCAAgC,EAAU,qCAC3C,CAGH,MAAO,CACL,GAAI,OAAO,EAAQ,CACnB,KAAM,EAAM,UACZ,eAAgB,CACd,SAAU,EAAM,aAAa,SAC7B,OAAQ,EAAM,aAAa,OAC3B,KAAM,EAAM,aAAa,KAC1B,CACD,QAAS,CACP,QAAS,CACP,KAAM,CAAC,EAAM,OAAO,CACrB,CACD,OAAQ,CACN,KAAM,CAAC,EAAM,OAAO,CACrB,CACF,CACD,GAAI,EAAM,kBAAkB,WAAa,CACvC,UAAW,CACT,WAAY,CACV,QAAS,EAAM,iBAAiB,UACjC,CACF,CACF,CACF,CAGH,SAAgB,EAAqB,CACnC,SAG8E,CAe9E,OALe,EAAmB,CAChC,MAVgB,EAAa,EAAM,CAWnC,UATgB,EAAK,EAAM,OAAQ,CACnC,MAAO,GACP,WAAY,EACZ,WAAY,IACZ,QAAS,KACV,CAAC,CAKD,CAAC,CAAC,OAAO,EAAc,CAK1B,SAAgB,EAAqB,CAAE,SAA8C,CACnF,OAAO,EAAgB,EAAM,OAAO,CAGtC,SAAgB,EAAuB,EAAkB,EAA+C,CACtG,GAAI,IAAsB,IAAA,GACxB,OAAO,EAGT,GAAI,CAAC,OAAO,UAAU,EAAkB,EAAI,EAAoB,EAC9D,MAAM,IAAI,EACR,4BACA,6DAA6D,IAC9D,CAGH,OAAQ,EAAW,OAAO,IAAS,EAAkB,CAAI,OAkG3D,SAAgB,EAAyB,EAA2B,CAKlE,OAJI,aAAiB,EACZ,EAAU,QAGZ,EAAU,qBAmBnB,SAAgB,EAA8B,EAA2B,CAYvE,OAVE,EAAc,EAAO,EAAoD,EACzE,EAAc,EAAO,EAAwC,CAEtD,EAAU,sBAGf,EAAc,EAAO,EAAoC,CACpD,EAAU,QAGZ,EAAU,QAWnB,SAAgB,EAAsB,CACpC,YACA,UAIiB,CACjB,OAAO,IAAI,QAAS,GAAY,CAC9B,IAAI,EAAU,GAER,MAAqB,CACrB,IAIJ,EAAU,GACV,aAAa,EAAU,CACvB,EAAO,oBAAoB,QAAS,EAAQ,CAC5C,GAAS,GAGL,MAAsB,CAC1B,GAAQ,EAGJ,EAAY,eAAiB,CACjC,GAAQ,EACP,EAAU,CAEb,EAAO,iBAAiB,QAAS,EAAS,CAAE,KAAM,GAAM,CAAC,CAErD,EAAO,SACT,GAAQ,EAEV,CAGJ,MAAM,EAA2B,OAAO,UAAU,CA4BlD,eAAsB,EACpB,EACA,EAC6D,CAC7D,IAAM,EAAiB,MAAM,QAAQ,KAAK,CACxC,EACA,IAAI,QAA2B,GAAY,CACzC,EAAO,iBAAiB,YAAe,EAAQ,EAAU,CAAE,CAAE,KAAM,GAAM,CAAC,EAC1E,CACH,CAAC,CAMF,OAJI,IAAmB,GAAa,EAAO,QAClC,CAAE,OAAQ,UAAW,CAGvB,CAAE,OAAQ,KAAM,MAAO,EAAgB,CAShD,SAAgB,EACd,EACA,EAKgB,CAChB,MAAO,CACL,SAAU,EAAM,SAChB,UAAW,EAAM,UACjB,YAAa,EAAQ,YACrB,UAAW,EAAQ,UACnB,YAAa,EAAQ,YACrB,WAAY,KAAK,KAAK,CACtB,KAAM,EAAM,KACZ,YAAa,EAAM,YACnB,GAAI,EAAM,GACV,cAAe,EAAM,cACrB,YAAa,EAAM,QACnB,YAAa,EAAM,YACnB,OAAQ,SACR,YAAa,EAAM,SACnB,YAAa,EAAM,YACnB,UAAW,EAAM,UACjB,KAAM,EAAM,YACb"}
@@ -0,0 +1,2 @@
1
+ require(`../_virtual/_rolldown/runtime.cjs`);const e=require(`../constants.cjs`),t=require(`./service-schemas.cjs`);let n=require(`zod`);const r=n.z.enum(e.Blockchain),i=n.z.object({tokenName:n.z.string(),nativeNetwork:r,denomination:n.z.number()}).extend({nativeContractAddress:t.EvmAddressSchema,wrappedContractAddress:t.EvmAddressSchema,wrappedNetwork:r}),a=n.z.object({disableFrontend:n.z.boolean(),addressBlocklist:n.z.array(n.z.string())}),o=a.extend({assets:n.z.record(n.z.string(),i),networks:n.z.partialRecord(r,n.z.union([n.z.number(),n.z.undefined()])),walletAddresses:n.z.partialRecord(r,t.EvmAddressSchema)}),s=n.z.object({minimumConfirmations:n.z.partialRecord(r,n.z.optional(n.z.number()))}),c=n.z.object({minimumFeeAmount:n.z.coerce.bigint().nonnegative(),maximumFeeAmount:n.z.coerce.bigint().nonnegative(),feePercentage:n.z.int().nonnegative(),feePercentageDecimals:n.z.int().nonnegative()}),l=s.extend({unwrapFeeApproximation:n.z.record(n.z.string(),c),wrapFeeApproximation:n.z.record(n.z.string(),c)}),u=n.z.object({critical:o,nonCritical:l}),d=n.z.object({tokenName:n.z.string(),bech32AddressPrefix:n.z.union([n.z.literal(`tb`),n.z.literal(`bc`)]),wrappedContractAddress:t.EvmAddressSchema,wrappedNetwork:r}),f=a.extend({addressBlocklist:n.z.array(n.z.string()),avalancheChainId:n.z.number(),bitcoinAssets:n.z.record(n.z.string(),d),walletAddresses:n.z.object({btc:t.BtcAddressSchema,avalanche:t.EvmAddressSchema})}),p=n.z.object({dustThreshold:n.z.number(),wrapFeeEstimate:n.z.object({minimumFeeAmount:n.z.string(),maximumFeeAmount:n.z.string(),feePercentage:n.z.number(),feePercentageDecimals:n.z.number()}),unwrapFeeEstimate:n.z.object({bridgeToll:n.z.object({minimumFeeAmount:n.z.string(),maximumFeeAmount:n.z.string(),feePercentage:n.z.number(),feePercentageDecimals:n.z.number()}),estimatedTxFee:n.z.object({constAmount:n.z.number(),numeratorPerSat:n.z.number(),denominatorPerSat:n.z.number()})})}),m=n.z.object({wrapFeeAmount:n.z.number(),constUnwrapFeeAmount:n.z.number(),unwrapFeeNumerator:n.z.number(),unwrapFeeDenominator:n.z.number(),dustThreshold:n.z.number()}),h=n.z.object({minimumConfirmations:n.z.number(),minimumOnboardSize:n.z.number(),currentBridgeFeeEstimate:n.z.union([p,m])}),g=n.z.object({networkInfo:n.z.record(n.z.string(),h).nullable()}),_=n.z.object({criticalBitcoin:f,nonCriticalBitcoin:g}),v=n.z.intersection(u,_);exports.DynamicFeeEstimation=c,exports.WardenConfigSchema=v;
2
+ //# sourceMappingURL=_warden-config-schema.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_warden-config-schema.cjs","names":["z","Blockchain","EvmAddressSchema","BtcAddressSchema"],"sources":["../../src/transfer-service/_warden-config-schema.ts"],"sourcesContent":["import { z } from 'zod';\nimport { BtcAddressSchema, EvmAddressSchema } from './service-schemas';\nimport { Blockchain } from '../constants';\n\nconst BlockchainEnum = z.enum(Blockchain);\n\nconst AssetBase = z.object({\n tokenName: z.string(),\n nativeNetwork: BlockchainEnum,\n denomination: z.number(),\n});\n\nconst EthereumAssetConfig = AssetBase.extend({\n nativeContractAddress: EvmAddressSchema,\n wrappedContractAddress: EvmAddressSchema,\n wrappedNetwork: BlockchainEnum,\n});\n\nconst CriticalConfigBase = z.object({\n disableFrontend: z.boolean(),\n addressBlocklist: z.array(z.string()),\n});\n\nconst EthereumCriticalConfig = CriticalConfigBase.extend({\n assets: z.record(z.string(), EthereumAssetConfig), // key is token symbol\n networks: z.partialRecord(BlockchainEnum, z.union([z.number(), z.undefined()])),\n walletAddresses: z.partialRecord(BlockchainEnum, EvmAddressSchema),\n});\n\nconst EthereumNonCriticalConfigBase = z.object({\n minimumConfirmations: z.partialRecord(BlockchainEnum, z.optional(z.number())),\n});\n\nexport const DynamicFeeEstimation: z.ZodType<{\n feePercentage: number;\n feePercentageDecimals: number;\n maximumFeeAmount: bigint;\n minimumFeeAmount: bigint;\n}> = z.object({\n minimumFeeAmount: z.coerce.bigint().nonnegative(),\n maximumFeeAmount: z.coerce.bigint().nonnegative(),\n feePercentage: z.int().nonnegative(),\n feePercentageDecimals: z.int().nonnegative(),\n});\n\nconst EthereumDynamicFeeNonCriticalConfig = EthereumNonCriticalConfigBase.extend({\n unwrapFeeApproximation: z.record(z.string(), DynamicFeeEstimation),\n wrapFeeApproximation: z.record(z.string(), DynamicFeeEstimation),\n});\n\nconst EthereumDynamicFeeConfig = z.object({\n critical: EthereumCriticalConfig,\n nonCritical: EthereumDynamicFeeNonCriticalConfig,\n});\n\nconst BitcoinAssetConfig = z.object({\n tokenName: z.string(),\n bech32AddressPrefix: z.union([z.literal('tb'), z.literal('bc')]),\n wrappedContractAddress: EvmAddressSchema,\n wrappedNetwork: BlockchainEnum,\n});\n\nconst BitcoinCritical = CriticalConfigBase.extend({\n addressBlocklist: z.array(z.string()),\n avalancheChainId: z.number(),\n bitcoinAssets: z.record(z.string(), BitcoinAssetConfig), // key is token symbol\n walletAddresses: z.object({\n btc: BtcAddressSchema,\n avalanche: EvmAddressSchema,\n }),\n});\n\nconst BitcoinCurrentBridgeFeeEstimateDynamic = z.object({\n dustThreshold: z.number(),\n wrapFeeEstimate: z.object({\n minimumFeeAmount: z.string(),\n maximumFeeAmount: z.string(),\n feePercentage: z.number(),\n feePercentageDecimals: z.number(),\n }),\n unwrapFeeEstimate: z.object({\n bridgeToll: z.object({\n minimumFeeAmount: z.string(),\n maximumFeeAmount: z.string(),\n feePercentage: z.number(),\n feePercentageDecimals: z.number(),\n }),\n estimatedTxFee: z.object({\n constAmount: z.number(),\n numeratorPerSat: z.number(),\n denominatorPerSat: z.number(),\n }),\n }),\n});\n\nconst BitcoinCurrentBridgeFeeEstimateStatic = z.object({\n wrapFeeAmount: z.number(),\n constUnwrapFeeAmount: z.number(),\n unwrapFeeNumerator: z.number(),\n unwrapFeeDenominator: z.number(),\n dustThreshold: z.number(),\n});\n\nconst BitcoinNetworkInfo = z.object({\n minimumConfirmations: z.number(),\n minimumOnboardSize: z.number(),\n currentBridgeFeeEstimate: z.union([BitcoinCurrentBridgeFeeEstimateDynamic, BitcoinCurrentBridgeFeeEstimateStatic]),\n});\n\nconst BitcoinNonCritical = z.object({\n networkInfo: z.record(z.string(), BitcoinNetworkInfo).nullable(),\n});\n\n// BitcoinConfig supports both dynamic and static\nconst BitcoinConfig = z.object({\n criticalBitcoin: BitcoinCritical,\n nonCriticalBitcoin: BitcoinNonCritical,\n});\n\n/**\n * The schema for the Warden configuration used by the Unified Asset Transfer service.\n *\n * > [!NOTE]\n * >\n * > The typing for this schema is auto-generated and should not be manually edited.\n * > If changes are made to the schema, the typing must be regenerated.\n * >\n * > You can regenerate the typing by deleting the existing typing and using\n * > VS Code's quick fix feature to generate the new typing.\n * >\n * > This typing is necessary to satisfy the isolatedDeclarations TypeScript compiler option.\n *\n * > [!INFO]\n * >\n * > Warden bridge settings are updated every 15 seconds.\n */\nexport const WardenConfigSchema: z.ZodIntersection<\n z.ZodObject<\n {\n critical: z.ZodObject<\n {\n disableFrontend: z.ZodBoolean;\n addressBlocklist: z.ZodArray<z.ZodString>;\n assets: z.ZodRecord<\n z.ZodString,\n z.ZodObject<\n {\n tokenName: z.ZodString;\n nativeNetwork: z.ZodEnum<typeof Blockchain>;\n denomination: z.ZodNumber;\n nativeContractAddress: z.ZodType<\n `0x${string}`,\n unknown,\n z.core.$ZodTypeInternals<`0x${string}`, unknown>\n >;\n wrappedContractAddress: z.ZodType<\n `0x${string}`,\n unknown,\n z.core.$ZodTypeInternals<`0x${string}`, unknown>\n >;\n wrappedNetwork: z.ZodEnum<typeof Blockchain>;\n },\n z.core.$strip\n >\n >;\n networks: z.ZodRecord<\n z.ZodEnum<typeof Blockchain> & z.core.$partial,\n z.ZodUnion<readonly [z.ZodNumber, z.ZodUndefined]>\n >;\n walletAddresses: z.ZodRecord<\n z.ZodEnum<typeof Blockchain> & z.core.$partial,\n z.ZodType<`0x${string}`, unknown, z.core.$ZodTypeInternals<`0x${string}`, unknown>>\n >;\n },\n z.core.$strip\n >;\n nonCritical: z.ZodObject<\n {\n minimumConfirmations: z.ZodRecord<z.ZodEnum<typeof Blockchain> & z.core.$partial, z.ZodOptional<z.ZodNumber>>;\n unwrapFeeApproximation: z.ZodRecord<\n z.ZodString,\n z.ZodType<\n {\n feePercentage: number;\n feePercentageDecimals: number;\n maximumFeeAmount: bigint;\n minimumFeeAmount: bigint;\n },\n unknown,\n z.core.$ZodTypeInternals<\n {\n feePercentage: number;\n feePercentageDecimals: number;\n maximumFeeAmount: bigint;\n minimumFeeAmount: bigint;\n },\n unknown\n >\n >\n >;\n wrapFeeApproximation: z.ZodRecord<\n z.ZodString,\n z.ZodType<\n {\n feePercentage: number;\n feePercentageDecimals: number;\n maximumFeeAmount: bigint;\n minimumFeeAmount: bigint;\n },\n unknown,\n z.core.$ZodTypeInternals<\n {\n feePercentage: number;\n feePercentageDecimals: number;\n maximumFeeAmount: bigint;\n minimumFeeAmount: bigint;\n },\n unknown\n >\n >\n >;\n },\n z.core.$strip\n >;\n },\n z.core.$strip\n >,\n z.ZodObject<\n {\n criticalBitcoin: z.ZodObject<\n {\n disableFrontend: z.ZodBoolean;\n addressBlocklist: z.ZodArray<z.ZodString>;\n avalancheChainId: z.ZodNumber;\n bitcoinAssets: z.ZodRecord<\n z.ZodString,\n z.ZodObject<\n {\n tokenName: z.ZodString;\n bech32AddressPrefix: z.ZodUnion<readonly [z.ZodLiteral<'tb'>, z.ZodLiteral<'bc'>]>;\n wrappedContractAddress: z.ZodType<\n `0x${string}`,\n unknown,\n z.core.$ZodTypeInternals<`0x${string}`, unknown>\n >;\n wrappedNetwork: z.ZodEnum<typeof Blockchain>;\n },\n z.core.$strip\n >\n >;\n walletAddresses: z.ZodObject<\n {\n btc: z.ZodType<string, unknown, z.core.$ZodTypeInternals<string, unknown>>;\n avalanche: z.ZodType<`0x${string}`, unknown, z.core.$ZodTypeInternals<`0x${string}`, unknown>>;\n },\n z.core.$strip\n >;\n },\n z.core.$strip\n >;\n nonCriticalBitcoin: z.ZodObject<\n {\n networkInfo: z.ZodNullable<\n z.ZodRecord<\n z.ZodString,\n z.ZodObject<\n {\n minimumConfirmations: z.ZodNumber;\n minimumOnboardSize: z.ZodNumber;\n currentBridgeFeeEstimate: z.ZodUnion<\n readonly [\n z.ZodObject<\n {\n dustThreshold: z.ZodNumber;\n wrapFeeEstimate: z.ZodObject<\n {\n minimumFeeAmount: z.ZodString;\n maximumFeeAmount: z.ZodString;\n feePercentage: z.ZodNumber;\n feePercentageDecimals: z.ZodNumber;\n },\n z.core.$strip\n >;\n unwrapFeeEstimate: z.ZodObject<\n {\n bridgeToll: z.ZodObject<\n {\n minimumFeeAmount: z.ZodString;\n maximumFeeAmount: z.ZodString;\n feePercentage: z.ZodNumber;\n feePercentageDecimals: z.ZodNumber;\n },\n z.core.$strip\n >;\n estimatedTxFee: z.ZodObject<\n {\n constAmount: z.ZodNumber;\n numeratorPerSat: z.ZodNumber;\n denominatorPerSat: z.ZodNumber;\n },\n z.core.$strip\n >;\n },\n z.core.$strip\n >;\n },\n z.core.$strip\n >,\n z.ZodObject<\n {\n wrapFeeAmount: z.ZodNumber;\n constUnwrapFeeAmount: z.ZodNumber;\n unwrapFeeNumerator: z.ZodNumber;\n unwrapFeeDenominator: z.ZodNumber;\n dustThreshold: z.ZodNumber;\n },\n z.core.$strip\n >,\n ]\n >;\n },\n z.core.$strip\n >\n >\n >;\n },\n z.core.$strip\n >;\n },\n z.core.$strip\n >\n> = z.intersection(EthereumDynamicFeeConfig, BitcoinConfig);\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{Blockchain as e}from"../constants.js";import{BtcAddressSchema as t,EvmAddressSchema as n}from"./service-schemas.js";import{z as r}from"zod";const i=r.enum(e),a=r.object({tokenName:r.string(),nativeNetwork:i,denomination:r.number()}).extend({nativeContractAddress:n,wrappedContractAddress:n,wrappedNetwork:i}),o=r.object({disableFrontend:r.boolean(),addressBlocklist:r.array(r.string())}),s=o.extend({assets:r.record(r.string(),a),networks:r.partialRecord(i,r.union([r.number(),r.undefined()])),walletAddresses:r.partialRecord(i,n)}),c=r.object({minimumConfirmations:r.partialRecord(i,r.optional(r.number()))}),l=r.object({minimumFeeAmount:r.coerce.bigint().nonnegative(),maximumFeeAmount:r.coerce.bigint().nonnegative(),feePercentage:r.int().nonnegative(),feePercentageDecimals:r.int().nonnegative()}),u=c.extend({unwrapFeeApproximation:r.record(r.string(),l),wrapFeeApproximation:r.record(r.string(),l)}),d=r.object({critical:s,nonCritical:u}),f=r.object({tokenName:r.string(),bech32AddressPrefix:r.union([r.literal(`tb`),r.literal(`bc`)]),wrappedContractAddress:n,wrappedNetwork:i}),p=o.extend({addressBlocklist:r.array(r.string()),avalancheChainId:r.number(),bitcoinAssets:r.record(r.string(),f),walletAddresses:r.object({btc:t,avalanche:n})}),m=r.object({dustThreshold:r.number(),wrapFeeEstimate:r.object({minimumFeeAmount:r.string(),maximumFeeAmount:r.string(),feePercentage:r.number(),feePercentageDecimals:r.number()}),unwrapFeeEstimate:r.object({bridgeToll:r.object({minimumFeeAmount:r.string(),maximumFeeAmount:r.string(),feePercentage:r.number(),feePercentageDecimals:r.number()}),estimatedTxFee:r.object({constAmount:r.number(),numeratorPerSat:r.number(),denominatorPerSat:r.number()})})}),h=r.object({wrapFeeAmount:r.number(),constUnwrapFeeAmount:r.number(),unwrapFeeNumerator:r.number(),unwrapFeeDenominator:r.number(),dustThreshold:r.number()}),g=r.object({minimumConfirmations:r.number(),minimumOnboardSize:r.number(),currentBridgeFeeEstimate:r.union([m,h])}),_=r.object({networkInfo:r.record(r.string(),g).nullable()}),v=r.object({criticalBitcoin:p,nonCriticalBitcoin:_}),y=r.intersection(d,v);export{l as DynamicFeeEstimation,y as WardenConfigSchema};
2
+ //# sourceMappingURL=_warden-config-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_warden-config-schema.js","names":[],"sources":["../../src/transfer-service/_warden-config-schema.ts"],"sourcesContent":["import { z } from 'zod';\nimport { BtcAddressSchema, EvmAddressSchema } from './service-schemas';\nimport { Blockchain } from '../constants';\n\nconst BlockchainEnum = z.enum(Blockchain);\n\nconst AssetBase = z.object({\n tokenName: z.string(),\n nativeNetwork: BlockchainEnum,\n denomination: z.number(),\n});\n\nconst EthereumAssetConfig = AssetBase.extend({\n nativeContractAddress: EvmAddressSchema,\n wrappedContractAddress: EvmAddressSchema,\n wrappedNetwork: BlockchainEnum,\n});\n\nconst CriticalConfigBase = z.object({\n disableFrontend: z.boolean(),\n addressBlocklist: z.array(z.string()),\n});\n\nconst EthereumCriticalConfig = CriticalConfigBase.extend({\n assets: z.record(z.string(), EthereumAssetConfig), // key is token symbol\n networks: z.partialRecord(BlockchainEnum, z.union([z.number(), z.undefined()])),\n walletAddresses: z.partialRecord(BlockchainEnum, EvmAddressSchema),\n});\n\nconst EthereumNonCriticalConfigBase = z.object({\n minimumConfirmations: z.partialRecord(BlockchainEnum, z.optional(z.number())),\n});\n\nexport const DynamicFeeEstimation: z.ZodType<{\n feePercentage: number;\n feePercentageDecimals: number;\n maximumFeeAmount: bigint;\n minimumFeeAmount: bigint;\n}> = z.object({\n minimumFeeAmount: z.coerce.bigint().nonnegative(),\n maximumFeeAmount: z.coerce.bigint().nonnegative(),\n feePercentage: z.int().nonnegative(),\n feePercentageDecimals: z.int().nonnegative(),\n});\n\nconst EthereumDynamicFeeNonCriticalConfig = EthereumNonCriticalConfigBase.extend({\n unwrapFeeApproximation: z.record(z.string(), DynamicFeeEstimation),\n wrapFeeApproximation: z.record(z.string(), DynamicFeeEstimation),\n});\n\nconst EthereumDynamicFeeConfig = z.object({\n critical: EthereumCriticalConfig,\n nonCritical: EthereumDynamicFeeNonCriticalConfig,\n});\n\nconst BitcoinAssetConfig = z.object({\n tokenName: z.string(),\n bech32AddressPrefix: z.union([z.literal('tb'), z.literal('bc')]),\n wrappedContractAddress: EvmAddressSchema,\n wrappedNetwork: BlockchainEnum,\n});\n\nconst BitcoinCritical = CriticalConfigBase.extend({\n addressBlocklist: z.array(z.string()),\n avalancheChainId: z.number(),\n bitcoinAssets: z.record(z.string(), BitcoinAssetConfig), // key is token symbol\n walletAddresses: z.object({\n btc: BtcAddressSchema,\n avalanche: EvmAddressSchema,\n }),\n});\n\nconst BitcoinCurrentBridgeFeeEstimateDynamic = z.object({\n dustThreshold: z.number(),\n wrapFeeEstimate: z.object({\n minimumFeeAmount: z.string(),\n maximumFeeAmount: z.string(),\n feePercentage: z.number(),\n feePercentageDecimals: z.number(),\n }),\n unwrapFeeEstimate: z.object({\n bridgeToll: z.object({\n minimumFeeAmount: z.string(),\n maximumFeeAmount: z.string(),\n feePercentage: z.number(),\n feePercentageDecimals: z.number(),\n }),\n estimatedTxFee: z.object({\n constAmount: z.number(),\n numeratorPerSat: z.number(),\n denominatorPerSat: z.number(),\n }),\n }),\n});\n\nconst BitcoinCurrentBridgeFeeEstimateStatic = z.object({\n wrapFeeAmount: z.number(),\n constUnwrapFeeAmount: z.number(),\n unwrapFeeNumerator: z.number(),\n unwrapFeeDenominator: z.number(),\n dustThreshold: z.number(),\n});\n\nconst BitcoinNetworkInfo = z.object({\n minimumConfirmations: z.number(),\n minimumOnboardSize: z.number(),\n currentBridgeFeeEstimate: z.union([BitcoinCurrentBridgeFeeEstimateDynamic, BitcoinCurrentBridgeFeeEstimateStatic]),\n});\n\nconst BitcoinNonCritical = z.object({\n networkInfo: z.record(z.string(), BitcoinNetworkInfo).nullable(),\n});\n\n// BitcoinConfig supports both dynamic and static\nconst BitcoinConfig = z.object({\n criticalBitcoin: BitcoinCritical,\n nonCriticalBitcoin: BitcoinNonCritical,\n});\n\n/**\n * The schema for the Warden configuration used by the Unified Asset Transfer service.\n *\n * > [!NOTE]\n * >\n * > The typing for this schema is auto-generated and should not be manually edited.\n * > If changes are made to the schema, the typing must be regenerated.\n * >\n * > You can regenerate the typing by deleting the existing typing and using\n * > VS Code's quick fix feature to generate the new typing.\n * >\n * > This typing is necessary to satisfy the isolatedDeclarations TypeScript compiler option.\n *\n * > [!INFO]\n * >\n * > Warden bridge settings are updated every 15 seconds.\n */\nexport const WardenConfigSchema: z.ZodIntersection<\n z.ZodObject<\n {\n critical: z.ZodObject<\n {\n disableFrontend: z.ZodBoolean;\n addressBlocklist: z.ZodArray<z.ZodString>;\n assets: z.ZodRecord<\n z.ZodString,\n z.ZodObject<\n {\n tokenName: z.ZodString;\n nativeNetwork: z.ZodEnum<typeof Blockchain>;\n denomination: z.ZodNumber;\n nativeContractAddress: z.ZodType<\n `0x${string}`,\n unknown,\n z.core.$ZodTypeInternals<`0x${string}`, unknown>\n >;\n wrappedContractAddress: z.ZodType<\n `0x${string}`,\n unknown,\n z.core.$ZodTypeInternals<`0x${string}`, unknown>\n >;\n wrappedNetwork: z.ZodEnum<typeof Blockchain>;\n },\n z.core.$strip\n >\n >;\n networks: z.ZodRecord<\n z.ZodEnum<typeof Blockchain> & z.core.$partial,\n z.ZodUnion<readonly [z.ZodNumber, z.ZodUndefined]>\n >;\n walletAddresses: z.ZodRecord<\n z.ZodEnum<typeof Blockchain> & z.core.$partial,\n z.ZodType<`0x${string}`, unknown, z.core.$ZodTypeInternals<`0x${string}`, unknown>>\n >;\n },\n z.core.$strip\n >;\n nonCritical: z.ZodObject<\n {\n minimumConfirmations: z.ZodRecord<z.ZodEnum<typeof Blockchain> & z.core.$partial, z.ZodOptional<z.ZodNumber>>;\n unwrapFeeApproximation: z.ZodRecord<\n z.ZodString,\n z.ZodType<\n {\n feePercentage: number;\n feePercentageDecimals: number;\n maximumFeeAmount: bigint;\n minimumFeeAmount: bigint;\n },\n unknown,\n z.core.$ZodTypeInternals<\n {\n feePercentage: number;\n feePercentageDecimals: number;\n maximumFeeAmount: bigint;\n minimumFeeAmount: bigint;\n },\n unknown\n >\n >\n >;\n wrapFeeApproximation: z.ZodRecord<\n z.ZodString,\n z.ZodType<\n {\n feePercentage: number;\n feePercentageDecimals: number;\n maximumFeeAmount: bigint;\n minimumFeeAmount: bigint;\n },\n unknown,\n z.core.$ZodTypeInternals<\n {\n feePercentage: number;\n feePercentageDecimals: number;\n maximumFeeAmount: bigint;\n minimumFeeAmount: bigint;\n },\n unknown\n >\n >\n >;\n },\n z.core.$strip\n >;\n },\n z.core.$strip\n >,\n z.ZodObject<\n {\n criticalBitcoin: z.ZodObject<\n {\n disableFrontend: z.ZodBoolean;\n addressBlocklist: z.ZodArray<z.ZodString>;\n avalancheChainId: z.ZodNumber;\n bitcoinAssets: z.ZodRecord<\n z.ZodString,\n z.ZodObject<\n {\n tokenName: z.ZodString;\n bech32AddressPrefix: z.ZodUnion<readonly [z.ZodLiteral<'tb'>, z.ZodLiteral<'bc'>]>;\n wrappedContractAddress: z.ZodType<\n `0x${string}`,\n unknown,\n z.core.$ZodTypeInternals<`0x${string}`, unknown>\n >;\n wrappedNetwork: z.ZodEnum<typeof Blockchain>;\n },\n z.core.$strip\n >\n >;\n walletAddresses: z.ZodObject<\n {\n btc: z.ZodType<string, unknown, z.core.$ZodTypeInternals<string, unknown>>;\n avalanche: z.ZodType<`0x${string}`, unknown, z.core.$ZodTypeInternals<`0x${string}`, unknown>>;\n },\n z.core.$strip\n >;\n },\n z.core.$strip\n >;\n nonCriticalBitcoin: z.ZodObject<\n {\n networkInfo: z.ZodNullable<\n z.ZodRecord<\n z.ZodString,\n z.ZodObject<\n {\n minimumConfirmations: z.ZodNumber;\n minimumOnboardSize: z.ZodNumber;\n currentBridgeFeeEstimate: z.ZodUnion<\n readonly [\n z.ZodObject<\n {\n dustThreshold: z.ZodNumber;\n wrapFeeEstimate: z.ZodObject<\n {\n minimumFeeAmount: z.ZodString;\n maximumFeeAmount: z.ZodString;\n feePercentage: z.ZodNumber;\n feePercentageDecimals: z.ZodNumber;\n },\n z.core.$strip\n >;\n unwrapFeeEstimate: z.ZodObject<\n {\n bridgeToll: z.ZodObject<\n {\n minimumFeeAmount: z.ZodString;\n maximumFeeAmount: z.ZodString;\n feePercentage: z.ZodNumber;\n feePercentageDecimals: z.ZodNumber;\n },\n z.core.$strip\n >;\n estimatedTxFee: z.ZodObject<\n {\n constAmount: z.ZodNumber;\n numeratorPerSat: z.ZodNumber;\n denominatorPerSat: z.ZodNumber;\n },\n z.core.$strip\n >;\n },\n z.core.$strip\n >;\n },\n z.core.$strip\n >,\n z.ZodObject<\n {\n wrapFeeAmount: z.ZodNumber;\n constUnwrapFeeAmount: z.ZodNumber;\n unwrapFeeNumerator: z.ZodNumber;\n unwrapFeeDenominator: z.ZodNumber;\n dustThreshold: z.ZodNumber;\n },\n z.core.$strip\n >,\n ]\n >;\n },\n z.core.$strip\n >\n >\n >;\n },\n z.core.$strip\n >;\n },\n z.core.$strip\n >\n> = z.intersection(EthereumDynamicFeeConfig, BitcoinConfig);\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ require(`../_virtual/_rolldown/runtime.cjs`);const e=require(`../constants.cjs`),t=require(`../errors.cjs`),n=require(`./_warden-config-schema.cjs`);let r=require(`es-toolkit`);const i={configMismatchThreshold:1,disabledTokensOnNetwork:{[e.Blockchain.AVALANCHE]:[],[e.Blockchain.ETHEREUM]:[`FAU`]},environment:e.Environment.DEV,tokenInfoUrl:`https://raw.githubusercontent.com/ava-labs/avalanche-bridge-resources/main/token_list.test.json`,wardenConfigUrls:[`https://warden1-avax-dev-storage.s3.amazonaws.com/bridge_settings.json`,`https://warden2-avax-dev-storage.s3.amazonaws.com/bridge_settings.json`,`https://warden3-avax-dev-storage.s3.amazonaws.com/bridge_settings.json`]},a={...i,configMismatchThreshold:2,environment:e.Environment.TEST,wardenConfigUrls:[`https://warden-testnet.19bc5bfd-25de-4c8f-8c4c-5887a9e59ee7.net/bridge_settings.json`,`https://assets.warden-testnet.avalanche.protofire.io/bridge_settings.json`,`https://avalabs-warden-test-blob.s3.amazonaws.com/bridge_settings.json`,`https://avawarden.s3.amazonaws.com/bridge_settings.json`,`https://blob-storage-testnet.warden-avascan.info/bridge_settings.json`,`https://chainstack-ava-warden-testnet.s3.us-west-2.amazonaws.com/bridge_settings.json`,`https://em-warden-testnet.enclave-warden.com/bridge_settings.json`]},o={configMismatchThreshold:2,disabledTokensOnNetwork:{[e.Blockchain.AVALANCHE]:[],[e.Blockchain.ETHEREUM]:[`CRV`]},environment:e.Environment.PROD,tokenInfoUrl:`https://raw.githubusercontent.com/ava-labs/avalanche-bridge-resources/main/token_list.json`,wardenConfigUrls:[`https://warden-mainnet.19bc5bfd-25de-4c8f-8c4c-5887a9e59ee7.net/bridge_settings.json`,`https://assets.warden-mainnet.avalanche.protofire.io/bridge_settings.json`,`https://avawarden-prod.s3.amazonaws.com/bridge_settings.json`,`https://blob-storage-mainnet.warden-avascan.info/bridge_settings.json`,`https://chainstack-ava-warden-mainnet.s3.us-west-2.amazonaws.com/bridge_settings.json`,`https://em-warden-mainnet.enclave-warden.com/bridge_settings.json`,`https://warden-avax-storage.s3.amazonaws.com/bridge_settings.json`]},s={[e.Environment.DEV]:i,[e.Environment.PROD]:o,[e.Environment.TEST]:a};function c(e){return s[e]}async function l(e){let t=[],r=[];e.forEach(e=>r.push(fetch(e)));let i=await Promise.allSettled(r);for(let e of i)if(!(e.status===`rejected`||!e.value||!e.value.ok))try{let r=await e.value.json(),i=n.WardenConfigSchema.parse(r);t.push(i)}catch(e){console.error(e)}return t}function u(e){return e.map(n=>{if(n.critical.disableFrontend)throw new t.ServiceInitializationError(t.ErrorReason.CONFIG_NOT_AVAILABLE,`Disable frontend`);return{config:n,count:e.reduce((e,t)=>e+((0,r.isEqual)(n.critical,t.critical)?1:0),0)}})}const d={};async function f(e){if(d[e])return d[e];let{configMismatchThreshold:n,wardenConfigUrls:i}=c(e),a=(0,r.maxBy)(u(await l(i)),e=>e.count);if(!a||a.count<i.length-n)throw new t.ServiceInitializationError(t.ErrorReason.WARDEN_CONFIG_MISMATCH,`Warden config mismatch`);return d[e]=a.config,a.config}exports.getWardenConfig=f;
2
+ //# sourceMappingURL=_warden-config.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_warden-config.cjs","names":["Blockchain","Environment","WardenConfigSchema","ServiceInitializationError","ErrorReason"],"sources":["../../src/transfer-service/_warden-config.ts"],"sourcesContent":["import { isEqual, maxBy } from 'es-toolkit';\nimport type { z } from 'zod';\nimport { Blockchain, Environment } from '../constants';\nimport { ErrorReason, ServiceInitializationError } from '../errors';\nimport { WardenConfigSchema } from './_warden-config-schema';\n\nexport type WardenConfig = z.output<typeof WardenConfigSchema>;\n\nexport interface RuntimeConfig {\n readonly configMismatchThreshold: number;\n readonly disabledTokensOnNetwork: Partial<Readonly<Record<Blockchain, readonly string[]>>>;\n readonly environment: Environment;\n readonly tokenInfoUrl: string;\n readonly wardenConfigUrls: readonly string[];\n}\n\nconst WARDEN_DEV_CONFIG: RuntimeConfig = {\n configMismatchThreshold: 1, // 2 of the 3 must match\n disabledTokensOnNetwork: {\n [Blockchain.AVALANCHE]: [],\n [Blockchain.ETHEREUM]: ['FAU'],\n },\n environment: Environment.DEV,\n tokenInfoUrl: 'https://raw.githubusercontent.com/ava-labs/avalanche-bridge-resources/main/token_list.test.json',\n wardenConfigUrls: [\n 'https://warden1-avax-dev-storage.s3.amazonaws.com/bridge_settings.json',\n 'https://warden2-avax-dev-storage.s3.amazonaws.com/bridge_settings.json',\n 'https://warden3-avax-dev-storage.s3.amazonaws.com/bridge_settings.json',\n ],\n};\n\nconst WARDEN_TEST_CONFIG: RuntimeConfig = {\n ...WARDEN_DEV_CONFIG,\n configMismatchThreshold: 2, // 5 of the 7 must match\n environment: Environment.TEST,\n wardenConfigUrls: [\n 'https://warden-testnet.19bc5bfd-25de-4c8f-8c4c-5887a9e59ee7.net/bridge_settings.json',\n 'https://assets.warden-testnet.avalanche.protofire.io/bridge_settings.json',\n 'https://avalabs-warden-test-blob.s3.amazonaws.com/bridge_settings.json',\n 'https://avawarden.s3.amazonaws.com/bridge_settings.json',\n 'https://blob-storage-testnet.warden-avascan.info/bridge_settings.json',\n 'https://chainstack-ava-warden-testnet.s3.us-west-2.amazonaws.com/bridge_settings.json',\n 'https://em-warden-testnet.enclave-warden.com/bridge_settings.json',\n ],\n};\n\nconst WARDEN_PROD_CONFIG: RuntimeConfig = {\n configMismatchThreshold: 2,\n disabledTokensOnNetwork: {\n [Blockchain.AVALANCHE]: [],\n [Blockchain.ETHEREUM]: ['CRV'],\n },\n environment: Environment.PROD,\n tokenInfoUrl: 'https://raw.githubusercontent.com/ava-labs/avalanche-bridge-resources/main/token_list.json',\n wardenConfigUrls: [\n 'https://warden-mainnet.19bc5bfd-25de-4c8f-8c4c-5887a9e59ee7.net/bridge_settings.json',\n 'https://assets.warden-mainnet.avalanche.protofire.io/bridge_settings.json',\n 'https://avawarden-prod.s3.amazonaws.com/bridge_settings.json',\n 'https://blob-storage-mainnet.warden-avascan.info/bridge_settings.json',\n 'https://chainstack-ava-warden-mainnet.s3.us-west-2.amazonaws.com/bridge_settings.json',\n 'https://em-warden-mainnet.enclave-warden.com/bridge_settings.json',\n 'https://warden-avax-storage.s3.amazonaws.com/bridge_settings.json',\n ],\n};\n\nexport const RUNTIME_CONFIGS: Readonly<Record<Environment, RuntimeConfig>> = {\n [Environment.DEV]: WARDEN_DEV_CONFIG,\n [Environment.PROD]: WARDEN_PROD_CONFIG,\n [Environment.TEST]: WARDEN_TEST_CONFIG,\n} as const;\n\nfunction getRuntimeConfig(environment: Environment): RuntimeConfig {\n return RUNTIME_CONFIGS[environment];\n}\n\nasync function fetchConfigs(wardenConfigUrls: readonly string[]): Promise<readonly WardenConfig[]> {\n const configs: WardenConfig[] = [];\n const promises: Promise<Response>[] = [];\n\n wardenConfigUrls.forEach((url) => promises.push(fetch(url)));\n\n const responses = await Promise.allSettled(promises);\n\n for (const response of responses) {\n if (response.status === 'rejected' || !response.value || !response.value.ok) {\n continue;\n }\n\n try {\n const responseJson = await response.value.json();\n const parsedConfig = WardenConfigSchema.parse(responseJson);\n configs.push(parsedConfig);\n } catch (e) {\n console.error(e);\n }\n }\n\n return configs;\n}\n\ntype ConsolidatedConfig = {\n config: WardenConfig;\n count: number;\n};\ntype ConsolidatedConfigs = readonly ConsolidatedConfig[];\n\nfunction consolidateByCriticalConfig(configs: readonly WardenConfig[]): ConsolidatedConfigs {\n return configs.map((config) => {\n if (config.critical.disableFrontend) {\n throw new ServiceInitializationError(ErrorReason.CONFIG_NOT_AVAILABLE, 'Disable frontend');\n }\n\n const count = configs.reduce(\n (count, otherConfig) => count + (isEqual(config.critical, otherConfig.critical) ? 1 : 0),\n 0,\n );\n return { config, count };\n });\n}\n\nconst cachedWardenConfigs: Partial<Record<Environment, WardenConfig>> = {};\n\n/**\n * Fetches and returns the Warden configuration for the specified environment.\n *\n * > [!NOTE]\n * >\n * > The Warden configuration is cached after the first fetch for each environment.\n */\nexport async function getWardenConfig(environment: Environment): Promise<WardenConfig> {\n if (cachedWardenConfigs[environment]) {\n return cachedWardenConfigs[environment];\n }\n\n const { configMismatchThreshold, wardenConfigUrls } = getRuntimeConfig(environment);\n const configs = await fetchConfigs(wardenConfigUrls);\n const consolidatedConfigs = consolidateByCriticalConfig(configs);\n const mostFrequentConfig = maxBy(consolidatedConfigs, (consolidatedConfig) => consolidatedConfig.count);\n\n if (!mostFrequentConfig || mostFrequentConfig.count < wardenConfigUrls.length - configMismatchThreshold) {\n throw new ServiceInitializationError(ErrorReason.WARDEN_CONFIG_MISMATCH, 'Warden config mismatch');\n }\n\n cachedWardenConfigs[environment] = mostFrequentConfig.config;\n\n return mostFrequentConfig.config;\n}\n"],"mappings":"iLAgBA,MAAM,EAAmC,CACvC,wBAAyB,EACzB,wBAAyB,EACtBA,EAAAA,WAAW,WAAY,EAAE,EACzBA,EAAAA,WAAW,UAAW,CAAC,MAAM,CAC/B,CACD,YAAaC,EAAAA,YAAY,IACzB,aAAc,kGACd,iBAAkB,CAChB,yEACA,yEACA,yEACD,CACF,CAEK,EAAoC,CACxC,GAAG,EACH,wBAAyB,EACzB,YAAaA,EAAAA,YAAY,KACzB,iBAAkB,CAChB,uFACA,4EACA,yEACA,0DACA,wEACA,wFACA,oEACD,CACF,CAEK,EAAoC,CACxC,wBAAyB,EACzB,wBAAyB,EACtBD,EAAAA,WAAW,WAAY,EAAE,EACzBA,EAAAA,WAAW,UAAW,CAAC,MAAM,CAC/B,CACD,YAAaC,EAAAA,YAAY,KACzB,aAAc,6FACd,iBAAkB,CAChB,uFACA,4EACA,+DACA,wEACA,wFACA,oEACA,oEACD,CACF,CAEY,EAAgE,EAC1EA,EAAAA,YAAY,KAAM,GAClBA,EAAAA,YAAY,MAAO,GACnBA,EAAAA,YAAY,MAAO,EACrB,CAED,SAAS,EAAiB,EAAyC,CACjE,OAAO,EAAgB,GAGzB,eAAe,EAAa,EAAuE,CACjG,IAAM,EAA0B,EAAE,CAC5B,EAAgC,EAAE,CAExC,EAAiB,QAAS,GAAQ,EAAS,KAAK,MAAM,EAAI,CAAC,CAAC,CAE5D,IAAM,EAAY,MAAM,QAAQ,WAAW,EAAS,CAEpD,IAAK,IAAM,KAAY,EACjB,OAAS,SAAW,YAAc,CAAC,EAAS,OAAS,CAAC,EAAS,MAAM,IAIzE,GAAI,CACF,IAAM,EAAe,MAAM,EAAS,MAAM,MAAM,CAC1C,EAAeC,EAAAA,mBAAmB,MAAM,EAAa,CAC3D,EAAQ,KAAK,EAAa,OACnB,EAAG,CACV,QAAQ,MAAM,EAAE,CAIpB,OAAO,EAST,SAAS,EAA4B,EAAuD,CAC1F,OAAO,EAAQ,IAAK,GAAW,CAC7B,GAAI,EAAO,SAAS,gBAClB,MAAM,IAAIC,EAAAA,2BAA2BC,EAAAA,YAAY,qBAAsB,mBAAmB,CAO5F,MAAO,CAAE,SAAQ,MAJH,EAAQ,QACnB,EAAO,IAAgB,IAAA,EAAA,EAAA,SAAiB,EAAO,SAAU,EAAY,SAAS,CAAG,EAAI,GACtF,EACD,CACuB,EACxB,CAGJ,MAAM,EAAkE,EAAE,CAS1E,eAAsB,EAAgB,EAAiD,CACrF,GAAI,EAAoB,GACtB,OAAO,EAAoB,GAG7B,GAAM,CAAE,0BAAyB,oBAAqB,EAAiB,EAAY,CAG7E,GAAA,EAAA,EAAA,OADsB,EADZ,MAAM,EAAa,EAAiB,CACY,CACT,GAAuB,EAAmB,MAAM,CAEvG,GAAI,CAAC,GAAsB,EAAmB,MAAQ,EAAiB,OAAS,EAC9E,MAAM,IAAID,EAAAA,2BAA2BC,EAAAA,YAAY,uBAAwB,yBAAyB,CAKpG,MAFA,GAAoB,GAAe,EAAmB,OAE/C,EAAmB"}
@@ -0,0 +1,2 @@
1
+ import{Blockchain as e,Environment as t}from"../constants.js";import{ErrorReason as n,ServiceInitializationError as r}from"../errors.js";import{WardenConfigSchema as i}from"./_warden-config-schema.js";import{isEqual as a,maxBy as o}from"es-toolkit";const s={configMismatchThreshold:1,disabledTokensOnNetwork:{[e.AVALANCHE]:[],[e.ETHEREUM]:[`FAU`]},environment:t.DEV,tokenInfoUrl:`https://raw.githubusercontent.com/ava-labs/avalanche-bridge-resources/main/token_list.test.json`,wardenConfigUrls:[`https://warden1-avax-dev-storage.s3.amazonaws.com/bridge_settings.json`,`https://warden2-avax-dev-storage.s3.amazonaws.com/bridge_settings.json`,`https://warden3-avax-dev-storage.s3.amazonaws.com/bridge_settings.json`]},c={...s,configMismatchThreshold:2,environment:t.TEST,wardenConfigUrls:[`https://warden-testnet.19bc5bfd-25de-4c8f-8c4c-5887a9e59ee7.net/bridge_settings.json`,`https://assets.warden-testnet.avalanche.protofire.io/bridge_settings.json`,`https://avalabs-warden-test-blob.s3.amazonaws.com/bridge_settings.json`,`https://avawarden.s3.amazonaws.com/bridge_settings.json`,`https://blob-storage-testnet.warden-avascan.info/bridge_settings.json`,`https://chainstack-ava-warden-testnet.s3.us-west-2.amazonaws.com/bridge_settings.json`,`https://em-warden-testnet.enclave-warden.com/bridge_settings.json`]},l={configMismatchThreshold:2,disabledTokensOnNetwork:{[e.AVALANCHE]:[],[e.ETHEREUM]:[`CRV`]},environment:t.PROD,tokenInfoUrl:`https://raw.githubusercontent.com/ava-labs/avalanche-bridge-resources/main/token_list.json`,wardenConfigUrls:[`https://warden-mainnet.19bc5bfd-25de-4c8f-8c4c-5887a9e59ee7.net/bridge_settings.json`,`https://assets.warden-mainnet.avalanche.protofire.io/bridge_settings.json`,`https://avawarden-prod.s3.amazonaws.com/bridge_settings.json`,`https://blob-storage-mainnet.warden-avascan.info/bridge_settings.json`,`https://chainstack-ava-warden-mainnet.s3.us-west-2.amazonaws.com/bridge_settings.json`,`https://em-warden-mainnet.enclave-warden.com/bridge_settings.json`,`https://warden-avax-storage.s3.amazonaws.com/bridge_settings.json`]},u={[t.DEV]:s,[t.PROD]:l,[t.TEST]:c};function d(e){return u[e]}async function f(e){let t=[],n=[];e.forEach(e=>n.push(fetch(e)));let r=await Promise.allSettled(n);for(let e of r)if(!(e.status===`rejected`||!e.value||!e.value.ok))try{let n=await e.value.json(),r=i.parse(n);t.push(r)}catch(e){console.error(e)}return t}function p(e){return e.map(t=>{if(t.critical.disableFrontend)throw new r(n.CONFIG_NOT_AVAILABLE,`Disable frontend`);return{config:t,count:e.reduce((e,n)=>e+(a(t.critical,n.critical)?1:0),0)}})}const m={};async function h(e){if(m[e])return m[e];let{configMismatchThreshold:t,wardenConfigUrls:i}=d(e),a=o(p(await f(i)),e=>e.count);if(!a||a.count<i.length-t)throw new r(n.WARDEN_CONFIG_MISMATCH,`Warden config mismatch`);return m[e]=a.config,a.config}export{h as getWardenConfig};
2
+ //# sourceMappingURL=_warden-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_warden-config.js","names":[],"sources":["../../src/transfer-service/_warden-config.ts"],"sourcesContent":["import { isEqual, maxBy } from 'es-toolkit';\nimport type { z } from 'zod';\nimport { Blockchain, Environment } from '../constants';\nimport { ErrorReason, ServiceInitializationError } from '../errors';\nimport { WardenConfigSchema } from './_warden-config-schema';\n\nexport type WardenConfig = z.output<typeof WardenConfigSchema>;\n\nexport interface RuntimeConfig {\n readonly configMismatchThreshold: number;\n readonly disabledTokensOnNetwork: Partial<Readonly<Record<Blockchain, readonly string[]>>>;\n readonly environment: Environment;\n readonly tokenInfoUrl: string;\n readonly wardenConfigUrls: readonly string[];\n}\n\nconst WARDEN_DEV_CONFIG: RuntimeConfig = {\n configMismatchThreshold: 1, // 2 of the 3 must match\n disabledTokensOnNetwork: {\n [Blockchain.AVALANCHE]: [],\n [Blockchain.ETHEREUM]: ['FAU'],\n },\n environment: Environment.DEV,\n tokenInfoUrl: 'https://raw.githubusercontent.com/ava-labs/avalanche-bridge-resources/main/token_list.test.json',\n wardenConfigUrls: [\n 'https://warden1-avax-dev-storage.s3.amazonaws.com/bridge_settings.json',\n 'https://warden2-avax-dev-storage.s3.amazonaws.com/bridge_settings.json',\n 'https://warden3-avax-dev-storage.s3.amazonaws.com/bridge_settings.json',\n ],\n};\n\nconst WARDEN_TEST_CONFIG: RuntimeConfig = {\n ...WARDEN_DEV_CONFIG,\n configMismatchThreshold: 2, // 5 of the 7 must match\n environment: Environment.TEST,\n wardenConfigUrls: [\n 'https://warden-testnet.19bc5bfd-25de-4c8f-8c4c-5887a9e59ee7.net/bridge_settings.json',\n 'https://assets.warden-testnet.avalanche.protofire.io/bridge_settings.json',\n 'https://avalabs-warden-test-blob.s3.amazonaws.com/bridge_settings.json',\n 'https://avawarden.s3.amazonaws.com/bridge_settings.json',\n 'https://blob-storage-testnet.warden-avascan.info/bridge_settings.json',\n 'https://chainstack-ava-warden-testnet.s3.us-west-2.amazonaws.com/bridge_settings.json',\n 'https://em-warden-testnet.enclave-warden.com/bridge_settings.json',\n ],\n};\n\nconst WARDEN_PROD_CONFIG: RuntimeConfig = {\n configMismatchThreshold: 2,\n disabledTokensOnNetwork: {\n [Blockchain.AVALANCHE]: [],\n [Blockchain.ETHEREUM]: ['CRV'],\n },\n environment: Environment.PROD,\n tokenInfoUrl: 'https://raw.githubusercontent.com/ava-labs/avalanche-bridge-resources/main/token_list.json',\n wardenConfigUrls: [\n 'https://warden-mainnet.19bc5bfd-25de-4c8f-8c4c-5887a9e59ee7.net/bridge_settings.json',\n 'https://assets.warden-mainnet.avalanche.protofire.io/bridge_settings.json',\n 'https://avawarden-prod.s3.amazonaws.com/bridge_settings.json',\n 'https://blob-storage-mainnet.warden-avascan.info/bridge_settings.json',\n 'https://chainstack-ava-warden-mainnet.s3.us-west-2.amazonaws.com/bridge_settings.json',\n 'https://em-warden-mainnet.enclave-warden.com/bridge_settings.json',\n 'https://warden-avax-storage.s3.amazonaws.com/bridge_settings.json',\n ],\n};\n\nexport const RUNTIME_CONFIGS: Readonly<Record<Environment, RuntimeConfig>> = {\n [Environment.DEV]: WARDEN_DEV_CONFIG,\n [Environment.PROD]: WARDEN_PROD_CONFIG,\n [Environment.TEST]: WARDEN_TEST_CONFIG,\n} as const;\n\nfunction getRuntimeConfig(environment: Environment): RuntimeConfig {\n return RUNTIME_CONFIGS[environment];\n}\n\nasync function fetchConfigs(wardenConfigUrls: readonly string[]): Promise<readonly WardenConfig[]> {\n const configs: WardenConfig[] = [];\n const promises: Promise<Response>[] = [];\n\n wardenConfigUrls.forEach((url) => promises.push(fetch(url)));\n\n const responses = await Promise.allSettled(promises);\n\n for (const response of responses) {\n if (response.status === 'rejected' || !response.value || !response.value.ok) {\n continue;\n }\n\n try {\n const responseJson = await response.value.json();\n const parsedConfig = WardenConfigSchema.parse(responseJson);\n configs.push(parsedConfig);\n } catch (e) {\n console.error(e);\n }\n }\n\n return configs;\n}\n\ntype ConsolidatedConfig = {\n config: WardenConfig;\n count: number;\n};\ntype ConsolidatedConfigs = readonly ConsolidatedConfig[];\n\nfunction consolidateByCriticalConfig(configs: readonly WardenConfig[]): ConsolidatedConfigs {\n return configs.map((config) => {\n if (config.critical.disableFrontend) {\n throw new ServiceInitializationError(ErrorReason.CONFIG_NOT_AVAILABLE, 'Disable frontend');\n }\n\n const count = configs.reduce(\n (count, otherConfig) => count + (isEqual(config.critical, otherConfig.critical) ? 1 : 0),\n 0,\n );\n return { config, count };\n });\n}\n\nconst cachedWardenConfigs: Partial<Record<Environment, WardenConfig>> = {};\n\n/**\n * Fetches and returns the Warden configuration for the specified environment.\n *\n * > [!NOTE]\n * >\n * > The Warden configuration is cached after the first fetch for each environment.\n */\nexport async function getWardenConfig(environment: Environment): Promise<WardenConfig> {\n if (cachedWardenConfigs[environment]) {\n return cachedWardenConfigs[environment];\n }\n\n const { configMismatchThreshold, wardenConfigUrls } = getRuntimeConfig(environment);\n const configs = await fetchConfigs(wardenConfigUrls);\n const consolidatedConfigs = consolidateByCriticalConfig(configs);\n const mostFrequentConfig = maxBy(consolidatedConfigs, (consolidatedConfig) => consolidatedConfig.count);\n\n if (!mostFrequentConfig || mostFrequentConfig.count < wardenConfigUrls.length - configMismatchThreshold) {\n throw new ServiceInitializationError(ErrorReason.WARDEN_CONFIG_MISMATCH, 'Warden config mismatch');\n }\n\n cachedWardenConfigs[environment] = mostFrequentConfig.config;\n\n return mostFrequentConfig.config;\n}\n"],"mappings":"yPAgBA,MAAM,EAAmC,CACvC,wBAAyB,EACzB,wBAAyB,EACtB,EAAW,WAAY,EAAE,EACzB,EAAW,UAAW,CAAC,MAAM,CAC/B,CACD,YAAa,EAAY,IACzB,aAAc,kGACd,iBAAkB,CAChB,yEACA,yEACA,yEACD,CACF,CAEK,EAAoC,CACxC,GAAG,EACH,wBAAyB,EACzB,YAAa,EAAY,KACzB,iBAAkB,CAChB,uFACA,4EACA,yEACA,0DACA,wEACA,wFACA,oEACD,CACF,CAEK,EAAoC,CACxC,wBAAyB,EACzB,wBAAyB,EACtB,EAAW,WAAY,EAAE,EACzB,EAAW,UAAW,CAAC,MAAM,CAC/B,CACD,YAAa,EAAY,KACzB,aAAc,6FACd,iBAAkB,CAChB,uFACA,4EACA,+DACA,wEACA,wFACA,oEACA,oEACD,CACF,CAEY,EAAgE,EAC1E,EAAY,KAAM,GAClB,EAAY,MAAO,GACnB,EAAY,MAAO,EACrB,CAED,SAAS,EAAiB,EAAyC,CACjE,OAAO,EAAgB,GAGzB,eAAe,EAAa,EAAuE,CACjG,IAAM,EAA0B,EAAE,CAC5B,EAAgC,EAAE,CAExC,EAAiB,QAAS,GAAQ,EAAS,KAAK,MAAM,EAAI,CAAC,CAAC,CAE5D,IAAM,EAAY,MAAM,QAAQ,WAAW,EAAS,CAEpD,IAAK,IAAM,KAAY,EACjB,OAAS,SAAW,YAAc,CAAC,EAAS,OAAS,CAAC,EAAS,MAAM,IAIzE,GAAI,CACF,IAAM,EAAe,MAAM,EAAS,MAAM,MAAM,CAC1C,EAAe,EAAmB,MAAM,EAAa,CAC3D,EAAQ,KAAK,EAAa,OACnB,EAAG,CACV,QAAQ,MAAM,EAAE,CAIpB,OAAO,EAST,SAAS,EAA4B,EAAuD,CAC1F,OAAO,EAAQ,IAAK,GAAW,CAC7B,GAAI,EAAO,SAAS,gBAClB,MAAM,IAAI,EAA2B,EAAY,qBAAsB,mBAAmB,CAO5F,MAAO,CAAE,SAAQ,MAJH,EAAQ,QACnB,EAAO,IAAgB,GAAS,EAAQ,EAAO,SAAU,EAAY,SAAS,CAAG,EAAI,GACtF,EACD,CACuB,EACxB,CAGJ,MAAM,EAAkE,EAAE,CAS1E,eAAsB,EAAgB,EAAiD,CACrF,GAAI,EAAoB,GACtB,OAAO,EAAoB,GAG7B,GAAM,CAAE,0BAAyB,oBAAqB,EAAiB,EAAY,CAG7E,EAAqB,EADC,EADZ,MAAM,EAAa,EAAiB,CACY,CACT,GAAuB,EAAmB,MAAM,CAEvG,GAAI,CAAC,GAAsB,EAAmB,MAAQ,EAAiB,OAAS,EAC9E,MAAM,IAAI,EAA2B,EAAY,uBAAwB,yBAAyB,CAKpG,MAFA,GAAoB,GAAe,EAAmB,OAE/C,EAAmB"}
@@ -0,0 +1,2 @@
1
+ const e={type:require(`../../constants.cjs`).TokenType.NATIVE,name:`Ether`,symbol:`ETH`,decimals:18};exports.DEFAULT_AVALANCHE_EVM_FEE_ESTIMATION_MULTIPLIER=3n,exports.ETH_TOKEN=e;
2
+ //# sourceMappingURL=_constants.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_constants.cjs","names":["TokenType"],"sources":["../../../src/transfer-service/avalanche-evm/_constants.ts"],"sourcesContent":["import { TokenType } from '../../constants';\nimport type { NativeAsset } from '../../types/asset';\n\nexport const ETH_TOKEN: NativeAsset = {\n type: TokenType.NATIVE,\n name: 'Ether',\n symbol: 'ETH',\n decimals: 18,\n};\n\nexport const DEFAULT_AVALANCHE_EVM_FEE_ESTIMATION_MULTIPLIER = 3n;\n"],"mappings":"AAGA,MAAa,EAAyB,CACpC,oCAAMA,UAAU,OAChB,KAAM,QACN,OAAQ,MACR,SAAU,GACX"}
@@ -0,0 +1,2 @@
1
+ import{TokenType as e}from"../../constants.js";const t={type:e.NATIVE,name:`Ether`,symbol:`ETH`,decimals:18},n=3n;export{n as DEFAULT_AVALANCHE_EVM_FEE_ESTIMATION_MULTIPLIER,t as ETH_TOKEN};
2
+ //# sourceMappingURL=_constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_constants.js","names":[],"sources":["../../../src/transfer-service/avalanche-evm/_constants.ts"],"sourcesContent":["import { TokenType } from '../../constants';\nimport type { NativeAsset } from '../../types/asset';\n\nexport const ETH_TOKEN: NativeAsset = {\n type: TokenType.NATIVE,\n name: 'Ether',\n symbol: 'ETH',\n decimals: 18,\n};\n\nexport const DEFAULT_AVALANCHE_EVM_FEE_ESTIMATION_MULTIPLIER = 3n;\n"],"mappings":"+CAGA,MAAa,EAAyB,CACpC,KAAM,EAAU,OAChB,KAAM,QACN,OAAQ,MACR,SAAU,GACX,CAEY,EAAkD"}
@@ -0,0 +1,2 @@
1
+ require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../type-guards.cjs`),t=require(`../../../utils/caip.cjs`),n=require(`../../../_utils/chain.cjs`),r=require(`../_utils/validations.cjs`);let i=require(`viem`);function a({serviceAssets:a}){return({sourceAsset:o,sourceChainId:s,targetAsset:c,targetChainId:l})=>{if(!r.isValidChainCombination(s,l))return!1;let{reference:u}=t.splitCaip2ChainId(s),d=Number(u),f=Number.isFinite(d)&&n.isEthereumChainId(d)&&e.isNativeAsset(o)?a[s]?.find(t=>e.isNativeAsset(t)):e.isErc20Asset(o)?a[s]?.find(t=>e.isErc20Asset(t)&&(0,i.isAddressEqual)(o.address,t.address)):void 0;if(!f)return!1;let p=f.destinations[l];return!p||!e.isErc20Asset(c)||!(0,i.isAddress)(p.address)?!1:(0,i.isAddressEqual)(c.address,p.address)}}exports.analyzeSupportFactory=a;
2
+ //# sourceMappingURL=analyze-support.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze-support.cjs","names":["isValidChainCombination","splitCaip2ChainId","isEthereumChainId","isNativeAsset","isErc20Asset"],"sources":["../../../../src/transfer-service/avalanche-evm/_handlers/analyze-support.ts"],"sourcesContent":["import { isErc20Asset, isNativeAsset } from '../../../type-guards';\nimport type { ChainAssetMap } from '../../../types/asset';\nimport type { TransferService } from '../../../types/service';\nimport { isEthereumChainId } from '../../../_utils/chain';\nimport { isValidChainCombination } from '../_utils/validations';\nimport { splitCaip2ChainId } from '../../../utils/caip';\nimport { isAddress, isAddressEqual } from 'viem';\n\nexport interface AnalyzeSupportOptions {\n serviceAssets: ChainAssetMap;\n}\n\nexport function analyzeSupportFactory({ serviceAssets }: AnalyzeSupportOptions): TransferService['analyzeSupport'] {\n return ({ sourceAsset, sourceChainId, targetAsset, targetChainId }) => {\n // 1. Validate chain combination\n if (!isValidChainCombination(sourceChainId, targetChainId)) return false;\n\n // 2. Detect native ETH on Ethereum\n const { reference } = splitCaip2ChainId(sourceChainId);\n const chainRefNumber = Number(reference);\n const isNativeEthOnEthereum =\n Number.isFinite(chainRefNumber) && isEthereumChainId(chainRefNumber) && isNativeAsset(sourceAsset);\n\n // 3. Resolve the source service asset (native ETH entry or ERC-20 by address)\n const sourceServiceAsset = isNativeEthOnEthereum\n ? serviceAssets[sourceChainId]?.find((a) => isNativeAsset(a))\n : isErc20Asset(sourceAsset)\n ? serviceAssets[sourceChainId]?.find((a) => isErc20Asset(a) && isAddressEqual(sourceAsset.address, a.address))\n : undefined;\n\n if (!sourceServiceAsset) return false;\n\n // 4. Resolve destination info for target chain\n const destinationInfo = sourceServiceAsset.destinations[targetChainId];\n if (!destinationInfo) return false;\n\n // 5. Target must be ERC-20 with valid destination address and match\n if (!isErc20Asset(targetAsset)) return false;\n if (!isAddress(destinationInfo.address)) return false;\n return isAddressEqual(targetAsset.address, destinationInfo.address);\n };\n}\n"],"mappings":"wOAYA,SAAgB,EAAsB,CAAE,iBAA2E,CACjH,OAAQ,CAAE,cAAa,gBAAe,cAAa,mBAAoB,CAErE,GAAI,CAACA,EAAAA,wBAAwB,EAAe,EAAc,CAAE,MAAO,GAGnE,GAAM,CAAE,aAAcC,EAAAA,kBAAkB,EAAc,CAChD,EAAiB,OAAO,EAAU,CAKlC,EAHJ,OAAO,SAAS,EAAe,EAAIC,EAAAA,kBAAkB,EAAe,EAAIC,EAAAA,cAAc,EAAY,CAIhG,EAAc,IAAgB,KAAM,GAAMA,EAAAA,cAAc,EAAE,CAAC,CAC3DC,EAAAA,aAAa,EAAY,CACzB,EAAc,IAAgB,KAAM,GAAMA,EAAAA,aAAa,EAAE,GAAA,EAAA,EAAA,gBAAmB,EAAY,QAAS,EAAE,QAAQ,CAAC,CAC5G,IAAA,GAEJ,GAAI,CAAC,EAAoB,MAAO,GAGhC,IAAM,EAAkB,EAAmB,aAAa,GAMxD,MALI,CAAC,GAGD,CAACA,EAAAA,aAAa,EAAY,EAC1B,EAAA,EAAA,EAAA,WAAW,EAAgB,QAAQ,CAAS,IAChD,EAAA,EAAA,gBAAsB,EAAY,QAAS,EAAgB,QAAQ"}
@@ -0,0 +1,2 @@
1
+ import{isErc20Asset as e,isNativeAsset as t}from"../../../type-guards.js";import{splitCaip2ChainId as n}from"../../../utils/caip.js";import{isEthereumChainId as r}from"../../../_utils/chain.js";import{isValidChainCombination as i}from"../_utils/validations.js";import{isAddress as a,isAddressEqual as o}from"viem";function s({serviceAssets:s}){return({sourceAsset:c,sourceChainId:l,targetAsset:u,targetChainId:d})=>{if(!i(l,d))return!1;let{reference:f}=n(l),p=Number(f),m=Number.isFinite(p)&&r(p)&&t(c)?s[l]?.find(e=>t(e)):e(c)?s[l]?.find(t=>e(t)&&o(c.address,t.address)):void 0;if(!m)return!1;let h=m.destinations[d];return!h||!e(u)||!a(h.address)?!1:o(u.address,h.address)}}export{s as analyzeSupportFactory};
2
+ //# sourceMappingURL=analyze-support.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze-support.js","names":[],"sources":["../../../../src/transfer-service/avalanche-evm/_handlers/analyze-support.ts"],"sourcesContent":["import { isErc20Asset, isNativeAsset } from '../../../type-guards';\nimport type { ChainAssetMap } from '../../../types/asset';\nimport type { TransferService } from '../../../types/service';\nimport { isEthereumChainId } from '../../../_utils/chain';\nimport { isValidChainCombination } from '../_utils/validations';\nimport { splitCaip2ChainId } from '../../../utils/caip';\nimport { isAddress, isAddressEqual } from 'viem';\n\nexport interface AnalyzeSupportOptions {\n serviceAssets: ChainAssetMap;\n}\n\nexport function analyzeSupportFactory({ serviceAssets }: AnalyzeSupportOptions): TransferService['analyzeSupport'] {\n return ({ sourceAsset, sourceChainId, targetAsset, targetChainId }) => {\n // 1. Validate chain combination\n if (!isValidChainCombination(sourceChainId, targetChainId)) return false;\n\n // 2. Detect native ETH on Ethereum\n const { reference } = splitCaip2ChainId(sourceChainId);\n const chainRefNumber = Number(reference);\n const isNativeEthOnEthereum =\n Number.isFinite(chainRefNumber) && isEthereumChainId(chainRefNumber) && isNativeAsset(sourceAsset);\n\n // 3. Resolve the source service asset (native ETH entry or ERC-20 by address)\n const sourceServiceAsset = isNativeEthOnEthereum\n ? serviceAssets[sourceChainId]?.find((a) => isNativeAsset(a))\n : isErc20Asset(sourceAsset)\n ? serviceAssets[sourceChainId]?.find((a) => isErc20Asset(a) && isAddressEqual(sourceAsset.address, a.address))\n : undefined;\n\n if (!sourceServiceAsset) return false;\n\n // 4. Resolve destination info for target chain\n const destinationInfo = sourceServiceAsset.destinations[targetChainId];\n if (!destinationInfo) return false;\n\n // 5. Target must be ERC-20 with valid destination address and match\n if (!isErc20Asset(targetAsset)) return false;\n if (!isAddress(destinationInfo.address)) return false;\n return isAddressEqual(targetAsset.address, destinationInfo.address);\n };\n}\n"],"mappings":"0TAYA,SAAgB,EAAsB,CAAE,iBAA2E,CACjH,OAAQ,CAAE,cAAa,gBAAe,cAAa,mBAAoB,CAErE,GAAI,CAAC,EAAwB,EAAe,EAAc,CAAE,MAAO,GAGnE,GAAM,CAAE,aAAc,EAAkB,EAAc,CAChD,EAAiB,OAAO,EAAU,CAKlC,EAHJ,OAAO,SAAS,EAAe,EAAI,EAAkB,EAAe,EAAI,EAAc,EAAY,CAIhG,EAAc,IAAgB,KAAM,GAAM,EAAc,EAAE,CAAC,CAC3D,EAAa,EAAY,CACzB,EAAc,IAAgB,KAAM,GAAM,EAAa,EAAE,EAAI,EAAe,EAAY,QAAS,EAAE,QAAQ,CAAC,CAC5G,IAAA,GAEJ,GAAI,CAAC,EAAoB,MAAO,GAGhC,IAAM,EAAkB,EAAmB,aAAa,GAMxD,MALI,CAAC,GAGD,CAAC,EAAa,EAAY,EAC1B,CAAC,EAAU,EAAgB,QAAQ,CAAS,GACzC,EAAe,EAAY,QAAS,EAAgB,QAAQ"}
@@ -0,0 +1,2 @@
1
+ require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../errors.cjs`),t=require(`../../../type-guards.cjs`),n=require(`../../_utils.cjs`),r=require(`../../_evm-gas.cjs`),i=require(`../../_abis.cjs`),a=require(`../_utils/transfer-data.cjs`);let o=require(`viem`);function s({config:s}){let c=s.walletAddresses.ethereum;return async({amountIn:l,assetIn:u,fromAddress:d,sourceChain:f,targetChain:p},m)=>{if(!(0,o.isAddress)(d))throw new e.InvalidParamsError(e.ErrorReason.INVALID_PARAMS,`Invalid fromAddress: ${d}`);let{ethToAva:h,source:g}=a.getTransferData({assetIn:u,sourceChainId:f.chainId,targetChainId:p.chainId},s),_=n.getEvmClientForChain({chain:f}),v=0n;if(t.isNativeAsset(u)&&h){v+=await _.estimateContractGas({address:g.token.address,abi:i.WETH_ABI,functionName:`deposit`,account:d});try{v+=await _.estimateContractGas({address:g.token.address,abi:o.erc20Abi,functionName:`transfer`,account:d,args:[c,l]})}catch{let e=(0,o.encodeFunctionData)({abi:o.erc20Abi,functionName:`transfer`,args:[c,l]});v+=await _.estimateGas({data:e,account:d,to:c,value:l})}}else v=await _.estimateContractGas({address:g.token.address,abi:h?o.erc20Abi:i.WAVAX_ABI,functionName:h?`transfer`:`unwrap`,account:d,args:h?[c,l]:[l,0n]});let y=n.applyFeeUnitsBpsMargin(v,m?.feeUnitsMarginBps),b=await r.estimateEvmFeesPerGas(_,f,m?.overrides?.feeRateTier),x=m?.overrides?.maxFeePerGas??b.maxFeePerGas,S=m?.overrides?.maxPriorityFeePerGas??b.maxPriorityFeePerGas,C=y*x;return{asset:f.networkToken,totalFee:C,meta:{maxFeePerGas:x,maxPriorityFeePerGas:S}}}}exports.estimateNativeFeeFactory=s;
2
+ //# sourceMappingURL=estimate-native-fee.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"estimate-native-fee.cjs","names":["InvalidParamsError","ErrorReason","getTransferData","getEvmClientForChain","isNativeAsset","WETH_ABI","ERC20_ABI","WAVAX_ABI","applyFeeUnitsBpsMargin","estimateEvmFeesPerGas"],"sources":["../../../../src/transfer-service/avalanche-evm/_handlers/estimate-native-fee.ts"],"sourcesContent":["import { ErrorReason, InvalidParamsError } from '../../../errors';\nimport { isNativeAsset } from '../../../type-guards';\nimport type { TransferService } from '../../../types/service';\nimport { encodeFunctionData, erc20Abi as ERC20_ABI, isAddress } from 'viem';\nimport { applyFeeUnitsBpsMargin, getEvmClientForChain } from '../../_utils';\nimport { estimateEvmFeesPerGas } from '../../_evm-gas';\nimport { WAVAX_ABI, WETH_ABI } from '../../_abis';\nimport { getTransferData } from '../_utils/transfer-data';\nimport type { EvmConfig } from '../_types';\n\nexport interface EstimateNativeFeeFactoryConfig {\n config: EvmConfig;\n}\n\nexport function estimateNativeFeeFactory({\n config,\n}: EstimateNativeFeeFactoryConfig): TransferService['estimateNativeFee'] {\n const ethereumWalletAddress = config.walletAddresses.ethereum;\n\n return async ({ amountIn, assetIn, fromAddress, sourceChain, targetChain }, options) => {\n if (!isAddress(fromAddress)) {\n throw new InvalidParamsError(ErrorReason.INVALID_PARAMS, `Invalid fromAddress: ${fromAddress}`);\n }\n\n const { ethToAva, source } = getTransferData(\n { assetIn, sourceChainId: sourceChain.chainId, targetChainId: targetChain.chainId },\n config,\n );\n const client = getEvmClientForChain({ chain: sourceChain });\n\n let estimate = 0n;\n\n if (isNativeAsset(assetIn) && ethToAva) {\n // ETH -> WETH\n estimate += await client.estimateContractGas({\n address: source.token.address,\n abi: WETH_ABI,\n functionName: 'deposit',\n account: fromAddress,\n });\n // Ethereum -> Avalanche\n try {\n estimate += await client.estimateContractGas({\n address: source.token.address,\n abi: ERC20_ABI,\n functionName: 'transfer',\n account: fromAddress,\n args: [ethereumWalletAddress, amountIn],\n });\n } catch {\n // When estimating the gas before performing the transfer asset, the WETH balance might be too low to perform the estimation.\n // This is a backup way to estimate the gas. But the result usually comes out a bit lower than estimateContractGas.\n const transferData = encodeFunctionData({\n abi: ERC20_ABI,\n functionName: 'transfer',\n args: [ethereumWalletAddress, amountIn],\n });\n\n estimate += await client.estimateGas({\n data: transferData,\n account: fromAddress,\n to: ethereumWalletAddress,\n value: amountIn,\n });\n }\n } else {\n estimate = await client.estimateContractGas({\n address: source.token.address,\n abi: ethToAva ? ERC20_ABI : WAVAX_ABI,\n functionName: ethToAva ? 'transfer' : 'unwrap',\n account: fromAddress,\n args: ethToAva ? [ethereumWalletAddress, amountIn] : [amountIn, 0n],\n });\n }\n\n const gasWithMargin = applyFeeUnitsBpsMargin(estimate, options?.feeUnitsMarginBps);\n\n const fees = await estimateEvmFeesPerGas(client, sourceChain, options?.overrides?.feeRateTier);\n\n const maxFeePerGas = options?.overrides?.maxFeePerGas ?? fees.maxFeePerGas;\n const maxPriorityFeePerGas = options?.overrides?.maxPriorityFeePerGas ?? fees.maxPriorityFeePerGas;\n\n const totalFee = gasWithMargin * maxFeePerGas;\n\n return {\n asset: sourceChain.networkToken,\n totalFee,\n meta: {\n maxFeePerGas,\n maxPriorityFeePerGas,\n },\n };\n };\n}\n"],"mappings":"0RAcA,SAAgB,EAAyB,CACvC,UACuE,CACvE,IAAM,EAAwB,EAAO,gBAAgB,SAErD,OAAO,MAAO,CAAE,WAAU,UAAS,cAAa,cAAa,eAAe,IAAY,CACtF,GAAI,EAAA,EAAA,EAAA,WAAW,EAAY,CACzB,MAAM,IAAIA,EAAAA,mBAAmBC,EAAAA,YAAY,eAAgB,wBAAwB,IAAc,CAGjG,GAAM,CAAE,WAAU,UAAWC,EAAAA,gBAC3B,CAAE,UAAS,cAAe,EAAY,QAAS,cAAe,EAAY,QAAS,CACnF,EACD,CACK,EAASC,EAAAA,qBAAqB,CAAE,MAAO,EAAa,CAAC,CAEvD,EAAW,GAEf,GAAIC,EAAAA,cAAc,EAAQ,EAAI,EAAU,CAEtC,GAAY,MAAM,EAAO,oBAAoB,CAC3C,QAAS,EAAO,MAAM,QACtB,IAAKC,EAAAA,SACL,aAAc,UACd,QAAS,EACV,CAAC,CAEF,GAAI,CACF,GAAY,MAAM,EAAO,oBAAoB,CAC3C,QAAS,EAAO,MAAM,QACtB,IAAKC,EAAAA,SACL,aAAc,WACd,QAAS,EACT,KAAM,CAAC,EAAuB,EAAS,CACxC,CAAC,MACI,CAGN,IAAM,GAAA,EAAA,EAAA,oBAAkC,CACtC,IAAKA,EAAAA,SACL,aAAc,WACd,KAAM,CAAC,EAAuB,EAAS,CACxC,CAAC,CAEF,GAAY,MAAM,EAAO,YAAY,CACnC,KAAM,EACN,QAAS,EACT,GAAI,EACJ,MAAO,EACR,CAAC,OAGJ,EAAW,MAAM,EAAO,oBAAoB,CAC1C,QAAS,EAAO,MAAM,QACtB,IAAK,EAAWA,EAAAA,SAAYC,EAAAA,UAC5B,aAAc,EAAW,WAAa,SACtC,QAAS,EACT,KAAM,EAAW,CAAC,EAAuB,EAAS,CAAG,CAAC,EAAU,GAAG,CACpE,CAAC,CAGJ,IAAM,EAAgBC,EAAAA,uBAAuB,EAAU,GAAS,kBAAkB,CAE5E,EAAO,MAAMC,EAAAA,sBAAsB,EAAQ,EAAa,GAAS,WAAW,YAAY,CAExF,EAAe,GAAS,WAAW,cAAgB,EAAK,aACxD,EAAuB,GAAS,WAAW,sBAAwB,EAAK,qBAExE,EAAW,EAAgB,EAEjC,MAAO,CACL,MAAO,EAAY,aACnB,WACA,KAAM,CACJ,eACA,uBACD,CACF"}
@@ -0,0 +1,2 @@
1
+ import{ErrorReason as e,InvalidParamsError as t}from"../../../errors.js";import{isNativeAsset as n}from"../../../type-guards.js";import{applyFeeUnitsBpsMargin as r,getEvmClientForChain as i}from"../../_utils.js";import{estimateEvmFeesPerGas as a}from"../../_evm-gas.js";import{WAVAX_ABI as o,WETH_ABI as s}from"../../_abis.js";import{getTransferData as c}from"../_utils/transfer-data.js";import{encodeFunctionData as l,erc20Abi as u,isAddress as d}from"viem";function f({config:f}){let p=f.walletAddresses.ethereum;return async({amountIn:m,assetIn:h,fromAddress:g,sourceChain:_,targetChain:v},y)=>{if(!d(g))throw new t(e.INVALID_PARAMS,`Invalid fromAddress: ${g}`);let{ethToAva:b,source:x}=c({assetIn:h,sourceChainId:_.chainId,targetChainId:v.chainId},f),S=i({chain:_}),C=0n;if(n(h)&&b){C+=await S.estimateContractGas({address:x.token.address,abi:s,functionName:`deposit`,account:g});try{C+=await S.estimateContractGas({address:x.token.address,abi:u,functionName:`transfer`,account:g,args:[p,m]})}catch{let e=l({abi:u,functionName:`transfer`,args:[p,m]});C+=await S.estimateGas({data:e,account:g,to:p,value:m})}}else C=await S.estimateContractGas({address:x.token.address,abi:b?u:o,functionName:b?`transfer`:`unwrap`,account:g,args:b?[p,m]:[m,0n]});let w=r(C,y?.feeUnitsMarginBps),T=await a(S,_,y?.overrides?.feeRateTier),E=y?.overrides?.maxFeePerGas??T.maxFeePerGas,D=y?.overrides?.maxPriorityFeePerGas??T.maxPriorityFeePerGas,O=w*E;return{asset:_.networkToken,totalFee:O,meta:{maxFeePerGas:E,maxPriorityFeePerGas:D}}}}export{f as estimateNativeFeeFactory};
2
+ //# sourceMappingURL=estimate-native-fee.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"estimate-native-fee.js","names":["ERC20_ABI"],"sources":["../../../../src/transfer-service/avalanche-evm/_handlers/estimate-native-fee.ts"],"sourcesContent":["import { ErrorReason, InvalidParamsError } from '../../../errors';\nimport { isNativeAsset } from '../../../type-guards';\nimport type { TransferService } from '../../../types/service';\nimport { encodeFunctionData, erc20Abi as ERC20_ABI, isAddress } from 'viem';\nimport { applyFeeUnitsBpsMargin, getEvmClientForChain } from '../../_utils';\nimport { estimateEvmFeesPerGas } from '../../_evm-gas';\nimport { WAVAX_ABI, WETH_ABI } from '../../_abis';\nimport { getTransferData } from '../_utils/transfer-data';\nimport type { EvmConfig } from '../_types';\n\nexport interface EstimateNativeFeeFactoryConfig {\n config: EvmConfig;\n}\n\nexport function estimateNativeFeeFactory({\n config,\n}: EstimateNativeFeeFactoryConfig): TransferService['estimateNativeFee'] {\n const ethereumWalletAddress = config.walletAddresses.ethereum;\n\n return async ({ amountIn, assetIn, fromAddress, sourceChain, targetChain }, options) => {\n if (!isAddress(fromAddress)) {\n throw new InvalidParamsError(ErrorReason.INVALID_PARAMS, `Invalid fromAddress: ${fromAddress}`);\n }\n\n const { ethToAva, source } = getTransferData(\n { assetIn, sourceChainId: sourceChain.chainId, targetChainId: targetChain.chainId },\n config,\n );\n const client = getEvmClientForChain({ chain: sourceChain });\n\n let estimate = 0n;\n\n if (isNativeAsset(assetIn) && ethToAva) {\n // ETH -> WETH\n estimate += await client.estimateContractGas({\n address: source.token.address,\n abi: WETH_ABI,\n functionName: 'deposit',\n account: fromAddress,\n });\n // Ethereum -> Avalanche\n try {\n estimate += await client.estimateContractGas({\n address: source.token.address,\n abi: ERC20_ABI,\n functionName: 'transfer',\n account: fromAddress,\n args: [ethereumWalletAddress, amountIn],\n });\n } catch {\n // When estimating the gas before performing the transfer asset, the WETH balance might be too low to perform the estimation.\n // This is a backup way to estimate the gas. But the result usually comes out a bit lower than estimateContractGas.\n const transferData = encodeFunctionData({\n abi: ERC20_ABI,\n functionName: 'transfer',\n args: [ethereumWalletAddress, amountIn],\n });\n\n estimate += await client.estimateGas({\n data: transferData,\n account: fromAddress,\n to: ethereumWalletAddress,\n value: amountIn,\n });\n }\n } else {\n estimate = await client.estimateContractGas({\n address: source.token.address,\n abi: ethToAva ? ERC20_ABI : WAVAX_ABI,\n functionName: ethToAva ? 'transfer' : 'unwrap',\n account: fromAddress,\n args: ethToAva ? [ethereumWalletAddress, amountIn] : [amountIn, 0n],\n });\n }\n\n const gasWithMargin = applyFeeUnitsBpsMargin(estimate, options?.feeUnitsMarginBps);\n\n const fees = await estimateEvmFeesPerGas(client, sourceChain, options?.overrides?.feeRateTier);\n\n const maxFeePerGas = options?.overrides?.maxFeePerGas ?? fees.maxFeePerGas;\n const maxPriorityFeePerGas = options?.overrides?.maxPriorityFeePerGas ?? fees.maxPriorityFeePerGas;\n\n const totalFee = gasWithMargin * maxFeePerGas;\n\n return {\n asset: sourceChain.networkToken,\n totalFee,\n meta: {\n maxFeePerGas,\n maxPriorityFeePerGas,\n },\n };\n };\n}\n"],"mappings":"2cAcA,SAAgB,EAAyB,CACvC,UACuE,CACvE,IAAM,EAAwB,EAAO,gBAAgB,SAErD,OAAO,MAAO,CAAE,WAAU,UAAS,cAAa,cAAa,eAAe,IAAY,CACtF,GAAI,CAAC,EAAU,EAAY,CACzB,MAAM,IAAI,EAAmB,EAAY,eAAgB,wBAAwB,IAAc,CAGjG,GAAM,CAAE,WAAU,UAAW,EAC3B,CAAE,UAAS,cAAe,EAAY,QAAS,cAAe,EAAY,QAAS,CACnF,EACD,CACK,EAAS,EAAqB,CAAE,MAAO,EAAa,CAAC,CAEvD,EAAW,GAEf,GAAI,EAAc,EAAQ,EAAI,EAAU,CAEtC,GAAY,MAAM,EAAO,oBAAoB,CAC3C,QAAS,EAAO,MAAM,QACtB,IAAK,EACL,aAAc,UACd,QAAS,EACV,CAAC,CAEF,GAAI,CACF,GAAY,MAAM,EAAO,oBAAoB,CAC3C,QAAS,EAAO,MAAM,QACtB,IAAKA,EACL,aAAc,WACd,QAAS,EACT,KAAM,CAAC,EAAuB,EAAS,CACxC,CAAC,MACI,CAGN,IAAM,EAAe,EAAmB,CACtC,IAAKA,EACL,aAAc,WACd,KAAM,CAAC,EAAuB,EAAS,CACxC,CAAC,CAEF,GAAY,MAAM,EAAO,YAAY,CACnC,KAAM,EACN,QAAS,EACT,GAAI,EACJ,MAAO,EACR,CAAC,OAGJ,EAAW,MAAM,EAAO,oBAAoB,CAC1C,QAAS,EAAO,MAAM,QACtB,IAAK,EAAWA,EAAY,EAC5B,aAAc,EAAW,WAAa,SACtC,QAAS,EACT,KAAM,EAAW,CAAC,EAAuB,EAAS,CAAG,CAAC,EAAU,GAAG,CACpE,CAAC,CAGJ,IAAM,EAAgB,EAAuB,EAAU,GAAS,kBAAkB,CAE5E,EAAO,MAAM,EAAsB,EAAQ,EAAa,GAAS,WAAW,YAAY,CAExF,EAAe,GAAS,WAAW,cAAgB,EAAK,aACxD,EAAuB,GAAS,WAAW,sBAAwB,EAAK,qBAExE,EAAW,EAAgB,EAEjC,MAAO,CACL,MAAO,EAAY,aACnB,WACA,KAAM,CACJ,eACA,uBACD,CACF"}
@@ -0,0 +1,2 @@
1
+ const e=require(`../../../constants.cjs`),t=require(`../_constants.cjs`);function n({avalancheTokens:n,ethereumTokens:r,nativeTokenConfig:i}){return async()=>{let a=Object.values(r).reduce((t,n)=>{if(n.token.symbol===`USDC`)return t;let r=n.chainId,i=n.target.chainId,a={...n.token,destinations:{[i]:{address:n.target.tokenAddress,bridgeProviders:[e.ServiceType.AVALANCHE_EVM]}},swapProviders:[]},o=t[r]??[];return o.push(a),t[r]=o,t},{}),o=Object.values(n).reduce((t,n)=>{if(n.token.symbol===`USDC.e`)return t;let r=n.chainId,i=n.target.chainId,a={...n.token,destinations:{[i]:{address:n.target.tokenAddress,bridgeProviders:[e.ServiceType.AVALANCHE_EVM]}},swapProviders:[]},o=t[r]??[];return o.push(a),t[r]=o,t},a),s=e.EthereumChainIds.MAINNET;o[s]&&o[s].push({...t.ETH_TOKEN,destinations:{[e.AvalancheChainIds.MAINNET]:{address:i.avalancheToken.token.address,bridgeProviders:[e.ServiceType.AVALANCHE_EVM]}},swapProviders:[]});let c=e.EthereumChainIds.SEPOLIA;return o[c]&&o[c].push({...t.ETH_TOKEN,destinations:{[e.AvalancheChainIds.FUJI]:{address:i.avalancheToken.token.address,bridgeProviders:[e.ServiceType.AVALANCHE_EVM]}},swapProviders:[]}),o}}exports.getAssetsFactory=n;
2
+ //# sourceMappingURL=get-assets.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-assets.cjs","names":["ServiceType","EthereumChainIds","ETH_TOKEN","AvalancheChainIds"],"sources":["../../../../src/transfer-service/avalanche-evm/_handlers/get-assets.ts"],"sourcesContent":["import { AvalancheChainIds, EthereumChainIds, ServiceType } from '../../../constants';\nimport type { ChainAssetMap } from '../../../types/asset';\nimport type { TransferService } from '../../../types/service';\nimport type { DeepMutable } from '../../../types/utility-types';\nimport { ETH_TOKEN } from '../_constants';\nimport type { AvalancheTokens, EthereumTokens } from '../_types';\n\nexport interface GetAssetsFactoryConfig {\n avalancheTokens: AvalancheTokens;\n ethereumTokens: EthereumTokens;\n nativeTokenConfig: {\n ethereumToken: EthereumTokens[keyof EthereumTokens];\n avalancheToken: AvalancheTokens[keyof AvalancheTokens];\n };\n}\n\nexport function getAssetsFactory({\n avalancheTokens,\n ethereumTokens,\n nativeTokenConfig,\n}: GetAssetsFactoryConfig): TransferService['getAssets'] {\n return async () => {\n const assetsWithEthTokens = Object.values(ethereumTokens).reduce((list, tokenConfig) => {\n // USDC is supported by CCTP; skip adding from Ethereum side\n if (tokenConfig.token.symbol === 'USDC') {\n return list;\n }\n const ethChainId = tokenConfig.chainId;\n const avaChainId = tokenConfig.target.chainId;\n\n const bridgeAsset = {\n ...tokenConfig.token,\n destinations: {\n [avaChainId]: {\n address: tokenConfig.target.tokenAddress,\n bridgeProviders: [ServiceType.AVALANCHE_EVM],\n },\n },\n swapProviders: [],\n };\n\n const currentList = list[ethChainId] ?? [];\n currentList.push(bridgeAsset);\n list[ethChainId] = currentList;\n\n return list;\n }, {} as DeepMutable<ChainAssetMap>);\n\n const allAssets = Object.values(avalancheTokens).reduce((list, tokenConfig) => {\n // USDC.e is supported elsewhere; skip adding from Avalanche side\n if (tokenConfig.token.symbol === 'USDC.e') {\n return list;\n }\n const avaChainId = tokenConfig.chainId;\n const ethChainId = tokenConfig.target.chainId;\n\n const bridgeAsset = {\n ...tokenConfig.token,\n destinations: {\n [ethChainId]: {\n address: tokenConfig.target.tokenAddress,\n bridgeProviders: [ServiceType.AVALANCHE_EVM],\n },\n },\n swapProviders: [],\n };\n\n const currentList = list[avaChainId] ?? [];\n currentList.push(bridgeAsset);\n list[avaChainId] = currentList;\n\n return list;\n }, assetsWithEthTokens);\n\n const homesteadKey = EthereumChainIds.MAINNET;\n if (allAssets[homesteadKey]) {\n allAssets[homesteadKey].push({\n ...ETH_TOKEN,\n destinations: {\n [AvalancheChainIds.MAINNET]: {\n // Native ETH on Ethereum maps to WETH.e on Avalanche\n address: nativeTokenConfig.avalancheToken.token.address,\n bridgeProviders: [ServiceType.AVALANCHE_EVM],\n },\n },\n swapProviders: [],\n });\n }\n\n const sepoliaKey = EthereumChainIds.SEPOLIA;\n if (allAssets[sepoliaKey]) {\n allAssets[sepoliaKey].push({\n ...ETH_TOKEN,\n destinations: {\n [AvalancheChainIds.FUJI]: {\n address: nativeTokenConfig.avalancheToken.token.address,\n bridgeProviders: [ServiceType.AVALANCHE_EVM],\n },\n },\n swapProviders: [],\n });\n }\n\n return allAssets as ChainAssetMap;\n };\n}\n"],"mappings":"yEAgBA,SAAgB,EAAiB,CAC/B,kBACA,iBACA,qBACuD,CACvD,OAAO,SAAY,CACjB,IAAM,EAAsB,OAAO,OAAO,EAAe,CAAC,QAAQ,EAAM,IAAgB,CAEtF,GAAI,EAAY,MAAM,SAAW,OAC/B,OAAO,EAET,IAAM,EAAa,EAAY,QACzB,EAAa,EAAY,OAAO,QAEhC,EAAc,CAClB,GAAG,EAAY,MACf,aAAc,EACX,GAAa,CACZ,QAAS,EAAY,OAAO,aAC5B,gBAAiB,CAACA,EAAAA,YAAY,cAAc,CAC7C,CACF,CACD,cAAe,EAAE,CAClB,CAEK,EAAc,EAAK,IAAe,EAAE,CAI1C,OAHA,EAAY,KAAK,EAAY,CAC7B,EAAK,GAAc,EAEZ,GACN,EAAE,CAA+B,CAE9B,EAAY,OAAO,OAAO,EAAgB,CAAC,QAAQ,EAAM,IAAgB,CAE7E,GAAI,EAAY,MAAM,SAAW,SAC/B,OAAO,EAET,IAAM,EAAa,EAAY,QACzB,EAAa,EAAY,OAAO,QAEhC,EAAc,CAClB,GAAG,EAAY,MACf,aAAc,EACX,GAAa,CACZ,QAAS,EAAY,OAAO,aAC5B,gBAAiB,CAACA,EAAAA,YAAY,cAAc,CAC7C,CACF,CACD,cAAe,EAAE,CAClB,CAEK,EAAc,EAAK,IAAe,EAAE,CAI1C,OAHA,EAAY,KAAK,EAAY,CAC7B,EAAK,GAAc,EAEZ,GACN,EAAoB,CAEjB,EAAeC,EAAAA,iBAAiB,QAClC,EAAU,IACZ,EAAU,GAAc,KAAK,CAC3B,GAAGC,EAAAA,UACH,aAAc,EACXC,EAAAA,kBAAkB,SAAU,CAE3B,QAAS,EAAkB,eAAe,MAAM,QAChD,gBAAiB,CAACH,EAAAA,YAAY,cAAc,CAC7C,CACF,CACD,cAAe,EAAE,CAClB,CAAC,CAGJ,IAAM,EAAaC,EAAAA,iBAAiB,QAcpC,OAbI,EAAU,IACZ,EAAU,GAAY,KAAK,CACzB,GAAGC,EAAAA,UACH,aAAc,EACXC,EAAAA,kBAAkB,MAAO,CACxB,QAAS,EAAkB,eAAe,MAAM,QAChD,gBAAiB,CAACH,EAAAA,YAAY,cAAc,CAC7C,CACF,CACD,cAAe,EAAE,CAClB,CAAC,CAGG"}
@@ -0,0 +1,2 @@
1
+ import{AvalancheChainIds as e,EthereumChainIds as t,ServiceType as n}from"../../../constants.js";import{ETH_TOKEN as r}from"../_constants.js";function i({avalancheTokens:i,ethereumTokens:a,nativeTokenConfig:o}){return async()=>{let s=Object.values(a).reduce((e,t)=>{if(t.token.symbol===`USDC`)return e;let r=t.chainId,i=t.target.chainId,a={...t.token,destinations:{[i]:{address:t.target.tokenAddress,bridgeProviders:[n.AVALANCHE_EVM]}},swapProviders:[]},o=e[r]??[];return o.push(a),e[r]=o,e},{}),c=Object.values(i).reduce((e,t)=>{if(t.token.symbol===`USDC.e`)return e;let r=t.chainId,i=t.target.chainId,a={...t.token,destinations:{[i]:{address:t.target.tokenAddress,bridgeProviders:[n.AVALANCHE_EVM]}},swapProviders:[]},o=e[r]??[];return o.push(a),e[r]=o,e},s),l=t.MAINNET;c[l]&&c[l].push({...r,destinations:{[e.MAINNET]:{address:o.avalancheToken.token.address,bridgeProviders:[n.AVALANCHE_EVM]}},swapProviders:[]});let u=t.SEPOLIA;return c[u]&&c[u].push({...r,destinations:{[e.FUJI]:{address:o.avalancheToken.token.address,bridgeProviders:[n.AVALANCHE_EVM]}},swapProviders:[]}),c}}export{i as getAssetsFactory};
2
+ //# sourceMappingURL=get-assets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-assets.js","names":[],"sources":["../../../../src/transfer-service/avalanche-evm/_handlers/get-assets.ts"],"sourcesContent":["import { AvalancheChainIds, EthereumChainIds, ServiceType } from '../../../constants';\nimport type { ChainAssetMap } from '../../../types/asset';\nimport type { TransferService } from '../../../types/service';\nimport type { DeepMutable } from '../../../types/utility-types';\nimport { ETH_TOKEN } from '../_constants';\nimport type { AvalancheTokens, EthereumTokens } from '../_types';\n\nexport interface GetAssetsFactoryConfig {\n avalancheTokens: AvalancheTokens;\n ethereumTokens: EthereumTokens;\n nativeTokenConfig: {\n ethereumToken: EthereumTokens[keyof EthereumTokens];\n avalancheToken: AvalancheTokens[keyof AvalancheTokens];\n };\n}\n\nexport function getAssetsFactory({\n avalancheTokens,\n ethereumTokens,\n nativeTokenConfig,\n}: GetAssetsFactoryConfig): TransferService['getAssets'] {\n return async () => {\n const assetsWithEthTokens = Object.values(ethereumTokens).reduce((list, tokenConfig) => {\n // USDC is supported by CCTP; skip adding from Ethereum side\n if (tokenConfig.token.symbol === 'USDC') {\n return list;\n }\n const ethChainId = tokenConfig.chainId;\n const avaChainId = tokenConfig.target.chainId;\n\n const bridgeAsset = {\n ...tokenConfig.token,\n destinations: {\n [avaChainId]: {\n address: tokenConfig.target.tokenAddress,\n bridgeProviders: [ServiceType.AVALANCHE_EVM],\n },\n },\n swapProviders: [],\n };\n\n const currentList = list[ethChainId] ?? [];\n currentList.push(bridgeAsset);\n list[ethChainId] = currentList;\n\n return list;\n }, {} as DeepMutable<ChainAssetMap>);\n\n const allAssets = Object.values(avalancheTokens).reduce((list, tokenConfig) => {\n // USDC.e is supported elsewhere; skip adding from Avalanche side\n if (tokenConfig.token.symbol === 'USDC.e') {\n return list;\n }\n const avaChainId = tokenConfig.chainId;\n const ethChainId = tokenConfig.target.chainId;\n\n const bridgeAsset = {\n ...tokenConfig.token,\n destinations: {\n [ethChainId]: {\n address: tokenConfig.target.tokenAddress,\n bridgeProviders: [ServiceType.AVALANCHE_EVM],\n },\n },\n swapProviders: [],\n };\n\n const currentList = list[avaChainId] ?? [];\n currentList.push(bridgeAsset);\n list[avaChainId] = currentList;\n\n return list;\n }, assetsWithEthTokens);\n\n const homesteadKey = EthereumChainIds.MAINNET;\n if (allAssets[homesteadKey]) {\n allAssets[homesteadKey].push({\n ...ETH_TOKEN,\n destinations: {\n [AvalancheChainIds.MAINNET]: {\n // Native ETH on Ethereum maps to WETH.e on Avalanche\n address: nativeTokenConfig.avalancheToken.token.address,\n bridgeProviders: [ServiceType.AVALANCHE_EVM],\n },\n },\n swapProviders: [],\n });\n }\n\n const sepoliaKey = EthereumChainIds.SEPOLIA;\n if (allAssets[sepoliaKey]) {\n allAssets[sepoliaKey].push({\n ...ETH_TOKEN,\n destinations: {\n [AvalancheChainIds.FUJI]: {\n address: nativeTokenConfig.avalancheToken.token.address,\n bridgeProviders: [ServiceType.AVALANCHE_EVM],\n },\n },\n swapProviders: [],\n });\n }\n\n return allAssets as ChainAssetMap;\n };\n}\n"],"mappings":"8IAgBA,SAAgB,EAAiB,CAC/B,kBACA,iBACA,qBACuD,CACvD,OAAO,SAAY,CACjB,IAAM,EAAsB,OAAO,OAAO,EAAe,CAAC,QAAQ,EAAM,IAAgB,CAEtF,GAAI,EAAY,MAAM,SAAW,OAC/B,OAAO,EAET,IAAM,EAAa,EAAY,QACzB,EAAa,EAAY,OAAO,QAEhC,EAAc,CAClB,GAAG,EAAY,MACf,aAAc,EACX,GAAa,CACZ,QAAS,EAAY,OAAO,aAC5B,gBAAiB,CAAC,EAAY,cAAc,CAC7C,CACF,CACD,cAAe,EAAE,CAClB,CAEK,EAAc,EAAK,IAAe,EAAE,CAI1C,OAHA,EAAY,KAAK,EAAY,CAC7B,EAAK,GAAc,EAEZ,GACN,EAAE,CAA+B,CAE9B,EAAY,OAAO,OAAO,EAAgB,CAAC,QAAQ,EAAM,IAAgB,CAE7E,GAAI,EAAY,MAAM,SAAW,SAC/B,OAAO,EAET,IAAM,EAAa,EAAY,QACzB,EAAa,EAAY,OAAO,QAEhC,EAAc,CAClB,GAAG,EAAY,MACf,aAAc,EACX,GAAa,CACZ,QAAS,EAAY,OAAO,aAC5B,gBAAiB,CAAC,EAAY,cAAc,CAC7C,CACF,CACD,cAAe,EAAE,CAClB,CAEK,EAAc,EAAK,IAAe,EAAE,CAI1C,OAHA,EAAY,KAAK,EAAY,CAC7B,EAAK,GAAc,EAEZ,GACN,EAAoB,CAEjB,EAAe,EAAiB,QAClC,EAAU,IACZ,EAAU,GAAc,KAAK,CAC3B,GAAG,EACH,aAAc,EACX,EAAkB,SAAU,CAE3B,QAAS,EAAkB,eAAe,MAAM,QAChD,gBAAiB,CAAC,EAAY,cAAc,CAC7C,CACF,CACD,cAAe,EAAE,CAClB,CAAC,CAGJ,IAAM,EAAa,EAAiB,QAcpC,OAbI,EAAU,IACZ,EAAU,GAAY,KAAK,CACzB,GAAG,EACH,aAAc,EACX,EAAkB,MAAO,CACxB,QAAS,EAAkB,eAAe,MAAM,QAChD,gBAAiB,CAAC,EAAY,cAAc,CAC7C,CACF,CACD,cAAe,EAAE,CAClB,CAAC,CAGG"}
@@ -0,0 +1,2 @@
1
+ const e=require(`../_utils/transfer-data.cjs`),t=require(`../_utils/fee.cjs`);function n({config:e,feeEstimationMultiplier:t}){return async({sourceAsset:n,sourceChainId:i,targetAsset:a,targetChainId:o})=>await r({sourceAsset:n,sourceChainId:i,targetAsset:a,targetChainId:o},e)*t}async function r({sourceAsset:n,sourceChainId:r,targetChainId:i},a){let{ethToAva:o,source:s}=e.getTransferData({assetIn:n,sourceChainId:r,targetChainId:i},a),c=o?s.wrapFeeApproximation:s.unwrapFeeApproximation;if(t.isDynamicFee(c))return c.minimumFeeAmount;let[l]=t.getFee({amountIn:1n,evmConfig:a,sourceAsset:n,sourceChainId:r,targetChainId:i});return l}exports.calculateMinimumTransferAmount=r,exports.getMinimumTransferAmountFactory=n;
2
+ //# sourceMappingURL=get-minimum-transfer-amount.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-minimum-transfer-amount.cjs","names":["getTransferData","isDynamicFee","getFee"],"sources":["../../../../src/transfer-service/avalanche-evm/_handlers/get-minimum-transfer-amount.ts"],"sourcesContent":["import type { GetMinimumTransferAmountProps, TransferService } from '../../../types/service';\nimport type { EvmConfig } from '../_types';\nimport { getTransferData } from '../_utils/transfer-data';\nimport { getFee, isDynamicFee } from '../_utils/fee';\n\nexport interface GetMinimumTransferAmountFactoryConfig {\n config: EvmConfig;\n /**\n * A multiplier to account for possible discrepancies in fee estimations.\n *\n * The fee charged is calculated at the time that the transfer is processed.\n * Given that the fee calculation depends on the current asset prices,\n * and that there is a time gap between when the transaction is sent by\n * the user and when it is processed by the bridge (~19 minutes for Ethereum, 1 hrs for bitcoin, etc),\n * the fee estimations made before the bridge Tx is submitted could be stale/off\n * compared to the actual fee charged.\n */\n feeEstimationMultiplier: bigint;\n}\n\nexport function getMinimumTransferAmountFactory({\n config,\n feeEstimationMultiplier,\n}: GetMinimumTransferAmountFactoryConfig): TransferService['getMinimumTransferAmount'] {\n return async ({ sourceAsset, sourceChainId, targetAsset, targetChainId }) => {\n const fee = await calculateMinimumTransferAmount(\n { sourceAsset, sourceChainId, targetAsset, targetChainId },\n config,\n );\n\n return fee * feeEstimationMultiplier;\n };\n}\n\n/**\n * Calculates the minimum transfer amount required for a given asset transfer,\n * which is the fee amount of the transfer.\n *\n * No multiplier is applied in this function; it returns the raw minimum fee amount.\n */\nexport async function calculateMinimumTransferAmount(\n { sourceAsset, sourceChainId, targetChainId }: GetMinimumTransferAmountProps,\n config: EvmConfig,\n): Promise<bigint> {\n const { ethToAva, source } = getTransferData({ assetIn: sourceAsset, sourceChainId, targetChainId }, config);\n\n const feeApproximation = ethToAva ? source.wrapFeeApproximation : source.unwrapFeeApproximation;\n\n if (isDynamicFee(feeApproximation)) {\n const minimumFeeAmount = feeApproximation.minimumFeeAmount;\n\n return minimumFeeAmount;\n }\n\n // Can remove this in future if we can remove \"static\" fees from Warden config.\n const [fee] = getFee({\n amountIn: 1n,\n evmConfig: config,\n sourceAsset,\n sourceChainId,\n targetChainId,\n });\n\n return fee;\n}\n"],"mappings":"8EAoBA,SAAgB,EAAgC,CAC9C,SACA,2BACqF,CACrF,OAAO,MAAO,CAAE,cAAa,gBAAe,cAAa,mBAC3C,MAAM,EAChB,CAAE,cAAa,gBAAe,cAAa,gBAAe,CAC1D,EACD,CAEY,EAUjB,eAAsB,EACpB,CAAE,cAAa,gBAAe,iBAC9B,EACiB,CACjB,GAAM,CAAE,WAAU,UAAWA,EAAAA,gBAAgB,CAAE,QAAS,EAAa,gBAAe,gBAAe,CAAE,EAAO,CAEtG,EAAmB,EAAW,EAAO,qBAAuB,EAAO,uBAEzE,GAAIC,EAAAA,aAAa,EAAiB,CAGhC,OAFyB,EAAiB,iBAM5C,GAAM,CAAC,GAAOC,EAAAA,OAAO,CACnB,SAAU,GACV,UAAW,EACX,cACA,gBACA,gBACD,CAAC,CAEF,OAAO"}
@@ -0,0 +1,2 @@
1
+ import{getTransferData as e}from"../_utils/transfer-data.js";import{getFee as t,isDynamicFee as n}from"../_utils/fee.js";function r({config:e,feeEstimationMultiplier:t}){return async({sourceAsset:n,sourceChainId:r,targetAsset:a,targetChainId:o})=>await i({sourceAsset:n,sourceChainId:r,targetAsset:a,targetChainId:o},e)*t}async function i({sourceAsset:r,sourceChainId:i,targetChainId:a},o){let{ethToAva:s,source:c}=e({assetIn:r,sourceChainId:i,targetChainId:a},o),l=s?c.wrapFeeApproximation:c.unwrapFeeApproximation;if(n(l))return l.minimumFeeAmount;let[u]=t({amountIn:1n,evmConfig:o,sourceAsset:r,sourceChainId:i,targetChainId:a});return u}export{i as calculateMinimumTransferAmount,r as getMinimumTransferAmountFactory};
2
+ //# sourceMappingURL=get-minimum-transfer-amount.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-minimum-transfer-amount.js","names":[],"sources":["../../../../src/transfer-service/avalanche-evm/_handlers/get-minimum-transfer-amount.ts"],"sourcesContent":["import type { GetMinimumTransferAmountProps, TransferService } from '../../../types/service';\nimport type { EvmConfig } from '../_types';\nimport { getTransferData } from '../_utils/transfer-data';\nimport { getFee, isDynamicFee } from '../_utils/fee';\n\nexport interface GetMinimumTransferAmountFactoryConfig {\n config: EvmConfig;\n /**\n * A multiplier to account for possible discrepancies in fee estimations.\n *\n * The fee charged is calculated at the time that the transfer is processed.\n * Given that the fee calculation depends on the current asset prices,\n * and that there is a time gap between when the transaction is sent by\n * the user and when it is processed by the bridge (~19 minutes for Ethereum, 1 hrs for bitcoin, etc),\n * the fee estimations made before the bridge Tx is submitted could be stale/off\n * compared to the actual fee charged.\n */\n feeEstimationMultiplier: bigint;\n}\n\nexport function getMinimumTransferAmountFactory({\n config,\n feeEstimationMultiplier,\n}: GetMinimumTransferAmountFactoryConfig): TransferService['getMinimumTransferAmount'] {\n return async ({ sourceAsset, sourceChainId, targetAsset, targetChainId }) => {\n const fee = await calculateMinimumTransferAmount(\n { sourceAsset, sourceChainId, targetAsset, targetChainId },\n config,\n );\n\n return fee * feeEstimationMultiplier;\n };\n}\n\n/**\n * Calculates the minimum transfer amount required for a given asset transfer,\n * which is the fee amount of the transfer.\n *\n * No multiplier is applied in this function; it returns the raw minimum fee amount.\n */\nexport async function calculateMinimumTransferAmount(\n { sourceAsset, sourceChainId, targetChainId }: GetMinimumTransferAmountProps,\n config: EvmConfig,\n): Promise<bigint> {\n const { ethToAva, source } = getTransferData({ assetIn: sourceAsset, sourceChainId, targetChainId }, config);\n\n const feeApproximation = ethToAva ? source.wrapFeeApproximation : source.unwrapFeeApproximation;\n\n if (isDynamicFee(feeApproximation)) {\n const minimumFeeAmount = feeApproximation.minimumFeeAmount;\n\n return minimumFeeAmount;\n }\n\n // Can remove this in future if we can remove \"static\" fees from Warden config.\n const [fee] = getFee({\n amountIn: 1n,\n evmConfig: config,\n sourceAsset,\n sourceChainId,\n targetChainId,\n });\n\n return fee;\n}\n"],"mappings":"yHAoBA,SAAgB,EAAgC,CAC9C,SACA,2BACqF,CACrF,OAAO,MAAO,CAAE,cAAa,gBAAe,cAAa,mBAC3C,MAAM,EAChB,CAAE,cAAa,gBAAe,cAAa,gBAAe,CAC1D,EACD,CAEY,EAUjB,eAAsB,EACpB,CAAE,cAAa,gBAAe,iBAC9B,EACiB,CACjB,GAAM,CAAE,WAAU,UAAW,EAAgB,CAAE,QAAS,EAAa,gBAAe,gBAAe,CAAE,EAAO,CAEtG,EAAmB,EAAW,EAAO,qBAAuB,EAAO,uBAEzE,GAAI,EAAa,EAAiB,CAGhC,OAFyB,EAAiB,iBAM5C,GAAM,CAAC,GAAO,EAAO,CACnB,SAAU,GACV,UAAW,EACX,cACA,gBACA,gBACD,CAAC,CAEF,OAAO"}
@@ -0,0 +1,2 @@
1
+ const e=require(`../../../constants.cjs`);function t({environment:t}){return async()=>t===e.Environment.TEST?new Map([[e.AvalancheChainIds.FUJI,new Set([e.EthereumChainIds.SEPOLIA])],[e.EthereumChainIds.SEPOLIA,new Set([e.AvalancheChainIds.FUJI])]]):new Map([[e.AvalancheChainIds.MAINNET,new Set([e.EthereumChainIds.MAINNET])],[e.EthereumChainIds.MAINNET,new Set([e.AvalancheChainIds.MAINNET])]])}exports.getSupportedChainsFactory=t;
2
+ //# sourceMappingURL=get-supported-chains.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-supported-chains.cjs","names":["Environment","AvalancheChainIds","EthereumChainIds"],"sources":["../../../../src/transfer-service/avalanche-evm/_handlers/get-supported-chains.ts"],"sourcesContent":["import { AvalancheChainIds, Environment, EthereumChainIds } from '../../../constants';\nimport type { TransferService } from '../../../types/service';\nimport type { Caip2ChainId } from '../../../types/caip';\n\nexport interface GetSupportedChainsFactoryConfig {\n environment: Environment;\n}\n\nexport function getSupportedChainsFactory({\n environment,\n}: GetSupportedChainsFactoryConfig): TransferService['getSupportedChains'] {\n return async () => {\n if (environment === Environment.TEST) {\n return new Map([\n [AvalancheChainIds.FUJI as Caip2ChainId, new Set([EthereumChainIds.SEPOLIA as Caip2ChainId])],\n [EthereumChainIds.SEPOLIA as Caip2ChainId, new Set([AvalancheChainIds.FUJI as Caip2ChainId])],\n ]);\n }\n\n return new Map([\n [AvalancheChainIds.MAINNET as Caip2ChainId, new Set([EthereumChainIds.MAINNET as Caip2ChainId])],\n [EthereumChainIds.MAINNET as Caip2ChainId, new Set([AvalancheChainIds.MAINNET as Caip2ChainId])],\n ]);\n };\n}\n"],"mappings":"0CAQA,SAAgB,EAA0B,CACxC,eACyE,CACzE,OAAO,SACD,IAAgBA,EAAAA,YAAY,KACvB,IAAI,IAAI,CACb,CAACC,EAAAA,kBAAkB,KAAsB,IAAI,IAAI,CAACC,EAAAA,iBAAiB,QAAwB,CAAC,CAAC,CAC7F,CAACA,EAAAA,iBAAiB,QAAyB,IAAI,IAAI,CAACD,EAAAA,kBAAkB,KAAqB,CAAC,CAAC,CAC9F,CAAC,CAGG,IAAI,IAAI,CACb,CAACA,EAAAA,kBAAkB,QAAyB,IAAI,IAAI,CAACC,EAAAA,iBAAiB,QAAwB,CAAC,CAAC,CAChG,CAACA,EAAAA,iBAAiB,QAAyB,IAAI,IAAI,CAACD,EAAAA,kBAAkB,QAAwB,CAAC,CAAC,CACjG,CAAC"}
@@ -0,0 +1,2 @@
1
+ import{AvalancheChainIds as e,Environment as t,EthereumChainIds as n}from"../../../constants.js";function r({environment:r}){return async()=>r===t.TEST?new Map([[e.FUJI,new Set([n.SEPOLIA])],[n.SEPOLIA,new Set([e.FUJI])]]):new Map([[e.MAINNET,new Set([n.MAINNET])],[n.MAINNET,new Set([e.MAINNET])]])}export{r as getSupportedChainsFactory};
2
+ //# sourceMappingURL=get-supported-chains.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-supported-chains.js","names":[],"sources":["../../../../src/transfer-service/avalanche-evm/_handlers/get-supported-chains.ts"],"sourcesContent":["import { AvalancheChainIds, Environment, EthereumChainIds } from '../../../constants';\nimport type { TransferService } from '../../../types/service';\nimport type { Caip2ChainId } from '../../../types/caip';\n\nexport interface GetSupportedChainsFactoryConfig {\n environment: Environment;\n}\n\nexport function getSupportedChainsFactory({\n environment,\n}: GetSupportedChainsFactoryConfig): TransferService['getSupportedChains'] {\n return async () => {\n if (environment === Environment.TEST) {\n return new Map([\n [AvalancheChainIds.FUJI as Caip2ChainId, new Set([EthereumChainIds.SEPOLIA as Caip2ChainId])],\n [EthereumChainIds.SEPOLIA as Caip2ChainId, new Set([AvalancheChainIds.FUJI as Caip2ChainId])],\n ]);\n }\n\n return new Map([\n [AvalancheChainIds.MAINNET as Caip2ChainId, new Set([EthereumChainIds.MAINNET as Caip2ChainId])],\n [EthereumChainIds.MAINNET as Caip2ChainId, new Set([AvalancheChainIds.MAINNET as Caip2ChainId])],\n ]);\n };\n}\n"],"mappings":"iGAQA,SAAgB,EAA0B,CACxC,eACyE,CACzE,OAAO,SACD,IAAgB,EAAY,KACvB,IAAI,IAAI,CACb,CAAC,EAAkB,KAAsB,IAAI,IAAI,CAAC,EAAiB,QAAwB,CAAC,CAAC,CAC7F,CAAC,EAAiB,QAAyB,IAAI,IAAI,CAAC,EAAkB,KAAqB,CAAC,CAAC,CAC9F,CAAC,CAGG,IAAI,IAAI,CACb,CAAC,EAAkB,QAAyB,IAAI,IAAI,CAAC,EAAiB,QAAwB,CAAC,CAAC,CAChG,CAAC,EAAiB,QAAyB,IAAI,IAAI,CAAC,EAAkB,QAAwB,CAAC,CAAC,CACjG,CAAC"}
@@ -0,0 +1,2 @@
1
+ require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../constants.cjs`),t=require(`../../../errors.cjs`),n=require(`../_utils/validations.cjs`),r=require(`./analyze-support.cjs`),i=require(`../_utils/fee.cjs`),a=require(`./get-minimum-transfer-amount.cjs`),o=require(`../../../utils/quote-fees.cjs`);let s=require(`viem`);function c({config:c,feeEstimationMultiplier:l,serviceAssets:u}){let d=r.analyzeSupportFactory({serviceAssets:u});return({amount:r,fromAddress:u,slippageBps:f,sourceAsset:p,sourceChain:m,targetAsset:h,targetChain:g,toAddress:_},v)=>{let y=new AbortController,b=()=>{y.abort()},x=d({sourceAsset:p,sourceChainId:m.chainId,targetAsset:h,targetChainId:g.chainId});if(!((0,s.isAddress)(u)&&(0,s.isAddress)(_))||!x)return y.signal.aborted||(v(`error`,new t.InvalidParamsError(t.ErrorReason.INVALID_PARAMS,`Invalid addresses, assets, or chains provided.`)),v(`done`)),{cancel:b};try{n.validateTransferAddressesOrThrow(u,_),n.validateTransferAddressesNotBlockedOrThrow([u,_],c.addressBlocklist)}catch{return y.signal.aborted||(v(`error`,new t.InvalidParamsError(t.ErrorReason.INVALID_PARAMS,`Transfer addresses are not equal or blocked.`)),v(`done`)),{cancel:b}}return(async()=>{let n=await a.calculateMinimumTransferAmount({sourceAsset:p,sourceChainId:m.chainId,targetAsset:h,targetChainId:g.chainId},c)*l;if(r<n)y.signal.aborted||(v(`error`,new t.InvalidParamsError(t.ErrorReason.INVALID_PARAMS,`Transfer amount is below the minimum transfer amount of ${n.toString()}`)),v(`done`));else{let[t]=i.getFee({amountIn:r,evmConfig:c,sourceAsset:p,sourceChainId:m.chainId,targetChainId:g.chainId}),n={aggregator:{name:`Avalanche Bridge™`,id:`avalanche-bridge-evm`},amountIn:r,amountOut:r-t,assetIn:p,assetOut:h,expiresAt:Math.floor(Date.now()/1e3)+60,fees:[{type:`bridge`,name:`Bridge Fee`,amount:t,chainId:m.chainId,token:o.assetToQuoteFeeToken(p)}],fromAddress:u,id:crypto.randomUUID(),partnerFeeBps:null,serviceType:e.ServiceType.AVALANCHE_EVM,slippageBps:f??0,sourceChain:m,targetChain:g,toAddress:_};y.signal.aborted||(v(`quote`,n),v(`done`))}})().catch(e=>{y.signal.aborted||(v(`error`,new t.SdkError(t.ErrorReason.UNKNOWN,t.ErrorCode.UNKNOWN,{cause:e,details:`Failed to stream quotes`})),v(`done`))}),{cancel:b}}}exports.streamQuotesFactory=c;
2
+ //# sourceMappingURL=stream-quotes.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream-quotes.cjs","names":["analyzeSupportFactory","InvalidParamsError","ErrorReason","calculateMinimumTransferAmount","getFee","assetToQuoteFeeToken","ServiceType","SdkError","ErrorCode"],"sources":["../../../../src/transfer-service/avalanche-evm/_handlers/stream-quotes.ts"],"sourcesContent":["import { ServiceType } from '../../../constants';\nimport { ErrorCode, ErrorReason, InvalidParamsError, SdkError } from '../../../errors';\nimport type { ChainAssetMap } from '../../../types/asset';\nimport type { Quote } from '../../../types/quote';\nimport type { TransferService } from '../../../types/service';\nimport type { Mutable } from '../../../types/utility-types';\nimport { isAddress } from 'viem';\nimport { validateTransferAddressesNotBlockedOrThrow, validateTransferAddressesOrThrow } from '../_utils/validations';\nimport type { EvmConfig } from '../_types';\nimport { analyzeSupportFactory } from './analyze-support';\nimport { calculateMinimumTransferAmount } from './get-minimum-transfer-amount';\nimport { getFee } from '../_utils/fee';\nimport { assetToQuoteFeeToken } from '../../../utils/quote-fees';\n\nexport interface StreamQuotesFactoryConfig {\n config: EvmConfig;\n feeEstimationMultiplier: bigint;\n serviceAssets: ChainAssetMap;\n}\n\nexport function streamQuotesFactory({\n config,\n feeEstimationMultiplier,\n serviceAssets,\n}: StreamQuotesFactoryConfig): TransferService['streamQuotes'] {\n const analyzeSupport = analyzeSupportFactory({ serviceAssets });\n\n return (\n { amount, fromAddress, slippageBps, sourceAsset, sourceChain, targetAsset, targetChain, toAddress },\n handler,\n ) => {\n const ac = new AbortController();\n const cancel = () => {\n ac.abort();\n };\n\n const hasValidAssetsAndChains = analyzeSupport({\n sourceAsset,\n sourceChainId: sourceChain.chainId,\n targetAsset,\n targetChainId: targetChain.chainId,\n });\n\n // Validate to/from addresses are EVM.\n // Verify assets and chains are supported.\n if (!(isAddress(fromAddress) && isAddress(toAddress)) || !hasValidAssetsAndChains) {\n if (!ac.signal.aborted) {\n handler(\n 'error',\n new InvalidParamsError(ErrorReason.INVALID_PARAMS, 'Invalid addresses, assets, or chains provided.'),\n );\n handler('done');\n }\n\n return { cancel };\n }\n\n // Validate addresses match and are not block listed.\n try {\n validateTransferAddressesOrThrow(fromAddress, toAddress);\n validateTransferAddressesNotBlockedOrThrow([fromAddress, toAddress], config.addressBlocklist);\n } catch {\n if (!ac.signal.aborted) {\n handler(\n 'error',\n new InvalidParamsError(ErrorReason.INVALID_PARAMS, 'Transfer addresses are not equal or blocked.'),\n );\n handler('done');\n }\n\n return { cancel };\n }\n\n (async () => {\n // Validate minimum transfer amount\n const minimumAmount = await calculateMinimumTransferAmount(\n {\n sourceAsset,\n sourceChainId: sourceChain.chainId,\n targetAsset,\n targetChainId: targetChain.chainId,\n },\n config,\n );\n\n const minimumTransferAmount = minimumAmount * feeEstimationMultiplier;\n\n if (amount < minimumTransferAmount) {\n if (!ac.signal.aborted) {\n handler(\n 'error',\n new InvalidParamsError(\n ErrorReason.INVALID_PARAMS,\n `Transfer amount is below the minimum transfer amount of ${minimumTransferAmount.toString()}`,\n ),\n );\n handler('done');\n }\n } else {\n const [fee] = getFee({\n amountIn: amount,\n evmConfig: config,\n sourceAsset,\n sourceChainId: sourceChain.chainId,\n targetChainId: targetChain.chainId,\n });\n\n // Create a quote.\n const quote: Mutable<Quote> = {\n aggregator: {\n name: 'Avalanche Bridge™',\n id: 'avalanche-bridge-evm',\n },\n amountIn: amount,\n amountOut: amount - fee,\n assetIn: sourceAsset,\n assetOut: targetAsset,\n // Set the expiration further out since the amountOut isn't expected to change\n // since the Warden config data isn't refreshed. The only expected change would be estimated gas.\n expiresAt: Math.floor(Date.now() / 1_000) + 60,\n fees: [\n {\n type: 'bridge',\n name: 'Bridge Fee',\n amount: fee,\n chainId: sourceChain.chainId,\n token: assetToQuoteFeeToken(sourceAsset),\n },\n ],\n fromAddress,\n id: crypto.randomUUID(),\n partnerFeeBps: null,\n serviceType: ServiceType.AVALANCHE_EVM,\n slippageBps: slippageBps ?? 0,\n sourceChain,\n targetChain,\n toAddress,\n };\n\n if (!ac.signal.aborted) {\n handler('quote', quote);\n handler('done');\n }\n }\n })().catch((error) => {\n if (!ac.signal.aborted) {\n handler(\n 'error',\n new SdkError(ErrorReason.UNKNOWN, ErrorCode.UNKNOWN, { cause: error, details: 'Failed to stream quotes' }),\n );\n handler('done');\n }\n });\n\n return {\n cancel,\n };\n };\n}\n"],"mappings":"uVAoBA,SAAgB,EAAoB,CAClC,SACA,0BACA,iBAC6D,CAC7D,IAAM,EAAiBA,EAAAA,sBAAsB,CAAE,gBAAe,CAAC,CAE/D,OACE,CAAE,SAAQ,cAAa,cAAa,cAAa,cAAa,cAAa,cAAa,aACxF,IACG,CACH,IAAM,EAAK,IAAI,gBACT,MAAe,CACnB,EAAG,OAAO,EAGN,EAA0B,EAAe,CAC7C,cACA,cAAe,EAAY,QAC3B,cACA,cAAe,EAAY,QAC5B,CAAC,CAIF,GAAI,GAAA,EAAA,EAAA,WAAY,EAAY,GAAA,EAAA,EAAA,WAAc,EAAU,GAAK,CAAC,EASxD,OARK,EAAG,OAAO,UACb,EACE,QACA,IAAIC,EAAAA,mBAAmBC,EAAAA,YAAY,eAAgB,iDAAiD,CACrG,CACD,EAAQ,OAAO,EAGV,CAAE,SAAQ,CAInB,GAAI,CACF,EAAA,iCAAiC,EAAa,EAAU,CACxD,EAAA,2CAA2C,CAAC,EAAa,EAAU,CAAE,EAAO,iBAAiB,MACvF,CASN,OARK,EAAG,OAAO,UACb,EACE,QACA,IAAID,EAAAA,mBAAmBC,EAAAA,YAAY,eAAgB,+CAA+C,CACnG,CACD,EAAQ,OAAO,EAGV,CAAE,SAAQ,CAoFnB,OAjFC,SAAY,CAYX,IAAM,EAVgB,MAAMC,EAAAA,+BAC1B,CACE,cACA,cAAe,EAAY,QAC3B,cACA,cAAe,EAAY,QAC5B,CACD,EACD,CAE6C,EAE9C,GAAI,EAAS,EACN,EAAG,OAAO,UACb,EACE,QACA,IAAIF,EAAAA,mBACFC,EAAAA,YAAY,eACZ,2DAA2D,EAAsB,UAAU,GAC5F,CACF,CACD,EAAQ,OAAO,MAEZ,CACL,GAAM,CAAC,GAAOE,EAAAA,OAAO,CACnB,SAAU,EACV,UAAW,EACX,cACA,cAAe,EAAY,QAC3B,cAAe,EAAY,QAC5B,CAAC,CAGI,EAAwB,CAC5B,WAAY,CACV,KAAM,oBACN,GAAI,uBACL,CACD,SAAU,EACV,UAAW,EAAS,EACpB,QAAS,EACT,SAAU,EAGV,UAAW,KAAK,MAAM,KAAK,KAAK,CAAG,IAAM,CAAG,GAC5C,KAAM,CACJ,CACE,KAAM,SACN,KAAM,aACN,OAAQ,EACR,QAAS,EAAY,QACrB,MAAOC,EAAAA,qBAAqB,EAAY,CACzC,CACF,CACD,cACA,GAAI,OAAO,YAAY,CACvB,cAAe,KACf,YAAaC,EAAAA,YAAY,cACzB,YAAa,GAAe,EAC5B,cACA,cACA,YACD,CAEI,EAAG,OAAO,UACb,EAAQ,QAAS,EAAM,CACvB,EAAQ,OAAO,MAGjB,CAAC,MAAO,GAAU,CACf,EAAG,OAAO,UACb,EACE,QACA,IAAIC,EAAAA,SAASL,EAAAA,YAAY,QAASM,EAAAA,UAAU,QAAS,CAAE,MAAO,EAAO,QAAS,0BAA2B,CAAC,CAC3G,CACD,EAAQ,OAAO,GAEjB,CAEK,CACL,SACD"}
@@ -0,0 +1,2 @@
1
+ import{ServiceType as e}from"../../../constants.js";import{ErrorCode as t,ErrorReason as n,InvalidParamsError as r,SdkError as i}from"../../../errors.js";import{validateTransferAddressesNotBlockedOrThrow as a,validateTransferAddressesOrThrow as o}from"../_utils/validations.js";import{analyzeSupportFactory as s}from"./analyze-support.js";import{getFee as c}from"../_utils/fee.js";import{calculateMinimumTransferAmount as l}from"./get-minimum-transfer-amount.js";import{assetToQuoteFeeToken as u}from"../../../utils/quote-fees.js";import{isAddress as d}from"viem";function f({config:f,feeEstimationMultiplier:p,serviceAssets:m}){let h=s({serviceAssets:m});return({amount:s,fromAddress:m,slippageBps:g,sourceAsset:_,sourceChain:v,targetAsset:y,targetChain:b,toAddress:x},S)=>{let C=new AbortController,w=()=>{C.abort()},T=h({sourceAsset:_,sourceChainId:v.chainId,targetAsset:y,targetChainId:b.chainId});if(!(d(m)&&d(x))||!T)return C.signal.aborted||(S(`error`,new r(n.INVALID_PARAMS,`Invalid addresses, assets, or chains provided.`)),S(`done`)),{cancel:w};try{o(m,x),a([m,x],f.addressBlocklist)}catch{return C.signal.aborted||(S(`error`,new r(n.INVALID_PARAMS,`Transfer addresses are not equal or blocked.`)),S(`done`)),{cancel:w}}return(async()=>{let t=await l({sourceAsset:_,sourceChainId:v.chainId,targetAsset:y,targetChainId:b.chainId},f)*p;if(s<t)C.signal.aborted||(S(`error`,new r(n.INVALID_PARAMS,`Transfer amount is below the minimum transfer amount of ${t.toString()}`)),S(`done`));else{let[t]=c({amountIn:s,evmConfig:f,sourceAsset:_,sourceChainId:v.chainId,targetChainId:b.chainId}),n={aggregator:{name:`Avalanche Bridge™`,id:`avalanche-bridge-evm`},amountIn:s,amountOut:s-t,assetIn:_,assetOut:y,expiresAt:Math.floor(Date.now()/1e3)+60,fees:[{type:`bridge`,name:`Bridge Fee`,amount:t,chainId:v.chainId,token:u(_)}],fromAddress:m,id:crypto.randomUUID(),partnerFeeBps:null,serviceType:e.AVALANCHE_EVM,slippageBps:g??0,sourceChain:v,targetChain:b,toAddress:x};C.signal.aborted||(S(`quote`,n),S(`done`))}})().catch(e=>{C.signal.aborted||(S(`error`,new i(n.UNKNOWN,t.UNKNOWN,{cause:e,details:`Failed to stream quotes`})),S(`done`))}),{cancel:w}}}export{f as streamQuotesFactory};
2
+ //# sourceMappingURL=stream-quotes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream-quotes.js","names":[],"sources":["../../../../src/transfer-service/avalanche-evm/_handlers/stream-quotes.ts"],"sourcesContent":["import { ServiceType } from '../../../constants';\nimport { ErrorCode, ErrorReason, InvalidParamsError, SdkError } from '../../../errors';\nimport type { ChainAssetMap } from '../../../types/asset';\nimport type { Quote } from '../../../types/quote';\nimport type { TransferService } from '../../../types/service';\nimport type { Mutable } from '../../../types/utility-types';\nimport { isAddress } from 'viem';\nimport { validateTransferAddressesNotBlockedOrThrow, validateTransferAddressesOrThrow } from '../_utils/validations';\nimport type { EvmConfig } from '../_types';\nimport { analyzeSupportFactory } from './analyze-support';\nimport { calculateMinimumTransferAmount } from './get-minimum-transfer-amount';\nimport { getFee } from '../_utils/fee';\nimport { assetToQuoteFeeToken } from '../../../utils/quote-fees';\n\nexport interface StreamQuotesFactoryConfig {\n config: EvmConfig;\n feeEstimationMultiplier: bigint;\n serviceAssets: ChainAssetMap;\n}\n\nexport function streamQuotesFactory({\n config,\n feeEstimationMultiplier,\n serviceAssets,\n}: StreamQuotesFactoryConfig): TransferService['streamQuotes'] {\n const analyzeSupport = analyzeSupportFactory({ serviceAssets });\n\n return (\n { amount, fromAddress, slippageBps, sourceAsset, sourceChain, targetAsset, targetChain, toAddress },\n handler,\n ) => {\n const ac = new AbortController();\n const cancel = () => {\n ac.abort();\n };\n\n const hasValidAssetsAndChains = analyzeSupport({\n sourceAsset,\n sourceChainId: sourceChain.chainId,\n targetAsset,\n targetChainId: targetChain.chainId,\n });\n\n // Validate to/from addresses are EVM.\n // Verify assets and chains are supported.\n if (!(isAddress(fromAddress) && isAddress(toAddress)) || !hasValidAssetsAndChains) {\n if (!ac.signal.aborted) {\n handler(\n 'error',\n new InvalidParamsError(ErrorReason.INVALID_PARAMS, 'Invalid addresses, assets, or chains provided.'),\n );\n handler('done');\n }\n\n return { cancel };\n }\n\n // Validate addresses match and are not block listed.\n try {\n validateTransferAddressesOrThrow(fromAddress, toAddress);\n validateTransferAddressesNotBlockedOrThrow([fromAddress, toAddress], config.addressBlocklist);\n } catch {\n if (!ac.signal.aborted) {\n handler(\n 'error',\n new InvalidParamsError(ErrorReason.INVALID_PARAMS, 'Transfer addresses are not equal or blocked.'),\n );\n handler('done');\n }\n\n return { cancel };\n }\n\n (async () => {\n // Validate minimum transfer amount\n const minimumAmount = await calculateMinimumTransferAmount(\n {\n sourceAsset,\n sourceChainId: sourceChain.chainId,\n targetAsset,\n targetChainId: targetChain.chainId,\n },\n config,\n );\n\n const minimumTransferAmount = minimumAmount * feeEstimationMultiplier;\n\n if (amount < minimumTransferAmount) {\n if (!ac.signal.aborted) {\n handler(\n 'error',\n new InvalidParamsError(\n ErrorReason.INVALID_PARAMS,\n `Transfer amount is below the minimum transfer amount of ${minimumTransferAmount.toString()}`,\n ),\n );\n handler('done');\n }\n } else {\n const [fee] = getFee({\n amountIn: amount,\n evmConfig: config,\n sourceAsset,\n sourceChainId: sourceChain.chainId,\n targetChainId: targetChain.chainId,\n });\n\n // Create a quote.\n const quote: Mutable<Quote> = {\n aggregator: {\n name: 'Avalanche Bridge™',\n id: 'avalanche-bridge-evm',\n },\n amountIn: amount,\n amountOut: amount - fee,\n assetIn: sourceAsset,\n assetOut: targetAsset,\n // Set the expiration further out since the amountOut isn't expected to change\n // since the Warden config data isn't refreshed. The only expected change would be estimated gas.\n expiresAt: Math.floor(Date.now() / 1_000) + 60,\n fees: [\n {\n type: 'bridge',\n name: 'Bridge Fee',\n amount: fee,\n chainId: sourceChain.chainId,\n token: assetToQuoteFeeToken(sourceAsset),\n },\n ],\n fromAddress,\n id: crypto.randomUUID(),\n partnerFeeBps: null,\n serviceType: ServiceType.AVALANCHE_EVM,\n slippageBps: slippageBps ?? 0,\n sourceChain,\n targetChain,\n toAddress,\n };\n\n if (!ac.signal.aborted) {\n handler('quote', quote);\n handler('done');\n }\n }\n })().catch((error) => {\n if (!ac.signal.aborted) {\n handler(\n 'error',\n new SdkError(ErrorReason.UNKNOWN, ErrorCode.UNKNOWN, { cause: error, details: 'Failed to stream quotes' }),\n );\n handler('done');\n }\n });\n\n return {\n cancel,\n };\n };\n}\n"],"mappings":"ojBAoBA,SAAgB,EAAoB,CAClC,SACA,0BACA,iBAC6D,CAC7D,IAAM,EAAiB,EAAsB,CAAE,gBAAe,CAAC,CAE/D,OACE,CAAE,SAAQ,cAAa,cAAa,cAAa,cAAa,cAAa,cAAa,aACxF,IACG,CACH,IAAM,EAAK,IAAI,gBACT,MAAe,CACnB,EAAG,OAAO,EAGN,EAA0B,EAAe,CAC7C,cACA,cAAe,EAAY,QAC3B,cACA,cAAe,EAAY,QAC5B,CAAC,CAIF,GAAI,EAAE,EAAU,EAAY,EAAI,EAAU,EAAU,GAAK,CAAC,EASxD,OARK,EAAG,OAAO,UACb,EACE,QACA,IAAI,EAAmB,EAAY,eAAgB,iDAAiD,CACrG,CACD,EAAQ,OAAO,EAGV,CAAE,SAAQ,CAInB,GAAI,CACF,EAAiC,EAAa,EAAU,CACxD,EAA2C,CAAC,EAAa,EAAU,CAAE,EAAO,iBAAiB,MACvF,CASN,OARK,EAAG,OAAO,UACb,EACE,QACA,IAAI,EAAmB,EAAY,eAAgB,+CAA+C,CACnG,CACD,EAAQ,OAAO,EAGV,CAAE,SAAQ,CAoFnB,OAjFC,SAAY,CAYX,IAAM,EAVgB,MAAM,EAC1B,CACE,cACA,cAAe,EAAY,QAC3B,cACA,cAAe,EAAY,QAC5B,CACD,EACD,CAE6C,EAE9C,GAAI,EAAS,EACN,EAAG,OAAO,UACb,EACE,QACA,IAAI,EACF,EAAY,eACZ,2DAA2D,EAAsB,UAAU,GAC5F,CACF,CACD,EAAQ,OAAO,MAEZ,CACL,GAAM,CAAC,GAAO,EAAO,CACnB,SAAU,EACV,UAAW,EACX,cACA,cAAe,EAAY,QAC3B,cAAe,EAAY,QAC5B,CAAC,CAGI,EAAwB,CAC5B,WAAY,CACV,KAAM,oBACN,GAAI,uBACL,CACD,SAAU,EACV,UAAW,EAAS,EACpB,QAAS,EACT,SAAU,EAGV,UAAW,KAAK,MAAM,KAAK,KAAK,CAAG,IAAM,CAAG,GAC5C,KAAM,CACJ,CACE,KAAM,SACN,KAAM,aACN,OAAQ,EACR,QAAS,EAAY,QACrB,MAAO,EAAqB,EAAY,CACzC,CACF,CACD,cACA,GAAI,OAAO,YAAY,CACvB,cAAe,KACf,YAAa,EAAY,cACzB,YAAa,GAAe,EAC5B,cACA,cACA,YACD,CAEI,EAAG,OAAO,UACb,EAAQ,QAAS,EAAM,CACvB,EAAQ,OAAO,MAGjB,CAAC,MAAO,GAAU,CACf,EAAG,OAAO,UACb,EACE,QACA,IAAI,EAAS,EAAY,QAAS,EAAU,QAAS,CAAE,MAAO,EAAO,QAAS,0BAA2B,CAAC,CAC3G,CACD,EAAQ,OAAO,GAEjB,CAEK,CACL,SACD"}
@@ -0,0 +1,2 @@
1
+ require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../errors.cjs`),t=require(`../../_utils.cjs`),n=require(`../_utils/transfer-data.cjs`);let r=require(`viem`);function i({config:n}){return({transfer:i,updateListener:s})=>{let c=new AbortController,l=()=>{c.abort()};if(i.status===`completed`||i.status===`failed`)return{cancel:l,result:Promise.resolve(i)};let{txHash:u}=i.source;if(!(0,r.isHash)(u)){let t={...i,errorCode:e.ErrorCode.INVALID_PARAMS,failedAtMs:Date.now(),status:`failed`};return s(t),{cancel:l,result:Promise.resolve(t)}}let d=t.getEvmClientForChain({chain:i.sourceChain}),f=t.getEvmClientForChain({chain:i.targetChain}),p=structuredClone(i);return{cancel:l,result:(async()=>{for(;!c.signal.aborted;)switch(p.status){case`source-pending`:p=await a({currentTransfer:p,signal:c.signal,sourceClient:d}),s(p);break;case`target-pending`:p=await o({assetIn:p.sourceAsset,currentTransfer:p,evmConfig:n,signal:c.signal,sourceChainId:p.sourceChain.chainId,targetChainId:p.targetChain.chainId,targetClient:f}),s(p);break;default:return p}return p})()}}}async function a({currentTransfer:n,signal:i,sourceClient:a}){let{confirmationCount:o,requiredConfirmationCount:s,txHash:c}=n.source;if(!(0,r.isHash)(c))return{...n,errorCode:e.ErrorCode.INVALID_PARAMS,failedAtMs:Date.now(),status:`failed`};if(o>=s)return{...n,status:`target-pending`,target:{confirmationCount:0,requiredConfirmationCount:1,startedAtMs:Date.now()}};try{let r=await t.awaitOrAbort(a.waitForTransactionReceipt({confirmations:Math.min(o+1,s),hash:c}),i);if(r.status===`aborted`)return n;let l=r.value;if(l.status===`reverted`)return{...n,errorCode:e.ErrorCode.TRANSACTION_REVERTED,failedAtMs:Date.now(),status:`failed`};let u=await a.getTransactionConfirmations({transactionReceipt:l}).then(e=>Number(e)).catch(()=>o+1);return u<s?{...n,source:{...n.source,confirmationCount:u}}:{...n,source:{...n.source,confirmationCount:u},status:`target-pending`,target:{confirmationCount:0,requiredConfirmationCount:1,startedAtMs:Date.now()}}}catch(e){return{...n,errorCode:t.getErrorCodeForViemError(e),failedAtMs:Date.now(),status:`failed`}}}async function o({assetIn:i,currentTransfer:a,evmConfig:o,signal:l,sourceChainId:u,targetChainId:d,targetClient:f}){let p=a.target??{confirmationCount:0,requiredConfirmationCount:1,startedAtMs:Date.now()};if(p.confirmationCount>=p.requiredConfirmationCount)return{...a,status:`completed`,completedAtMs:Date.now()};if(!p.txHash){let{ethToAva:t,target:{token:{address:r}}}=n.getTransferData({assetIn:i,sourceChainId:u,targetChainId:d},o),l=t?await s({contractAddress:r,sourceTxHash:a.source.txHash,targetClient:f,targetStartBlockNumber:a.source.targetStartBlockNumber}):await c({contractAddress:r,evmConfig:o,fromAddress:a.fromAddress,targetClient:f,targetStartBlockNumber:a.source.targetStartBlockNumber});return l?{...a,target:{...p,txHash:l}}:{...a,errorCode:e.ErrorCode.UNKNOWN,errorReason:`Target transaction hash could not be found`,failedAtMs:Date.now(),status:`failed`}}if(!(0,r.isHash)(p.txHash))return{...a,errorCode:e.ErrorCode.INVALID_PARAMS,failedAtMs:Date.now(),status:`failed`};try{let n=await t.awaitOrAbort(f.waitForTransactionReceipt({confirmations:p.requiredConfirmationCount,hash:p.txHash}),l);if(n.status===`aborted`)return a;let r=n.value;return r.status===`reverted`?{...a,errorCode:e.ErrorCode.TRANSACTION_REVERTED,failedAtMs:Date.now(),status:`failed`}:{...a,completedAtMs:Date.now(),status:`completed`,target:{...p,confirmationCount:await f.getTransactionConfirmations({transactionReceipt:r}).then(e=>Number(e)).catch(()=>p.requiredConfirmationCount)}}}catch(e){return{...a,errorCode:t.getErrorCodeForViemError(e),failedAtMs:Date.now(),status:`failed`}}}async function s({contractAddress:e,sourceTxHash:t,targetClient:n,targetStartBlockNumber:r}){if(r===void 0)return null;let i=(await n.getLogs({address:e,event:{inputs:[{indexed:!1,name:`to`,type:`address`},{indexed:!1,name:`amount`,type:`uint256`},{indexed:!1,name:`feeAddress`,type:`address`},{indexed:!1,name:`feeAmount`,type:`uint256`},{indexed:!1,name:`originTxId`,type:`bytes32`}],name:`Mint`,type:`event`},fromBlock:r,toBlock:`latest`})).find(e=>e.args.originTxId===t);return i?i.transactionHash:null}async function c({contractAddress:e,evmConfig:t,fromAddress:n,targetClient:i,targetStartBlockNumber:a}){if(a===void 0||!(0,r.isAddress)(n))return null;let o=(await i.getLogs({address:e,args:{dst:n,src:t.walletAddresses.ethereum},event:{inputs:[{indexed:!0,name:`src`,type:`address`},{indexed:!0,name:`dst`,type:`address`},{indexed:!1,name:`wad`,type:`uint256`}],name:`Transfer`,type:`event`},fromBlock:a,toBlock:`latest`})).at(0);return o?o.transactionHash:null}exports.trackTransferFactory=i;
2
+ //# sourceMappingURL=track-transfer.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"track-transfer.cjs","names":["ErrorCode","getEvmClientForChain","awaitOrAbort","getErrorCodeForViemError","getTransferData"],"sources":["../../../../src/transfer-service/avalanche-evm/_handlers/track-transfer.ts"],"sourcesContent":["import { isAddress, isHash, type Hash } from 'viem';\nimport { ErrorCode } from '../../../errors';\nimport type { Asset } from '../../../types/asset';\nimport type { Caip2ChainId } from '../../../types/caip';\nimport type {\n CompletedTransfer,\n FailedTransfer,\n SourcePendingTransfer,\n TargetPendingTransfer,\n Transfer,\n} from '../../../types/transfer';\nimport type { TransferService } from '../../../types/service';\nimport { awaitOrAbort, getErrorCodeForViemError, getEvmClientForChain } from '../../_utils';\nimport type { EvmConfig } from '../_types';\nimport { getTransferData } from '../_utils/transfer-data';\n\nexport interface TrackTransferFactoryConfig {\n config: EvmConfig;\n}\n\nexport function trackTransferFactory({\n config: evmConfig,\n}: TrackTransferFactoryConfig): TransferService['trackTransfer'] {\n return ({ transfer, updateListener }) => {\n const ac = new AbortController();\n const cancel = () => {\n ac.abort();\n };\n\n // Failed and completed transfers are terminal states.\n if (transfer.status === 'completed' || transfer.status === 'failed') {\n return {\n cancel,\n result: Promise.resolve(transfer),\n };\n }\n\n const { txHash } = transfer.source;\n\n if (!isHash(txHash)) {\n const failedTransfer: FailedTransfer = {\n ...transfer,\n errorCode: ErrorCode.INVALID_PARAMS,\n failedAtMs: Date.now(),\n status: 'failed',\n };\n updateListener(failedTransfer);\n\n return {\n cancel,\n result: Promise.resolve(failedTransfer),\n };\n }\n\n const sourceClient = getEvmClientForChain({ chain: transfer.sourceChain });\n const targetClient = getEvmClientForChain({ chain: transfer.targetChain });\n let currentTransfer: Transfer = structuredClone(transfer);\n\n const executeTracking = async (): Promise<Transfer> => {\n // Create a loop to poll for confirmations and update the transfer status until\n // failed or completed.\n while (!ac.signal.aborted) {\n switch (currentTransfer.status) {\n case 'source-pending': {\n currentTransfer = await _trackSourceTx({\n currentTransfer,\n signal: ac.signal,\n sourceClient,\n });\n updateListener(currentTransfer);\n break;\n }\n case 'target-pending': {\n currentTransfer = await _trackTargetTx({\n assetIn: currentTransfer.sourceAsset,\n currentTransfer,\n evmConfig,\n signal: ac.signal,\n sourceChainId: currentTransfer.sourceChain.chainId,\n targetChainId: currentTransfer.targetChain.chainId,\n targetClient,\n });\n updateListener(currentTransfer);\n break;\n }\n default: {\n return currentTransfer;\n }\n }\n }\n\n return currentTransfer;\n };\n\n return {\n cancel,\n result: executeTracking(),\n };\n };\n}\n\nexport interface TrackBaseParams {\n currentTransfer: Transfer;\n signal: AbortSignal;\n}\n\nexport interface TrackSourceTxParams extends TrackBaseParams {\n currentTransfer: SourcePendingTransfer;\n sourceClient: ReturnType<typeof getEvmClientForChain>;\n}\n\nexport interface TrackTargetTxParams extends TrackBaseParams {\n assetIn: Asset;\n currentTransfer: TargetPendingTransfer;\n evmConfig: EvmConfig;\n sourceChainId: Caip2ChainId;\n targetChainId: Caip2ChainId;\n targetClient: ReturnType<typeof getEvmClientForChain>;\n}\n\nexport async function _trackSourceTx({\n currentTransfer,\n signal,\n sourceClient,\n}: TrackSourceTxParams): Promise<Transfer> {\n const { confirmationCount, requiredConfirmationCount, txHash } = currentTransfer.source;\n\n if (!isHash(txHash)) {\n const failedTransfer: FailedTransfer = {\n ...currentTransfer,\n errorCode: ErrorCode.INVALID_PARAMS,\n failedAtMs: Date.now(),\n status: 'failed',\n };\n return failedTransfer;\n }\n\n if (confirmationCount >= requiredConfirmationCount) {\n // Move to target-pending\n\n const updatedTransfer: TargetPendingTransfer = {\n ...currentTransfer,\n status: 'target-pending',\n target: {\n confirmationCount: 0,\n requiredConfirmationCount: 1, // EVM txs need 1 confirmation on target chain.\n startedAtMs: Date.now(),\n },\n };\n\n return updatedTransfer;\n }\n\n try {\n const receiptResult = await awaitOrAbort(\n sourceClient.waitForTransactionReceipt({\n confirmations: Math.min(confirmationCount + 1, requiredConfirmationCount),\n hash: txHash,\n }),\n signal,\n );\n\n if (receiptResult.status === 'aborted') {\n return currentTransfer;\n }\n\n const transactionReceipt = receiptResult.value;\n\n if (transactionReceipt.status === 'reverted') {\n return {\n ...currentTransfer,\n errorCode: ErrorCode.TRANSACTION_REVERTED,\n failedAtMs: Date.now(),\n status: 'failed',\n } satisfies FailedTransfer;\n }\n\n // Either update confirmation count or move to target-pending\n const newConfirmationCount: number = await sourceClient\n .getTransactionConfirmations({\n // hash: txHash,\n transactionReceipt,\n })\n .then((count) => Number(count))\n .catch(() => confirmationCount + 1);\n\n // If still not enough confirmations, just update count\n if (newConfirmationCount < requiredConfirmationCount) {\n return {\n ...currentTransfer,\n source: {\n ...currentTransfer.source,\n confirmationCount: newConfirmationCount,\n },\n } satisfies SourcePendingTransfer;\n }\n\n // Move to target-pending\n return {\n ...currentTransfer,\n source: {\n ...currentTransfer.source,\n confirmationCount: newConfirmationCount,\n },\n status: 'target-pending',\n target: {\n confirmationCount: 0,\n requiredConfirmationCount: 1, // EVM txs need 1 confirmation on target chain.\n startedAtMs: Date.now(),\n },\n } satisfies TargetPendingTransfer;\n } catch (error) {\n return {\n ...currentTransfer,\n errorCode: getErrorCodeForViemError(error),\n failedAtMs: Date.now(),\n status: 'failed',\n } satisfies FailedTransfer;\n }\n}\n\nexport async function _trackTargetTx({\n assetIn,\n currentTransfer,\n evmConfig,\n signal,\n sourceChainId,\n targetChainId,\n targetClient,\n}: TrackTargetTxParams): Promise<Transfer> {\n const target = currentTransfer.target ?? {\n confirmationCount: 0,\n requiredConfirmationCount: 1,\n startedAtMs: Date.now(),\n };\n\n if (target.confirmationCount >= target.requiredConfirmationCount) {\n // Move to completed\n const completedTransfer: Transfer = {\n ...currentTransfer,\n status: 'completed',\n completedAtMs: Date.now(),\n };\n return completedTransfer;\n }\n\n if (!target.txHash) {\n // Find the target tx hash via logs and then update the transfer.\n const {\n ethToAva,\n target: {\n token: { address: contractAddress },\n },\n } = getTransferData(\n {\n assetIn,\n sourceChainId,\n targetChainId,\n },\n evmConfig,\n );\n\n const targetTxHash = ethToAva\n ? await _getTargetTxHashEthToAva({\n contractAddress,\n sourceTxHash: currentTransfer.source.txHash,\n targetClient,\n targetStartBlockNumber: currentTransfer.source.targetStartBlockNumber,\n })\n : await _getTargetTxHashAvaToEth({\n contractAddress,\n evmConfig,\n fromAddress: currentTransfer.fromAddress,\n targetClient,\n targetStartBlockNumber: currentTransfer.source.targetStartBlockNumber,\n });\n\n if (!targetTxHash) {\n return {\n ...currentTransfer,\n errorCode: ErrorCode.UNKNOWN,\n errorReason: 'Target transaction hash could not be found',\n failedAtMs: Date.now(),\n status: 'failed',\n } satisfies FailedTransfer;\n }\n\n return {\n ...currentTransfer,\n target: {\n ...target,\n txHash: targetTxHash,\n },\n } satisfies TargetPendingTransfer;\n }\n\n if (!isHash(target.txHash)) {\n return {\n ...currentTransfer,\n errorCode: ErrorCode.INVALID_PARAMS,\n failedAtMs: Date.now(),\n status: 'failed',\n } satisfies FailedTransfer;\n }\n\n try {\n const receiptResult = await awaitOrAbort(\n targetClient.waitForTransactionReceipt({\n // Wait for all required confirmations (which should just be 1 on target).\n // This is a safety in case it's ever more than 1. We just won't \"poll\" multiple times\n // like we do for the source.\n confirmations: target.requiredConfirmationCount,\n hash: target.txHash,\n }),\n signal,\n );\n\n if (receiptResult.status === 'aborted') {\n return currentTransfer;\n }\n\n const transactionReceipt = receiptResult.value;\n\n if (transactionReceipt.status === 'reverted') {\n return {\n ...currentTransfer,\n errorCode: ErrorCode.TRANSACTION_REVERTED,\n failedAtMs: Date.now(),\n status: 'failed',\n } satisfies FailedTransfer;\n }\n\n return {\n ...currentTransfer,\n completedAtMs: Date.now(),\n status: 'completed',\n target: {\n ...target,\n confirmationCount: await targetClient\n .getTransactionConfirmations({\n // hash: target.txHash,\n transactionReceipt,\n })\n .then((count) => Number(count))\n .catch(() => target.requiredConfirmationCount),\n },\n } satisfies CompletedTransfer;\n } catch (error) {\n return {\n ...currentTransfer,\n errorCode: getErrorCodeForViemError(error),\n failedAtMs: Date.now(),\n status: 'failed',\n } satisfies FailedTransfer;\n }\n}\n\nexport async function _getTargetTxHashEthToAva({\n contractAddress,\n sourceTxHash,\n targetClient,\n targetStartBlockNumber,\n}: {\n contractAddress: Hash;\n sourceTxHash: string;\n targetClient: ReturnType<typeof getEvmClientForChain>;\n targetStartBlockNumber: bigint | undefined;\n}): Promise<Hash | null> {\n if (targetStartBlockNumber === undefined) {\n return null;\n }\n\n const logs = await targetClient.getLogs({\n address: contractAddress,\n event: {\n inputs: [\n {\n indexed: false,\n name: 'to',\n type: 'address',\n },\n {\n indexed: false,\n name: 'amount',\n type: 'uint256',\n },\n {\n indexed: false,\n name: 'feeAddress',\n type: 'address',\n },\n {\n indexed: false,\n name: 'feeAmount',\n type: 'uint256',\n },\n {\n indexed: false,\n name: 'originTxId',\n type: 'bytes32',\n },\n ],\n name: 'Mint',\n type: 'event',\n },\n fromBlock: targetStartBlockNumber,\n toBlock: 'latest', // TODO: Consider limiting the range?\n });\n\n // OriginTxId is not indexed. So it cannot be part of the filter.\n const foundLog = logs.find((log) => log.args.originTxId === sourceTxHash); // TODO: Is my assumption correct here? ie that we want to compare the sourceTxHash?\n\n if (!foundLog) {\n return null;\n }\n\n return foundLog.transactionHash;\n}\n\nexport async function _getTargetTxHashAvaToEth({\n contractAddress,\n evmConfig,\n fromAddress,\n targetClient,\n targetStartBlockNumber,\n}: {\n contractAddress: Hash;\n evmConfig: EvmConfig;\n fromAddress: string;\n targetClient: ReturnType<typeof getEvmClientForChain>;\n targetStartBlockNumber: bigint | undefined;\n}): Promise<Hash | null> {\n if (targetStartBlockNumber === undefined) {\n return null;\n }\n\n if (!isAddress(fromAddress)) {\n return null;\n }\n\n const logs = await targetClient.getLogs({\n address: contractAddress,\n args: {\n dst: fromAddress,\n src: evmConfig.walletAddresses.ethereum,\n },\n event: {\n inputs: [\n {\n indexed: true,\n name: 'src',\n type: 'address',\n },\n {\n indexed: true,\n name: 'dst',\n type: 'address',\n },\n {\n indexed: false,\n name: 'wad',\n type: 'uint256',\n },\n ],\n name: 'Transfer',\n type: 'event',\n },\n fromBlock: targetStartBlockNumber,\n toBlock: 'latest', // TODO: Consider limiting the range?\n });\n\n const foundLog = logs.at(0); // TODO: Is this correct? Original code was using -1. But we want \"oldest\" log right? ie the closest to the \"fromBlock\"?\n\n if (!foundLog) {\n return null;\n }\n\n return foundLog.transactionHash;\n}\n"],"mappings":"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"}