@avalabs/fusion-sdk 0.0.0-avalanche-evm-bugs-20260313162813

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 (418) 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/_virtual/_rolldown/runtime.cjs +1 -0
  12. package/dist/constants.cjs +2 -0
  13. package/dist/constants.cjs.map +1 -0
  14. package/dist/constants.d.cts +102 -0
  15. package/dist/constants.d.ts +102 -0
  16. package/dist/constants.js +2 -0
  17. package/dist/constants.js.map +1 -0
  18. package/dist/errors.cjs +2 -0
  19. package/dist/errors.cjs.map +1 -0
  20. package/dist/errors.d.cts +117 -0
  21. package/dist/errors.d.ts +117 -0
  22. package/dist/errors.js +2 -0
  23. package/dist/errors.js.map +1 -0
  24. package/dist/mod.cjs +1 -0
  25. package/dist/mod.d.cts +19 -0
  26. package/dist/mod.d.ts +19 -0
  27. package/dist/mod.js +1 -0
  28. package/dist/quoter/_utils.cjs +2 -0
  29. package/dist/quoter/_utils.cjs.map +1 -0
  30. package/dist/quoter/_utils.js +2 -0
  31. package/dist/quoter/_utils.js.map +1 -0
  32. package/dist/quoter/constants.cjs +2 -0
  33. package/dist/quoter/constants.cjs.map +1 -0
  34. package/dist/quoter/constants.js +2 -0
  35. package/dist/quoter/constants.js.map +1 -0
  36. package/dist/quoter/quoter.cjs +2 -0
  37. package/dist/quoter/quoter.cjs.map +1 -0
  38. package/dist/quoter/quoter.d.cts +31 -0
  39. package/dist/quoter/quoter.d.ts +34 -0
  40. package/dist/quoter/quoter.js +2 -0
  41. package/dist/quoter/quoter.js.map +1 -0
  42. package/dist/transfer-manager.cjs +2 -0
  43. package/dist/transfer-manager.cjs.map +1 -0
  44. package/dist/transfer-manager.d.cts +17 -0
  45. package/dist/transfer-manager.d.ts +17 -0
  46. package/dist/transfer-manager.js +2 -0
  47. package/dist/transfer-manager.js.map +1 -0
  48. package/dist/transfer-service/_abis.cjs +2 -0
  49. package/dist/transfer-service/_abis.cjs.map +1 -0
  50. package/dist/transfer-service/_abis.js +2 -0
  51. package/dist/transfer-service/_abis.js.map +1 -0
  52. package/dist/transfer-service/_evm-gas.cjs +2 -0
  53. package/dist/transfer-service/_evm-gas.cjs.map +1 -0
  54. package/dist/transfer-service/_evm-gas.js +2 -0
  55. package/dist/transfer-service/_evm-gas.js.map +1 -0
  56. package/dist/transfer-service/_tracking-utilities.cjs +2 -0
  57. package/dist/transfer-service/_tracking-utilities.cjs.map +1 -0
  58. package/dist/transfer-service/_tracking-utilities.js +2 -0
  59. package/dist/transfer-service/_tracking-utilities.js.map +1 -0
  60. package/dist/transfer-service/_transfer-utilities.cjs +2 -0
  61. package/dist/transfer-service/_transfer-utilities.cjs.map +1 -0
  62. package/dist/transfer-service/_transfer-utilities.js +2 -0
  63. package/dist/transfer-service/_transfer-utilities.js.map +1 -0
  64. package/dist/transfer-service/_utils.cjs +2 -0
  65. package/dist/transfer-service/_utils.cjs.map +1 -0
  66. package/dist/transfer-service/_utils.js +2 -0
  67. package/dist/transfer-service/_utils.js.map +1 -0
  68. package/dist/transfer-service/_warden-config-schema.cjs +2 -0
  69. package/dist/transfer-service/_warden-config-schema.cjs.map +1 -0
  70. package/dist/transfer-service/_warden-config-schema.js +2 -0
  71. package/dist/transfer-service/_warden-config-schema.js.map +1 -0
  72. package/dist/transfer-service/_warden-config.cjs +2 -0
  73. package/dist/transfer-service/_warden-config.cjs.map +1 -0
  74. package/dist/transfer-service/_warden-config.js +2 -0
  75. package/dist/transfer-service/_warden-config.js.map +1 -0
  76. package/dist/transfer-service/avalanche-evm/_constants.cjs +2 -0
  77. package/dist/transfer-service/avalanche-evm/_constants.cjs.map +1 -0
  78. package/dist/transfer-service/avalanche-evm/_constants.js +2 -0
  79. package/dist/transfer-service/avalanche-evm/_constants.js.map +1 -0
  80. package/dist/transfer-service/avalanche-evm/_handlers/analyze-support.cjs +2 -0
  81. package/dist/transfer-service/avalanche-evm/_handlers/analyze-support.cjs.map +1 -0
  82. package/dist/transfer-service/avalanche-evm/_handlers/analyze-support.js +2 -0
  83. package/dist/transfer-service/avalanche-evm/_handlers/analyze-support.js.map +1 -0
  84. package/dist/transfer-service/avalanche-evm/_handlers/estimate-native-fee.cjs +2 -0
  85. package/dist/transfer-service/avalanche-evm/_handlers/estimate-native-fee.cjs.map +1 -0
  86. package/dist/transfer-service/avalanche-evm/_handlers/estimate-native-fee.js +2 -0
  87. package/dist/transfer-service/avalanche-evm/_handlers/estimate-native-fee.js.map +1 -0
  88. package/dist/transfer-service/avalanche-evm/_handlers/get-assets.cjs +2 -0
  89. package/dist/transfer-service/avalanche-evm/_handlers/get-assets.cjs.map +1 -0
  90. package/dist/transfer-service/avalanche-evm/_handlers/get-assets.js +2 -0
  91. package/dist/transfer-service/avalanche-evm/_handlers/get-assets.js.map +1 -0
  92. package/dist/transfer-service/avalanche-evm/_handlers/get-bridgeable-assets.cjs +2 -0
  93. package/dist/transfer-service/avalanche-evm/_handlers/get-bridgeable-assets.cjs.map +1 -0
  94. package/dist/transfer-service/avalanche-evm/_handlers/get-bridgeable-assets.js +2 -0
  95. package/dist/transfer-service/avalanche-evm/_handlers/get-bridgeable-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-bridgeable-assets.cjs +2 -0
  185. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/get-bridgeable-assets.cjs.map +1 -0
  186. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/get-bridgeable-assets.js +2 -0
  187. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/get-bridgeable-assets.js.map +1 -0
  188. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/get-minimum-transfer-amount.cjs +2 -0
  189. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/get-minimum-transfer-amount.cjs.map +1 -0
  190. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/get-minimum-transfer-amount.js +2 -0
  191. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/get-minimum-transfer-amount.js.map +1 -0
  192. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/stream-quotes.cjs +2 -0
  193. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/stream-quotes.cjs.map +1 -0
  194. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/stream-quotes.js +2 -0
  195. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/stream-quotes.js.map +1 -0
  196. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/track-transfer.cjs +2 -0
  197. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/track-transfer.cjs.map +1 -0
  198. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/track-transfer.js +2 -0
  199. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/track-transfer.js.map +1 -0
  200. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/transfer-asset.cjs +2 -0
  201. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/transfer-asset.cjs.map +1 -0
  202. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/transfer-asset.js +2 -0
  203. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/transfer-asset.js.map +1 -0
  204. package/dist/transfer-service/lombard/btc-to-btcb-service.cjs +2 -0
  205. package/dist/transfer-service/lombard/btc-to-btcb-service.cjs.map +1 -0
  206. package/dist/transfer-service/lombard/btc-to-btcb-service.js +2 -0
  207. package/dist/transfer-service/lombard/btc-to-btcb-service.js.map +1 -0
  208. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/analyze-support.cjs +2 -0
  209. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/analyze-support.cjs.map +1 -0
  210. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/analyze-support.js +2 -0
  211. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/analyze-support.js.map +1 -0
  212. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/estimate-native-fee.cjs +2 -0
  213. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/estimate-native-fee.cjs.map +1 -0
  214. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/estimate-native-fee.js +2 -0
  215. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/estimate-native-fee.js.map +1 -0
  216. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/get-assets.cjs +2 -0
  217. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/get-assets.cjs.map +1 -0
  218. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/get-assets.js +2 -0
  219. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/get-assets.js.map +1 -0
  220. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/get-bridgeable-assets.cjs +2 -0
  221. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/get-bridgeable-assets.cjs.map +1 -0
  222. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/get-bridgeable-assets.js +2 -0
  223. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/get-bridgeable-assets.js.map +1 -0
  224. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/stream-quotes.cjs +2 -0
  225. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/stream-quotes.cjs.map +1 -0
  226. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/stream-quotes.js +2 -0
  227. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/stream-quotes.js.map +1 -0
  228. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/track-transfer.cjs +2 -0
  229. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/track-transfer.cjs.map +1 -0
  230. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/track-transfer.js +2 -0
  231. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/track-transfer.js.map +1 -0
  232. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/transfer-asset.cjs +2 -0
  233. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/transfer-asset.cjs.map +1 -0
  234. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/transfer-asset.js +2 -0
  235. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/transfer-asset.js.map +1 -0
  236. package/dist/transfer-service/lombard/btcb-to-btc-service.cjs +2 -0
  237. package/dist/transfer-service/lombard/btcb-to-btc-service.cjs.map +1 -0
  238. package/dist/transfer-service/lombard/btcb-to-btc-service.js +2 -0
  239. package/dist/transfer-service/lombard/btcb-to-btc-service.js.map +1 -0
  240. package/dist/transfer-service/lombard/constants.cjs +2 -0
  241. package/dist/transfer-service/lombard/constants.cjs.map +1 -0
  242. package/dist/transfer-service/lombard/constants.js +2 -0
  243. package/dist/transfer-service/lombard/constants.js.map +1 -0
  244. package/dist/transfer-service/markr/_abis/cross-chain-swap-wrapper-abi.cjs +2 -0
  245. package/dist/transfer-service/markr/_abis/cross-chain-swap-wrapper-abi.cjs.map +1 -0
  246. package/dist/transfer-service/markr/_abis/cross-chain-swap-wrapper-abi.js +2 -0
  247. package/dist/transfer-service/markr/_abis/cross-chain-swap-wrapper-abi.js.map +1 -0
  248. package/dist/transfer-service/markr/_abis/swap-wrapper-abi.cjs +2 -0
  249. package/dist/transfer-service/markr/_abis/swap-wrapper-abi.cjs.map +1 -0
  250. package/dist/transfer-service/markr/_abis/swap-wrapper-abi.js +2 -0
  251. package/dist/transfer-service/markr/_abis/swap-wrapper-abi.js.map +1 -0
  252. package/dist/transfer-service/markr/_api.cjs +2 -0
  253. package/dist/transfer-service/markr/_api.cjs.map +1 -0
  254. package/dist/transfer-service/markr/_api.js +2 -0
  255. package/dist/transfer-service/markr/_api.js.map +1 -0
  256. package/dist/transfer-service/markr/_handlers/analyze-support.cjs +2 -0
  257. package/dist/transfer-service/markr/_handlers/analyze-support.cjs.map +1 -0
  258. package/dist/transfer-service/markr/_handlers/analyze-support.js +2 -0
  259. package/dist/transfer-service/markr/_handlers/analyze-support.js.map +1 -0
  260. package/dist/transfer-service/markr/_handlers/estimate-native-fee.cjs +2 -0
  261. package/dist/transfer-service/markr/_handlers/estimate-native-fee.cjs.map +1 -0
  262. package/dist/transfer-service/markr/_handlers/estimate-native-fee.js +2 -0
  263. package/dist/transfer-service/markr/_handlers/estimate-native-fee.js.map +1 -0
  264. package/dist/transfer-service/markr/_handlers/get-assets.cjs +2 -0
  265. package/dist/transfer-service/markr/_handlers/get-assets.cjs.map +1 -0
  266. package/dist/transfer-service/markr/_handlers/get-assets.js +2 -0
  267. package/dist/transfer-service/markr/_handlers/get-assets.js.map +1 -0
  268. package/dist/transfer-service/markr/_handlers/get-bridgeable-assets.cjs +2 -0
  269. package/dist/transfer-service/markr/_handlers/get-bridgeable-assets.cjs.map +1 -0
  270. package/dist/transfer-service/markr/_handlers/get-bridgeable-assets.js +2 -0
  271. package/dist/transfer-service/markr/_handlers/get-bridgeable-assets.js.map +1 -0
  272. package/dist/transfer-service/markr/_handlers/get-minimum-transfer-amount.cjs +2 -0
  273. package/dist/transfer-service/markr/_handlers/get-minimum-transfer-amount.cjs.map +1 -0
  274. package/dist/transfer-service/markr/_handlers/get-minimum-transfer-amount.js +2 -0
  275. package/dist/transfer-service/markr/_handlers/get-minimum-transfer-amount.js.map +1 -0
  276. package/dist/transfer-service/markr/_handlers/stream-quotes.cjs +2 -0
  277. package/dist/transfer-service/markr/_handlers/stream-quotes.cjs.map +1 -0
  278. package/dist/transfer-service/markr/_handlers/stream-quotes.js +2 -0
  279. package/dist/transfer-service/markr/_handlers/stream-quotes.js.map +1 -0
  280. package/dist/transfer-service/markr/_handlers/track-transfer.cjs +2 -0
  281. package/dist/transfer-service/markr/_handlers/track-transfer.cjs.map +1 -0
  282. package/dist/transfer-service/markr/_handlers/track-transfer.js +2 -0
  283. package/dist/transfer-service/markr/_handlers/track-transfer.js.map +1 -0
  284. package/dist/transfer-service/markr/_handlers/transfer-asset.cjs +2 -0
  285. package/dist/transfer-service/markr/_handlers/transfer-asset.cjs.map +1 -0
  286. package/dist/transfer-service/markr/_handlers/transfer-asset.js +2 -0
  287. package/dist/transfer-service/markr/_handlers/transfer-asset.js.map +1 -0
  288. package/dist/transfer-service/markr/_schema.cjs +2 -0
  289. package/dist/transfer-service/markr/_schema.cjs.map +1 -0
  290. package/dist/transfer-service/markr/_schema.js +2 -0
  291. package/dist/transfer-service/markr/_schema.js.map +1 -0
  292. package/dist/transfer-service/markr/_type-guards.cjs +2 -0
  293. package/dist/transfer-service/markr/_type-guards.cjs.map +1 -0
  294. package/dist/transfer-service/markr/_type-guards.js +2 -0
  295. package/dist/transfer-service/markr/_type-guards.js.map +1 -0
  296. package/dist/transfer-service/markr/_utils.cjs +2 -0
  297. package/dist/transfer-service/markr/_utils.cjs.map +1 -0
  298. package/dist/transfer-service/markr/_utils.js +2 -0
  299. package/dist/transfer-service/markr/_utils.js.map +1 -0
  300. package/dist/transfer-service/markr/constants.cjs +2 -0
  301. package/dist/transfer-service/markr/constants.cjs.map +1 -0
  302. package/dist/transfer-service/markr/constants.js +2 -0
  303. package/dist/transfer-service/markr/constants.js.map +1 -0
  304. package/dist/transfer-service/markr/markr-service.cjs +2 -0
  305. package/dist/transfer-service/markr/markr-service.cjs.map +1 -0
  306. package/dist/transfer-service/markr/markr-service.js +2 -0
  307. package/dist/transfer-service/markr/markr-service.js.map +1 -0
  308. package/dist/transfer-service/service-schemas.cjs +2 -0
  309. package/dist/transfer-service/service-schemas.cjs.map +1 -0
  310. package/dist/transfer-service/service-schemas.js +2 -0
  311. package/dist/transfer-service/service-schemas.js.map +1 -0
  312. package/dist/transfer-service/wrap-unwrap/_handlers/analyze-support.cjs +2 -0
  313. package/dist/transfer-service/wrap-unwrap/_handlers/analyze-support.cjs.map +1 -0
  314. package/dist/transfer-service/wrap-unwrap/_handlers/analyze-support.js +2 -0
  315. package/dist/transfer-service/wrap-unwrap/_handlers/analyze-support.js.map +1 -0
  316. package/dist/transfer-service/wrap-unwrap/_handlers/estimate-native-fee.cjs +2 -0
  317. package/dist/transfer-service/wrap-unwrap/_handlers/estimate-native-fee.cjs.map +1 -0
  318. package/dist/transfer-service/wrap-unwrap/_handlers/estimate-native-fee.js +2 -0
  319. package/dist/transfer-service/wrap-unwrap/_handlers/estimate-native-fee.js.map +1 -0
  320. package/dist/transfer-service/wrap-unwrap/_handlers/get-assets.cjs +2 -0
  321. package/dist/transfer-service/wrap-unwrap/_handlers/get-assets.cjs.map +1 -0
  322. package/dist/transfer-service/wrap-unwrap/_handlers/get-assets.js +2 -0
  323. package/dist/transfer-service/wrap-unwrap/_handlers/get-assets.js.map +1 -0
  324. package/dist/transfer-service/wrap-unwrap/_handlers/get-bridgeable-assets.cjs +2 -0
  325. package/dist/transfer-service/wrap-unwrap/_handlers/get-bridgeable-assets.cjs.map +1 -0
  326. package/dist/transfer-service/wrap-unwrap/_handlers/get-bridgeable-assets.js +2 -0
  327. package/dist/transfer-service/wrap-unwrap/_handlers/get-bridgeable-assets.js.map +1 -0
  328. package/dist/transfer-service/wrap-unwrap/_handlers/get-minimum-transfer-amount.cjs +2 -0
  329. package/dist/transfer-service/wrap-unwrap/_handlers/get-minimum-transfer-amount.cjs.map +1 -0
  330. package/dist/transfer-service/wrap-unwrap/_handlers/get-minimum-transfer-amount.js +2 -0
  331. package/dist/transfer-service/wrap-unwrap/_handlers/get-minimum-transfer-amount.js.map +1 -0
  332. package/dist/transfer-service/wrap-unwrap/_handlers/stream-quotes.cjs +2 -0
  333. package/dist/transfer-service/wrap-unwrap/_handlers/stream-quotes.cjs.map +1 -0
  334. package/dist/transfer-service/wrap-unwrap/_handlers/stream-quotes.js +2 -0
  335. package/dist/transfer-service/wrap-unwrap/_handlers/stream-quotes.js.map +1 -0
  336. package/dist/transfer-service/wrap-unwrap/_handlers/track-transfer.cjs +2 -0
  337. package/dist/transfer-service/wrap-unwrap/_handlers/track-transfer.cjs.map +1 -0
  338. package/dist/transfer-service/wrap-unwrap/_handlers/track-transfer.js +2 -0
  339. package/dist/transfer-service/wrap-unwrap/_handlers/track-transfer.js.map +1 -0
  340. package/dist/transfer-service/wrap-unwrap/_handlers/transfer-asset.cjs +2 -0
  341. package/dist/transfer-service/wrap-unwrap/_handlers/transfer-asset.cjs.map +1 -0
  342. package/dist/transfer-service/wrap-unwrap/_handlers/transfer-asset.js +2 -0
  343. package/dist/transfer-service/wrap-unwrap/_handlers/transfer-asset.js.map +1 -0
  344. package/dist/transfer-service/wrap-unwrap/_utils.cjs +2 -0
  345. package/dist/transfer-service/wrap-unwrap/_utils.cjs.map +1 -0
  346. package/dist/transfer-service/wrap-unwrap/_utils.js +2 -0
  347. package/dist/transfer-service/wrap-unwrap/_utils.js.map +1 -0
  348. package/dist/transfer-service/wrap-unwrap/constants.cjs +2 -0
  349. package/dist/transfer-service/wrap-unwrap/constants.cjs.map +1 -0
  350. package/dist/transfer-service/wrap-unwrap/constants.js +2 -0
  351. package/dist/transfer-service/wrap-unwrap/constants.js.map +1 -0
  352. package/dist/transfer-service/wrap-unwrap/wrap-unwrap-service.cjs +2 -0
  353. package/dist/transfer-service/wrap-unwrap/wrap-unwrap-service.cjs.map +1 -0
  354. package/dist/transfer-service/wrap-unwrap/wrap-unwrap-service.js +2 -0
  355. package/dist/transfer-service/wrap-unwrap/wrap-unwrap-service.js.map +1 -0
  356. package/dist/type-guards.cjs +2 -0
  357. package/dist/type-guards.cjs.map +1 -0
  358. package/dist/type-guards.d.cts +16 -0
  359. package/dist/type-guards.d.ts +16 -0
  360. package/dist/type-guards.js +2 -0
  361. package/dist/type-guards.js.map +1 -0
  362. package/dist/types/asset.d.cts +66 -0
  363. package/dist/types/asset.d.ts +66 -0
  364. package/dist/types/bitcoin.d.cts +66 -0
  365. package/dist/types/bitcoin.d.ts +66 -0
  366. package/dist/types/caip.d.cts +30 -0
  367. package/dist/types/caip.d.ts +30 -0
  368. package/dist/types/chain.d.cts +17 -0
  369. package/dist/types/chain.d.ts +17 -0
  370. package/dist/types/fee.d.cts +13 -0
  371. package/dist/types/fee.d.ts +13 -0
  372. package/dist/types/quote.d.cts +140 -0
  373. package/dist/types/quote.d.ts +140 -0
  374. package/dist/types/service.d.cts +243 -0
  375. package/dist/types/service.d.ts +243 -0
  376. package/dist/types/signer.d.cts +52 -0
  377. package/dist/types/signer.d.ts +52 -0
  378. package/dist/types/transfer-manager.d.cts +119 -0
  379. package/dist/types/transfer-manager.d.ts +119 -0
  380. package/dist/types/transfer.d.cts +126 -0
  381. package/dist/types/transfer.d.ts +126 -0
  382. package/dist/types/utility-types.d.cts +21 -0
  383. package/dist/types/utility-types.d.ts +21 -0
  384. package/dist/utils/asset-id.cjs +2 -0
  385. package/dist/utils/asset-id.cjs.map +1 -0
  386. package/dist/utils/asset-id.js +2 -0
  387. package/dist/utils/asset-id.js.map +1 -0
  388. package/dist/utils/bitcoin-address.cjs +2 -0
  389. package/dist/utils/bitcoin-address.cjs.map +1 -0
  390. package/dist/utils/bitcoin-address.js +2 -0
  391. package/dist/utils/bitcoin-address.js.map +1 -0
  392. package/dist/utils/caip.cjs +2 -0
  393. package/dist/utils/caip.cjs.map +1 -0
  394. package/dist/utils/caip.d.cts +49 -0
  395. package/dist/utils/caip.d.ts +49 -0
  396. package/dist/utils/caip.js +2 -0
  397. package/dist/utils/caip.js.map +1 -0
  398. package/dist/utils/evm-address.cjs +2 -0
  399. package/dist/utils/evm-address.cjs.map +1 -0
  400. package/dist/utils/evm-address.js +2 -0
  401. package/dist/utils/evm-address.js.map +1 -0
  402. package/dist/utils/quote-fees.cjs +2 -0
  403. package/dist/utils/quote-fees.cjs.map +1 -0
  404. package/dist/utils/quote-fees.js +2 -0
  405. package/dist/utils/quote-fees.js.map +1 -0
  406. package/dist/utils/sol-address.cjs +2 -0
  407. package/dist/utils/sol-address.cjs.map +1 -0
  408. package/dist/utils/sol-address.js +2 -0
  409. package/dist/utils/sol-address.js.map +1 -0
  410. package/dist/utils/solana-transaction.d.cts +15 -0
  411. package/dist/utils/solana-transaction.d.ts +17 -0
  412. package/dist/utils/transfer-utils.cjs +2 -0
  413. package/dist/utils/transfer-utils.cjs.map +1 -0
  414. package/dist/utils/transfer-utils.d.cts +8 -0
  415. package/dist/utils/transfer-utils.d.ts +8 -0
  416. package/dist/utils/transfer-utils.js +2 -0
  417. package/dist/utils/transfer-utils.js.map +1 -0
  418. package/package.json +63 -0
@@ -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 Fusion SDK services.\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(`../../../constants.cjs`),t=require(`../../../utils/asset-id.cjs`);function n({serviceAssets:n}){return async({sourceAsset:r,sourceChainId:i,targetChainId:a})=>{let o=n[i];if(!o)return[];let s=t.getAssetId(i,r),c=o.find(e=>t.getAssetId(i,e)===s);if(!c)return[];let l=c.destinations[a];if(!l)return[];let u=n[a];if(!u)return[];let d=u.find(e=>`address`in e&&e.address.toLowerCase()===l.address.toLowerCase());return d?[{type:d.type,name:d.name,symbol:d.symbol,decimals:d.decimals,...`address`in d&&{address:d.address},...d.logoUri!==void 0&&{logoUri:d.logoUri},bridgeProviders:[e.ServiceType.AVALANCHE_EVM]}]:[]}}exports.getBridgeableAssetsFactory=n;
2
+ //# sourceMappingURL=get-bridgeable-assets.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-bridgeable-assets.cjs","names":["getAssetId","ServiceType"],"sources":["../../../../src/transfer-service/avalanche-evm/_handlers/get-bridgeable-assets.ts"],"sourcesContent":["import { ServiceType } from '../../../constants';\nimport type { BridgeableUiAsset, ChainAssetMap } from '../../../types/asset';\nimport type { GetBridgeableAssetsProps, TransferService } from '../../../types/service';\nimport { getAssetId } from '../../../utils/asset-id';\n\nexport function getBridgeableAssetsFactory({\n serviceAssets,\n}: {\n serviceAssets: ChainAssetMap;\n}): TransferService['getBridgeableAssets'] {\n return async ({\n sourceAsset,\n sourceChainId,\n targetChainId,\n }: GetBridgeableAssetsProps): Promise<readonly BridgeableUiAsset[]> => {\n const sourceChainAssets = serviceAssets[sourceChainId];\n if (!sourceChainAssets) return [];\n\n const sourceId = getAssetId(sourceChainId, sourceAsset);\n const found = sourceChainAssets.find((a) => getAssetId(sourceChainId, a) === sourceId);\n if (!found) return [];\n\n const destination = found.destinations[targetChainId];\n if (!destination) return [];\n\n const targetChainAssets = serviceAssets[targetChainId];\n if (!targetChainAssets) return [];\n\n const target = targetChainAssets.find(\n (a) => 'address' in a && a.address.toLowerCase() === destination.address.toLowerCase(),\n );\n if (!target) return [];\n\n return [\n {\n type: target.type,\n name: target.name,\n symbol: target.symbol,\n decimals: target.decimals,\n ...('address' in target && { address: target.address }),\n ...(target.logoUri !== undefined && { logoUri: target.logoUri }),\n bridgeProviders: [ServiceType.AVALANCHE_EVM],\n } as BridgeableUiAsset,\n ];\n };\n}\n"],"mappings":"mFAKA,SAAgB,EAA2B,CACzC,iBAGyC,CACzC,OAAO,MAAO,CACZ,cACA,gBACA,mBACqE,CACrE,IAAM,EAAoB,EAAc,GACxC,GAAI,CAAC,EAAmB,MAAO,EAAE,CAEjC,IAAM,EAAWA,EAAAA,WAAW,EAAe,EAAY,CACjD,EAAQ,EAAkB,KAAM,GAAMA,EAAAA,WAAW,EAAe,EAAE,GAAK,EAAS,CACtF,GAAI,CAAC,EAAO,MAAO,EAAE,CAErB,IAAM,EAAc,EAAM,aAAa,GACvC,GAAI,CAAC,EAAa,MAAO,EAAE,CAE3B,IAAM,EAAoB,EAAc,GACxC,GAAI,CAAC,EAAmB,MAAO,EAAE,CAEjC,IAAM,EAAS,EAAkB,KAC9B,GAAM,YAAa,GAAK,EAAE,QAAQ,aAAa,GAAK,EAAY,QAAQ,aAAa,CACvF,CAGD,OAFK,EAEE,CACL,CACE,KAAM,EAAO,KACb,KAAM,EAAO,KACb,OAAQ,EAAO,OACf,SAAU,EAAO,SACjB,GAAI,YAAa,GAAU,CAAE,QAAS,EAAO,QAAS,CACtD,GAAI,EAAO,UAAY,IAAA,IAAa,CAAE,QAAS,EAAO,QAAS,CAC/D,gBAAiB,CAACC,EAAAA,YAAY,cAAc,CAC7C,CACF,CAZmB,EAAE"}
@@ -0,0 +1,2 @@
1
+ import{ServiceType as e}from"../../../constants.js";import{getAssetId as t}from"../../../utils/asset-id.js";function n({serviceAssets:n}){return async({sourceAsset:r,sourceChainId:i,targetChainId:a})=>{let o=n[i];if(!o)return[];let s=t(i,r),c=o.find(e=>t(i,e)===s);if(!c)return[];let l=c.destinations[a];if(!l)return[];let u=n[a];if(!u)return[];let d=u.find(e=>`address`in e&&e.address.toLowerCase()===l.address.toLowerCase());return d?[{type:d.type,name:d.name,symbol:d.symbol,decimals:d.decimals,...`address`in d&&{address:d.address},...d.logoUri!==void 0&&{logoUri:d.logoUri},bridgeProviders:[e.AVALANCHE_EVM]}]:[]}}export{n as getBridgeableAssetsFactory};
2
+ //# sourceMappingURL=get-bridgeable-assets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-bridgeable-assets.js","names":[],"sources":["../../../../src/transfer-service/avalanche-evm/_handlers/get-bridgeable-assets.ts"],"sourcesContent":["import { ServiceType } from '../../../constants';\nimport type { BridgeableUiAsset, ChainAssetMap } from '../../../types/asset';\nimport type { GetBridgeableAssetsProps, TransferService } from '../../../types/service';\nimport { getAssetId } from '../../../utils/asset-id';\n\nexport function getBridgeableAssetsFactory({\n serviceAssets,\n}: {\n serviceAssets: ChainAssetMap;\n}): TransferService['getBridgeableAssets'] {\n return async ({\n sourceAsset,\n sourceChainId,\n targetChainId,\n }: GetBridgeableAssetsProps): Promise<readonly BridgeableUiAsset[]> => {\n const sourceChainAssets = serviceAssets[sourceChainId];\n if (!sourceChainAssets) return [];\n\n const sourceId = getAssetId(sourceChainId, sourceAsset);\n const found = sourceChainAssets.find((a) => getAssetId(sourceChainId, a) === sourceId);\n if (!found) return [];\n\n const destination = found.destinations[targetChainId];\n if (!destination) return [];\n\n const targetChainAssets = serviceAssets[targetChainId];\n if (!targetChainAssets) return [];\n\n const target = targetChainAssets.find(\n (a) => 'address' in a && a.address.toLowerCase() === destination.address.toLowerCase(),\n );\n if (!target) return [];\n\n return [\n {\n type: target.type,\n name: target.name,\n symbol: target.symbol,\n decimals: target.decimals,\n ...('address' in target && { address: target.address }),\n ...(target.logoUri !== undefined && { logoUri: target.logoUri }),\n bridgeProviders: [ServiceType.AVALANCHE_EVM],\n } as BridgeableUiAsset,\n ];\n };\n}\n"],"mappings":"4GAKA,SAAgB,EAA2B,CACzC,iBAGyC,CACzC,OAAO,MAAO,CACZ,cACA,gBACA,mBACqE,CACrE,IAAM,EAAoB,EAAc,GACxC,GAAI,CAAC,EAAmB,MAAO,EAAE,CAEjC,IAAM,EAAW,EAAW,EAAe,EAAY,CACjD,EAAQ,EAAkB,KAAM,GAAM,EAAW,EAAe,EAAE,GAAK,EAAS,CACtF,GAAI,CAAC,EAAO,MAAO,EAAE,CAErB,IAAM,EAAc,EAAM,aAAa,GACvC,GAAI,CAAC,EAAa,MAAO,EAAE,CAE3B,IAAM,EAAoB,EAAc,GACxC,GAAI,CAAC,EAAmB,MAAO,EAAE,CAEjC,IAAM,EAAS,EAAkB,KAC9B,GAAM,YAAa,GAAK,EAAE,QAAQ,aAAa,GAAK,EAAY,QAAQ,aAAa,CACvF,CAGD,OAFK,EAEE,CACL,CACE,KAAM,EAAO,KACb,KAAM,EAAO,KACb,OAAQ,EAAO,OACf,SAAU,EAAO,SACjB,GAAI,YAAa,GAAU,CAAE,QAAS,EAAO,QAAS,CACtD,GAAI,EAAO,UAAY,IAAA,IAAa,CAAE,QAAS,EAAO,QAAS,CAC/D,gBAAiB,CAAC,EAAY,cAAc,CAC7C,CACF,CAZmB,EAAE"}
@@ -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,errorReason:`Invalid source transaction hash`,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,errorReason:`Invalid source transaction hash`,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,errorReason:`Source transaction was 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{return n}}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:e,target:{token:{address:t}}}=n.getTransferData({assetIn:i,sourceChainId:u,targetChainId:d},o),r=e?await s({contractAddress:t,sourceTxHash:a.source.txHash,targetClient:f,targetStartBlockNumber:a.source.targetStartBlockNumber}):await c({contractAddress:t,evmConfig:o,fromAddress:a.fromAddress,targetClient:f,targetStartBlockNumber:a.source.targetStartBlockNumber});return r?{...a,target:{...p,txHash:r}}:a}if(!(0,r.isHash)(p.txHash))return{...a,errorCode:e.ErrorCode.INVALID_PARAMS,errorReason:`Invalid target transaction hash`,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,errorReason:`Target transaction was 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{return a}}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","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, 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 errorReason: 'Invalid source transaction hash',\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 errorReason: 'Invalid source transaction hash',\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 errorReason: 'Source transaction was 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 {\n return currentTransfer;\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 currentTransfer;\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 errorReason: 'Invalid target transaction hash',\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 errorReason: 'Target transaction was 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 {\n return currentTransfer;\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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"}
@@ -0,0 +1,2 @@
1
+ import{ErrorCode as e}from"../../../errors.js";import{awaitOrAbort as t,getEvmClientForChain as n}from"../../_utils.js";import{getTransferData as r}from"../_utils/transfer-data.js";import{isAddress as i,isHash as a}from"viem";function o({config:t}){return({transfer:r,updateListener:i})=>{let o=new AbortController,l=()=>{o.abort()};if(r.status===`completed`||r.status===`failed`)return{cancel:l,result:Promise.resolve(r)};let{txHash:u}=r.source;if(!a(u)){let t={...r,errorCode:e.INVALID_PARAMS,errorReason:`Invalid source transaction hash`,failedAtMs:Date.now(),status:`failed`};return i(t),{cancel:l,result:Promise.resolve(t)}}let d=n({chain:r.sourceChain}),f=n({chain:r.targetChain}),p=structuredClone(r);return{cancel:l,result:(async()=>{for(;!o.signal.aborted;)switch(p.status){case`source-pending`:p=await s({currentTransfer:p,signal:o.signal,sourceClient:d}),i(p);break;case`target-pending`:p=await c({assetIn:p.sourceAsset,currentTransfer:p,evmConfig:t,signal:o.signal,sourceChainId:p.sourceChain.chainId,targetChainId:p.targetChain.chainId,targetClient:f}),i(p);break;default:return p}return p})()}}}async function s({currentTransfer:n,signal:r,sourceClient:i}){let{confirmationCount:o,requiredConfirmationCount:s,txHash:c}=n.source;if(!a(c))return{...n,errorCode:e.INVALID_PARAMS,errorReason:`Invalid source transaction hash`,failedAtMs:Date.now(),status:`failed`};if(o>=s)return{...n,status:`target-pending`,target:{confirmationCount:0,requiredConfirmationCount:1,startedAtMs:Date.now()}};try{let a=await t(i.waitForTransactionReceipt({confirmations:Math.min(o+1,s),hash:c}),r);if(a.status===`aborted`)return n;let l=a.value;if(l.status===`reverted`)return{...n,errorCode:e.TRANSACTION_REVERTED,errorReason:`Source transaction was reverted`,failedAtMs:Date.now(),status:`failed`};let u=await i.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{return n}}async function c({assetIn:n,currentTransfer:i,evmConfig:o,signal:s,sourceChainId:c,targetChainId:d,targetClient:f}){let p=i.target??{confirmationCount:0,requiredConfirmationCount:1,startedAtMs:Date.now()};if(p.confirmationCount>=p.requiredConfirmationCount)return{...i,status:`completed`,completedAtMs:Date.now()};if(!p.txHash){let{ethToAva:e,target:{token:{address:t}}}=r({assetIn:n,sourceChainId:c,targetChainId:d},o),a=e?await l({contractAddress:t,sourceTxHash:i.source.txHash,targetClient:f,targetStartBlockNumber:i.source.targetStartBlockNumber}):await u({contractAddress:t,evmConfig:o,fromAddress:i.fromAddress,targetClient:f,targetStartBlockNumber:i.source.targetStartBlockNumber});return a?{...i,target:{...p,txHash:a}}:i}if(!a(p.txHash))return{...i,errorCode:e.INVALID_PARAMS,errorReason:`Invalid target transaction hash`,failedAtMs:Date.now(),status:`failed`};try{let n=await t(f.waitForTransactionReceipt({confirmations:p.requiredConfirmationCount,hash:p.txHash}),s);if(n.status===`aborted`)return i;let r=n.value;return r.status===`reverted`?{...i,errorCode:e.TRANSACTION_REVERTED,errorReason:`Target transaction was reverted`,failedAtMs:Date.now(),status:`failed`}:{...i,completedAtMs:Date.now(),status:`completed`,target:{...p,confirmationCount:await f.getTransactionConfirmations({transactionReceipt:r}).then(e=>Number(e)).catch(()=>p.requiredConfirmationCount)}}}catch{return i}}async function l({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 u({contractAddress:e,evmConfig:t,fromAddress:n,targetClient:r,targetStartBlockNumber:a}){if(a===void 0||!i(n))return null;let o=(await r.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}export{o as trackTransferFactory};
2
+ //# sourceMappingURL=track-transfer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"track-transfer.js","names":[],"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, 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 errorReason: 'Invalid source transaction hash',\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 errorReason: 'Invalid source transaction hash',\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 errorReason: 'Source transaction was 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 {\n return currentTransfer;\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 currentTransfer;\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 errorReason: 'Invalid target transaction hash',\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 errorReason: 'Target transaction was 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 {\n return currentTransfer;\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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"}
@@ -0,0 +1,2 @@
1
+ require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../constants.cjs`),t=require(`../../../errors.cjs`),n=require(`../../../_utils/chain.cjs`),r=require(`../_utils/validations.cjs`),i=require(`../../_utils.cjs`),a=require(`../_utils/transfer-data.cjs`),o=require(`./get-minimum-transfer-amount.cjs`),s=require(`../_utils/unwrap.cjs`),c=require(`../_utils/wrap.cjs`);let l=require(`viem`);function u({config:u,evmSigner:d,feeEstimationMultiplier:f}){return async({gasSettings:p,onStepChange:m,quote:h})=>{if(!(0,l.isAddress)(h.fromAddress)||!(0,l.isAddress)(h.toAddress))throw new t.InvalidParamsError(t.ErrorReason.INVALID_PARAMS,"`fromAddress` and `toAddress` must be valid EVM addresses.");r.validateTransferAddressesOrThrow(h.fromAddress,h.toAddress),r.validateTransferAddressesNotBlockedOrThrow([h.fromAddress,h.toAddress],u.addressBlocklist),r.validateChainCombinationOrThrow(h.sourceChain.chainId,h.targetChain.chainId);let g=await o.getMinimumTransferAmountFactory({config:u,feeEstimationMultiplier:f})({sourceAsset:h.assetIn,sourceChainId:h.sourceChain.chainId,targetAsset:h.assetOut,targetChainId:h.targetChain.chainId});if(h.amountIn<g)throw new t.InvalidParamsError(t.ErrorReason.INVALID_PARAMS,`Transfer amount is below the minimum transfer amount of ${g.toString()}`);let{ethToAva:_,source:v}=a.getTransferData({assetIn:h.assetIn,sourceChainId:h.sourceChain.chainId,targetChainId:h.targetChain.chainId},u),y=Date.now(),b,x,S=i.getEvmClientForChain({chain:h.targetChain}),C;try{C=await S.getBlockNumber()}catch{}_?[b,x]=await c.transferAssetFromEthToAva({amountIn:h.amountIn,assetIn:h.assetIn,evmConfig:u,fromAddress:h.fromAddress,sign:d.sign,source:v,sourceChain:h.sourceChain,targetChain:h.targetChain,gasSettings:p,onStepChange:m,quote:h}):[b,x]=await s.transferAssetFromAvaToEth({amountIn:h.amountIn,fromAddress:h.fromAddress,sign:d.sign,source:v,sourceChain:h.sourceChain,gasSettings:p,onStepChange:m,quote:h});let w=n.isAvalancheChain(h.sourceChain)?u.minimumConfirmations.avalanche:u.minimumConfirmations.ethereum;return x.status===`reverted`?{amountIn:h.amountIn,amountOut:h.amountOut,environment:u.environment,errorCode:t.ErrorCode.TRANSACTION_REVERTED,failedAtMs:Date.now(),fees:h.fees,fromAddress:h.fromAddress,id:h.id,partnerFeeBps:h.partnerFeeBps,source:{confirmationCount:0,requiredConfirmationCount:w,startedAtMs:y,txHash:b},sourceAsset:h.assetIn,sourceChain:h.sourceChain,status:`failed`,targetAsset:h.assetOut,targetChain:h.targetChain,toAddress:h.toAddress,type:e.ServiceType.AVALANCHE_EVM}:{amountIn:h.amountIn,amountOut:h.amountOut,environment:u.environment,fees:h.fees,fromAddress:h.fromAddress,id:h.id,partnerFeeBps:h.partnerFeeBps,source:{confirmationCount:1,requiredConfirmationCount:w,startedAtMs:y,targetStartBlockNumber:C,txHash:b},sourceAsset:h.assetIn,sourceChain:h.sourceChain,status:`source-pending`,targetAsset:h.assetOut,targetChain:h.targetChain,toAddress:h.toAddress,type:e.ServiceType.AVALANCHE_EVM}}}exports.transferAssetFactory=u;
2
+ //# sourceMappingURL=transfer-asset.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transfer-asset.cjs","names":["InvalidParamsError","ErrorReason","getMinimumTransferAmountFactory","getTransferData","getEvmClientForChain","transferAssetFromEthToAva","transferAssetFromAvaToEth","isAvalancheChain","ErrorCode","ServiceType"],"sources":["../../../../src/transfer-service/avalanche-evm/_handlers/transfer-asset.ts"],"sourcesContent":["import { isAddress as isEvmAddress, type Hex, type TransactionReceipt } from 'viem';\nimport type { EvmConfig } from '../_types';\nimport { ServiceType } from '../../../constants';\nimport { ErrorCode, ErrorReason, InvalidParamsError } from '../../../errors';\nimport type { EvmSigner } from '../../../types/signer';\nimport type { FailedTransfer, SourcePendingTransfer } from '../../../types/transfer';\nimport type { TransferService } from '../../../types/service';\nimport {\n validateChainCombinationOrThrow,\n validateTransferAddressesNotBlockedOrThrow,\n validateTransferAddressesOrThrow,\n} from '../_utils/validations';\nimport { getMinimumTransferAmountFactory } from './get-minimum-transfer-amount';\nimport { getTransferData } from '../_utils/transfer-data';\nimport { getEvmClientForChain } from '../../_utils';\nimport { isAvalancheChain } from '../../../_utils/chain';\nimport { transferAssetFromAvaToEth } from '../_utils/unwrap';\nimport { transferAssetFromEthToAva } from '../_utils/wrap';\n\nexport interface TransferAssetFactoryConfig {\n config: EvmConfig;\n evmSigner: EvmSigner;\n feeEstimationMultiplier: bigint;\n}\n\nexport function transferAssetFactory({\n config,\n evmSigner,\n feeEstimationMultiplier,\n}: TransferAssetFactoryConfig): TransferService['transferAsset'] {\n return async ({ gasSettings, onStepChange, quote }) => {\n // 1. Addresses must be EVM and valid.\n if (!isEvmAddress(quote.fromAddress) || !isEvmAddress(quote.toAddress)) {\n throw new InvalidParamsError(\n ErrorReason.INVALID_PARAMS,\n '`fromAddress` and `toAddress` must be valid EVM addresses.',\n );\n }\n\n // 2. Validate quote addresses are identical\n // Avalanche EVM bridge requires fromAddress and toAddress to be the same.\n validateTransferAddressesOrThrow(quote.fromAddress, quote.toAddress);\n\n // 3. Ensure addresses are not blocklisted\n validateTransferAddressesNotBlockedOrThrow([quote.fromAddress, quote.toAddress], config.addressBlocklist);\n\n // 4. Validate chain combination is supported\n validateChainCombinationOrThrow(quote.sourceChain.chainId, quote.targetChain.chainId);\n\n // 5. Amount must be greater than minimum transfer amount\n const minimumAmount = await getMinimumTransferAmountFactory({ config, feeEstimationMultiplier })({\n sourceAsset: quote.assetIn,\n sourceChainId: quote.sourceChain.chainId,\n targetAsset: quote.assetOut,\n targetChainId: quote.targetChain.chainId,\n });\n\n if (quote.amountIn < minimumAmount) {\n throw new InvalidParamsError(\n ErrorReason.INVALID_PARAMS,\n `Transfer amount is below the minimum transfer amount of ${minimumAmount.toString()}`,\n );\n }\n\n // 6. Proceed with transfer\n const { ethToAva, source } = getTransferData(\n {\n assetIn: quote.assetIn,\n sourceChainId: quote.sourceChain.chainId,\n targetChainId: quote.targetChain.chainId,\n },\n config,\n );\n\n const sourceStartedAtMs = Date.now();\n let txHash: Hex;\n let sourceReceipt: TransactionReceipt;\n const targetClient = getEvmClientForChain({ chain: quote.targetChain });\n let targetStartBlockNumber: bigint | undefined;\n\n // Grab the target start block number for tracking BEFORE the transfer is initiated to avoid race conditions\n try {\n targetStartBlockNumber = await targetClient.getBlockNumber();\n } catch {\n // TODO: Add logger?\n }\n\n if (ethToAva) {\n // Wrap asset (Ethereum -> Avalanche)\n [txHash, sourceReceipt] = await transferAssetFromEthToAva({\n amountIn: quote.amountIn,\n assetIn: quote.assetIn,\n evmConfig: config,\n fromAddress: quote.fromAddress,\n sign: evmSigner.sign,\n source,\n sourceChain: quote.sourceChain,\n targetChain: quote.targetChain,\n gasSettings,\n onStepChange,\n quote,\n });\n } else {\n // Unwrap asset (Avalanche -> Ethereum)\n [txHash, sourceReceipt] = await transferAssetFromAvaToEth({\n amountIn: quote.amountIn,\n fromAddress: quote.fromAddress,\n sign: evmSigner.sign,\n source,\n sourceChain: quote.sourceChain,\n gasSettings,\n onStepChange,\n quote,\n });\n }\n\n const sourceRequiredConfirmationCount = isAvalancheChain(quote.sourceChain)\n ? config.minimumConfirmations.avalanche\n : config.minimumConfirmations.ethereum;\n\n if (sourceReceipt.status === 'reverted') {\n return {\n amountIn: quote.amountIn,\n amountOut: quote.amountOut,\n environment: config.environment,\n errorCode: ErrorCode.TRANSACTION_REVERTED,\n failedAtMs: Date.now(),\n fees: quote.fees,\n fromAddress: quote.fromAddress,\n id: quote.id,\n partnerFeeBps: quote.partnerFeeBps,\n source: {\n confirmationCount: 0,\n requiredConfirmationCount: sourceRequiredConfirmationCount,\n startedAtMs: sourceStartedAtMs,\n txHash,\n },\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: ServiceType.AVALANCHE_EVM,\n } satisfies FailedTransfer;\n }\n\n return {\n amountIn: quote.amountIn,\n amountOut: quote.amountOut,\n environment: config.environment,\n fees: quote.fees,\n fromAddress: quote.fromAddress,\n id: quote.id,\n partnerFeeBps: quote.partnerFeeBps,\n source: {\n confirmationCount: 1, // This is 1 because of the receipt confirmation done in the transfer functions\n requiredConfirmationCount: sourceRequiredConfirmationCount,\n startedAtMs: sourceStartedAtMs,\n targetStartBlockNumber,\n txHash,\n },\n sourceAsset: quote.assetIn,\n sourceChain: quote.sourceChain,\n status: 'source-pending',\n targetAsset: quote.assetOut,\n targetChain: quote.targetChain,\n toAddress: quote.toAddress,\n type: ServiceType.AVALANCHE_EVM,\n } satisfies SourcePendingTransfer;\n };\n}\n"],"mappings":"0ZAyBA,SAAgB,EAAqB,CACnC,SACA,YACA,2BAC+D,CAC/D,OAAO,MAAO,CAAE,cAAa,eAAc,WAAY,CAErD,GAAI,EAAA,EAAA,EAAA,WAAc,EAAM,YAAY,EAAI,EAAA,EAAA,EAAA,WAAc,EAAM,UAAU,CACpE,MAAM,IAAIA,EAAAA,mBACRC,EAAAA,YAAY,eACZ,6DACD,CAKH,EAAA,iCAAiC,EAAM,YAAa,EAAM,UAAU,CAGpE,EAAA,2CAA2C,CAAC,EAAM,YAAa,EAAM,UAAU,CAAE,EAAO,iBAAiB,CAGzG,EAAA,gCAAgC,EAAM,YAAY,QAAS,EAAM,YAAY,QAAQ,CAGrF,IAAM,EAAgB,MAAMC,EAAAA,gCAAgC,CAAE,SAAQ,0BAAyB,CAAC,CAAC,CAC/F,YAAa,EAAM,QACnB,cAAe,EAAM,YAAY,QACjC,YAAa,EAAM,SACnB,cAAe,EAAM,YAAY,QAClC,CAAC,CAEF,GAAI,EAAM,SAAW,EACnB,MAAM,IAAIF,EAAAA,mBACRC,EAAAA,YAAY,eACZ,2DAA2D,EAAc,UAAU,GACpF,CAIH,GAAM,CAAE,WAAU,UAAWE,EAAAA,gBAC3B,CACE,QAAS,EAAM,QACf,cAAe,EAAM,YAAY,QACjC,cAAe,EAAM,YAAY,QAClC,CACD,EACD,CAEK,EAAoB,KAAK,KAAK,CAChC,EACA,EACE,EAAeC,EAAAA,qBAAqB,CAAE,MAAO,EAAM,YAAa,CAAC,CACnE,EAGJ,GAAI,CACF,EAAyB,MAAM,EAAa,gBAAgB,MACtD,EAIJ,EAEF,CAAC,EAAQ,GAAiB,MAAMC,EAAAA,0BAA0B,CACxD,SAAU,EAAM,SAChB,QAAS,EAAM,QACf,UAAW,EACX,YAAa,EAAM,YACnB,KAAM,EAAU,KAChB,SACA,YAAa,EAAM,YACnB,YAAa,EAAM,YACnB,cACA,eACA,QACD,CAAC,CAGF,CAAC,EAAQ,GAAiB,MAAMC,EAAAA,0BAA0B,CACxD,SAAU,EAAM,SAChB,YAAa,EAAM,YACnB,KAAM,EAAU,KAChB,SACA,YAAa,EAAM,YACnB,cACA,eACA,QACD,CAAC,CAGJ,IAAM,EAAkCC,EAAAA,iBAAiB,EAAM,YAAY,CACvE,EAAO,qBAAqB,UAC5B,EAAO,qBAAqB,SA6BhC,OA3BI,EAAc,SAAW,WACpB,CACL,SAAU,EAAM,SAChB,UAAW,EAAM,UACjB,YAAa,EAAO,YACpB,UAAWC,EAAAA,UAAU,qBACrB,WAAY,KAAK,KAAK,CACtB,KAAM,EAAM,KACZ,YAAa,EAAM,YACnB,GAAI,EAAM,GACV,cAAe,EAAM,cACrB,OAAQ,CACN,kBAAmB,EACnB,0BAA2B,EAC3B,YAAa,EACb,SACD,CACD,YAAa,EAAM,QACnB,YAAa,EAAM,YACnB,OAAQ,SACR,YAAa,EAAM,SACnB,YAAa,EAAM,YACnB,UAAW,EAAM,UACjB,KAAMC,EAAAA,YAAY,cACnB,CAGI,CACL,SAAU,EAAM,SAChB,UAAW,EAAM,UACjB,YAAa,EAAO,YACpB,KAAM,EAAM,KACZ,YAAa,EAAM,YACnB,GAAI,EAAM,GACV,cAAe,EAAM,cACrB,OAAQ,CACN,kBAAmB,EACnB,0BAA2B,EAC3B,YAAa,EACb,yBACA,SACD,CACD,YAAa,EAAM,QACnB,YAAa,EAAM,YACnB,OAAQ,iBACR,YAAa,EAAM,SACnB,YAAa,EAAM,YACnB,UAAW,EAAM,UACjB,KAAMA,EAAAA,YAAY,cACnB"}
@@ -0,0 +1,2 @@
1
+ import{ServiceType as e}from"../../../constants.js";import{ErrorCode as t,ErrorReason as n,InvalidParamsError as r}from"../../../errors.js";import{isAvalancheChain as i}from"../../../_utils/chain.js";import{validateChainCombinationOrThrow as a,validateTransferAddressesNotBlockedOrThrow as o,validateTransferAddressesOrThrow as s}from"../_utils/validations.js";import{getEvmClientForChain as c}from"../../_utils.js";import{getTransferData as l}from"../_utils/transfer-data.js";import{getMinimumTransferAmountFactory as u}from"./get-minimum-transfer-amount.js";import{transferAssetFromAvaToEth as d}from"../_utils/unwrap.js";import{transferAssetFromEthToAva as f}from"../_utils/wrap.js";import{isAddress as p}from"viem";function m({config:m,evmSigner:h,feeEstimationMultiplier:g}){return async({gasSettings:_,onStepChange:v,quote:y})=>{if(!p(y.fromAddress)||!p(y.toAddress))throw new r(n.INVALID_PARAMS,"`fromAddress` and `toAddress` must be valid EVM addresses.");s(y.fromAddress,y.toAddress),o([y.fromAddress,y.toAddress],m.addressBlocklist),a(y.sourceChain.chainId,y.targetChain.chainId);let b=await u({config:m,feeEstimationMultiplier:g})({sourceAsset:y.assetIn,sourceChainId:y.sourceChain.chainId,targetAsset:y.assetOut,targetChainId:y.targetChain.chainId});if(y.amountIn<b)throw new r(n.INVALID_PARAMS,`Transfer amount is below the minimum transfer amount of ${b.toString()}`);let{ethToAva:x,source:S}=l({assetIn:y.assetIn,sourceChainId:y.sourceChain.chainId,targetChainId:y.targetChain.chainId},m),C=Date.now(),w,T,E=c({chain:y.targetChain}),D;try{D=await E.getBlockNumber()}catch{}x?[w,T]=await f({amountIn:y.amountIn,assetIn:y.assetIn,evmConfig:m,fromAddress:y.fromAddress,sign:h.sign,source:S,sourceChain:y.sourceChain,targetChain:y.targetChain,gasSettings:_,onStepChange:v,quote:y}):[w,T]=await d({amountIn:y.amountIn,fromAddress:y.fromAddress,sign:h.sign,source:S,sourceChain:y.sourceChain,gasSettings:_,onStepChange:v,quote:y});let O=i(y.sourceChain)?m.minimumConfirmations.avalanche:m.minimumConfirmations.ethereum;return T.status===`reverted`?{amountIn:y.amountIn,amountOut:y.amountOut,environment:m.environment,errorCode:t.TRANSACTION_REVERTED,failedAtMs:Date.now(),fees:y.fees,fromAddress:y.fromAddress,id:y.id,partnerFeeBps:y.partnerFeeBps,source:{confirmationCount:0,requiredConfirmationCount:O,startedAtMs:C,txHash:w},sourceAsset:y.assetIn,sourceChain:y.sourceChain,status:`failed`,targetAsset:y.assetOut,targetChain:y.targetChain,toAddress:y.toAddress,type:e.AVALANCHE_EVM}:{amountIn:y.amountIn,amountOut:y.amountOut,environment:m.environment,fees:y.fees,fromAddress:y.fromAddress,id:y.id,partnerFeeBps:y.partnerFeeBps,source:{confirmationCount:1,requiredConfirmationCount:O,startedAtMs:C,targetStartBlockNumber:D,txHash:w},sourceAsset:y.assetIn,sourceChain:y.sourceChain,status:`source-pending`,targetAsset:y.assetOut,targetChain:y.targetChain,toAddress:y.toAddress,type:e.AVALANCHE_EVM}}}export{m as transferAssetFactory};
2
+ //# sourceMappingURL=transfer-asset.js.map