@avalabs/fusion-sdk 0.0.0-additive-fee-allowance-buffer-20260325170134

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 (428) 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 +20 -0
  26. package/dist/mod.d.ts +20 -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/_solana-utils.cjs +2 -0
  293. package/dist/transfer-service/markr/_solana-utils.cjs.map +1 -0
  294. package/dist/transfer-service/markr/_solana-utils.js +2 -0
  295. package/dist/transfer-service/markr/_solana-utils.js.map +1 -0
  296. package/dist/transfer-service/markr/_type-guards.cjs +2 -0
  297. package/dist/transfer-service/markr/_type-guards.cjs.map +1 -0
  298. package/dist/transfer-service/markr/_type-guards.js +2 -0
  299. package/dist/transfer-service/markr/_type-guards.js.map +1 -0
  300. package/dist/transfer-service/markr/_utils.cjs +2 -0
  301. package/dist/transfer-service/markr/_utils.cjs.map +1 -0
  302. package/dist/transfer-service/markr/_utils.js +2 -0
  303. package/dist/transfer-service/markr/_utils.js.map +1 -0
  304. package/dist/transfer-service/markr/constants.cjs +2 -0
  305. package/dist/transfer-service/markr/constants.cjs.map +1 -0
  306. package/dist/transfer-service/markr/constants.js +2 -0
  307. package/dist/transfer-service/markr/constants.js.map +1 -0
  308. package/dist/transfer-service/markr/markr-service.cjs +2 -0
  309. package/dist/transfer-service/markr/markr-service.cjs.map +1 -0
  310. package/dist/transfer-service/markr/markr-service.js +2 -0
  311. package/dist/transfer-service/markr/markr-service.js.map +1 -0
  312. package/dist/transfer-service/service-schemas.cjs +2 -0
  313. package/dist/transfer-service/service-schemas.cjs.map +1 -0
  314. package/dist/transfer-service/service-schemas.js +2 -0
  315. package/dist/transfer-service/service-schemas.js.map +1 -0
  316. package/dist/transfer-service/wrap-unwrap/_handlers/analyze-support.cjs +2 -0
  317. package/dist/transfer-service/wrap-unwrap/_handlers/analyze-support.cjs.map +1 -0
  318. package/dist/transfer-service/wrap-unwrap/_handlers/analyze-support.js +2 -0
  319. package/dist/transfer-service/wrap-unwrap/_handlers/analyze-support.js.map +1 -0
  320. package/dist/transfer-service/wrap-unwrap/_handlers/estimate-native-fee.cjs +2 -0
  321. package/dist/transfer-service/wrap-unwrap/_handlers/estimate-native-fee.cjs.map +1 -0
  322. package/dist/transfer-service/wrap-unwrap/_handlers/estimate-native-fee.js +2 -0
  323. package/dist/transfer-service/wrap-unwrap/_handlers/estimate-native-fee.js.map +1 -0
  324. package/dist/transfer-service/wrap-unwrap/_handlers/get-assets.cjs +2 -0
  325. package/dist/transfer-service/wrap-unwrap/_handlers/get-assets.cjs.map +1 -0
  326. package/dist/transfer-service/wrap-unwrap/_handlers/get-assets.js +2 -0
  327. package/dist/transfer-service/wrap-unwrap/_handlers/get-assets.js.map +1 -0
  328. package/dist/transfer-service/wrap-unwrap/_handlers/get-bridgeable-assets.cjs +2 -0
  329. package/dist/transfer-service/wrap-unwrap/_handlers/get-bridgeable-assets.cjs.map +1 -0
  330. package/dist/transfer-service/wrap-unwrap/_handlers/get-bridgeable-assets.js +2 -0
  331. package/dist/transfer-service/wrap-unwrap/_handlers/get-bridgeable-assets.js.map +1 -0
  332. package/dist/transfer-service/wrap-unwrap/_handlers/get-minimum-transfer-amount.cjs +2 -0
  333. package/dist/transfer-service/wrap-unwrap/_handlers/get-minimum-transfer-amount.cjs.map +1 -0
  334. package/dist/transfer-service/wrap-unwrap/_handlers/get-minimum-transfer-amount.js +2 -0
  335. package/dist/transfer-service/wrap-unwrap/_handlers/get-minimum-transfer-amount.js.map +1 -0
  336. package/dist/transfer-service/wrap-unwrap/_handlers/stream-quotes.cjs +2 -0
  337. package/dist/transfer-service/wrap-unwrap/_handlers/stream-quotes.cjs.map +1 -0
  338. package/dist/transfer-service/wrap-unwrap/_handlers/stream-quotes.js +2 -0
  339. package/dist/transfer-service/wrap-unwrap/_handlers/stream-quotes.js.map +1 -0
  340. package/dist/transfer-service/wrap-unwrap/_handlers/track-transfer.cjs +2 -0
  341. package/dist/transfer-service/wrap-unwrap/_handlers/track-transfer.cjs.map +1 -0
  342. package/dist/transfer-service/wrap-unwrap/_handlers/track-transfer.js +2 -0
  343. package/dist/transfer-service/wrap-unwrap/_handlers/track-transfer.js.map +1 -0
  344. package/dist/transfer-service/wrap-unwrap/_handlers/transfer-asset.cjs +2 -0
  345. package/dist/transfer-service/wrap-unwrap/_handlers/transfer-asset.cjs.map +1 -0
  346. package/dist/transfer-service/wrap-unwrap/_handlers/transfer-asset.js +2 -0
  347. package/dist/transfer-service/wrap-unwrap/_handlers/transfer-asset.js.map +1 -0
  348. package/dist/transfer-service/wrap-unwrap/_utils.cjs +2 -0
  349. package/dist/transfer-service/wrap-unwrap/_utils.cjs.map +1 -0
  350. package/dist/transfer-service/wrap-unwrap/_utils.js +2 -0
  351. package/dist/transfer-service/wrap-unwrap/_utils.js.map +1 -0
  352. package/dist/transfer-service/wrap-unwrap/constants.cjs +2 -0
  353. package/dist/transfer-service/wrap-unwrap/constants.cjs.map +1 -0
  354. package/dist/transfer-service/wrap-unwrap/constants.js +2 -0
  355. package/dist/transfer-service/wrap-unwrap/constants.js.map +1 -0
  356. package/dist/transfer-service/wrap-unwrap/wrap-unwrap-service.cjs +2 -0
  357. package/dist/transfer-service/wrap-unwrap/wrap-unwrap-service.cjs.map +1 -0
  358. package/dist/transfer-service/wrap-unwrap/wrap-unwrap-service.js +2 -0
  359. package/dist/transfer-service/wrap-unwrap/wrap-unwrap-service.js.map +1 -0
  360. package/dist/type-guards.cjs +2 -0
  361. package/dist/type-guards.cjs.map +1 -0
  362. package/dist/type-guards.d.cts +16 -0
  363. package/dist/type-guards.d.ts +16 -0
  364. package/dist/type-guards.js +2 -0
  365. package/dist/type-guards.js.map +1 -0
  366. package/dist/types/asset.d.cts +66 -0
  367. package/dist/types/asset.d.ts +66 -0
  368. package/dist/types/bitcoin.d.cts +66 -0
  369. package/dist/types/bitcoin.d.ts +66 -0
  370. package/dist/types/caip.d.cts +30 -0
  371. package/dist/types/caip.d.ts +30 -0
  372. package/dist/types/chain.d.cts +17 -0
  373. package/dist/types/chain.d.ts +17 -0
  374. package/dist/types/fee.d.cts +13 -0
  375. package/dist/types/fee.d.ts +13 -0
  376. package/dist/types/quote.d.cts +165 -0
  377. package/dist/types/quote.d.ts +165 -0
  378. package/dist/types/service.d.cts +247 -0
  379. package/dist/types/service.d.ts +247 -0
  380. package/dist/types/signer.d.cts +52 -0
  381. package/dist/types/signer.d.ts +52 -0
  382. package/dist/types/transfer-manager.d.cts +119 -0
  383. package/dist/types/transfer-manager.d.ts +119 -0
  384. package/dist/types/transfer.d.cts +126 -0
  385. package/dist/types/transfer.d.ts +126 -0
  386. package/dist/types/utility-types.d.cts +21 -0
  387. package/dist/types/utility-types.d.ts +21 -0
  388. package/dist/utils/asset-id.cjs +2 -0
  389. package/dist/utils/asset-id.cjs.map +1 -0
  390. package/dist/utils/asset-id.js +2 -0
  391. package/dist/utils/asset-id.js.map +1 -0
  392. package/dist/utils/bitcoin-address.cjs +2 -0
  393. package/dist/utils/bitcoin-address.cjs.map +1 -0
  394. package/dist/utils/bitcoin-address.js +2 -0
  395. package/dist/utils/bitcoin-address.js.map +1 -0
  396. package/dist/utils/caip.cjs +2 -0
  397. package/dist/utils/caip.cjs.map +1 -0
  398. package/dist/utils/caip.d.cts +49 -0
  399. package/dist/utils/caip.d.ts +49 -0
  400. package/dist/utils/caip.js +2 -0
  401. package/dist/utils/caip.js.map +1 -0
  402. package/dist/utils/evm-address.cjs +2 -0
  403. package/dist/utils/evm-address.cjs.map +1 -0
  404. package/dist/utils/evm-address.js +2 -0
  405. package/dist/utils/evm-address.js.map +1 -0
  406. package/dist/utils/price-impact.cjs +2 -0
  407. package/dist/utils/price-impact.cjs.map +1 -0
  408. package/dist/utils/price-impact.d.cts +31 -0
  409. package/dist/utils/price-impact.d.ts +31 -0
  410. package/dist/utils/price-impact.js +2 -0
  411. package/dist/utils/price-impact.js.map +1 -0
  412. package/dist/utils/quote-fees.cjs +2 -0
  413. package/dist/utils/quote-fees.cjs.map +1 -0
  414. package/dist/utils/quote-fees.js +2 -0
  415. package/dist/utils/quote-fees.js.map +1 -0
  416. package/dist/utils/sol-address.cjs +2 -0
  417. package/dist/utils/sol-address.cjs.map +1 -0
  418. package/dist/utils/sol-address.js +2 -0
  419. package/dist/utils/sol-address.js.map +1 -0
  420. package/dist/utils/solana-transaction.d.cts +15 -0
  421. package/dist/utils/solana-transaction.d.ts +17 -0
  422. package/dist/utils/transfer-utils.cjs +2 -0
  423. package/dist/utils/transfer-utils.cjs.map +1 -0
  424. package/dist/utils/transfer-utils.d.cts +8 -0
  425. package/dist/utils/transfer-utils.d.ts +8 -0
  426. package/dist/utils/transfer-utils.js +2 -0
  427. package/dist/utils/transfer-utils.js.map +1 -0
  428. package/package.json +63 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-minimum-transfer-amount.cjs","names":["SdkError","ErrorReason","ErrorCode","TokenType","isCaip2AvalancheChainId","isSolanaNamespace"],"sources":["../../../../src/transfer-service/markr/_handlers/get-minimum-transfer-amount.ts"],"sourcesContent":["import { TokenType } from '../../../constants';\nimport { isCaip2AvalancheChainId, isSolanaNamespace } from '../../../_utils/chain';\nimport { ErrorCode, ErrorReason, SdkError } from '../../../errors';\nimport type { Caip2ChainId } from '../../../types/caip';\nimport type { TransferService } from '../../../types/service';\n\n/** Minimum core fee captured from a transfer, expressed in source-asset base units. */\nexport const MINIMUM_CORE_FEE_BASE_UNITS = 1n;\nconst BPS_SCALE = 10_000n;\nconst PARTNER_FEE_FLOOR_MARGIN_BPS = 500n; // 5%\n/**\n * Scale used for the token-asset floor calculation.\n *\n * This has been separated _just in case_ we want to adjust the value\n * lower than 10,000 (0.01%) in the future to allow smaller transfer amounts.\n */\nconst TOKEN_ASSET_SCALE = 100_000n;\n\n/**\n * Default token-floor units for one source token.\n *\n * With `TOKEN_ASSET_SCALE=100_000`, this is 0.010% of one source token.\n */\nconst DEFAULT_TOKEN_ASSET_FLOOR_UNITS = 10n;\n\n/**\n * Elevated token-floor units for Avalanche native -> Solana native routes.\n *\n * With `TOKEN_ASSET_SCALE=100_000`, this is 1.000% of one source token.\n */\nconst AVALANCHE_NATIVE_TO_SOL_NATIVE_TOKEN_ASSET_FLOOR_UNITS = 1_000n;\n\nexport interface GetMinimumTransferAmountFactoryConfig {\n analyzeSupport: TransferService['analyzeSupport'];\n partnerFeeBps: number;\n}\n\n/**\n * Computes the minimum source amount for Markr transfers.\n *\n * Calculation summary:\n * 1) Compute `partnerFeeFloor` from `partnerFeeBps` (10_000 scale), then apply 5% margin.\n * 2) Compute `tokenAssetFloor` from source token decimals and route-aware floor units (100_000 scale).\n * 3) Return the larger value between `partnerFeeFloor` and `tokenAssetFloor`.\n *\n * Example:\n * - USDC (6 decimals) with partnerFeeBps=85 -> `partnerFeeFloor` (124) is greater than `tokenAssetFloor` (100).\n * - AVAX (18 decimals) with partnerFeeBps=85 -> `tokenAssetFloor` (100_000_000_000_000) is greater.\n */\nexport function getMinimumTransferAmountFactory({\n analyzeSupport,\n partnerFeeBps,\n}: GetMinimumTransferAmountFactoryConfig): TransferService['getMinimumTransferAmount'] {\n return async ({ sourceAsset, sourceChainId, targetAsset, targetChainId }) => {\n // Verify partnerFeeBps is positive integer\n if (!Number.isInteger(partnerFeeBps) || partnerFeeBps < 0) {\n // We shouldn't hit this given our Zod validation at service creation time.\n throw new SdkError(ErrorReason.UNKNOWN, ErrorCode.INVALID_PARAMS, {\n details: `Invalid partner fee basis points: ${partnerFeeBps}`,\n });\n }\n\n if (!analyzeSupport({ sourceAsset, sourceChainId, targetAsset, targetChainId })) {\n // This should never happen given the analyzeSupport check that happens in the TransferManager.\n throw new SdkError(ErrorReason.UNKNOWN, ErrorCode.INVALID_PARAMS, {\n details: 'Transfer not supported by Markr. Unable to get minimum transfer amount.',\n });\n }\n\n validateSourceAssetDecimals(sourceAsset.decimals);\n\n const partnerFeeFloor = computePartnerFeeFloor(partnerFeeBps);\n const tokenAssetFloorUnits = getTokenAssetFloorUnitsForRoute({\n sourceAssetType: sourceAsset.type,\n sourceChainId,\n targetChainId,\n targetAssetType: targetAsset.type,\n });\n const tokenAssetFloor = computeTokenAssetFloor(sourceAsset.decimals, tokenAssetFloorUnits);\n\n return maxBigInt(partnerFeeFloor, tokenAssetFloor);\n };\n}\n\nfunction ceilDiv(value: bigint, divisor: bigint): bigint {\n return (value + divisor - 1n) / divisor;\n}\n\nfunction maxBigInt(left: bigint, right: bigint): bigint {\n return left > right ? left : right;\n}\n\nfunction validateSourceAssetDecimals(decimals: number): void {\n if (!Number.isInteger(decimals) || decimals < 0) {\n throw new SdkError(ErrorReason.UNKNOWN, ErrorCode.INVALID_PARAMS, {\n details: `Invalid source asset decimals: ${decimals}`,\n });\n }\n}\n\nfunction toBaseUnitsOfOneTokenWithScale(decimals: number, units: bigint, scale: bigint): bigint {\n return ceilDiv(10n ** BigInt(decimals) * units, scale);\n}\n\nfunction computePartnerFeeFloor(partnerFeeBps: number): bigint {\n const basePartnerFeeFloor =\n partnerFeeBps === 0\n ? MINIMUM_CORE_FEE_BASE_UNITS\n : ceilDiv(MINIMUM_CORE_FEE_BASE_UNITS * BPS_SCALE, BigInt(partnerFeeBps));\n\n return ceilDiv(basePartnerFeeFloor * (BPS_SCALE + PARTNER_FEE_FLOOR_MARGIN_BPS), BPS_SCALE);\n}\n\nfunction computeTokenAssetFloor(sourceAssetDecimals: number, tokenAssetFloorUnits: bigint): bigint {\n return toBaseUnitsOfOneTokenWithScale(sourceAssetDecimals, tokenAssetFloorUnits, TOKEN_ASSET_SCALE);\n}\n\n/**\n * Select token-floor units based on route characteristics.\n *\n * We currently elevate the floor only for native Avalanche C-Chain -> native SOL routes,\n * where quote availability requires a higher practical input threshold.\n */\nfunction getTokenAssetFloorUnitsForRoute({\n sourceAssetType,\n sourceChainId,\n targetChainId,\n targetAssetType,\n}: {\n sourceAssetType: TokenType;\n sourceChainId: Caip2ChainId;\n targetChainId: Caip2ChainId;\n targetAssetType: TokenType;\n}): bigint {\n // Native Avalanche C-Chain -> Native SOL routes require a higher floor due to liquidity/quote availability constraints on Markr's side.\n if (\n sourceAssetType === TokenType.NATIVE &&\n isCaip2AvalancheChainId(sourceChainId) &&\n isSolanaNamespace(targetChainId) &&\n targetAssetType === TokenType.NATIVE\n ) {\n return AVALANCHE_NATIVE_TO_SOL_NATIVE_TOKEN_ASSET_FLOOR_UNITS;\n }\n\n return DEFAULT_TOKEN_ASSET_FLOOR_UNITS;\n}\n"],"mappings":"kHAOa,EAA8B,GACrC,EAAY,OAyClB,SAAgB,EAAgC,CAC9C,iBACA,iBACqF,CACrF,OAAO,MAAO,CAAE,cAAa,gBAAe,cAAa,mBAAoB,CAE3E,GAAI,CAAC,OAAO,UAAU,EAAc,EAAI,EAAgB,EAEtD,MAAM,IAAIA,EAAAA,SAASC,EAAAA,YAAY,QAASC,EAAAA,UAAU,eAAgB,CAChE,QAAS,qCAAqC,IAC/C,CAAC,CAGJ,GAAI,CAAC,EAAe,CAAE,cAAa,gBAAe,cAAa,gBAAe,CAAC,CAE7E,MAAM,IAAIF,EAAAA,SAASC,EAAAA,YAAY,QAASC,EAAAA,UAAU,eAAgB,CAChE,QAAS,0EACV,CAAC,CAGJ,EAA4B,EAAY,SAAS,CAEjD,IAAM,EAAkB,EAAuB,EAAc,CACvD,EAAuB,EAAgC,CAC3D,gBAAiB,EAAY,KAC7B,gBACA,gBACA,gBAAiB,EAAY,KAC9B,CAAC,CAGF,OAAO,EAAU,EAFO,EAAuB,EAAY,SAAU,EAAqB,CAExC,EAItD,SAAS,EAAQ,EAAe,EAAyB,CACvD,OAAQ,EAAQ,EAAU,IAAM,EAGlC,SAAS,EAAU,EAAc,EAAuB,CACtD,OAAO,EAAO,EAAQ,EAAO,EAG/B,SAAS,EAA4B,EAAwB,CAC3D,GAAI,CAAC,OAAO,UAAU,EAAS,EAAI,EAAW,EAC5C,MAAM,IAAIF,EAAAA,SAASC,EAAAA,YAAY,QAASC,EAAAA,UAAU,eAAgB,CAChE,QAAS,kCAAkC,IAC5C,CAAC,CAIN,SAAS,EAA+B,EAAkB,EAAe,EAAuB,CAC9F,OAAO,EAAQ,KAAO,OAAO,EAAS,CAAG,EAAO,EAAM,CAGxD,SAAS,EAAuB,EAA+B,CAM7D,OAAO,GAJL,IAAkB,EACd,EACA,EAAQ,EAA8B,EAAW,OAAO,EAAc,CAAC,GAEvC,EAAY,MAA+B,EAAU,CAG7F,SAAS,EAAuB,EAA6B,EAAsC,CACjG,OAAO,EAA+B,EAAqB,EAAsB,QAAkB,CASrG,SAAS,EAAgC,CACvC,kBACA,gBACA,gBACA,mBAMS,CAWT,OARE,IAAoBC,EAAAA,UAAU,QAC9BC,EAAAA,wBAAwB,EAAc,EACtCC,EAAAA,kBAAkB,EAAc,EAChC,IAAoBF,EAAAA,UAAU,OAEvB,MAGF"}
@@ -0,0 +1,2 @@
1
+ import{TokenType as e}from"../../../constants.js";import{ErrorCode as t,ErrorReason as n,SdkError as r}from"../../../errors.js";import{isCaip2AvalancheChainId as i,isSolanaNamespace as a}from"../../../_utils/chain.js";const o=1n,s=10000n;function c({analyzeSupport:e,partnerFeeBps:i}){return async({sourceAsset:a,sourceChainId:o,targetAsset:s,targetChainId:c})=>{if(!Number.isInteger(i)||i<0)throw new r(n.UNKNOWN,t.INVALID_PARAMS,{details:`Invalid partner fee basis points: ${i}`});if(!e({sourceAsset:a,sourceChainId:o,targetAsset:s,targetChainId:c}))throw new r(n.UNKNOWN,t.INVALID_PARAMS,{details:`Transfer not supported by Markr. Unable to get minimum transfer amount.`});d(a.decimals);let l=p(i),f=h({sourceAssetType:a.type,sourceChainId:o,targetChainId:c,targetAssetType:s.type});return u(l,m(a.decimals,f))}}function l(e,t){return(e+t-1n)/t}function u(e,t){return e>t?e:t}function d(e){if(!Number.isInteger(e)||e<0)throw new r(n.UNKNOWN,t.INVALID_PARAMS,{details:`Invalid source asset decimals: ${e}`})}function f(e,t,n){return l(10n**BigInt(e)*t,n)}function p(e){return l((e===0?o:l(o*s,BigInt(e)))*(s+500n),s)}function m(e,t){return f(e,t,100000n)}function h({sourceAssetType:t,sourceChainId:n,targetChainId:r,targetAssetType:o}){return t===e.NATIVE&&i(n)&&a(r)&&o===e.NATIVE?1000n:10n}export{c 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/markr/_handlers/get-minimum-transfer-amount.ts"],"sourcesContent":["import { TokenType } from '../../../constants';\nimport { isCaip2AvalancheChainId, isSolanaNamespace } from '../../../_utils/chain';\nimport { ErrorCode, ErrorReason, SdkError } from '../../../errors';\nimport type { Caip2ChainId } from '../../../types/caip';\nimport type { TransferService } from '../../../types/service';\n\n/** Minimum core fee captured from a transfer, expressed in source-asset base units. */\nexport const MINIMUM_CORE_FEE_BASE_UNITS = 1n;\nconst BPS_SCALE = 10_000n;\nconst PARTNER_FEE_FLOOR_MARGIN_BPS = 500n; // 5%\n/**\n * Scale used for the token-asset floor calculation.\n *\n * This has been separated _just in case_ we want to adjust the value\n * lower than 10,000 (0.01%) in the future to allow smaller transfer amounts.\n */\nconst TOKEN_ASSET_SCALE = 100_000n;\n\n/**\n * Default token-floor units for one source token.\n *\n * With `TOKEN_ASSET_SCALE=100_000`, this is 0.010% of one source token.\n */\nconst DEFAULT_TOKEN_ASSET_FLOOR_UNITS = 10n;\n\n/**\n * Elevated token-floor units for Avalanche native -> Solana native routes.\n *\n * With `TOKEN_ASSET_SCALE=100_000`, this is 1.000% of one source token.\n */\nconst AVALANCHE_NATIVE_TO_SOL_NATIVE_TOKEN_ASSET_FLOOR_UNITS = 1_000n;\n\nexport interface GetMinimumTransferAmountFactoryConfig {\n analyzeSupport: TransferService['analyzeSupport'];\n partnerFeeBps: number;\n}\n\n/**\n * Computes the minimum source amount for Markr transfers.\n *\n * Calculation summary:\n * 1) Compute `partnerFeeFloor` from `partnerFeeBps` (10_000 scale), then apply 5% margin.\n * 2) Compute `tokenAssetFloor` from source token decimals and route-aware floor units (100_000 scale).\n * 3) Return the larger value between `partnerFeeFloor` and `tokenAssetFloor`.\n *\n * Example:\n * - USDC (6 decimals) with partnerFeeBps=85 -> `partnerFeeFloor` (124) is greater than `tokenAssetFloor` (100).\n * - AVAX (18 decimals) with partnerFeeBps=85 -> `tokenAssetFloor` (100_000_000_000_000) is greater.\n */\nexport function getMinimumTransferAmountFactory({\n analyzeSupport,\n partnerFeeBps,\n}: GetMinimumTransferAmountFactoryConfig): TransferService['getMinimumTransferAmount'] {\n return async ({ sourceAsset, sourceChainId, targetAsset, targetChainId }) => {\n // Verify partnerFeeBps is positive integer\n if (!Number.isInteger(partnerFeeBps) || partnerFeeBps < 0) {\n // We shouldn't hit this given our Zod validation at service creation time.\n throw new SdkError(ErrorReason.UNKNOWN, ErrorCode.INVALID_PARAMS, {\n details: `Invalid partner fee basis points: ${partnerFeeBps}`,\n });\n }\n\n if (!analyzeSupport({ sourceAsset, sourceChainId, targetAsset, targetChainId })) {\n // This should never happen given the analyzeSupport check that happens in the TransferManager.\n throw new SdkError(ErrorReason.UNKNOWN, ErrorCode.INVALID_PARAMS, {\n details: 'Transfer not supported by Markr. Unable to get minimum transfer amount.',\n });\n }\n\n validateSourceAssetDecimals(sourceAsset.decimals);\n\n const partnerFeeFloor = computePartnerFeeFloor(partnerFeeBps);\n const tokenAssetFloorUnits = getTokenAssetFloorUnitsForRoute({\n sourceAssetType: sourceAsset.type,\n sourceChainId,\n targetChainId,\n targetAssetType: targetAsset.type,\n });\n const tokenAssetFloor = computeTokenAssetFloor(sourceAsset.decimals, tokenAssetFloorUnits);\n\n return maxBigInt(partnerFeeFloor, tokenAssetFloor);\n };\n}\n\nfunction ceilDiv(value: bigint, divisor: bigint): bigint {\n return (value + divisor - 1n) / divisor;\n}\n\nfunction maxBigInt(left: bigint, right: bigint): bigint {\n return left > right ? left : right;\n}\n\nfunction validateSourceAssetDecimals(decimals: number): void {\n if (!Number.isInteger(decimals) || decimals < 0) {\n throw new SdkError(ErrorReason.UNKNOWN, ErrorCode.INVALID_PARAMS, {\n details: `Invalid source asset decimals: ${decimals}`,\n });\n }\n}\n\nfunction toBaseUnitsOfOneTokenWithScale(decimals: number, units: bigint, scale: bigint): bigint {\n return ceilDiv(10n ** BigInt(decimals) * units, scale);\n}\n\nfunction computePartnerFeeFloor(partnerFeeBps: number): bigint {\n const basePartnerFeeFloor =\n partnerFeeBps === 0\n ? MINIMUM_CORE_FEE_BASE_UNITS\n : ceilDiv(MINIMUM_CORE_FEE_BASE_UNITS * BPS_SCALE, BigInt(partnerFeeBps));\n\n return ceilDiv(basePartnerFeeFloor * (BPS_SCALE + PARTNER_FEE_FLOOR_MARGIN_BPS), BPS_SCALE);\n}\n\nfunction computeTokenAssetFloor(sourceAssetDecimals: number, tokenAssetFloorUnits: bigint): bigint {\n return toBaseUnitsOfOneTokenWithScale(sourceAssetDecimals, tokenAssetFloorUnits, TOKEN_ASSET_SCALE);\n}\n\n/**\n * Select token-floor units based on route characteristics.\n *\n * We currently elevate the floor only for native Avalanche C-Chain -> native SOL routes,\n * where quote availability requires a higher practical input threshold.\n */\nfunction getTokenAssetFloorUnitsForRoute({\n sourceAssetType,\n sourceChainId,\n targetChainId,\n targetAssetType,\n}: {\n sourceAssetType: TokenType;\n sourceChainId: Caip2ChainId;\n targetChainId: Caip2ChainId;\n targetAssetType: TokenType;\n}): bigint {\n // Native Avalanche C-Chain -> Native SOL routes require a higher floor due to liquidity/quote availability constraints on Markr's side.\n if (\n sourceAssetType === TokenType.NATIVE &&\n isCaip2AvalancheChainId(sourceChainId) &&\n isSolanaNamespace(targetChainId) &&\n targetAssetType === TokenType.NATIVE\n ) {\n return AVALANCHE_NATIVE_TO_SOL_NATIVE_TOKEN_ASSET_FLOOR_UNITS;\n }\n\n return DEFAULT_TOKEN_ASSET_FLOOR_UNITS;\n}\n"],"mappings":"0NAOA,MAAa,EAA8B,GACrC,EAAY,OAyClB,SAAgB,EAAgC,CAC9C,iBACA,iBACqF,CACrF,OAAO,MAAO,CAAE,cAAa,gBAAe,cAAa,mBAAoB,CAE3E,GAAI,CAAC,OAAO,UAAU,EAAc,EAAI,EAAgB,EAEtD,MAAM,IAAI,EAAS,EAAY,QAAS,EAAU,eAAgB,CAChE,QAAS,qCAAqC,IAC/C,CAAC,CAGJ,GAAI,CAAC,EAAe,CAAE,cAAa,gBAAe,cAAa,gBAAe,CAAC,CAE7E,MAAM,IAAI,EAAS,EAAY,QAAS,EAAU,eAAgB,CAChE,QAAS,0EACV,CAAC,CAGJ,EAA4B,EAAY,SAAS,CAEjD,IAAM,EAAkB,EAAuB,EAAc,CACvD,EAAuB,EAAgC,CAC3D,gBAAiB,EAAY,KAC7B,gBACA,gBACA,gBAAiB,EAAY,KAC9B,CAAC,CAGF,OAAO,EAAU,EAFO,EAAuB,EAAY,SAAU,EAAqB,CAExC,EAItD,SAAS,EAAQ,EAAe,EAAyB,CACvD,OAAQ,EAAQ,EAAU,IAAM,EAGlC,SAAS,EAAU,EAAc,EAAuB,CACtD,OAAO,EAAO,EAAQ,EAAO,EAG/B,SAAS,EAA4B,EAAwB,CAC3D,GAAI,CAAC,OAAO,UAAU,EAAS,EAAI,EAAW,EAC5C,MAAM,IAAI,EAAS,EAAY,QAAS,EAAU,eAAgB,CAChE,QAAS,kCAAkC,IAC5C,CAAC,CAIN,SAAS,EAA+B,EAAkB,EAAe,EAAuB,CAC9F,OAAO,EAAQ,KAAO,OAAO,EAAS,CAAG,EAAO,EAAM,CAGxD,SAAS,EAAuB,EAA+B,CAM7D,OAAO,GAJL,IAAkB,EACd,EACA,EAAQ,EAA8B,EAAW,OAAO,EAAc,CAAC,GAEvC,EAAY,MAA+B,EAAU,CAG7F,SAAS,EAAuB,EAA6B,EAAsC,CACjG,OAAO,EAA+B,EAAqB,EAAsB,QAAkB,CASrG,SAAS,EAAgC,CACvC,kBACA,gBACA,gBACA,mBAMS,CAWT,OARE,IAAoB,EAAU,QAC9B,EAAwB,EAAc,EACtC,EAAkB,EAAc,EAChC,IAAoB,EAAU,OAEvB,MAGF"}
@@ -0,0 +1,2 @@
1
+ const e=require(`../../../errors.cjs`),t=require(`../../../utils/caip.cjs`),n=require(`../../../_utils/chain.cjs`),r=require(`../../../utils/evm-address.cjs`),i=require(`../_api.cjs`),a=require(`../../../utils/sol-address.cjs`),o=require(`../_utils.cjs`);function s({apiOptions:e,appId:r,partnerFeeBps:a}){return(s,l)=>{let u=new AbortController,{userEvmAddress:d,userSolanaAddress:f,validationError:p}=c(s);return p?(l(`error`,p),l(`done`),{cancel:()=>{}}):(i.markrStreamQuote(e,{amount:s.amount.toString(),appId:r,chainId:n.isEvmNamespace(s.sourceChain.chainId)?t.caip2ToEip155ChainId(s.sourceChain.chainId):s.sourceChain.chainId,destinationChainId:s.sourceChain.chainId===s.targetChain.chainId?void 0:n.isEvmNamespace(s.targetChain.chainId)?t.caip2ToEip155ChainId(s.targetChain.chainId):s.targetChain.chainId,slippage:s.slippageBps,tokenIn:o.assetToAddressString(s.sourceAsset,s.sourceChain.chainId),tokenInDecimals:s.sourceAsset.decimals,tokenOut:o.assetToAddressString(s.targetAsset,s.targetChain.chainId),tokenOutDecimals:s.targetAsset.decimals,userEvmAddress:d,userSolanaAddress:f},{onDone:()=>{u.signal.aborted||l(`done`)},onError:e=>{u.signal.aborted||(l(`error`,e),l(`done`))},onQuote:e=>{u.signal.aborted||l(`quote`,o.quoteFromMarkrQuoteResponseData(e,s,a))},signal:u.signal}),{cancel:()=>{u.abort()}})}}function c(t){let i=t.sourceChain.chainId!==t.targetChain.chainId,o=n.isEvmNamespace(t.sourceChain.chainId),s=n.isEvmNamespace(t.targetChain.chainId),c=n.isSolanaNamespace(t.sourceChain.chainId),l=n.isSolanaNamespace(t.targetChain.chainId);return o&&!r.isEvmAddress(t.fromAddress)?{userEvmAddress:void 0,userSolanaAddress:void 0,validationError:new e.InvalidParamsError(e.ErrorReason.INVALID_PARAMS,`Invalid fromAddress for EVM source chain.`)}:s&&!r.isEvmAddress(t.toAddress)?{userEvmAddress:void 0,userSolanaAddress:void 0,validationError:new e.InvalidParamsError(e.ErrorReason.INVALID_PARAMS,`Invalid toAddress for EVM target chain.`)}:c&&!a.isSolAddress(t.fromAddress)?{userEvmAddress:void 0,userSolanaAddress:void 0,validationError:new e.InvalidParamsError(e.ErrorReason.INVALID_PARAMS,`Invalid fromAddress for Solana source chain.`)}:l&&!a.isSolAddress(t.toAddress)?{userEvmAddress:void 0,userSolanaAddress:void 0,validationError:new e.InvalidParamsError(e.ErrorReason.INVALID_PARAMS,`Invalid toAddress for Solana target chain.`)}:i&&(o&&s||c&&l)&&t.fromAddress!==t.toAddress?{userEvmAddress:void 0,userSolanaAddress:void 0,validationError:new e.InvalidParamsError(e.ErrorReason.INVALID_PARAMS,`fromAddress and toAddress must match for same-namespace cross-chain swaps.`)}:i?{userEvmAddress:o&&r.isEvmAddress(t.fromAddress)?t.fromAddress:s&&r.isEvmAddress(t.toAddress)?t.toAddress:void 0,userSolanaAddress:c&&a.isSolAddress(t.fromAddress)?t.fromAddress:l&&a.isSolAddress(t.toAddress)?t.toAddress:void 0}:t.fromAddress===t.toAddress?{userEvmAddress:void 0,userSolanaAddress:void 0}:{userEvmAddress:void 0,userSolanaAddress:void 0,validationError:new e.InvalidParamsError(e.ErrorReason.INVALID_PARAMS,`fromAddress and toAddress must match for same-chain swaps.`)}}exports.streamQuotesFactory=s;
2
+ //# sourceMappingURL=stream-quotes.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream-quotes.cjs","names":["markrStreamQuote","isEvmNamespace","caip2ToEip155ChainId","assetToAddressString","quoteFromMarkrQuoteResponseData","isSolanaNamespace","isEvmAddress","InvalidParamsError","ErrorReason","isSolAddress"],"sources":["../../../../src/transfer-service/markr/_handlers/stream-quotes.ts"],"sourcesContent":["import { caip2ToEip155ChainId } from '../../../utils/caip';\nimport type { TransferService } from '../../../types/service';\nimport { markrStreamQuote, type ApiOptions, type MarkrStreamQuoteParams } from '../_api';\nimport { assetToAddressString, quoteFromMarkrQuoteResponseData } from '../_utils';\nimport { isEvmNamespace, isSolanaNamespace } from '../../../_utils/chain';\nimport { isEvmAddress } from '../../../utils/evm-address';\nimport { isSolAddress } from '../../../utils/sol-address';\nimport { ErrorReason, InvalidParamsError } from '../../../errors';\n\nexport interface StreamQuotesFactoryConfig {\n apiOptions: ApiOptions;\n appId: string;\n partnerFeeBps: number;\n}\n\nexport function streamQuotesFactory({\n apiOptions,\n appId,\n partnerFeeBps,\n}: StreamQuotesFactoryConfig): TransferService['streamQuotes'] {\n return (props, handler) => {\n const ac = new AbortController();\n const { userEvmAddress, userSolanaAddress, validationError } = _validateAndGetUserAddresses(props);\n\n if (validationError) {\n handler('error', validationError);\n handler('done');\n\n return {\n cancel: () => {},\n };\n }\n\n void markrStreamQuote(\n apiOptions,\n {\n amount: props.amount.toString(),\n appId,\n chainId: isEvmNamespace(props.sourceChain.chainId)\n ? caip2ToEip155ChainId(props.sourceChain.chainId)\n : props.sourceChain.chainId,\n // For cross-chain requests, destinationChainId is required.\n // Use EVM numeric chain IDs for EVM targets and CAIP-2 IDs for non-EVM targets.\n destinationChainId:\n props.sourceChain.chainId !== props.targetChain.chainId\n ? isEvmNamespace(props.targetChain.chainId)\n ? caip2ToEip155ChainId(props.targetChain.chainId)\n : props.targetChain.chainId\n : undefined,\n slippage: props.slippageBps,\n tokenIn: assetToAddressString(props.sourceAsset, props.sourceChain.chainId),\n tokenInDecimals: props.sourceAsset.decimals,\n tokenOut: assetToAddressString(props.targetAsset, props.targetChain.chainId),\n tokenOutDecimals: props.targetAsset.decimals,\n userEvmAddress,\n userSolanaAddress,\n },\n {\n onDone: () => {\n if (!ac.signal.aborted) {\n handler('done');\n }\n },\n onError: (error) => {\n if (!ac.signal.aborted) {\n handler('error', error);\n handler('done');\n }\n },\n onQuote: (data) => {\n if (!ac.signal.aborted) {\n handler('quote', quoteFromMarkrQuoteResponseData(data, props, partnerFeeBps));\n }\n },\n signal: ac.signal,\n },\n );\n\n return {\n cancel: () => {\n ac.abort();\n },\n };\n };\n}\n\nexport function _validateAndGetUserAddresses(\n props: Parameters<TransferService['streamQuotes']>[0],\n): Pick<MarkrStreamQuoteParams, 'userEvmAddress' | 'userSolanaAddress'> & { validationError?: InvalidParamsError } {\n const isCrossChainSwap = props.sourceChain.chainId !== props.targetChain.chainId;\n const sourceIsEvm = isEvmNamespace(props.sourceChain.chainId);\n const targetIsEvm = isEvmNamespace(props.targetChain.chainId);\n const sourceIsSolana = isSolanaNamespace(props.sourceChain.chainId);\n const targetIsSolana = isSolanaNamespace(props.targetChain.chainId);\n\n if (sourceIsEvm && !isEvmAddress(props.fromAddress)) {\n return {\n userEvmAddress: undefined,\n userSolanaAddress: undefined,\n validationError: new InvalidParamsError(ErrorReason.INVALID_PARAMS, 'Invalid fromAddress for EVM source chain.'),\n };\n }\n\n if (targetIsEvm && !isEvmAddress(props.toAddress)) {\n return {\n userEvmAddress: undefined,\n userSolanaAddress: undefined,\n validationError: new InvalidParamsError(ErrorReason.INVALID_PARAMS, 'Invalid toAddress for EVM target chain.'),\n };\n }\n\n if (sourceIsSolana && !isSolAddress(props.fromAddress)) {\n return {\n userEvmAddress: undefined,\n userSolanaAddress: undefined,\n validationError: new InvalidParamsError(\n ErrorReason.INVALID_PARAMS,\n 'Invalid fromAddress for Solana source chain.',\n ),\n };\n }\n\n if (targetIsSolana && !isSolAddress(props.toAddress)) {\n return {\n userEvmAddress: undefined,\n userSolanaAddress: undefined,\n validationError: new InvalidParamsError(ErrorReason.INVALID_PARAMS, 'Invalid toAddress for Solana target chain.'),\n };\n }\n\n if (isCrossChainSwap && ((sourceIsEvm && targetIsEvm) || (sourceIsSolana && targetIsSolana))) {\n if (props.fromAddress !== props.toAddress) {\n return {\n userEvmAddress: undefined,\n userSolanaAddress: undefined,\n validationError: new InvalidParamsError(\n ErrorReason.INVALID_PARAMS,\n 'fromAddress and toAddress must match for same-namespace cross-chain swaps.',\n ),\n };\n }\n }\n\n if (!isCrossChainSwap) {\n if (props.fromAddress !== props.toAddress) {\n return {\n userEvmAddress: undefined,\n userSolanaAddress: undefined,\n validationError: new InvalidParamsError(\n ErrorReason.INVALID_PARAMS,\n 'fromAddress and toAddress must match for same-chain swaps.',\n ),\n };\n }\n\n return {\n userEvmAddress: undefined,\n userSolanaAddress: undefined,\n };\n }\n\n const userEvmAddress =\n sourceIsEvm && isEvmAddress(props.fromAddress)\n ? props.fromAddress\n : targetIsEvm && isEvmAddress(props.toAddress)\n ? props.toAddress\n : undefined;\n\n const userSolanaAddress =\n sourceIsSolana && isSolAddress(props.fromAddress)\n ? props.fromAddress\n : targetIsSolana && isSolAddress(props.toAddress)\n ? props.toAddress\n : undefined;\n\n return {\n userEvmAddress,\n userSolanaAddress,\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{ErrorReason as e,InvalidParamsError as t}from"../../../errors.js";import{caip2ToEip155ChainId as n}from"../../../utils/caip.js";import{isEvmNamespace as r,isSolanaNamespace as i}from"../../../_utils/chain.js";import{isEvmAddress as a}from"../../../utils/evm-address.js";import{markrStreamQuote as o}from"../_api.js";import{isSolAddress as s}from"../../../utils/sol-address.js";import{assetToAddressString as c,quoteFromMarkrQuoteResponseData as l}from"../_utils.js";function u({apiOptions:e,appId:t,partnerFeeBps:i}){return(a,s)=>{let u=new AbortController,{userEvmAddress:f,userSolanaAddress:p,validationError:m}=d(a);return m?(s(`error`,m),s(`done`),{cancel:()=>{}}):(o(e,{amount:a.amount.toString(),appId:t,chainId:r(a.sourceChain.chainId)?n(a.sourceChain.chainId):a.sourceChain.chainId,destinationChainId:a.sourceChain.chainId===a.targetChain.chainId?void 0:r(a.targetChain.chainId)?n(a.targetChain.chainId):a.targetChain.chainId,slippage:a.slippageBps,tokenIn:c(a.sourceAsset,a.sourceChain.chainId),tokenInDecimals:a.sourceAsset.decimals,tokenOut:c(a.targetAsset,a.targetChain.chainId),tokenOutDecimals:a.targetAsset.decimals,userEvmAddress:f,userSolanaAddress:p},{onDone:()=>{u.signal.aborted||s(`done`)},onError:e=>{u.signal.aborted||(s(`error`,e),s(`done`))},onQuote:e=>{u.signal.aborted||s(`quote`,l(e,a,i))},signal:u.signal}),{cancel:()=>{u.abort()}})}}function d(n){let o=n.sourceChain.chainId!==n.targetChain.chainId,c=r(n.sourceChain.chainId),l=r(n.targetChain.chainId),u=i(n.sourceChain.chainId),d=i(n.targetChain.chainId);return c&&!a(n.fromAddress)?{userEvmAddress:void 0,userSolanaAddress:void 0,validationError:new t(e.INVALID_PARAMS,`Invalid fromAddress for EVM source chain.`)}:l&&!a(n.toAddress)?{userEvmAddress:void 0,userSolanaAddress:void 0,validationError:new t(e.INVALID_PARAMS,`Invalid toAddress for EVM target chain.`)}:u&&!s(n.fromAddress)?{userEvmAddress:void 0,userSolanaAddress:void 0,validationError:new t(e.INVALID_PARAMS,`Invalid fromAddress for Solana source chain.`)}:d&&!s(n.toAddress)?{userEvmAddress:void 0,userSolanaAddress:void 0,validationError:new t(e.INVALID_PARAMS,`Invalid toAddress for Solana target chain.`)}:o&&(c&&l||u&&d)&&n.fromAddress!==n.toAddress?{userEvmAddress:void 0,userSolanaAddress:void 0,validationError:new t(e.INVALID_PARAMS,`fromAddress and toAddress must match for same-namespace cross-chain swaps.`)}:o?{userEvmAddress:c&&a(n.fromAddress)?n.fromAddress:l&&a(n.toAddress)?n.toAddress:void 0,userSolanaAddress:u&&s(n.fromAddress)?n.fromAddress:d&&s(n.toAddress)?n.toAddress:void 0}:n.fromAddress===n.toAddress?{userEvmAddress:void 0,userSolanaAddress:void 0}:{userEvmAddress:void 0,userSolanaAddress:void 0,validationError:new t(e.INVALID_PARAMS,`fromAddress and toAddress must match for same-chain swaps.`)}}export{u as streamQuotesFactory};
2
+ //# sourceMappingURL=stream-quotes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream-quotes.js","names":[],"sources":["../../../../src/transfer-service/markr/_handlers/stream-quotes.ts"],"sourcesContent":["import { caip2ToEip155ChainId } from '../../../utils/caip';\nimport type { TransferService } from '../../../types/service';\nimport { markrStreamQuote, type ApiOptions, type MarkrStreamQuoteParams } from '../_api';\nimport { assetToAddressString, quoteFromMarkrQuoteResponseData } from '../_utils';\nimport { isEvmNamespace, isSolanaNamespace } from '../../../_utils/chain';\nimport { isEvmAddress } from '../../../utils/evm-address';\nimport { isSolAddress } from '../../../utils/sol-address';\nimport { ErrorReason, InvalidParamsError } from '../../../errors';\n\nexport interface StreamQuotesFactoryConfig {\n apiOptions: ApiOptions;\n appId: string;\n partnerFeeBps: number;\n}\n\nexport function streamQuotesFactory({\n apiOptions,\n appId,\n partnerFeeBps,\n}: StreamQuotesFactoryConfig): TransferService['streamQuotes'] {\n return (props, handler) => {\n const ac = new AbortController();\n const { userEvmAddress, userSolanaAddress, validationError } = _validateAndGetUserAddresses(props);\n\n if (validationError) {\n handler('error', validationError);\n handler('done');\n\n return {\n cancel: () => {},\n };\n }\n\n void markrStreamQuote(\n apiOptions,\n {\n amount: props.amount.toString(),\n appId,\n chainId: isEvmNamespace(props.sourceChain.chainId)\n ? caip2ToEip155ChainId(props.sourceChain.chainId)\n : props.sourceChain.chainId,\n // For cross-chain requests, destinationChainId is required.\n // Use EVM numeric chain IDs for EVM targets and CAIP-2 IDs for non-EVM targets.\n destinationChainId:\n props.sourceChain.chainId !== props.targetChain.chainId\n ? isEvmNamespace(props.targetChain.chainId)\n ? caip2ToEip155ChainId(props.targetChain.chainId)\n : props.targetChain.chainId\n : undefined,\n slippage: props.slippageBps,\n tokenIn: assetToAddressString(props.sourceAsset, props.sourceChain.chainId),\n tokenInDecimals: props.sourceAsset.decimals,\n tokenOut: assetToAddressString(props.targetAsset, props.targetChain.chainId),\n tokenOutDecimals: props.targetAsset.decimals,\n userEvmAddress,\n userSolanaAddress,\n },\n {\n onDone: () => {\n if (!ac.signal.aborted) {\n handler('done');\n }\n },\n onError: (error) => {\n if (!ac.signal.aborted) {\n handler('error', error);\n handler('done');\n }\n },\n onQuote: (data) => {\n if (!ac.signal.aborted) {\n handler('quote', quoteFromMarkrQuoteResponseData(data, props, partnerFeeBps));\n }\n },\n signal: ac.signal,\n },\n );\n\n return {\n cancel: () => {\n ac.abort();\n },\n };\n };\n}\n\nexport function _validateAndGetUserAddresses(\n props: Parameters<TransferService['streamQuotes']>[0],\n): Pick<MarkrStreamQuoteParams, 'userEvmAddress' | 'userSolanaAddress'> & { validationError?: InvalidParamsError } {\n const isCrossChainSwap = props.sourceChain.chainId !== props.targetChain.chainId;\n const sourceIsEvm = isEvmNamespace(props.sourceChain.chainId);\n const targetIsEvm = isEvmNamespace(props.targetChain.chainId);\n const sourceIsSolana = isSolanaNamespace(props.sourceChain.chainId);\n const targetIsSolana = isSolanaNamespace(props.targetChain.chainId);\n\n if (sourceIsEvm && !isEvmAddress(props.fromAddress)) {\n return {\n userEvmAddress: undefined,\n userSolanaAddress: undefined,\n validationError: new InvalidParamsError(ErrorReason.INVALID_PARAMS, 'Invalid fromAddress for EVM source chain.'),\n };\n }\n\n if (targetIsEvm && !isEvmAddress(props.toAddress)) {\n return {\n userEvmAddress: undefined,\n userSolanaAddress: undefined,\n validationError: new InvalidParamsError(ErrorReason.INVALID_PARAMS, 'Invalid toAddress for EVM target chain.'),\n };\n }\n\n if (sourceIsSolana && !isSolAddress(props.fromAddress)) {\n return {\n userEvmAddress: undefined,\n userSolanaAddress: undefined,\n validationError: new InvalidParamsError(\n ErrorReason.INVALID_PARAMS,\n 'Invalid fromAddress for Solana source chain.',\n ),\n };\n }\n\n if (targetIsSolana && !isSolAddress(props.toAddress)) {\n return {\n userEvmAddress: undefined,\n userSolanaAddress: undefined,\n validationError: new InvalidParamsError(ErrorReason.INVALID_PARAMS, 'Invalid toAddress for Solana target chain.'),\n };\n }\n\n if (isCrossChainSwap && ((sourceIsEvm && targetIsEvm) || (sourceIsSolana && targetIsSolana))) {\n if (props.fromAddress !== props.toAddress) {\n return {\n userEvmAddress: undefined,\n userSolanaAddress: undefined,\n validationError: new InvalidParamsError(\n ErrorReason.INVALID_PARAMS,\n 'fromAddress and toAddress must match for same-namespace cross-chain swaps.',\n ),\n };\n }\n }\n\n if (!isCrossChainSwap) {\n if (props.fromAddress !== props.toAddress) {\n return {\n userEvmAddress: undefined,\n userSolanaAddress: undefined,\n validationError: new InvalidParamsError(\n ErrorReason.INVALID_PARAMS,\n 'fromAddress and toAddress must match for same-chain swaps.',\n ),\n };\n }\n\n return {\n userEvmAddress: undefined,\n userSolanaAddress: undefined,\n };\n }\n\n const userEvmAddress =\n sourceIsEvm && isEvmAddress(props.fromAddress)\n ? props.fromAddress\n : targetIsEvm && isEvmAddress(props.toAddress)\n ? props.toAddress\n : undefined;\n\n const userSolanaAddress =\n sourceIsSolana && isSolAddress(props.fromAddress)\n ? props.fromAddress\n : targetIsSolana && isSolAddress(props.toAddress)\n ? props.toAddress\n : undefined;\n\n return {\n userEvmAddress,\n userSolanaAddress,\n };\n}\n"],"mappings":"ydAeA,SAAgB,EAAoB,CAClC,aACA,QACA,iBAC6D,CAC7D,OAAQ,EAAO,IAAY,CACzB,IAAM,EAAK,IAAI,gBACT,CAAE,iBAAgB,oBAAmB,mBAAoB,EAA6B,EAAM,CAwDlG,OAtDI,GACF,EAAQ,QAAS,EAAgB,CACjC,EAAQ,OAAO,CAER,CACL,WAAc,GACf,GAGE,EACH,EACA,CACE,OAAQ,EAAM,OAAO,UAAU,CAC/B,QACA,QAAS,EAAe,EAAM,YAAY,QAAQ,CAC9C,EAAqB,EAAM,YAAY,QAAQ,CAC/C,EAAM,YAAY,QAGtB,mBACE,EAAM,YAAY,UAAY,EAAM,YAAY,QAI5C,IAAA,GAHA,EAAe,EAAM,YAAY,QAAQ,CACvC,EAAqB,EAAM,YAAY,QAAQ,CAC/C,EAAM,YAAY,QAE1B,SAAU,EAAM,YAChB,QAAS,EAAqB,EAAM,YAAa,EAAM,YAAY,QAAQ,CAC3E,gBAAiB,EAAM,YAAY,SACnC,SAAU,EAAqB,EAAM,YAAa,EAAM,YAAY,QAAQ,CAC5E,iBAAkB,EAAM,YAAY,SACpC,iBACA,oBACD,CACD,CACE,WAAc,CACP,EAAG,OAAO,SACb,EAAQ,OAAO,EAGnB,QAAU,GAAU,CACb,EAAG,OAAO,UACb,EAAQ,QAAS,EAAM,CACvB,EAAQ,OAAO,GAGnB,QAAU,GAAS,CACZ,EAAG,OAAO,SACb,EAAQ,QAAS,EAAgC,EAAM,EAAO,EAAc,CAAC,EAGjF,OAAQ,EAAG,OACZ,CACF,CAEM,CACL,WAAc,CACZ,EAAG,OAAO,EAEb,GAIL,SAAgB,EACd,EACiH,CACjH,IAAM,EAAmB,EAAM,YAAY,UAAY,EAAM,YAAY,QACnE,EAAc,EAAe,EAAM,YAAY,QAAQ,CACvD,EAAc,EAAe,EAAM,YAAY,QAAQ,CACvD,EAAiB,EAAkB,EAAM,YAAY,QAAQ,CAC7D,EAAiB,EAAkB,EAAM,YAAY,QAAQ,CAkFnE,OAhFI,GAAe,CAAC,EAAa,EAAM,YAAY,CAC1C,CACL,eAAgB,IAAA,GAChB,kBAAmB,IAAA,GACnB,gBAAiB,IAAI,EAAmB,EAAY,eAAgB,4CAA4C,CACjH,CAGC,GAAe,CAAC,EAAa,EAAM,UAAU,CACxC,CACL,eAAgB,IAAA,GAChB,kBAAmB,IAAA,GACnB,gBAAiB,IAAI,EAAmB,EAAY,eAAgB,0CAA0C,CAC/G,CAGC,GAAkB,CAAC,EAAa,EAAM,YAAY,CAC7C,CACL,eAAgB,IAAA,GAChB,kBAAmB,IAAA,GACnB,gBAAiB,IAAI,EACnB,EAAY,eACZ,+CACD,CACF,CAGC,GAAkB,CAAC,EAAa,EAAM,UAAU,CAC3C,CACL,eAAgB,IAAA,GAChB,kBAAmB,IAAA,GACnB,gBAAiB,IAAI,EAAmB,EAAY,eAAgB,6CAA6C,CAClH,CAGC,IAAsB,GAAe,GAAiB,GAAkB,IACtE,EAAM,cAAgB,EAAM,UACvB,CACL,eAAgB,IAAA,GAChB,kBAAmB,IAAA,GACnB,gBAAiB,IAAI,EACnB,EAAY,eACZ,6EACD,CACF,CAIA,EAgCE,CACL,eAdA,GAAe,EAAa,EAAM,YAAY,CAC1C,EAAM,YACN,GAAe,EAAa,EAAM,UAAU,CAC5C,EAAM,UACN,IAAA,GAWJ,kBARA,GAAkB,EAAa,EAAM,YAAY,CAC7C,EAAM,YACN,GAAkB,EAAa,EAAM,UAAU,CAC/C,EAAM,UACN,IAAA,GAKL,CAlCK,EAAM,cAAgB,EAAM,UAWzB,CACL,eAAgB,IAAA,GAChB,kBAAmB,IAAA,GACpB,CAbQ,CACL,eAAgB,IAAA,GAChB,kBAAmB,IAAA,GACnB,gBAAiB,IAAI,EACnB,EAAY,eACZ,6DACD,CACF"}
@@ -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.cjs`),i=require(`../_api.cjs`),a=require(`../../_tracking-utilities.cjs`),o=require(`../constants.cjs`);let s=require(`viem`),c=require(`@solana/kit`);function l({apiOptions:e}){return({transfer:t,updateListener:r})=>t.sourceChain.chainId===t.targetChain.chainId?n.isSolanaNamespace(t.sourceChain.chainId)?u({transfer:t,updateListener:r}):a.trackSameChainEvmTransfer({transfer:t,updateListener:r}):f({transfer:t,updateListener:r},e)}function u({transfer:e,updateListener:t}){let n=new AbortController,r=()=>n.abort();return e.status===`source-pending`?{cancel:r,result:d(e,t,n.signal)}:{cancel:r,result:Promise.resolve(e)}}async function d(e,n,i){let{txHash:a}=e.source;try{(0,c.assertIsSignature)(a)}catch{let r={...e,errorCode:t.ErrorCode.INVALID_PARAMS,errorReason:`Invalid source transaction hash`,failedAtMs:Date.now(),status:`failed`};return n(r),r}let s=r.getSolanaRpcForChain({chain:e.sourceChain}),l=Date.now();for(;!i.aborted;){if(Date.now()-l>o.SOLANA_TX_TIMEOUT_MS)return e;try{let{value:c}=await s.getSignatureStatuses([a],{searchTransactionHistory:!0}).send(),l=c[0];if(!l){await r.waitForTimeoutOrAbort({timeoutMs:o.SOLANA_POLLING_INTERVAL_MS,signal:i});continue}if(l.err!==null){let r={...e,errorCode:t.ErrorCode.TRANSACTION_REVERTED,errorReason:`Source transaction was reverted`,failedAtMs:Date.now(),status:`failed`};return n(r),r}if(l.confirmationStatus===`finalized`){let t={...e,completedAtMs:Date.now(),source:{...e.source,confirmationCount:e.source.requiredConfirmationCount},status:`completed`,target:null};return n(t),t}let u=Number(l.confirmations??0),d=Math.min(u,e.source.requiredConfirmationCount-1);d!==e.source.confirmationCount&&(e={...e,source:{...e.source,confirmationCount:d}},n(e)),await r.waitForTimeoutOrAbort({timeoutMs:o.SOLANA_POLLING_INTERVAL_MS,signal:i})}catch{return e}}return e}function f({transfer:e,updateListener:t},n){let r=new AbortController;return{cancel:()=>{r.abort()},result:(async()=>{let i=structuredClone(e);for(;!r.signal.aborted;){let e=await p(i,n,r.signal);if(r.signal.aborted)break;if(i=e,t(e),e.status===`completed`||e.status===`failed`||e.status===`refunded`)return e;let a=g(e);await new Promise(e=>{let t=setTimeout(e,a);r.signal.addEventListener(`abort`,()=>clearTimeout(t),{once:!0})})}return i})()}}async function p(e,a,o){if(e.status===`completed`||e.status===`failed`||e.status===`refunded`)return e;if(!x(e.source.txHash,e.sourceChain.chainId))return{...e,errorCode:t.ErrorCode.INVALID_PARAMS,errorReason:`Invalid source transaction hash`,failedAtMs:Date.now(),status:`failed`};if(e.status===`source-pending`){if(n.isEvmNamespace(e.sourceChain.chainId)){let n=e.source.txHash;if(!(0,s.isHash)(n))return{...e,errorCode:t.ErrorCode.INVALID_PARAMS,errorReason:`Invalid source transaction hash`,failedAtMs:Date.now(),status:`failed`};let i=r.getEvmClientForChain({chain:e.sourceChain});try{let a=await r.awaitOrAbort(i.waitForTransactionReceipt({hash:n}),o);if(a.status===`aborted`)return e;let s=a.value;return s.status===`reverted`?{...e,errorCode:t.ErrorCode.TRANSACTION_REVERTED,errorReason:`Source transaction was reverted`,failedAtMs:Date.now(),status:`failed`}:(await m(i,e.sourceChain.chainId,e.sourceChain.chainName,s.blockNumber,o)).status===`aborted`?e:C(e)}catch{return e}}if(n.isSolanaNamespace(e.sourceChain.chainId)){let n=e.source.txHash;try{(0,c.assertIsSignature)(n)}catch{return{...e,errorCode:t.ErrorCode.INVALID_PARAMS,errorReason:`Invalid source transaction hash`,failedAtMs:Date.now(),status:`failed`}}let r=await b(e.sourceChain,n,o);return r.status===`aborted`?e:r.status===`reverted`?{...e,errorCode:t.ErrorCode.TRANSACTION_REVERTED,errorReason:`Source transaction was reverted`,failedAtMs:Date.now(),status:`failed`}:r.status===`unknown`?e:C(e)}}try{let n=await i.markrGetCrossChainStatus(a,e.source.txHash,{signal:o}),r=w(e,n);switch(n.status){case`failed`:return{...r,errorCode:t.ErrorCode.TRANSACTION_REVERTED,errorReason:`Transaction execution failed.`,failedAtMs:A(n),status:`failed`};case`pending`:return S(n.sourceChain.finalized)?C(r):r;case`committed`:case`pending_execution`:return T(r,n);case`completed`:return E(r,n);case`refunded`:return D(r,n);default:return k(r,n)}}catch(t){return console.error(`[Fusion SDK] Error fetching cross-chain status from Markr API`,{error:t,now:Date.now()}),e}}async function m(e,t,n,i,a){let o=h(t,n);for(;!a.aborted;){let t=await r.awaitOrAbort(e.getBlock({blockTag:`finalized`}),a);if(t.status===`aborted`)return{status:`aborted`};if(t.value.number>=i)return{status:`ok`};await r.waitForTimeoutOrAbort({timeoutMs:o,signal:a})}return{status:`aborted`}}function h(e,t){return o.CROSS_CHAIN_POLLING_INTERVAL_MS[y(_(e,t))]}function g(e){return e.status===`source-pending`?h(e.sourceChain.chainId,e.sourceChain.chainName):h(e.targetChain.chainId,e.targetChain.chainName)}function _(e,t){let n=o.FINALITY_MS_BY_CHAIN_ID[e];if(n!==void 0)return n;let r=v(t);return o.FINALITY_MS_BY_CHAIN_NAME_ALIAS.find(({aliases:e})=>e.some(e=>r.includes(e)))?.finalityMs}function v(e){return e.toLowerCase().replace(/[^a-z0-9]/g,``)}function y(e){return e===void 0?`medium`:e<=o.FINALITY_TIER_MAX_FINALITY_MS.fast?`fast`:e<=o.FINALITY_TIER_MAX_FINALITY_MS.medium?`medium`:e<=o.FINALITY_TIER_MAX_FINALITY_MS.slow?`slow`:`verySlow`}async function b(e,t,n){let i=r.getSolanaRpcForChain({chain:e}),a=Date.now();for(;!n.aborted;){if(Date.now()-a>o.SOLANA_TX_TIMEOUT_MS)return{status:`unknown`};try{let{value:e}=await i.getSignatureStatuses([t],{searchTransactionHistory:!0}).send(),a=e[0];if(!a){await r.waitForTimeoutOrAbort({timeoutMs:o.SOLANA_POLLING_INTERVAL_MS,signal:n});continue}if(a.err!==null)return{status:`reverted`};if(a.confirmationStatus===`finalized`)return{status:`ok`};await r.waitForTimeoutOrAbort({timeoutMs:o.SOLANA_POLLING_INTERVAL_MS,signal:n})}catch{return{status:`unknown`}}}return{status:`aborted`}}function x(e,t){if(n.isEvmNamespace(t))return(0,s.isHash)(e);if(n.isSolanaNamespace(t))try{return(0,c.assertIsSignature)(e),!0}catch{return!1}return!1}function S(e){return e===!0||typeof e==`string`}function C(e){return{...e,source:{...e.source,confirmationCount:2,requiredConfirmationCount:2},status:`source-completed`}}function w(e,t){let n={...e.metadata??{}};return t.destinationChain.bridgeHash&&(n.bridgeHash=t.destinationChain.bridgeHash),t.debug&&(n.debug=t.debug),Object.keys(n).length===0?e:{...e,metadata:n}}function T(e,t){let{timestamp:n,transactionHash:r}=t.destinationChain;return{...e,source:{...e.source,confirmationCount:2,requiredConfirmationCount:2},status:`target-pending`,target:{confirmationCount:r?1:0,requiredConfirmationCount:2,startedAtMs:n?new Date(n).getTime():Date.now(),txHash:r??void 0}}}function E(e,t){let{timestamp:n,transactionHash:r}=t.destinationChain;return{...e,completedAtMs:A(t),status:`completed`,source:{...e.source,confirmationCount:2,requiredConfirmationCount:2},target:r?{txHash:r,confirmationCount:2,requiredConfirmationCount:2,startedAtMs:n?new Date(n).getTime():Date.now()}:null}}function D(e,t){let{transactionHash:n}=t.destinationChain,r=t.transferredTokens[0],i=r?O(e.targetChain.chainId,r.token)??null:null,a=`target`in e?e.target:null;return{...e,refund:{amount:r?.amount??0n,asset:i,chainId:e.targetChain.chainId,txHash:n??null,timestampMs:A(t)},source:{...e.source,confirmationCount:2,requiredConfirmationCount:2},status:`refunded`,target:a?{...a,txHash:void 0}:null}}function O(t,r){if(n.isSolanaNamespace(t))return(0,c.isAddress)(r)?{address:r,decimals:6,name:`USD Coin`,symbol:`USDC`,type:e.TokenType.SPL}:void 0;if(n.isEvmNamespace(t))return(0,s.isAddress)(r)?{address:r,decimals:6,name:`USD Coin`,symbol:`USDC`,type:e.TokenType.ERC20}:void 0}function k(e,t){return t.progress.executed===!0?E(e,t):t.progress.committed===!0?T(e,t):S(t.sourceChain.finalized)?C(e):{...e,source:{...e.source,confirmationCount:0,requiredConfirmationCount:2},status:`source-pending`}}function A(e){return e.destinationChain.finalized?new Date(e.destinationChain.finalized).getTime():e.destinationChain.timestamp?new Date(e.destinationChain.timestamp).getTime():e.sourceChain.finalized?typeof e.sourceChain.finalized==`boolean`&&e.sourceChain.finalized===!0?new Date(e.sourceChain.timestamp).getTime():new Date(e.sourceChain.finalized).getTime():new Date(e.sourceChain.timestamp).getTime()}exports.trackTransferFactory=l;
2
+ //# sourceMappingURL=track-transfer.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"track-transfer.cjs","names":["isSolanaNamespace","trackSameChainEvmTransfer","ErrorCode","getSolanaRpcForChain","SOLANA_TX_TIMEOUT_MS","waitForTimeoutOrAbort","SOLANA_POLLING_INTERVAL_MS","isEvmNamespace","getEvmClientForChain","awaitOrAbort","markrGetCrossChainStatus","CROSS_CHAIN_POLLING_INTERVAL_MS","FINALITY_MS_BY_CHAIN_ID","FINALITY_MS_BY_CHAIN_NAME_ALIAS","FINALITY_TIER_MAX_FINALITY_MS","TokenType"],"sources":["../../../../src/transfer-service/markr/_handlers/track-transfer.ts"],"sourcesContent":["import { assertIsSignature, isAddress as isSolanaAddress, type Signature } from '@solana/kit';\nimport { isAddress as isEvmAddress, isHash } from 'viem';\nimport { isEvmNamespace, isSolanaNamespace } from '../../../_utils/chain';\nimport { TokenType } from '../../../constants';\nimport { ErrorCode } from '../../../errors';\nimport type { TransferService, TrackTransferProps } from '../../../types/service';\nimport type { Asset } from '../../../types/asset';\nimport type {\n CompletedTransfer,\n FailedTransfer,\n SourceCompletedTransfer,\n SourcePendingTransfer,\n TargetPendingTransfer,\n Transfer,\n} from '../../../types/transfer';\nimport { awaitOrAbort, getEvmClientForChain, getSolanaRpcForChain, waitForTimeoutOrAbort } from '../../_utils';\nimport { trackSameChainEvmTransfer } from '../../_tracking-utilities';\nimport { markrGetCrossChainStatus, type ApiOptions } from '../_api';\nimport type { CrossChainStatusResponse } from '../_schema';\nimport {\n CROSS_CHAIN_POLLING_INTERVAL_MS,\n FINALITY_MS_BY_CHAIN_ID,\n FINALITY_MS_BY_CHAIN_NAME_ALIAS,\n FINALITY_TIER_MAX_FINALITY_MS,\n SOLANA_POLLING_INTERVAL_MS,\n SOLANA_TX_TIMEOUT_MS,\n} from '../constants';\nimport type { Caip2ChainId } from '../../../mod';\n\ntype FinalityTier = keyof typeof CROSS_CHAIN_POLLING_INTERVAL_MS;\n\ntype InFlightTransfer = SourcePendingTransfer | SourceCompletedTransfer | TargetPendingTransfer;\n\nexport interface TrackTransferFactoryConfig {\n apiOptions: ApiOptions;\n}\n\nexport function trackTransferFactory({ apiOptions }: TrackTransferFactoryConfig): TransferService['trackTransfer'] {\n return ({ transfer, updateListener }) => {\n if (transfer.sourceChain.chainId === transfer.targetChain.chainId) {\n if (isSolanaNamespace(transfer.sourceChain.chainId)) {\n return _trackSameChainSolanaTransfer({ transfer, updateListener });\n }\n return trackSameChainEvmTransfer({ transfer, updateListener });\n }\n\n return _trackCrossChainTransfer({ transfer, updateListener }, apiOptions);\n };\n}\n\nexport function _trackSameChainSolanaTransfer({ transfer, updateListener }: TrackTransferProps): {\n cancel: () => void;\n result: Promise<Transfer>;\n} {\n const ac = new AbortController();\n const cancel = () => ac.abort();\n\n if (transfer.status !== 'source-pending') {\n return { cancel, result: Promise.resolve(transfer) };\n }\n\n return { cancel, result: _pollSolanaSignatureStatus(transfer, updateListener, ac.signal) };\n}\n\nasync function _pollSolanaSignatureStatus(\n transfer: SourcePendingTransfer,\n updateListener: (transfer: Transfer) => void,\n signal: AbortSignal,\n): Promise<Transfer> {\n const { txHash } = transfer.source;\n\n try {\n assertIsSignature(txHash);\n } catch {\n const failed: FailedTransfer = {\n ...transfer,\n errorCode: ErrorCode.INVALID_PARAMS,\n errorReason: 'Invalid source transaction hash',\n failedAtMs: Date.now(),\n status: 'failed',\n };\n updateListener(failed);\n return failed;\n }\n\n const rpc = getSolanaRpcForChain({ chain: transfer.sourceChain });\n const startTime = Date.now();\n\n while (!signal.aborted) {\n if (Date.now() - startTime > SOLANA_TX_TIMEOUT_MS) {\n return transfer;\n }\n\n try {\n const { value } = await rpc.getSignatureStatuses([txHash], { searchTransactionHistory: true }).send();\n const status = value[0];\n\n if (!status) {\n await waitForTimeoutOrAbort({ timeoutMs: SOLANA_POLLING_INTERVAL_MS, signal });\n continue;\n }\n\n if (status.err !== null) {\n const failed: FailedTransfer = {\n ...transfer,\n errorCode: ErrorCode.TRANSACTION_REVERTED,\n errorReason: 'Source transaction was reverted',\n failedAtMs: Date.now(),\n status: 'failed',\n };\n updateListener(failed);\n return failed;\n }\n\n if (status.confirmationStatus === 'finalized') {\n const completed: CompletedTransfer = {\n ...transfer,\n completedAtMs: Date.now(),\n source: {\n ...transfer.source,\n confirmationCount: transfer.source.requiredConfirmationCount,\n },\n status: 'completed',\n target: null,\n };\n updateListener(completed);\n return completed;\n }\n\n const confirmations = Number(status.confirmations ?? 0);\n const cappedCount = Math.min(confirmations, transfer.source.requiredConfirmationCount - 1);\n\n if (cappedCount !== transfer.source.confirmationCount) {\n transfer = {\n ...transfer,\n source: {\n ...transfer.source,\n confirmationCount: cappedCount,\n },\n };\n updateListener(transfer);\n }\n\n await waitForTimeoutOrAbort({ timeoutMs: SOLANA_POLLING_INTERVAL_MS, signal });\n } catch {\n return transfer;\n }\n }\n\n return transfer;\n}\n\nexport function _trackCrossChainTransfer(\n { transfer, updateListener }: TrackTransferProps,\n apiOptions: ApiOptions,\n): { cancel: () => void; result: Promise<Transfer> } {\n const ac = new AbortController();\n const cancel = () => {\n ac.abort();\n };\n\n const executeTracking = async (): Promise<Transfer> => {\n let currentTransfer: Transfer = structuredClone(transfer);\n while (!ac.signal.aborted) {\n const updatedTransfer = await _getMarkrCrossChainTxStatus(currentTransfer, apiOptions, ac.signal);\n\n if (ac.signal.aborted) {\n break;\n }\n\n currentTransfer = updatedTransfer;\n\n updateListener(updatedTransfer);\n\n if (\n updatedTransfer.status === 'completed' ||\n updatedTransfer.status === 'failed' ||\n updatedTransfer.status === 'refunded'\n ) {\n return updatedTransfer;\n }\n\n const pollingIntervalMs = _getPollingIntervalMsForTransfer(updatedTransfer);\n\n // Wait before polling again.\n await new Promise((resolve) => {\n const timeoutId = setTimeout(resolve, pollingIntervalMs);\n ac.signal.addEventListener('abort', () => clearTimeout(timeoutId), { once: true });\n });\n }\n\n return currentTransfer;\n };\n\n return {\n cancel,\n result: executeTracking(),\n };\n}\n\nexport async function _getMarkrCrossChainTxStatus(\n transfer: Transfer,\n apiOptions: ApiOptions,\n signal: AbortSignal,\n): Promise<Transfer> {\n if (transfer.status === 'completed' || transfer.status === 'failed' || transfer.status === 'refunded') {\n return transfer;\n }\n\n // We only support tracking EVM or Solana source transactions.\n if (!_isValidSourceTxHash(transfer.source.txHash, transfer.sourceChain.chainId)) {\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 return failedTransfer;\n }\n\n // If transfer is `source-pending`, we first confirm source-chain finality before\n // querying Markr's cross-chain status endpoint.\n // Once source finality is confirmed, we mark the transfer as source-completed and\n // defer Markr polling to subsequent iterations.\n if (transfer.status === 'source-pending') {\n if (isEvmNamespace(transfer.sourceChain.chainId)) {\n const sourceTxHash = transfer.source.txHash;\n\n if (!isHash(sourceTxHash)) {\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\n return failedTransfer;\n }\n\n const client = getEvmClientForChain({ chain: transfer.sourceChain });\n\n try {\n const receiptResult = await awaitOrAbort(\n client.waitForTransactionReceipt({\n hash: sourceTxHash,\n }),\n signal,\n );\n\n if (receiptResult.status === 'aborted') {\n return transfer;\n }\n\n const receipt = receiptResult.value;\n\n if (receipt.status === 'reverted') {\n const failedTransfer: FailedTransfer = {\n ...transfer,\n errorCode: ErrorCode.TRANSACTION_REVERTED,\n errorReason: 'Source transaction was reverted',\n failedAtMs: Date.now(),\n status: 'failed',\n };\n return failedTransfer;\n }\n\n const finalityResult = await _waitForEvmSourceFinalization(\n client,\n transfer.sourceChain.chainId,\n transfer.sourceChain.chainName,\n receipt.blockNumber,\n signal,\n );\n if (finalityResult.status === 'aborted') {\n return transfer;\n }\n\n return _toSourceCompletedTransfer(transfer);\n } catch {\n return transfer;\n }\n }\n\n if (isSolanaNamespace(transfer.sourceChain.chainId)) {\n const sourceTxHash = transfer.source.txHash;\n\n try {\n assertIsSignature(sourceTxHash);\n } catch {\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 return failedTransfer;\n }\n\n const finalityResult = await _waitForSolanaSourceFinalization(transfer.sourceChain, sourceTxHash, signal);\n\n if (finalityResult.status === 'aborted') {\n return transfer;\n }\n\n if (finalityResult.status === 'reverted') {\n const failedTransfer: FailedTransfer = {\n ...transfer,\n errorCode: ErrorCode.TRANSACTION_REVERTED,\n errorReason: 'Source transaction was reverted',\n failedAtMs: Date.now(),\n status: 'failed',\n };\n return failedTransfer;\n }\n\n if (finalityResult.status === 'unknown') {\n return transfer;\n }\n\n return _toSourceCompletedTransfer(transfer);\n }\n }\n\n try {\n const statusResponse = await markrGetCrossChainStatus(apiOptions, transfer.source.txHash, { signal });\n const transferWithMarkrMetadata = _withMarkrTrackingMetadata(transfer, statusResponse);\n\n switch (statusResponse.status) {\n case 'failed': {\n const failedTransfer: FailedTransfer = {\n ...transferWithMarkrMetadata,\n errorCode: ErrorCode.TRANSACTION_REVERTED,\n errorReason: 'Transaction execution failed.',\n failedAtMs: _getLastStatusActivityTime(statusResponse),\n status: 'failed',\n };\n\n return failedTransfer;\n }\n\n case 'pending': {\n return _isMarkrSourceFinalized(statusResponse.sourceChain.finalized)\n ? _toSourceCompletedTransfer(transferWithMarkrMetadata)\n : transferWithMarkrMetadata;\n }\n\n case 'committed':\n case 'pending_execution': {\n return _toTargetPendingTransfer(transferWithMarkrMetadata, statusResponse);\n }\n\n case 'completed': {\n return _toCompletedTransfer(transferWithMarkrMetadata, statusResponse);\n }\n\n case 'refunded': {\n return _toRefundedTransfer(transferWithMarkrMetadata, statusResponse);\n }\n\n case 'unknown':\n default: {\n return _deriveTransferFromUnknownStatus(transferWithMarkrMetadata, statusResponse);\n }\n }\n } catch (error) {\n // TODO: Clean this console.error up before v1 release.\n // This is just here for now to try to track down tracking issues.\n console.error('[Fusion SDK] Error fetching cross-chain status from Markr API', {\n error,\n now: Date.now(),\n });\n\n return transfer;\n }\n}\n\nasync function _waitForEvmSourceFinalization(\n client: ReturnType<typeof getEvmClientForChain>,\n chainId: Caip2ChainId,\n chainName: string,\n txBlockNumber: bigint,\n signal: AbortSignal,\n): Promise<{ status: 'aborted' } | { status: 'ok' }> {\n const pollingIntervalMs = _getCrossChainPollingIntervalMs(chainId, chainName);\n\n while (!signal.aborted) {\n const finalizedBlockResult = await awaitOrAbort(client.getBlock({ blockTag: 'finalized' }), signal);\n\n if (finalizedBlockResult.status === 'aborted') {\n return { status: 'aborted' };\n }\n\n if (finalizedBlockResult.value.number >= txBlockNumber) {\n return { status: 'ok' };\n }\n\n await waitForTimeoutOrAbort({\n timeoutMs: pollingIntervalMs,\n signal,\n });\n }\n\n return { status: 'aborted' };\n}\n\nfunction _getCrossChainPollingIntervalMs(chainId: Caip2ChainId, chainName: string): number {\n const knownFinalityMs = _getKnownFinalityMs(chainId, chainName);\n const finalityTier = _toFinalityTier(knownFinalityMs);\n return CROSS_CHAIN_POLLING_INTERVAL_MS[finalityTier];\n}\n\nfunction _getPollingIntervalMsForTransfer(transfer: Transfer): number {\n if (transfer.status === 'source-pending') {\n return _getCrossChainPollingIntervalMs(transfer.sourceChain.chainId, transfer.sourceChain.chainName);\n }\n\n return _getCrossChainPollingIntervalMs(transfer.targetChain.chainId, transfer.targetChain.chainName);\n}\n\nfunction _getKnownFinalityMs(chainId: Caip2ChainId, chainName: string): number | undefined {\n const chainIdFinalityMs = FINALITY_MS_BY_CHAIN_ID[chainId];\n if (chainIdFinalityMs !== undefined) {\n return chainIdFinalityMs;\n }\n\n const normalizedName = _normalizeChainName(chainName);\n const matchingAlias = FINALITY_MS_BY_CHAIN_NAME_ALIAS.find(({ aliases }) =>\n aliases.some((alias) => normalizedName.includes(alias)),\n );\n\n return matchingAlias?.finalityMs;\n}\n\nfunction _normalizeChainName(chainName: string): string {\n return chainName.toLowerCase().replace(/[^a-z0-9]/g, '');\n}\n\nfunction _toFinalityTier(knownFinalityMs: number | undefined): FinalityTier {\n if (knownFinalityMs === undefined) {\n return 'medium';\n }\n\n if (knownFinalityMs <= FINALITY_TIER_MAX_FINALITY_MS.fast) {\n return 'fast';\n }\n\n if (knownFinalityMs <= FINALITY_TIER_MAX_FINALITY_MS.medium) {\n return 'medium';\n }\n\n if (knownFinalityMs <= FINALITY_TIER_MAX_FINALITY_MS.slow) {\n return 'slow';\n }\n\n return 'verySlow';\n}\n\nasync function _waitForSolanaSourceFinalization(\n chain: SourcePendingTransfer['sourceChain'],\n txHash: Signature,\n signal: AbortSignal,\n): Promise<{ status: 'aborted' } | { status: 'ok' } | { status: 'reverted' } | { status: 'unknown' }> {\n const rpc = getSolanaRpcForChain({ chain });\n const startTime = Date.now();\n\n while (!signal.aborted) {\n if (Date.now() - startTime > SOLANA_TX_TIMEOUT_MS) {\n return { status: 'unknown' };\n }\n\n try {\n const { value } = await rpc.getSignatureStatuses([txHash], { searchTransactionHistory: true }).send();\n const txStatus = value[0];\n\n if (!txStatus) {\n await waitForTimeoutOrAbort({ timeoutMs: SOLANA_POLLING_INTERVAL_MS, signal });\n continue;\n }\n\n if (txStatus.err !== null) {\n return { status: 'reverted' };\n }\n\n if (txStatus.confirmationStatus === 'finalized') {\n return { status: 'ok' };\n }\n\n await waitForTimeoutOrAbort({ timeoutMs: SOLANA_POLLING_INTERVAL_MS, signal });\n } catch {\n return { status: 'unknown' };\n }\n }\n\n return { status: 'aborted' };\n}\n\nfunction _isValidSourceTxHash(txHash: string, sourceChainId: Caip2ChainId): boolean {\n if (isEvmNamespace(sourceChainId)) {\n return isHash(txHash);\n }\n\n if (isSolanaNamespace(sourceChainId)) {\n try {\n assertIsSignature(txHash);\n return true;\n } catch {\n return false;\n }\n }\n\n return false;\n}\n\nfunction _isMarkrSourceFinalized(finalized: CrossChainStatusResponse['sourceChain']['finalized']): boolean {\n return finalized === true || typeof finalized === 'string';\n}\n\nfunction _toSourceCompletedTransfer(transfer: InFlightTransfer): SourceCompletedTransfer {\n return {\n ...transfer,\n source: {\n ...transfer.source,\n confirmationCount: 2,\n requiredConfirmationCount: 2,\n },\n status: 'source-completed',\n };\n}\n\nfunction _withMarkrTrackingMetadata(\n transfer: InFlightTransfer,\n statusResponse: CrossChainStatusResponse,\n): InFlightTransfer {\n const metadata: Record<string, unknown> = { ...(transfer.metadata ?? {}) };\n\n if (statusResponse.destinationChain.bridgeHash) {\n metadata.bridgeHash = statusResponse.destinationChain.bridgeHash;\n }\n\n if (statusResponse.debug) {\n metadata.debug = statusResponse.debug;\n }\n\n if (Object.keys(metadata).length === 0) {\n return transfer;\n }\n\n return {\n ...transfer,\n metadata,\n };\n}\n\nfunction _toTargetPendingTransfer(\n transfer: InFlightTransfer,\n statusResponse: CrossChainStatusResponse,\n): TargetPendingTransfer {\n const { timestamp, transactionHash } = statusResponse.destinationChain;\n\n return {\n ...transfer,\n source: {\n ...transfer.source,\n confirmationCount: 2,\n requiredConfirmationCount: 2,\n },\n status: 'target-pending',\n target: {\n confirmationCount: transactionHash ? 1 : 0,\n requiredConfirmationCount: 2,\n startedAtMs: timestamp ? new Date(timestamp).getTime() : Date.now(),\n txHash: transactionHash ?? undefined,\n },\n };\n}\n\nfunction _toCompletedTransfer(transfer: InFlightTransfer, statusResponse: CrossChainStatusResponse): CompletedTransfer {\n const { timestamp, transactionHash } = statusResponse.destinationChain;\n\n return {\n ...transfer,\n completedAtMs: _getLastStatusActivityTime(statusResponse),\n status: 'completed',\n source: {\n ...transfer.source,\n confirmationCount: 2,\n requiredConfirmationCount: 2,\n },\n target: transactionHash\n ? {\n txHash: transactionHash,\n confirmationCount: 2,\n requiredConfirmationCount: 2,\n startedAtMs: timestamp ? new Date(timestamp).getTime() : Date.now(),\n }\n : null,\n };\n}\n\nfunction _toRefundedTransfer(transfer: InFlightTransfer, statusResponse: CrossChainStatusResponse): Transfer {\n const { transactionHash } = statusResponse.destinationChain;\n // This _should_ exist.\n // If it doesn't, thats a problem with Markr's API and they should resolve it.\n // We were \"guaranteed\" by them that in a \"refunded\" status, there would be exactly 1\n // transferred token in the response, which represents the refund.\n const refundedToken = statusResponse.transferredTokens[0];\n\n const refundAsset = refundedToken ? _getRefundAsset(transfer.targetChain.chainId, refundedToken.token) ?? null : null;\n const existingTarget = 'target' in transfer ? transfer.target : null;\n\n return {\n ...transfer,\n refund: {\n amount: refundedToken?.amount ?? 0n,\n asset: refundAsset,\n chainId: transfer.targetChain.chainId,\n txHash: transactionHash ?? null,\n timestampMs: _getLastStatusActivityTime(statusResponse),\n },\n source: {\n ...transfer.source,\n confirmationCount: 2,\n requiredConfirmationCount: 2,\n },\n status: 'refunded',\n target: existingTarget\n ? {\n ...existingTarget,\n txHash: undefined,\n }\n : null,\n };\n}\n\nfunction _getRefundAsset(chainId: Caip2ChainId, tokenAddress: string): Asset | undefined {\n if (isSolanaNamespace(chainId)) {\n if (!isSolanaAddress(tokenAddress)) {\n return undefined;\n }\n\n return {\n address: tokenAddress,\n decimals: 6,\n name: 'USD Coin',\n symbol: 'USDC',\n type: TokenType.SPL,\n };\n }\n\n if (isEvmNamespace(chainId)) {\n if (!isEvmAddress(tokenAddress)) {\n return undefined;\n }\n\n return {\n address: tokenAddress,\n decimals: 6,\n name: 'USD Coin',\n symbol: 'USDC',\n type: TokenType.ERC20,\n };\n }\n\n return undefined;\n}\n\nfunction _deriveTransferFromUnknownStatus(\n transfer: InFlightTransfer,\n statusResponse: CrossChainStatusResponse,\n): Transfer {\n if (statusResponse.progress.executed === true) {\n return _toCompletedTransfer(transfer, statusResponse);\n }\n\n if (statusResponse.progress.committed === true) {\n return _toTargetPendingTransfer(transfer, statusResponse);\n }\n\n if (_isMarkrSourceFinalized(statusResponse.sourceChain.finalized)) {\n return _toSourceCompletedTransfer(transfer);\n }\n\n return {\n ...transfer,\n source: {\n ...transfer.source,\n confirmationCount: 0,\n requiredConfirmationCount: 2,\n },\n status: 'source-pending',\n };\n}\n\nfunction _getLastStatusActivityTime(response: CrossChainStatusResponse): number {\n if (response.destinationChain.finalized) {\n return new Date(response.destinationChain.finalized).getTime();\n }\n\n if (response.destinationChain.timestamp) {\n return new Date(response.destinationChain.timestamp).getTime();\n }\n\n if (response.sourceChain.finalized) {\n if (typeof response.sourceChain.finalized === 'boolean' && response.sourceChain.finalized === true) {\n // Handle case where finalized is returned as boolean `true` instead of a timestamp.\n return new Date(response.sourceChain.timestamp).getTime();\n }\n return new Date(response.sourceChain.finalized).getTime();\n }\n\n return new Date(response.sourceChain.timestamp).getTime();\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{TokenType as e}from"../../../constants.js";import{ErrorCode as t}from"../../../errors.js";import{isEvmNamespace as n,isSolanaNamespace as r}from"../../../_utils/chain.js";import{awaitOrAbort as i,getEvmClientForChain as a,getSolanaRpcForChain as o,waitForTimeoutOrAbort as s}from"../../_utils.js";import{markrGetCrossChainStatus as c}from"../_api.js";import{trackSameChainEvmTransfer as l}from"../../_tracking-utilities.js";import{CROSS_CHAIN_POLLING_INTERVAL_MS as u,FINALITY_MS_BY_CHAIN_ID as d,FINALITY_MS_BY_CHAIN_NAME_ALIAS as f,FINALITY_TIER_MAX_FINALITY_MS as p,SOLANA_POLLING_INTERVAL_MS as m,SOLANA_TX_TIMEOUT_MS as h}from"../constants.js";import{isAddress as g,isHash as _}from"viem";import{assertIsSignature as v,isAddress as y}from"@solana/kit";function b({apiOptions:e}){return({transfer:t,updateListener:n})=>t.sourceChain.chainId===t.targetChain.chainId?r(t.sourceChain.chainId)?x({transfer:t,updateListener:n}):l({transfer:t,updateListener:n}):C({transfer:t,updateListener:n},e)}function x({transfer:e,updateListener:t}){let n=new AbortController,r=()=>n.abort();return e.status===`source-pending`?{cancel:r,result:S(e,t,n.signal)}:{cancel:r,result:Promise.resolve(e)}}async function S(e,n,r){let{txHash:i}=e.source;try{v(i)}catch{let r={...e,errorCode:t.INVALID_PARAMS,errorReason:`Invalid source transaction hash`,failedAtMs:Date.now(),status:`failed`};return n(r),r}let a=o({chain:e.sourceChain}),c=Date.now();for(;!r.aborted;){if(Date.now()-c>h)return e;try{let{value:o}=await a.getSignatureStatuses([i],{searchTransactionHistory:!0}).send(),c=o[0];if(!c){await s({timeoutMs:m,signal:r});continue}if(c.err!==null){let r={...e,errorCode:t.TRANSACTION_REVERTED,errorReason:`Source transaction was reverted`,failedAtMs:Date.now(),status:`failed`};return n(r),r}if(c.confirmationStatus===`finalized`){let t={...e,completedAtMs:Date.now(),source:{...e.source,confirmationCount:e.source.requiredConfirmationCount},status:`completed`,target:null};return n(t),t}let l=Number(c.confirmations??0),u=Math.min(l,e.source.requiredConfirmationCount-1);u!==e.source.confirmationCount&&(e={...e,source:{...e.source,confirmationCount:u}},n(e)),await s({timeoutMs:m,signal:r})}catch{return e}}return e}function C({transfer:e,updateListener:t},n){let r=new AbortController;return{cancel:()=>{r.abort()},result:(async()=>{let i=structuredClone(e);for(;!r.signal.aborted;){let e=await w(i,n,r.signal);if(r.signal.aborted)break;if(i=e,t(e),e.status===`completed`||e.status===`failed`||e.status===`refunded`)return e;let a=D(e);await new Promise(e=>{let t=setTimeout(e,a);r.signal.addEventListener(`abort`,()=>clearTimeout(t),{once:!0})})}return i})()}}async function w(e,o,s){if(e.status===`completed`||e.status===`failed`||e.status===`refunded`)return e;if(!M(e.source.txHash,e.sourceChain.chainId))return{...e,errorCode:t.INVALID_PARAMS,errorReason:`Invalid source transaction hash`,failedAtMs:Date.now(),status:`failed`};if(e.status===`source-pending`){if(n(e.sourceChain.chainId)){let n=e.source.txHash;if(!_(n))return{...e,errorCode:t.INVALID_PARAMS,errorReason:`Invalid source transaction hash`,failedAtMs:Date.now(),status:`failed`};let r=a({chain:e.sourceChain});try{let a=await i(r.waitForTransactionReceipt({hash:n}),s);if(a.status===`aborted`)return e;let o=a.value;return o.status===`reverted`?{...e,errorCode:t.TRANSACTION_REVERTED,errorReason:`Source transaction was reverted`,failedAtMs:Date.now(),status:`failed`}:(await T(r,e.sourceChain.chainId,e.sourceChain.chainName,o.blockNumber,s)).status===`aborted`?e:P(e)}catch{return e}}if(r(e.sourceChain.chainId)){let n=e.source.txHash;try{v(n)}catch{return{...e,errorCode:t.INVALID_PARAMS,errorReason:`Invalid source transaction hash`,failedAtMs:Date.now(),status:`failed`}}let r=await j(e.sourceChain,n,s);return r.status===`aborted`?e:r.status===`reverted`?{...e,errorCode:t.TRANSACTION_REVERTED,errorReason:`Source transaction was reverted`,failedAtMs:Date.now(),status:`failed`}:r.status===`unknown`?e:P(e)}}try{let n=await c(o,e.source.txHash,{signal:s}),r=F(e,n);switch(n.status){case`failed`:return{...r,errorCode:t.TRANSACTION_REVERTED,errorReason:`Transaction execution failed.`,failedAtMs:V(n),status:`failed`};case`pending`:return N(n.sourceChain.finalized)?P(r):r;case`committed`:case`pending_execution`:return I(r,n);case`completed`:return L(r,n);case`refunded`:return R(r,n);default:return B(r,n)}}catch(t){return console.error(`[Fusion SDK] Error fetching cross-chain status from Markr API`,{error:t,now:Date.now()}),e}}async function T(e,t,n,r,a){let o=E(t,n);for(;!a.aborted;){let t=await i(e.getBlock({blockTag:`finalized`}),a);if(t.status===`aborted`)return{status:`aborted`};if(t.value.number>=r)return{status:`ok`};await s({timeoutMs:o,signal:a})}return{status:`aborted`}}function E(e,t){return u[A(O(e,t))]}function D(e){return e.status===`source-pending`?E(e.sourceChain.chainId,e.sourceChain.chainName):E(e.targetChain.chainId,e.targetChain.chainName)}function O(e,t){let n=d[e];if(n!==void 0)return n;let r=k(t);return f.find(({aliases:e})=>e.some(e=>r.includes(e)))?.finalityMs}function k(e){return e.toLowerCase().replace(/[^a-z0-9]/g,``)}function A(e){return e===void 0?`medium`:e<=p.fast?`fast`:e<=p.medium?`medium`:e<=p.slow?`slow`:`verySlow`}async function j(e,t,n){let r=o({chain:e}),i=Date.now();for(;!n.aborted;){if(Date.now()-i>h)return{status:`unknown`};try{let{value:e}=await r.getSignatureStatuses([t],{searchTransactionHistory:!0}).send(),i=e[0];if(!i){await s({timeoutMs:m,signal:n});continue}if(i.err!==null)return{status:`reverted`};if(i.confirmationStatus===`finalized`)return{status:`ok`};await s({timeoutMs:m,signal:n})}catch{return{status:`unknown`}}}return{status:`aborted`}}function M(e,t){if(n(t))return _(e);if(r(t))try{return v(e),!0}catch{return!1}return!1}function N(e){return e===!0||typeof e==`string`}function P(e){return{...e,source:{...e.source,confirmationCount:2,requiredConfirmationCount:2},status:`source-completed`}}function F(e,t){let n={...e.metadata??{}};return t.destinationChain.bridgeHash&&(n.bridgeHash=t.destinationChain.bridgeHash),t.debug&&(n.debug=t.debug),Object.keys(n).length===0?e:{...e,metadata:n}}function I(e,t){let{timestamp:n,transactionHash:r}=t.destinationChain;return{...e,source:{...e.source,confirmationCount:2,requiredConfirmationCount:2},status:`target-pending`,target:{confirmationCount:r?1:0,requiredConfirmationCount:2,startedAtMs:n?new Date(n).getTime():Date.now(),txHash:r??void 0}}}function L(e,t){let{timestamp:n,transactionHash:r}=t.destinationChain;return{...e,completedAtMs:V(t),status:`completed`,source:{...e.source,confirmationCount:2,requiredConfirmationCount:2},target:r?{txHash:r,confirmationCount:2,requiredConfirmationCount:2,startedAtMs:n?new Date(n).getTime():Date.now()}:null}}function R(e,t){let{transactionHash:n}=t.destinationChain,r=t.transferredTokens[0],i=r?z(e.targetChain.chainId,r.token)??null:null,a=`target`in e?e.target:null;return{...e,refund:{amount:r?.amount??0n,asset:i,chainId:e.targetChain.chainId,txHash:n??null,timestampMs:V(t)},source:{...e.source,confirmationCount:2,requiredConfirmationCount:2},status:`refunded`,target:a?{...a,txHash:void 0}:null}}function z(t,i){if(r(t))return y(i)?{address:i,decimals:6,name:`USD Coin`,symbol:`USDC`,type:e.SPL}:void 0;if(n(t))return g(i)?{address:i,decimals:6,name:`USD Coin`,symbol:`USDC`,type:e.ERC20}:void 0}function B(e,t){return t.progress.executed===!0?L(e,t):t.progress.committed===!0?I(e,t):N(t.sourceChain.finalized)?P(e):{...e,source:{...e.source,confirmationCount:0,requiredConfirmationCount:2},status:`source-pending`}}function V(e){return e.destinationChain.finalized?new Date(e.destinationChain.finalized).getTime():e.destinationChain.timestamp?new Date(e.destinationChain.timestamp).getTime():e.sourceChain.finalized?typeof e.sourceChain.finalized==`boolean`&&e.sourceChain.finalized===!0?new Date(e.sourceChain.timestamp).getTime():new Date(e.sourceChain.finalized).getTime():new Date(e.sourceChain.timestamp).getTime()}export{b as trackTransferFactory};
2
+ //# sourceMappingURL=track-transfer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"track-transfer.js","names":["isSolanaAddress","isEvmAddress"],"sources":["../../../../src/transfer-service/markr/_handlers/track-transfer.ts"],"sourcesContent":["import { assertIsSignature, isAddress as isSolanaAddress, type Signature } from '@solana/kit';\nimport { isAddress as isEvmAddress, isHash } from 'viem';\nimport { isEvmNamespace, isSolanaNamespace } from '../../../_utils/chain';\nimport { TokenType } from '../../../constants';\nimport { ErrorCode } from '../../../errors';\nimport type { TransferService, TrackTransferProps } from '../../../types/service';\nimport type { Asset } from '../../../types/asset';\nimport type {\n CompletedTransfer,\n FailedTransfer,\n SourceCompletedTransfer,\n SourcePendingTransfer,\n TargetPendingTransfer,\n Transfer,\n} from '../../../types/transfer';\nimport { awaitOrAbort, getEvmClientForChain, getSolanaRpcForChain, waitForTimeoutOrAbort } from '../../_utils';\nimport { trackSameChainEvmTransfer } from '../../_tracking-utilities';\nimport { markrGetCrossChainStatus, type ApiOptions } from '../_api';\nimport type { CrossChainStatusResponse } from '../_schema';\nimport {\n CROSS_CHAIN_POLLING_INTERVAL_MS,\n FINALITY_MS_BY_CHAIN_ID,\n FINALITY_MS_BY_CHAIN_NAME_ALIAS,\n FINALITY_TIER_MAX_FINALITY_MS,\n SOLANA_POLLING_INTERVAL_MS,\n SOLANA_TX_TIMEOUT_MS,\n} from '../constants';\nimport type { Caip2ChainId } from '../../../mod';\n\ntype FinalityTier = keyof typeof CROSS_CHAIN_POLLING_INTERVAL_MS;\n\ntype InFlightTransfer = SourcePendingTransfer | SourceCompletedTransfer | TargetPendingTransfer;\n\nexport interface TrackTransferFactoryConfig {\n apiOptions: ApiOptions;\n}\n\nexport function trackTransferFactory({ apiOptions }: TrackTransferFactoryConfig): TransferService['trackTransfer'] {\n return ({ transfer, updateListener }) => {\n if (transfer.sourceChain.chainId === transfer.targetChain.chainId) {\n if (isSolanaNamespace(transfer.sourceChain.chainId)) {\n return _trackSameChainSolanaTransfer({ transfer, updateListener });\n }\n return trackSameChainEvmTransfer({ transfer, updateListener });\n }\n\n return _trackCrossChainTransfer({ transfer, updateListener }, apiOptions);\n };\n}\n\nexport function _trackSameChainSolanaTransfer({ transfer, updateListener }: TrackTransferProps): {\n cancel: () => void;\n result: Promise<Transfer>;\n} {\n const ac = new AbortController();\n const cancel = () => ac.abort();\n\n if (transfer.status !== 'source-pending') {\n return { cancel, result: Promise.resolve(transfer) };\n }\n\n return { cancel, result: _pollSolanaSignatureStatus(transfer, updateListener, ac.signal) };\n}\n\nasync function _pollSolanaSignatureStatus(\n transfer: SourcePendingTransfer,\n updateListener: (transfer: Transfer) => void,\n signal: AbortSignal,\n): Promise<Transfer> {\n const { txHash } = transfer.source;\n\n try {\n assertIsSignature(txHash);\n } catch {\n const failed: FailedTransfer = {\n ...transfer,\n errorCode: ErrorCode.INVALID_PARAMS,\n errorReason: 'Invalid source transaction hash',\n failedAtMs: Date.now(),\n status: 'failed',\n };\n updateListener(failed);\n return failed;\n }\n\n const rpc = getSolanaRpcForChain({ chain: transfer.sourceChain });\n const startTime = Date.now();\n\n while (!signal.aborted) {\n if (Date.now() - startTime > SOLANA_TX_TIMEOUT_MS) {\n return transfer;\n }\n\n try {\n const { value } = await rpc.getSignatureStatuses([txHash], { searchTransactionHistory: true }).send();\n const status = value[0];\n\n if (!status) {\n await waitForTimeoutOrAbort({ timeoutMs: SOLANA_POLLING_INTERVAL_MS, signal });\n continue;\n }\n\n if (status.err !== null) {\n const failed: FailedTransfer = {\n ...transfer,\n errorCode: ErrorCode.TRANSACTION_REVERTED,\n errorReason: 'Source transaction was reverted',\n failedAtMs: Date.now(),\n status: 'failed',\n };\n updateListener(failed);\n return failed;\n }\n\n if (status.confirmationStatus === 'finalized') {\n const completed: CompletedTransfer = {\n ...transfer,\n completedAtMs: Date.now(),\n source: {\n ...transfer.source,\n confirmationCount: transfer.source.requiredConfirmationCount,\n },\n status: 'completed',\n target: null,\n };\n updateListener(completed);\n return completed;\n }\n\n const confirmations = Number(status.confirmations ?? 0);\n const cappedCount = Math.min(confirmations, transfer.source.requiredConfirmationCount - 1);\n\n if (cappedCount !== transfer.source.confirmationCount) {\n transfer = {\n ...transfer,\n source: {\n ...transfer.source,\n confirmationCount: cappedCount,\n },\n };\n updateListener(transfer);\n }\n\n await waitForTimeoutOrAbort({ timeoutMs: SOLANA_POLLING_INTERVAL_MS, signal });\n } catch {\n return transfer;\n }\n }\n\n return transfer;\n}\n\nexport function _trackCrossChainTransfer(\n { transfer, updateListener }: TrackTransferProps,\n apiOptions: ApiOptions,\n): { cancel: () => void; result: Promise<Transfer> } {\n const ac = new AbortController();\n const cancel = () => {\n ac.abort();\n };\n\n const executeTracking = async (): Promise<Transfer> => {\n let currentTransfer: Transfer = structuredClone(transfer);\n while (!ac.signal.aborted) {\n const updatedTransfer = await _getMarkrCrossChainTxStatus(currentTransfer, apiOptions, ac.signal);\n\n if (ac.signal.aborted) {\n break;\n }\n\n currentTransfer = updatedTransfer;\n\n updateListener(updatedTransfer);\n\n if (\n updatedTransfer.status === 'completed' ||\n updatedTransfer.status === 'failed' ||\n updatedTransfer.status === 'refunded'\n ) {\n return updatedTransfer;\n }\n\n const pollingIntervalMs = _getPollingIntervalMsForTransfer(updatedTransfer);\n\n // Wait before polling again.\n await new Promise((resolve) => {\n const timeoutId = setTimeout(resolve, pollingIntervalMs);\n ac.signal.addEventListener('abort', () => clearTimeout(timeoutId), { once: true });\n });\n }\n\n return currentTransfer;\n };\n\n return {\n cancel,\n result: executeTracking(),\n };\n}\n\nexport async function _getMarkrCrossChainTxStatus(\n transfer: Transfer,\n apiOptions: ApiOptions,\n signal: AbortSignal,\n): Promise<Transfer> {\n if (transfer.status === 'completed' || transfer.status === 'failed' || transfer.status === 'refunded') {\n return transfer;\n }\n\n // We only support tracking EVM or Solana source transactions.\n if (!_isValidSourceTxHash(transfer.source.txHash, transfer.sourceChain.chainId)) {\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 return failedTransfer;\n }\n\n // If transfer is `source-pending`, we first confirm source-chain finality before\n // querying Markr's cross-chain status endpoint.\n // Once source finality is confirmed, we mark the transfer as source-completed and\n // defer Markr polling to subsequent iterations.\n if (transfer.status === 'source-pending') {\n if (isEvmNamespace(transfer.sourceChain.chainId)) {\n const sourceTxHash = transfer.source.txHash;\n\n if (!isHash(sourceTxHash)) {\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\n return failedTransfer;\n }\n\n const client = getEvmClientForChain({ chain: transfer.sourceChain });\n\n try {\n const receiptResult = await awaitOrAbort(\n client.waitForTransactionReceipt({\n hash: sourceTxHash,\n }),\n signal,\n );\n\n if (receiptResult.status === 'aborted') {\n return transfer;\n }\n\n const receipt = receiptResult.value;\n\n if (receipt.status === 'reverted') {\n const failedTransfer: FailedTransfer = {\n ...transfer,\n errorCode: ErrorCode.TRANSACTION_REVERTED,\n errorReason: 'Source transaction was reverted',\n failedAtMs: Date.now(),\n status: 'failed',\n };\n return failedTransfer;\n }\n\n const finalityResult = await _waitForEvmSourceFinalization(\n client,\n transfer.sourceChain.chainId,\n transfer.sourceChain.chainName,\n receipt.blockNumber,\n signal,\n );\n if (finalityResult.status === 'aborted') {\n return transfer;\n }\n\n return _toSourceCompletedTransfer(transfer);\n } catch {\n return transfer;\n }\n }\n\n if (isSolanaNamespace(transfer.sourceChain.chainId)) {\n const sourceTxHash = transfer.source.txHash;\n\n try {\n assertIsSignature(sourceTxHash);\n } catch {\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 return failedTransfer;\n }\n\n const finalityResult = await _waitForSolanaSourceFinalization(transfer.sourceChain, sourceTxHash, signal);\n\n if (finalityResult.status === 'aborted') {\n return transfer;\n }\n\n if (finalityResult.status === 'reverted') {\n const failedTransfer: FailedTransfer = {\n ...transfer,\n errorCode: ErrorCode.TRANSACTION_REVERTED,\n errorReason: 'Source transaction was reverted',\n failedAtMs: Date.now(),\n status: 'failed',\n };\n return failedTransfer;\n }\n\n if (finalityResult.status === 'unknown') {\n return transfer;\n }\n\n return _toSourceCompletedTransfer(transfer);\n }\n }\n\n try {\n const statusResponse = await markrGetCrossChainStatus(apiOptions, transfer.source.txHash, { signal });\n const transferWithMarkrMetadata = _withMarkrTrackingMetadata(transfer, statusResponse);\n\n switch (statusResponse.status) {\n case 'failed': {\n const failedTransfer: FailedTransfer = {\n ...transferWithMarkrMetadata,\n errorCode: ErrorCode.TRANSACTION_REVERTED,\n errorReason: 'Transaction execution failed.',\n failedAtMs: _getLastStatusActivityTime(statusResponse),\n status: 'failed',\n };\n\n return failedTransfer;\n }\n\n case 'pending': {\n return _isMarkrSourceFinalized(statusResponse.sourceChain.finalized)\n ? _toSourceCompletedTransfer(transferWithMarkrMetadata)\n : transferWithMarkrMetadata;\n }\n\n case 'committed':\n case 'pending_execution': {\n return _toTargetPendingTransfer(transferWithMarkrMetadata, statusResponse);\n }\n\n case 'completed': {\n return _toCompletedTransfer(transferWithMarkrMetadata, statusResponse);\n }\n\n case 'refunded': {\n return _toRefundedTransfer(transferWithMarkrMetadata, statusResponse);\n }\n\n case 'unknown':\n default: {\n return _deriveTransferFromUnknownStatus(transferWithMarkrMetadata, statusResponse);\n }\n }\n } catch (error) {\n // TODO: Clean this console.error up before v1 release.\n // This is just here for now to try to track down tracking issues.\n console.error('[Fusion SDK] Error fetching cross-chain status from Markr API', {\n error,\n now: Date.now(),\n });\n\n return transfer;\n }\n}\n\nasync function _waitForEvmSourceFinalization(\n client: ReturnType<typeof getEvmClientForChain>,\n chainId: Caip2ChainId,\n chainName: string,\n txBlockNumber: bigint,\n signal: AbortSignal,\n): Promise<{ status: 'aborted' } | { status: 'ok' }> {\n const pollingIntervalMs = _getCrossChainPollingIntervalMs(chainId, chainName);\n\n while (!signal.aborted) {\n const finalizedBlockResult = await awaitOrAbort(client.getBlock({ blockTag: 'finalized' }), signal);\n\n if (finalizedBlockResult.status === 'aborted') {\n return { status: 'aborted' };\n }\n\n if (finalizedBlockResult.value.number >= txBlockNumber) {\n return { status: 'ok' };\n }\n\n await waitForTimeoutOrAbort({\n timeoutMs: pollingIntervalMs,\n signal,\n });\n }\n\n return { status: 'aborted' };\n}\n\nfunction _getCrossChainPollingIntervalMs(chainId: Caip2ChainId, chainName: string): number {\n const knownFinalityMs = _getKnownFinalityMs(chainId, chainName);\n const finalityTier = _toFinalityTier(knownFinalityMs);\n return CROSS_CHAIN_POLLING_INTERVAL_MS[finalityTier];\n}\n\nfunction _getPollingIntervalMsForTransfer(transfer: Transfer): number {\n if (transfer.status === 'source-pending') {\n return _getCrossChainPollingIntervalMs(transfer.sourceChain.chainId, transfer.sourceChain.chainName);\n }\n\n return _getCrossChainPollingIntervalMs(transfer.targetChain.chainId, transfer.targetChain.chainName);\n}\n\nfunction _getKnownFinalityMs(chainId: Caip2ChainId, chainName: string): number | undefined {\n const chainIdFinalityMs = FINALITY_MS_BY_CHAIN_ID[chainId];\n if (chainIdFinalityMs !== undefined) {\n return chainIdFinalityMs;\n }\n\n const normalizedName = _normalizeChainName(chainName);\n const matchingAlias = FINALITY_MS_BY_CHAIN_NAME_ALIAS.find(({ aliases }) =>\n aliases.some((alias) => normalizedName.includes(alias)),\n );\n\n return matchingAlias?.finalityMs;\n}\n\nfunction _normalizeChainName(chainName: string): string {\n return chainName.toLowerCase().replace(/[^a-z0-9]/g, '');\n}\n\nfunction _toFinalityTier(knownFinalityMs: number | undefined): FinalityTier {\n if (knownFinalityMs === undefined) {\n return 'medium';\n }\n\n if (knownFinalityMs <= FINALITY_TIER_MAX_FINALITY_MS.fast) {\n return 'fast';\n }\n\n if (knownFinalityMs <= FINALITY_TIER_MAX_FINALITY_MS.medium) {\n return 'medium';\n }\n\n if (knownFinalityMs <= FINALITY_TIER_MAX_FINALITY_MS.slow) {\n return 'slow';\n }\n\n return 'verySlow';\n}\n\nasync function _waitForSolanaSourceFinalization(\n chain: SourcePendingTransfer['sourceChain'],\n txHash: Signature,\n signal: AbortSignal,\n): Promise<{ status: 'aborted' } | { status: 'ok' } | { status: 'reverted' } | { status: 'unknown' }> {\n const rpc = getSolanaRpcForChain({ chain });\n const startTime = Date.now();\n\n while (!signal.aborted) {\n if (Date.now() - startTime > SOLANA_TX_TIMEOUT_MS) {\n return { status: 'unknown' };\n }\n\n try {\n const { value } = await rpc.getSignatureStatuses([txHash], { searchTransactionHistory: true }).send();\n const txStatus = value[0];\n\n if (!txStatus) {\n await waitForTimeoutOrAbort({ timeoutMs: SOLANA_POLLING_INTERVAL_MS, signal });\n continue;\n }\n\n if (txStatus.err !== null) {\n return { status: 'reverted' };\n }\n\n if (txStatus.confirmationStatus === 'finalized') {\n return { status: 'ok' };\n }\n\n await waitForTimeoutOrAbort({ timeoutMs: SOLANA_POLLING_INTERVAL_MS, signal });\n } catch {\n return { status: 'unknown' };\n }\n }\n\n return { status: 'aborted' };\n}\n\nfunction _isValidSourceTxHash(txHash: string, sourceChainId: Caip2ChainId): boolean {\n if (isEvmNamespace(sourceChainId)) {\n return isHash(txHash);\n }\n\n if (isSolanaNamespace(sourceChainId)) {\n try {\n assertIsSignature(txHash);\n return true;\n } catch {\n return false;\n }\n }\n\n return false;\n}\n\nfunction _isMarkrSourceFinalized(finalized: CrossChainStatusResponse['sourceChain']['finalized']): boolean {\n return finalized === true || typeof finalized === 'string';\n}\n\nfunction _toSourceCompletedTransfer(transfer: InFlightTransfer): SourceCompletedTransfer {\n return {\n ...transfer,\n source: {\n ...transfer.source,\n confirmationCount: 2,\n requiredConfirmationCount: 2,\n },\n status: 'source-completed',\n };\n}\n\nfunction _withMarkrTrackingMetadata(\n transfer: InFlightTransfer,\n statusResponse: CrossChainStatusResponse,\n): InFlightTransfer {\n const metadata: Record<string, unknown> = { ...(transfer.metadata ?? {}) };\n\n if (statusResponse.destinationChain.bridgeHash) {\n metadata.bridgeHash = statusResponse.destinationChain.bridgeHash;\n }\n\n if (statusResponse.debug) {\n metadata.debug = statusResponse.debug;\n }\n\n if (Object.keys(metadata).length === 0) {\n return transfer;\n }\n\n return {\n ...transfer,\n metadata,\n };\n}\n\nfunction _toTargetPendingTransfer(\n transfer: InFlightTransfer,\n statusResponse: CrossChainStatusResponse,\n): TargetPendingTransfer {\n const { timestamp, transactionHash } = statusResponse.destinationChain;\n\n return {\n ...transfer,\n source: {\n ...transfer.source,\n confirmationCount: 2,\n requiredConfirmationCount: 2,\n },\n status: 'target-pending',\n target: {\n confirmationCount: transactionHash ? 1 : 0,\n requiredConfirmationCount: 2,\n startedAtMs: timestamp ? new Date(timestamp).getTime() : Date.now(),\n txHash: transactionHash ?? undefined,\n },\n };\n}\n\nfunction _toCompletedTransfer(transfer: InFlightTransfer, statusResponse: CrossChainStatusResponse): CompletedTransfer {\n const { timestamp, transactionHash } = statusResponse.destinationChain;\n\n return {\n ...transfer,\n completedAtMs: _getLastStatusActivityTime(statusResponse),\n status: 'completed',\n source: {\n ...transfer.source,\n confirmationCount: 2,\n requiredConfirmationCount: 2,\n },\n target: transactionHash\n ? {\n txHash: transactionHash,\n confirmationCount: 2,\n requiredConfirmationCount: 2,\n startedAtMs: timestamp ? new Date(timestamp).getTime() : Date.now(),\n }\n : null,\n };\n}\n\nfunction _toRefundedTransfer(transfer: InFlightTransfer, statusResponse: CrossChainStatusResponse): Transfer {\n const { transactionHash } = statusResponse.destinationChain;\n // This _should_ exist.\n // If it doesn't, thats a problem with Markr's API and they should resolve it.\n // We were \"guaranteed\" by them that in a \"refunded\" status, there would be exactly 1\n // transferred token in the response, which represents the refund.\n const refundedToken = statusResponse.transferredTokens[0];\n\n const refundAsset = refundedToken ? _getRefundAsset(transfer.targetChain.chainId, refundedToken.token) ?? null : null;\n const existingTarget = 'target' in transfer ? transfer.target : null;\n\n return {\n ...transfer,\n refund: {\n amount: refundedToken?.amount ?? 0n,\n asset: refundAsset,\n chainId: transfer.targetChain.chainId,\n txHash: transactionHash ?? null,\n timestampMs: _getLastStatusActivityTime(statusResponse),\n },\n source: {\n ...transfer.source,\n confirmationCount: 2,\n requiredConfirmationCount: 2,\n },\n status: 'refunded',\n target: existingTarget\n ? {\n ...existingTarget,\n txHash: undefined,\n }\n : null,\n };\n}\n\nfunction _getRefundAsset(chainId: Caip2ChainId, tokenAddress: string): Asset | undefined {\n if (isSolanaNamespace(chainId)) {\n if (!isSolanaAddress(tokenAddress)) {\n return undefined;\n }\n\n return {\n address: tokenAddress,\n decimals: 6,\n name: 'USD Coin',\n symbol: 'USDC',\n type: TokenType.SPL,\n };\n }\n\n if (isEvmNamespace(chainId)) {\n if (!isEvmAddress(tokenAddress)) {\n return undefined;\n }\n\n return {\n address: tokenAddress,\n decimals: 6,\n name: 'USD Coin',\n symbol: 'USDC',\n type: TokenType.ERC20,\n };\n }\n\n return undefined;\n}\n\nfunction _deriveTransferFromUnknownStatus(\n transfer: InFlightTransfer,\n statusResponse: CrossChainStatusResponse,\n): Transfer {\n if (statusResponse.progress.executed === true) {\n return _toCompletedTransfer(transfer, statusResponse);\n }\n\n if (statusResponse.progress.committed === true) {\n return _toTargetPendingTransfer(transfer, statusResponse);\n }\n\n if (_isMarkrSourceFinalized(statusResponse.sourceChain.finalized)) {\n return _toSourceCompletedTransfer(transfer);\n }\n\n return {\n ...transfer,\n source: {\n ...transfer.source,\n confirmationCount: 0,\n requiredConfirmationCount: 2,\n },\n status: 'source-pending',\n };\n}\n\nfunction _getLastStatusActivityTime(response: CrossChainStatusResponse): number {\n if (response.destinationChain.finalized) {\n return new Date(response.destinationChain.finalized).getTime();\n }\n\n if (response.destinationChain.timestamp) {\n return new Date(response.destinationChain.timestamp).getTime();\n }\n\n if (response.sourceChain.finalized) {\n if (typeof response.sourceChain.finalized === 'boolean' && response.sourceChain.finalized === true) {\n // Handle case where finalized is returned as boolean `true` instead of a timestamp.\n return new Date(response.sourceChain.timestamp).getTime();\n }\n return new Date(response.sourceChain.finalized).getTime();\n }\n\n return new Date(response.sourceChain.timestamp).getTime();\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/caip.cjs`),r=require(`../../../_utils/chain.cjs`),i=require(`../../_utils.cjs`),a=require(`../_api.cjs`),o=require(`../../../utils/sol-address.cjs`),s=require(`../_utils.cjs`),c=require(`../_type-guards.cjs`),l=require(`../_solana-utils.cjs`),u=require(`./estimate-native-fee.cjs`),d=require(`../constants.cjs`);let f=require(`viem`);function p({apiOptions:n,appId:i,environment:a,evmSigner:o,solanaSigner:s}){return async({quote:c,gasSettings:l,fallbackToDefaultOnBatchFailure:u,onStepChange:d})=>{if(c.serviceType!==e.ServiceType.MARKR)throw new t.SdkError(t.ErrorReason.INCORRECT_PROVIDER_PROVIDED,t.ErrorCode.INVALID_PARAMS);let f=Math.floor(Date.now()/1e3);if(c.expiresAt<=f)throw new t.SdkError(t.ErrorReason.QUOTE_EXPIRED,t.ErrorCode.INVALID_PARAMS);let p=c.sourceChain.chainId;if(r.isSolanaNamespace(p))return h({apiOptions:n,appId:i,environment:a,solanaSigner:s,quote:c,onStepChange:d});if(r.isEvmNamespace(p))return m({apiOptions:n,appId:i,environment:a,evmSigner:o,quote:c,gasSettings:l,fallbackToDefaultOnBatchFailure:u,onStepChange:d});throw new t.SdkError(t.ErrorReason.CHAIN_NOT_SUPPORTED,t.ErrorCode.INVALID_PARAMS,{details:`Unsupported source chain namespace: ${p}`})}}async function m({apiOptions:r,appId:o,environment:l,evmSigner:d,quote:p,gasSettings:m,fallbackToDefaultOnBatchFailure:h,onStepChange:_}){let v=p.fromAddress;if(!(0,f.isAddress)(v))throw new t.SdkError(t.ErrorReason.INVALID_PARAMS,t.ErrorCode.INVALID_PARAMS,{details:`fromAddress is not a valid EVM address.`});let y=s.calculateMarkrMinimumAmountOut({amountOut:p.amountOut,assetOut:p.assetOut,slippageBps:p.slippageBps}),b=i.getEvmClientForChain({chain:p.sourceChain}),x=s.assetToAddressString(p.assetIn,p.sourceChain.chainId),S=s.assetToAddressString(p.assetOut,p.targetChain.chainId);if(!(0,f.isAddress)(x))throw new t.SdkError(t.ErrorReason.INVALID_PARAMS,t.ErrorCode.INVALID_PARAMS,{details:`assetIn address is not a valid EVM address.`});let C=x,w=s.isTokenAddressNative(C),T=p.sourceChain.chainId.toLowerCase()!==p.targetChain.chainId.toLowerCase(),E=p.amountIn+s.getAdditiveSourceAssetFeeAmount(p),{address:D}=await a.markrGetSpenderAddress(r,{chainId:n.caip2ToEip155ChainId(p.sourceChain.chainId),crossChainSwap:T,quoteId:p.id});if(!w&&!D)throw new t.SdkError(t.ErrorReason.CHAIN_NOT_SUPPORTED,t.ErrorCode.INVALID_PARAMS,{details:`Missing Markr spender address for source chain ${p.sourceChain.chainId}.`});let O=!1,k;if(!w&&D&&await b.readContract({address:C,abi:f.erc20Abi,functionName:`allowance`,args:[v,D]})<E){O=!0;let e=(0,f.encodeFunctionData)({abi:f.erc20Abi,functionName:`approve`,args:[D,E]}),r;try{r=i.applyFeeUnitsBpsMargin(await b.estimateGas({account:v,to:C,data:e,value:0n}),m?.estimateGasMarginBps)}catch(e){throw new t.SdkError(`Error during gas estimation`,t.ErrorCode.VIEM_ERROR,{cause:e,details:`Failed to estimate gas for ERC20 approval transaction.`})}k={chainId:n.caip2ToEip155HexChainId(p.sourceChain.chainId),data:e,from:v,gas:r,to:C,value:0n,...m?.maxFeePerGas===void 0?null:{maxFeePerGas:m.maxFeePerGas,maxPriorityFeePerGas:m.maxPriorityFeePerGas}}}let A=g({approvalRequest:k,requiresApprovalSignature:O,signBatch:d.signBatch,sourceChainId:p.sourceChain.chainId,targetChainId:p.targetChain.chainId}),j=await a.markrSwap(r,{amountIn:p.amountIn.toString(),appId:o,minAmountOut:y.toString(),tokenIn:x,tokenOut:S,uuid:p.id});if(!c.isEvmSwapResponse(j))throw new t.SdkError(t.ErrorReason.CHAIN_NOT_SUPPORTED,t.ErrorCode.INVALID_PARAMS,{details:`Received non-EVM swap response from Markr, but only EVM swaps are supported for this source chain.`});let M=(t,n=Date.now())=>{let r=p.sourceChain.chainId===p.targetChain.chainId;return{amountIn:p.amountIn,amountOut:p.amountOut,environment:l,fees:p.fees,fromAddress:p.fromAddress,id:p.id,partnerFeeBps:p.partnerFeeBps,sourceAsset:p.assetIn,sourceChain:p.sourceChain,status:`source-pending`,targetAsset:p.assetOut,targetChain:p.targetChain,toAddress:p.toAddress,type:e.ServiceType.MARKR,source:{confirmationCount:0,requiredConfirmationCount:r?1:2,startedAtMs:n,txHash:t}}};if(A&&k){let r={currentSignature:1,currentSignatureReason:e.TransferSignatureReason.TokensTransfer,quote:p,requiredSignatures:1},i=d.signBatch;if(!i)throw new t.SdkError(`One-click batch signer is not available.`,t.ErrorCode.SIGNING_FAILED);let a={chainId:n.caip2ToEip155HexChainId(p.sourceChain.chainId),data:j.data,from:v,gas:void 0,to:j.to,value:j.value,...m?.maxFeePerGas===void 0?null:{maxFeePerGas:m.maxFeePerGas,maxPriorityFeePerGas:m.maxPriorityFeePerGas}};_?.(r);try{let e=(await i([k,a],async e=>b.sendRawTransaction({serializedTransaction:e}),r)).at(-1);if(!e)throw new t.SdkError(`One-click batch signing returned no transaction hashes.`,t.ErrorCode.SIGNING_FAILED);return M(e)}catch(e){if(!h)throw e}}if(O&&k){let n={currentSignature:1,currentSignatureReason:e.TransferSignatureReason.AllowanceApproval,quote:p,requiredSignatures:2};_?.(n);let r=await d.sign(k,async e=>b.sendRawTransaction({serializedTransaction:e}),n);if((await b.waitForTransactionReceipt({hash:r})).status===`reverted`)return i.makeFailedTransferFromQuote(p,{environment:l,errorCode:t.ErrorCode.TRANSACTION_REVERTED,errorReason:`ERC20 approval transaction was reverted`})}let N=await u._estimateGasFromSwapResponse({crossChain:T,fromAddress:v,feeUnitsMarginBps:m?.estimateGasMarginBps,sourceClient:b,swap:j}),P={chainId:n.caip2ToEip155HexChainId(p.sourceChain.chainId),data:j.data,from:v,gas:N,to:j.to,value:j.value,...m?.maxFeePerGas===void 0?null:{maxFeePerGas:m.maxFeePerGas,maxPriorityFeePerGas:m.maxPriorityFeePerGas}},F={currentSignature:O?2:1,currentSignatureReason:e.TransferSignatureReason.TokensTransfer,quote:p,requiredSignatures:O?2:1};_?.(F);let I=Date.now();return M(await d.sign(P,async e=>b.sendRawTransaction({serializedTransaction:e}),F),I)}async function h({apiOptions:n,appId:r,environment:u,solanaSigner:f,quote:p,onStepChange:m}){if(!f)throw new t.SdkError(t.ErrorReason.INVALID_PARAMS,t.ErrorCode.INVALID_PARAMS,{details:`solanaSigner is required for Solana transfers but was not provided.`});if(!o.isSolAddress(p.fromAddress))throw new t.SdkError(t.ErrorReason.INVALID_PARAMS,t.ErrorCode.INVALID_PARAMS,{details:`fromAddress is not a valid Solana address.`});let h=s.calculateMarkrMinimumAmountOut({amountOut:p.amountOut,assetOut:p.assetOut,slippageBps:p.slippageBps}),g=s.assetToAddressString(p.assetIn,p.sourceChain.chainId),_=s.assetToAddressString(p.assetOut,p.targetChain.chainId),v=await a.markrSwap(n,{amountIn:p.amountIn.toString(),appId:r,minAmountOut:h.toString(),tokenIn:g,tokenOut:_,userPublicKey:p.fromAddress,uuid:p.id});if(!c.isSolanaSwapResponse(v))throw new t.SdkError(t.ErrorReason.CHAIN_NOT_SUPPORTED,t.ErrorCode.INVALID_PARAMS,{details:`Received non-SVM swap response from Markr, but only SVM swaps are supported for this source chain.`});console.debug(`[Fusion SDK] Original swap transaction (base64):`,v.swapTransaction);let y=await l.refreshSolanaSwapTransactionBlockhash(v.swapTransaction,i.getSolanaRpcForChain({chain:p.sourceChain}));console.debug(`[Fusion SDK] Refreshed swap transaction with new blockhash (base64):`,y);let b={currentSignature:1,currentSignatureReason:e.TransferSignatureReason.TokensTransfer,quote:p,requiredSignatures:1};m?.(b);let x=Date.now(),S=await f.signAndSend({account:p.fromAddress,serializedTx:y},b),C=p.sourceChain.chainId.toLowerCase()!==p.targetChain.chainId.toLowerCase();return{amountIn:p.amountIn,amountOut:p.amountOut,environment:u,fees:p.fees,fromAddress:p.fromAddress,id:p.id,partnerFeeBps:p.partnerFeeBps,sourceAsset:p.assetIn,sourceChain:p.sourceChain,status:`source-pending`,targetAsset:p.assetOut,targetChain:p.targetChain,toAddress:p.toAddress,type:e.ServiceType.MARKR,source:{confirmationCount:0,requiredConfirmationCount:C?2:d.SOLANA_REQUIRED_CONFIRMATIONS,startedAtMs:x,txHash:S}}}function g({approvalRequest:e,requiresApprovalSignature:t,signBatch:n,sourceChainId:i,targetChainId:a}){return r.isEvmNamespace(i)&&r.isEvmNamespace(a)&&i===a&&t&&e!==void 0&&typeof n==`function`}exports.transferAssetFactory=p;
2
+ //# sourceMappingURL=transfer-asset.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transfer-asset.cjs","names":["ServiceType","SdkError","ErrorReason","ErrorCode","isSolanaNamespace","isEvmNamespace","calculateMarkrMinimumAmountOut","getEvmClientForChain","assetToAddressString","isTokenAddressNative","getAdditiveSourceAssetFeeAmount","markrGetSpenderAddress","caip2ToEip155ChainId","erc20Abi","applyFeeUnitsBpsMargin","caip2ToEip155HexChainId","markrSwap","isEvmSwapResponse","TransferSignatureReason","makeFailedTransferFromQuote","_estimateGasFromSwapResponse","isSolAddress","isSolanaSwapResponse","refreshSolanaSwapTransactionBlockhash","getSolanaRpcForChain","SOLANA_REQUIRED_CONFIRMATIONS"],"sources":["../../../../src/transfer-service/markr/_handlers/transfer-asset.ts"],"sourcesContent":["import { encodeFunctionData, erc20Abi, isAddress } from 'viem';\nimport { isEvmNamespace, isSolanaNamespace } from '../../../_utils/chain';\nimport { ServiceType, TransferSignatureReason } from '../../../constants';\nimport type { Environment } from '../../../constants';\nimport { ErrorCode, ErrorReason, SdkError } from '../../../errors';\nimport type { TransferService } from '../../../types/service';\nimport type { EvmSigner, EvmTransactionRequest, SolanaSigner } from '../../../types/signer';\nimport type { Transfer, TransferStepDetails } from '../../../types/transfer';\nimport { caip2ToEip155ChainId, caip2ToEip155HexChainId } from '../../../utils/caip';\nimport { isSolAddress } from '../../../utils/sol-address';\nimport {\n applyFeeUnitsBpsMargin,\n getEvmClientForChain,\n getSolanaRpcForChain,\n makeFailedTransferFromQuote,\n} from '../../_utils';\nimport { markrGetSpenderAddress, markrSwap, type ApiOptions } from '../_api';\nimport {\n assetToAddressString,\n calculateMarkrMinimumAmountOut,\n getAdditiveSourceAssetFeeAmount,\n isTokenAddressNative,\n} from '../_utils';\nimport { isEvmSwapResponse, isSolanaSwapResponse } from '../_type-guards';\nimport { SOLANA_REQUIRED_CONFIRMATIONS } from '../constants';\nimport { _estimateGasFromSwapResponse } from './estimate-native-fee';\nimport type { Caip2ChainId } from '../../../types/caip';\nimport { refreshSolanaSwapTransactionBlockhash } from '../_solana-utils';\n\nexport interface TransferAssetFactoryConfig {\n apiOptions: ApiOptions;\n appId: string;\n environment: Environment;\n evmSigner: EvmSigner;\n solanaSigner?: SolanaSigner;\n}\n\nexport function transferAssetFactory({\n apiOptions,\n appId,\n environment,\n evmSigner,\n solanaSigner,\n}: TransferAssetFactoryConfig): TransferService['transferAsset'] {\n return async ({ quote, gasSettings, fallbackToDefaultOnBatchFailure, onStepChange }) => {\n if (quote.serviceType !== ServiceType.MARKR) {\n throw new SdkError(ErrorReason.INCORRECT_PROVIDER_PROVIDED, ErrorCode.INVALID_PARAMS);\n }\n\n const now = Math.floor(Date.now() / 1_000);\n\n if (quote.expiresAt <= now) {\n throw new SdkError(ErrorReason.QUOTE_EXPIRED, ErrorCode.INVALID_PARAMS);\n }\n\n const sourceChainId = quote.sourceChain.chainId;\n\n if (isSolanaNamespace(sourceChainId)) {\n return _executeSvmTransfer({ apiOptions, appId, environment, solanaSigner, quote, onStepChange });\n }\n\n if (isEvmNamespace(sourceChainId)) {\n return _executeEvmTransfer({\n apiOptions,\n appId,\n environment,\n evmSigner,\n quote,\n gasSettings,\n fallbackToDefaultOnBatchFailure,\n onStepChange,\n });\n }\n\n throw new SdkError(ErrorReason.CHAIN_NOT_SUPPORTED, ErrorCode.INVALID_PARAMS, {\n details: `Unsupported source chain namespace: ${sourceChainId}`,\n });\n };\n}\n\n// ---------------------------------------------------------------------------\n// EVM transfer path\n// ---------------------------------------------------------------------------\n\ninterface EvmTransferParams {\n apiOptions: ApiOptions;\n appId: string;\n environment: Environment;\n evmSigner: EvmSigner;\n quote: Parameters<TransferService['transferAsset']>[0]['quote'];\n gasSettings?: Parameters<TransferService['transferAsset']>[0]['gasSettings'];\n fallbackToDefaultOnBatchFailure?: Parameters<TransferService['transferAsset']>[0]['fallbackToDefaultOnBatchFailure'];\n onStepChange?: Parameters<TransferService['transferAsset']>[0]['onStepChange'];\n}\n\nasync function _executeEvmTransfer({\n apiOptions,\n appId,\n environment,\n evmSigner,\n quote,\n gasSettings,\n fallbackToDefaultOnBatchFailure,\n onStepChange,\n}: EvmTransferParams): Promise<Transfer> {\n const fromAddress = quote.fromAddress;\n\n if (!isAddress(fromAddress)) {\n throw new SdkError(ErrorReason.INVALID_PARAMS, ErrorCode.INVALID_PARAMS, {\n details: 'fromAddress is not a valid EVM address.',\n });\n }\n\n const minAmountOut = calculateMarkrMinimumAmountOut({\n amountOut: quote.amountOut,\n assetOut: quote.assetOut,\n slippageBps: quote.slippageBps,\n });\n\n const sourceClient = getEvmClientForChain({ chain: quote.sourceChain });\n\n const tokenInAddressString = assetToAddressString(quote.assetIn, quote.sourceChain.chainId);\n const tokenOutAddressString = assetToAddressString(quote.assetOut, quote.targetChain.chainId);\n\n if (!isAddress(tokenInAddressString)) {\n throw new SdkError(ErrorReason.INVALID_PARAMS, ErrorCode.INVALID_PARAMS, {\n details: 'assetIn address is not a valid EVM address.',\n });\n }\n\n const tokenInAddress = tokenInAddressString;\n const isTokenInNative = isTokenAddressNative(tokenInAddress);\n const isCrossChainSwap = quote.sourceChain.chainId.toLowerCase() !== quote.targetChain.chainId.toLowerCase();\n const allowanceAmount = quote.amountIn + getAdditiveSourceAssetFeeAmount(quote);\n\n const { address: spenderAddress } = await markrGetSpenderAddress(apiOptions, {\n chainId: caip2ToEip155ChainId(quote.sourceChain.chainId),\n crossChainSwap: isCrossChainSwap,\n quoteId: quote.id,\n });\n\n if (!isTokenInNative && !spenderAddress) {\n throw new SdkError(ErrorReason.CHAIN_NOT_SUPPORTED, ErrorCode.INVALID_PARAMS, {\n details: `Missing Markr spender address for source chain ${quote.sourceChain.chainId}.`,\n });\n }\n\n let requiresApprovalSignature = false;\n let approvalRequest: EvmTransactionRequest | undefined;\n\n if (!isTokenInNative && spenderAddress) {\n const allowance = await sourceClient.readContract({\n address: tokenInAddress,\n abi: erc20Abi,\n functionName: 'allowance',\n args: [fromAddress, spenderAddress],\n });\n\n if (allowance < allowanceAmount) {\n requiresApprovalSignature = true;\n\n const approvalData = encodeFunctionData({\n abi: erc20Abi,\n functionName: 'approve',\n args: [spenderAddress, allowanceAmount],\n });\n\n let approvalGasWithMargin: bigint | undefined;\n\n try {\n const approvalGasEstimate = await sourceClient.estimateGas({\n account: fromAddress,\n to: tokenInAddress,\n data: approvalData,\n value: 0n,\n });\n\n approvalGasWithMargin = applyFeeUnitsBpsMargin(approvalGasEstimate, gasSettings?.estimateGasMarginBps);\n } catch (err) {\n throw new SdkError('Error during gas estimation', ErrorCode.VIEM_ERROR, {\n cause: err,\n details: 'Failed to estimate gas for ERC20 approval transaction.',\n });\n }\n\n approvalRequest = {\n chainId: caip2ToEip155HexChainId(quote.sourceChain.chainId),\n data: approvalData,\n from: fromAddress,\n gas: approvalGasWithMargin,\n to: tokenInAddress,\n value: 0n,\n ...(gasSettings?.maxFeePerGas !== undefined\n ? {\n maxFeePerGas: gasSettings.maxFeePerGas,\n maxPriorityFeePerGas: gasSettings.maxPriorityFeePerGas,\n }\n : null),\n };\n }\n }\n\n const maybeOneClickBatch = isOneClickBatchEligible({\n approvalRequest,\n requiresApprovalSignature,\n signBatch: evmSigner.signBatch,\n sourceChainId: quote.sourceChain.chainId,\n targetChainId: quote.targetChain.chainId,\n });\n\n const swap = await markrSwap(apiOptions, {\n amountIn: quote.amountIn.toString(),\n appId,\n minAmountOut: minAmountOut.toString(),\n tokenIn: tokenInAddressString,\n tokenOut: tokenOutAddressString,\n uuid: quote.id,\n });\n\n if (!isEvmSwapResponse(swap)) {\n throw new SdkError(ErrorReason.CHAIN_NOT_SUPPORTED, ErrorCode.INVALID_PARAMS, {\n details: 'Received non-EVM swap response from Markr, but only EVM swaps are supported for this source chain.',\n });\n }\n\n const makePendingTransfer = (txHash: `0x${string}`, startedAtMs: number = Date.now()): Transfer => {\n const isSameChainTransfer = quote.sourceChain.chainId === quote.targetChain.chainId;\n\n return {\n amountIn: quote.amountIn,\n amountOut: quote.amountOut,\n environment,\n fees: quote.fees,\n fromAddress: quote.fromAddress,\n id: quote.id,\n partnerFeeBps: quote.partnerFeeBps,\n sourceAsset: quote.assetIn,\n sourceChain: quote.sourceChain,\n status: 'source-pending',\n targetAsset: quote.assetOut,\n targetChain: quote.targetChain,\n toAddress: quote.toAddress,\n type: ServiceType.MARKR,\n source: {\n confirmationCount: 0,\n requiredConfirmationCount: isSameChainTransfer ? 1 : 2,\n startedAtMs,\n txHash,\n },\n };\n };\n\n if (maybeOneClickBatch && approvalRequest) {\n const batchStep: TransferStepDetails = {\n currentSignature: 1,\n currentSignatureReason: TransferSignatureReason.TokensTransfer,\n quote,\n requiredSignatures: 1,\n };\n\n const signBatch = evmSigner.signBatch;\n\n if (!signBatch) {\n throw new SdkError('One-click batch signer is not available.', ErrorCode.SIGNING_FAILED);\n }\n\n const swapRequest: EvmTransactionRequest = {\n chainId: caip2ToEip155HexChainId(quote.sourceChain.chainId),\n data: swap.data,\n from: fromAddress,\n // Gas is purposely left undefined here.\n // We can't estimate the gas because we aren't executing the\n // approval tx. It's up to the wallet to correctly handle gas estimation.\n gas: undefined,\n to: swap.to,\n value: swap.value,\n ...(gasSettings?.maxFeePerGas !== undefined\n ? {\n maxFeePerGas: gasSettings.maxFeePerGas,\n maxPriorityFeePerGas: gasSettings.maxPriorityFeePerGas,\n }\n : null),\n };\n\n onStepChange?.(batchStep);\n\n try {\n const txHashes = await signBatch(\n [approvalRequest, swapRequest],\n async (signedTxHash) => sourceClient.sendRawTransaction({ serializedTransaction: signedTxHash }),\n batchStep,\n );\n\n const swapTxHash = txHashes.at(-1);\n\n if (!swapTxHash) {\n throw new SdkError('One-click batch signing returned no transaction hashes.', ErrorCode.SIGNING_FAILED);\n }\n\n return makePendingTransfer(swapTxHash);\n } catch (error) {\n if (!fallbackToDefaultOnBatchFailure) {\n throw error;\n }\n }\n }\n\n if (requiresApprovalSignature && approvalRequest) {\n const approvalStep: TransferStepDetails = {\n currentSignature: 1,\n currentSignatureReason: TransferSignatureReason.AllowanceApproval,\n quote,\n requiredSignatures: 2,\n };\n\n onStepChange?.(approvalStep);\n\n const approvalTxHash = await evmSigner.sign(\n approvalRequest,\n async (signedTxHash) => sourceClient.sendRawTransaction({ serializedTransaction: signedTxHash }),\n approvalStep,\n );\n\n const approvalReceipt = await sourceClient.waitForTransactionReceipt({ hash: approvalTxHash });\n\n if (approvalReceipt.status === 'reverted') {\n return makeFailedTransferFromQuote(quote, {\n environment,\n errorCode: ErrorCode.TRANSACTION_REVERTED,\n errorReason: 'ERC20 approval transaction was reverted',\n });\n }\n }\n\n const swapGasWithMargin = await _estimateGasFromSwapResponse({\n crossChain: isCrossChainSwap,\n fromAddress,\n feeUnitsMarginBps: gasSettings?.estimateGasMarginBps,\n sourceClient,\n swap,\n });\n\n const swapRequest: EvmTransactionRequest = {\n chainId: caip2ToEip155HexChainId(quote.sourceChain.chainId),\n data: swap.data,\n from: fromAddress,\n gas: swapGasWithMargin,\n to: swap.to,\n value: swap.value,\n ...(gasSettings?.maxFeePerGas !== undefined\n ? {\n maxFeePerGas: gasSettings.maxFeePerGas,\n maxPriorityFeePerGas: gasSettings.maxPriorityFeePerGas,\n }\n : null),\n };\n\n const step: TransferStepDetails = {\n currentSignature: requiresApprovalSignature ? 2 : 1,\n currentSignatureReason: TransferSignatureReason.TokensTransfer,\n quote,\n requiredSignatures: requiresApprovalSignature ? 2 : 1,\n };\n\n onStepChange?.(step);\n\n const startedAtMs = Date.now();\n\n const txHash = await evmSigner.sign(\n swapRequest,\n async (signedTxHash) => sourceClient.sendRawTransaction({ serializedTransaction: signedTxHash }),\n step,\n );\n\n return makePendingTransfer(txHash, startedAtMs);\n}\n\n// ---------------------------------------------------------------------------\n// SVM (Solana) transfer path\n// ---------------------------------------------------------------------------\n\ninterface SvmTransferParams {\n apiOptions: ApiOptions;\n appId: string;\n environment: Environment;\n solanaSigner?: SolanaSigner;\n quote: Parameters<TransferService['transferAsset']>[0]['quote'];\n onStepChange?: Parameters<TransferService['transferAsset']>[0]['onStepChange'];\n}\n\nasync function _executeSvmTransfer({\n apiOptions,\n appId,\n environment,\n solanaSigner,\n quote,\n onStepChange,\n}: SvmTransferParams): Promise<Transfer> {\n if (!solanaSigner) {\n throw new SdkError(ErrorReason.INVALID_PARAMS, ErrorCode.INVALID_PARAMS, {\n details: 'solanaSigner is required for Solana transfers but was not provided.',\n });\n }\n\n if (!isSolAddress(quote.fromAddress)) {\n throw new SdkError(ErrorReason.INVALID_PARAMS, ErrorCode.INVALID_PARAMS, {\n details: 'fromAddress is not a valid Solana address.',\n });\n }\n\n const minAmountOut = calculateMarkrMinimumAmountOut({\n amountOut: quote.amountOut,\n assetOut: quote.assetOut,\n slippageBps: quote.slippageBps,\n });\n\n const tokenInAddressString = assetToAddressString(quote.assetIn, quote.sourceChain.chainId);\n const tokenOutAddressString = assetToAddressString(quote.assetOut, quote.targetChain.chainId);\n\n const swap = await markrSwap(apiOptions, {\n amountIn: quote.amountIn.toString(),\n appId,\n minAmountOut: minAmountOut.toString(),\n tokenIn: tokenInAddressString,\n tokenOut: tokenOutAddressString,\n userPublicKey: quote.fromAddress,\n uuid: quote.id,\n });\n\n if (!isSolanaSwapResponse(swap)) {\n throw new SdkError(ErrorReason.CHAIN_NOT_SUPPORTED, ErrorCode.INVALID_PARAMS, {\n details: 'Received non-SVM swap response from Markr, but only SVM swaps are supported for this source chain.',\n });\n }\n\n // TODO: Cleanup\n console.debug('[Fusion SDK] Original swap transaction (base64):', swap.swapTransaction);\n\n const swapTransactionBase64 = await refreshSolanaSwapTransactionBlockhash(\n swap.swapTransaction,\n getSolanaRpcForChain({ chain: quote.sourceChain }),\n );\n\n // TODO: Cleanup\n console.debug('[Fusion SDK] Refreshed swap transaction with new blockhash (base64):', swapTransactionBase64);\n\n const step: TransferStepDetails = {\n currentSignature: 1,\n currentSignatureReason: TransferSignatureReason.TokensTransfer,\n quote,\n requiredSignatures: 1,\n };\n\n onStepChange?.(step);\n\n const startedAtMs = Date.now();\n\n const txHash = await solanaSigner.signAndSend(\n {\n account: quote.fromAddress,\n serializedTx: swapTransactionBase64,\n },\n step,\n );\n\n const isCrossChainSwap = quote.sourceChain.chainId.toLowerCase() !== quote.targetChain.chainId.toLowerCase();\n\n return {\n amountIn: quote.amountIn,\n amountOut: quote.amountOut,\n environment,\n fees: quote.fees,\n fromAddress: quote.fromAddress,\n id: quote.id,\n partnerFeeBps: quote.partnerFeeBps,\n sourceAsset: quote.assetIn,\n sourceChain: quote.sourceChain,\n status: 'source-pending',\n targetAsset: quote.assetOut,\n targetChain: quote.targetChain,\n toAddress: quote.toAddress,\n type: ServiceType.MARKR,\n source: {\n confirmationCount: 0,\n requiredConfirmationCount: isCrossChainSwap ? 2 : SOLANA_REQUIRED_CONFIRMATIONS,\n startedAtMs,\n txHash,\n },\n };\n}\n\n/**\n * Determines whether one-click swap eligibility criteria is met.\n *\n * Only same-chain EVM swaps are currently eligible.\n */\nfunction isOneClickBatchEligible({\n approvalRequest,\n requiresApprovalSignature,\n signBatch,\n sourceChainId,\n targetChainId,\n}: {\n approvalRequest?: EvmTransactionRequest;\n requiresApprovalSignature: boolean;\n signBatch?: EvmSigner['signBatch'];\n sourceChainId: Caip2ChainId;\n targetChainId: Caip2ChainId;\n}): boolean {\n return (\n isEvmNamespace(sourceChainId) &&\n isEvmNamespace(targetChainId) &&\n sourceChainId === targetChainId &&\n requiresApprovalSignature &&\n approvalRequest !== undefined &&\n typeof signBatch === 'function'\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{ServiceType as e,TransferSignatureReason as t}from"../../../constants.js";import{ErrorCode as n,ErrorReason as r,SdkError as i}from"../../../errors.js";import{caip2ToEip155ChainId as a,caip2ToEip155HexChainId as o}from"../../../utils/caip.js";import{isEvmNamespace as s,isSolanaNamespace as c}from"../../../_utils/chain.js";import{applyFeeUnitsBpsMargin as l,getEvmClientForChain as u,getSolanaRpcForChain as d,makeFailedTransferFromQuote as f}from"../../_utils.js";import{markrGetSpenderAddress as p,markrSwap as m}from"../_api.js";import{isSolAddress as h}from"../../../utils/sol-address.js";import{assetToAddressString as g,calculateMarkrMinimumAmountOut as _,getAdditiveSourceAssetFeeAmount as v,isTokenAddressNative as y}from"../_utils.js";import{isEvmSwapResponse as b,isSolanaSwapResponse as x}from"../_type-guards.js";import{refreshSolanaSwapTransactionBlockhash as S}from"../_solana-utils.js";import{_estimateGasFromSwapResponse as C}from"./estimate-native-fee.js";import{SOLANA_REQUIRED_CONFIRMATIONS as w}from"../constants.js";import{encodeFunctionData as T,erc20Abi as E,isAddress as D}from"viem";function O({apiOptions:t,appId:a,environment:o,evmSigner:l,solanaSigner:u}){return async({quote:d,gasSettings:f,fallbackToDefaultOnBatchFailure:p,onStepChange:m})=>{if(d.serviceType!==e.MARKR)throw new i(r.INCORRECT_PROVIDER_PROVIDED,n.INVALID_PARAMS);let h=Math.floor(Date.now()/1e3);if(d.expiresAt<=h)throw new i(r.QUOTE_EXPIRED,n.INVALID_PARAMS);let g=d.sourceChain.chainId;if(c(g))return A({apiOptions:t,appId:a,environment:o,solanaSigner:u,quote:d,onStepChange:m});if(s(g))return k({apiOptions:t,appId:a,environment:o,evmSigner:l,quote:d,gasSettings:f,fallbackToDefaultOnBatchFailure:p,onStepChange:m});throw new i(r.CHAIN_NOT_SUPPORTED,n.INVALID_PARAMS,{details:`Unsupported source chain namespace: ${g}`})}}async function k({apiOptions:s,appId:c,environment:d,evmSigner:h,quote:x,gasSettings:S,fallbackToDefaultOnBatchFailure:w,onStepChange:O}){let k=x.fromAddress;if(!D(k))throw new i(r.INVALID_PARAMS,n.INVALID_PARAMS,{details:`fromAddress is not a valid EVM address.`});let A=_({amountOut:x.amountOut,assetOut:x.assetOut,slippageBps:x.slippageBps}),M=u({chain:x.sourceChain}),N=g(x.assetIn,x.sourceChain.chainId),P=g(x.assetOut,x.targetChain.chainId);if(!D(N))throw new i(r.INVALID_PARAMS,n.INVALID_PARAMS,{details:`assetIn address is not a valid EVM address.`});let F=N,I=y(F),L=x.sourceChain.chainId.toLowerCase()!==x.targetChain.chainId.toLowerCase(),R=x.amountIn+v(x),{address:z}=await p(s,{chainId:a(x.sourceChain.chainId),crossChainSwap:L,quoteId:x.id});if(!I&&!z)throw new i(r.CHAIN_NOT_SUPPORTED,n.INVALID_PARAMS,{details:`Missing Markr spender address for source chain ${x.sourceChain.chainId}.`});let B=!1,V;if(!I&&z&&await M.readContract({address:F,abi:E,functionName:`allowance`,args:[k,z]})<R){B=!0;let e=T({abi:E,functionName:`approve`,args:[z,R]}),t;try{t=l(await M.estimateGas({account:k,to:F,data:e,value:0n}),S?.estimateGasMarginBps)}catch(e){throw new i(`Error during gas estimation`,n.VIEM_ERROR,{cause:e,details:`Failed to estimate gas for ERC20 approval transaction.`})}V={chainId:o(x.sourceChain.chainId),data:e,from:k,gas:t,to:F,value:0n,...S?.maxFeePerGas===void 0?null:{maxFeePerGas:S.maxFeePerGas,maxPriorityFeePerGas:S.maxPriorityFeePerGas}}}let H=j({approvalRequest:V,requiresApprovalSignature:B,signBatch:h.signBatch,sourceChainId:x.sourceChain.chainId,targetChainId:x.targetChain.chainId}),U=await m(s,{amountIn:x.amountIn.toString(),appId:c,minAmountOut:A.toString(),tokenIn:N,tokenOut:P,uuid:x.id});if(!b(U))throw new i(r.CHAIN_NOT_SUPPORTED,n.INVALID_PARAMS,{details:`Received non-EVM swap response from Markr, but only EVM swaps are supported for this source chain.`});let W=(t,n=Date.now())=>{let r=x.sourceChain.chainId===x.targetChain.chainId;return{amountIn:x.amountIn,amountOut:x.amountOut,environment:d,fees:x.fees,fromAddress:x.fromAddress,id:x.id,partnerFeeBps:x.partnerFeeBps,sourceAsset:x.assetIn,sourceChain:x.sourceChain,status:`source-pending`,targetAsset:x.assetOut,targetChain:x.targetChain,toAddress:x.toAddress,type:e.MARKR,source:{confirmationCount:0,requiredConfirmationCount:r?1:2,startedAtMs:n,txHash:t}}};if(H&&V){let e={currentSignature:1,currentSignatureReason:t.TokensTransfer,quote:x,requiredSignatures:1},r=h.signBatch;if(!r)throw new i(`One-click batch signer is not available.`,n.SIGNING_FAILED);let a={chainId:o(x.sourceChain.chainId),data:U.data,from:k,gas:void 0,to:U.to,value:U.value,...S?.maxFeePerGas===void 0?null:{maxFeePerGas:S.maxFeePerGas,maxPriorityFeePerGas:S.maxPriorityFeePerGas}};O?.(e);try{let t=(await r([V,a],async e=>M.sendRawTransaction({serializedTransaction:e}),e)).at(-1);if(!t)throw new i(`One-click batch signing returned no transaction hashes.`,n.SIGNING_FAILED);return W(t)}catch(e){if(!w)throw e}}if(B&&V){let e={currentSignature:1,currentSignatureReason:t.AllowanceApproval,quote:x,requiredSignatures:2};O?.(e);let r=await h.sign(V,async e=>M.sendRawTransaction({serializedTransaction:e}),e);if((await M.waitForTransactionReceipt({hash:r})).status===`reverted`)return f(x,{environment:d,errorCode:n.TRANSACTION_REVERTED,errorReason:`ERC20 approval transaction was reverted`})}let G=await C({crossChain:L,fromAddress:k,feeUnitsMarginBps:S?.estimateGasMarginBps,sourceClient:M,swap:U}),K={chainId:o(x.sourceChain.chainId),data:U.data,from:k,gas:G,to:U.to,value:U.value,...S?.maxFeePerGas===void 0?null:{maxFeePerGas:S.maxFeePerGas,maxPriorityFeePerGas:S.maxPriorityFeePerGas}},q={currentSignature:B?2:1,currentSignatureReason:t.TokensTransfer,quote:x,requiredSignatures:B?2:1};O?.(q);let J=Date.now();return W(await h.sign(K,async e=>M.sendRawTransaction({serializedTransaction:e}),q),J)}async function A({apiOptions:a,appId:o,environment:s,solanaSigner:c,quote:l,onStepChange:u}){if(!c)throw new i(r.INVALID_PARAMS,n.INVALID_PARAMS,{details:`solanaSigner is required for Solana transfers but was not provided.`});if(!h(l.fromAddress))throw new i(r.INVALID_PARAMS,n.INVALID_PARAMS,{details:`fromAddress is not a valid Solana address.`});let f=_({amountOut:l.amountOut,assetOut:l.assetOut,slippageBps:l.slippageBps}),p=g(l.assetIn,l.sourceChain.chainId),v=g(l.assetOut,l.targetChain.chainId),y=await m(a,{amountIn:l.amountIn.toString(),appId:o,minAmountOut:f.toString(),tokenIn:p,tokenOut:v,userPublicKey:l.fromAddress,uuid:l.id});if(!x(y))throw new i(r.CHAIN_NOT_SUPPORTED,n.INVALID_PARAMS,{details:`Received non-SVM swap response from Markr, but only SVM swaps are supported for this source chain.`});console.debug(`[Fusion SDK] Original swap transaction (base64):`,y.swapTransaction);let b=await S(y.swapTransaction,d({chain:l.sourceChain}));console.debug(`[Fusion SDK] Refreshed swap transaction with new blockhash (base64):`,b);let C={currentSignature:1,currentSignatureReason:t.TokensTransfer,quote:l,requiredSignatures:1};u?.(C);let T=Date.now(),E=await c.signAndSend({account:l.fromAddress,serializedTx:b},C),D=l.sourceChain.chainId.toLowerCase()!==l.targetChain.chainId.toLowerCase();return{amountIn:l.amountIn,amountOut:l.amountOut,environment:s,fees:l.fees,fromAddress:l.fromAddress,id:l.id,partnerFeeBps:l.partnerFeeBps,sourceAsset:l.assetIn,sourceChain:l.sourceChain,status:`source-pending`,targetAsset:l.assetOut,targetChain:l.targetChain,toAddress:l.toAddress,type:e.MARKR,source:{confirmationCount:0,requiredConfirmationCount:D?2:w,startedAtMs:T,txHash:E}}}function j({approvalRequest:e,requiresApprovalSignature:t,signBatch:n,sourceChainId:r,targetChainId:i}){return s(r)&&s(i)&&r===i&&t&&e!==void 0&&typeof n==`function`}export{O as transferAssetFactory};
2
+ //# sourceMappingURL=transfer-asset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transfer-asset.js","names":[],"sources":["../../../../src/transfer-service/markr/_handlers/transfer-asset.ts"],"sourcesContent":["import { encodeFunctionData, erc20Abi, isAddress } from 'viem';\nimport { isEvmNamespace, isSolanaNamespace } from '../../../_utils/chain';\nimport { ServiceType, TransferSignatureReason } from '../../../constants';\nimport type { Environment } from '../../../constants';\nimport { ErrorCode, ErrorReason, SdkError } from '../../../errors';\nimport type { TransferService } from '../../../types/service';\nimport type { EvmSigner, EvmTransactionRequest, SolanaSigner } from '../../../types/signer';\nimport type { Transfer, TransferStepDetails } from '../../../types/transfer';\nimport { caip2ToEip155ChainId, caip2ToEip155HexChainId } from '../../../utils/caip';\nimport { isSolAddress } from '../../../utils/sol-address';\nimport {\n applyFeeUnitsBpsMargin,\n getEvmClientForChain,\n getSolanaRpcForChain,\n makeFailedTransferFromQuote,\n} from '../../_utils';\nimport { markrGetSpenderAddress, markrSwap, type ApiOptions } from '../_api';\nimport {\n assetToAddressString,\n calculateMarkrMinimumAmountOut,\n getAdditiveSourceAssetFeeAmount,\n isTokenAddressNative,\n} from '../_utils';\nimport { isEvmSwapResponse, isSolanaSwapResponse } from '../_type-guards';\nimport { SOLANA_REQUIRED_CONFIRMATIONS } from '../constants';\nimport { _estimateGasFromSwapResponse } from './estimate-native-fee';\nimport type { Caip2ChainId } from '../../../types/caip';\nimport { refreshSolanaSwapTransactionBlockhash } from '../_solana-utils';\n\nexport interface TransferAssetFactoryConfig {\n apiOptions: ApiOptions;\n appId: string;\n environment: Environment;\n evmSigner: EvmSigner;\n solanaSigner?: SolanaSigner;\n}\n\nexport function transferAssetFactory({\n apiOptions,\n appId,\n environment,\n evmSigner,\n solanaSigner,\n}: TransferAssetFactoryConfig): TransferService['transferAsset'] {\n return async ({ quote, gasSettings, fallbackToDefaultOnBatchFailure, onStepChange }) => {\n if (quote.serviceType !== ServiceType.MARKR) {\n throw new SdkError(ErrorReason.INCORRECT_PROVIDER_PROVIDED, ErrorCode.INVALID_PARAMS);\n }\n\n const now = Math.floor(Date.now() / 1_000);\n\n if (quote.expiresAt <= now) {\n throw new SdkError(ErrorReason.QUOTE_EXPIRED, ErrorCode.INVALID_PARAMS);\n }\n\n const sourceChainId = quote.sourceChain.chainId;\n\n if (isSolanaNamespace(sourceChainId)) {\n return _executeSvmTransfer({ apiOptions, appId, environment, solanaSigner, quote, onStepChange });\n }\n\n if (isEvmNamespace(sourceChainId)) {\n return _executeEvmTransfer({\n apiOptions,\n appId,\n environment,\n evmSigner,\n quote,\n gasSettings,\n fallbackToDefaultOnBatchFailure,\n onStepChange,\n });\n }\n\n throw new SdkError(ErrorReason.CHAIN_NOT_SUPPORTED, ErrorCode.INVALID_PARAMS, {\n details: `Unsupported source chain namespace: ${sourceChainId}`,\n });\n };\n}\n\n// ---------------------------------------------------------------------------\n// EVM transfer path\n// ---------------------------------------------------------------------------\n\ninterface EvmTransferParams {\n apiOptions: ApiOptions;\n appId: string;\n environment: Environment;\n evmSigner: EvmSigner;\n quote: Parameters<TransferService['transferAsset']>[0]['quote'];\n gasSettings?: Parameters<TransferService['transferAsset']>[0]['gasSettings'];\n fallbackToDefaultOnBatchFailure?: Parameters<TransferService['transferAsset']>[0]['fallbackToDefaultOnBatchFailure'];\n onStepChange?: Parameters<TransferService['transferAsset']>[0]['onStepChange'];\n}\n\nasync function _executeEvmTransfer({\n apiOptions,\n appId,\n environment,\n evmSigner,\n quote,\n gasSettings,\n fallbackToDefaultOnBatchFailure,\n onStepChange,\n}: EvmTransferParams): Promise<Transfer> {\n const fromAddress = quote.fromAddress;\n\n if (!isAddress(fromAddress)) {\n throw new SdkError(ErrorReason.INVALID_PARAMS, ErrorCode.INVALID_PARAMS, {\n details: 'fromAddress is not a valid EVM address.',\n });\n }\n\n const minAmountOut = calculateMarkrMinimumAmountOut({\n amountOut: quote.amountOut,\n assetOut: quote.assetOut,\n slippageBps: quote.slippageBps,\n });\n\n const sourceClient = getEvmClientForChain({ chain: quote.sourceChain });\n\n const tokenInAddressString = assetToAddressString(quote.assetIn, quote.sourceChain.chainId);\n const tokenOutAddressString = assetToAddressString(quote.assetOut, quote.targetChain.chainId);\n\n if (!isAddress(tokenInAddressString)) {\n throw new SdkError(ErrorReason.INVALID_PARAMS, ErrorCode.INVALID_PARAMS, {\n details: 'assetIn address is not a valid EVM address.',\n });\n }\n\n const tokenInAddress = tokenInAddressString;\n const isTokenInNative = isTokenAddressNative(tokenInAddress);\n const isCrossChainSwap = quote.sourceChain.chainId.toLowerCase() !== quote.targetChain.chainId.toLowerCase();\n const allowanceAmount = quote.amountIn + getAdditiveSourceAssetFeeAmount(quote);\n\n const { address: spenderAddress } = await markrGetSpenderAddress(apiOptions, {\n chainId: caip2ToEip155ChainId(quote.sourceChain.chainId),\n crossChainSwap: isCrossChainSwap,\n quoteId: quote.id,\n });\n\n if (!isTokenInNative && !spenderAddress) {\n throw new SdkError(ErrorReason.CHAIN_NOT_SUPPORTED, ErrorCode.INVALID_PARAMS, {\n details: `Missing Markr spender address for source chain ${quote.sourceChain.chainId}.`,\n });\n }\n\n let requiresApprovalSignature = false;\n let approvalRequest: EvmTransactionRequest | undefined;\n\n if (!isTokenInNative && spenderAddress) {\n const allowance = await sourceClient.readContract({\n address: tokenInAddress,\n abi: erc20Abi,\n functionName: 'allowance',\n args: [fromAddress, spenderAddress],\n });\n\n if (allowance < allowanceAmount) {\n requiresApprovalSignature = true;\n\n const approvalData = encodeFunctionData({\n abi: erc20Abi,\n functionName: 'approve',\n args: [spenderAddress, allowanceAmount],\n });\n\n let approvalGasWithMargin: bigint | undefined;\n\n try {\n const approvalGasEstimate = await sourceClient.estimateGas({\n account: fromAddress,\n to: tokenInAddress,\n data: approvalData,\n value: 0n,\n });\n\n approvalGasWithMargin = applyFeeUnitsBpsMargin(approvalGasEstimate, gasSettings?.estimateGasMarginBps);\n } catch (err) {\n throw new SdkError('Error during gas estimation', ErrorCode.VIEM_ERROR, {\n cause: err,\n details: 'Failed to estimate gas for ERC20 approval transaction.',\n });\n }\n\n approvalRequest = {\n chainId: caip2ToEip155HexChainId(quote.sourceChain.chainId),\n data: approvalData,\n from: fromAddress,\n gas: approvalGasWithMargin,\n to: tokenInAddress,\n value: 0n,\n ...(gasSettings?.maxFeePerGas !== undefined\n ? {\n maxFeePerGas: gasSettings.maxFeePerGas,\n maxPriorityFeePerGas: gasSettings.maxPriorityFeePerGas,\n }\n : null),\n };\n }\n }\n\n const maybeOneClickBatch = isOneClickBatchEligible({\n approvalRequest,\n requiresApprovalSignature,\n signBatch: evmSigner.signBatch,\n sourceChainId: quote.sourceChain.chainId,\n targetChainId: quote.targetChain.chainId,\n });\n\n const swap = await markrSwap(apiOptions, {\n amountIn: quote.amountIn.toString(),\n appId,\n minAmountOut: minAmountOut.toString(),\n tokenIn: tokenInAddressString,\n tokenOut: tokenOutAddressString,\n uuid: quote.id,\n });\n\n if (!isEvmSwapResponse(swap)) {\n throw new SdkError(ErrorReason.CHAIN_NOT_SUPPORTED, ErrorCode.INVALID_PARAMS, {\n details: 'Received non-EVM swap response from Markr, but only EVM swaps are supported for this source chain.',\n });\n }\n\n const makePendingTransfer = (txHash: `0x${string}`, startedAtMs: number = Date.now()): Transfer => {\n const isSameChainTransfer = quote.sourceChain.chainId === quote.targetChain.chainId;\n\n return {\n amountIn: quote.amountIn,\n amountOut: quote.amountOut,\n environment,\n fees: quote.fees,\n fromAddress: quote.fromAddress,\n id: quote.id,\n partnerFeeBps: quote.partnerFeeBps,\n sourceAsset: quote.assetIn,\n sourceChain: quote.sourceChain,\n status: 'source-pending',\n targetAsset: quote.assetOut,\n targetChain: quote.targetChain,\n toAddress: quote.toAddress,\n type: ServiceType.MARKR,\n source: {\n confirmationCount: 0,\n requiredConfirmationCount: isSameChainTransfer ? 1 : 2,\n startedAtMs,\n txHash,\n },\n };\n };\n\n if (maybeOneClickBatch && approvalRequest) {\n const batchStep: TransferStepDetails = {\n currentSignature: 1,\n currentSignatureReason: TransferSignatureReason.TokensTransfer,\n quote,\n requiredSignatures: 1,\n };\n\n const signBatch = evmSigner.signBatch;\n\n if (!signBatch) {\n throw new SdkError('One-click batch signer is not available.', ErrorCode.SIGNING_FAILED);\n }\n\n const swapRequest: EvmTransactionRequest = {\n chainId: caip2ToEip155HexChainId(quote.sourceChain.chainId),\n data: swap.data,\n from: fromAddress,\n // Gas is purposely left undefined here.\n // We can't estimate the gas because we aren't executing the\n // approval tx. It's up to the wallet to correctly handle gas estimation.\n gas: undefined,\n to: swap.to,\n value: swap.value,\n ...(gasSettings?.maxFeePerGas !== undefined\n ? {\n maxFeePerGas: gasSettings.maxFeePerGas,\n maxPriorityFeePerGas: gasSettings.maxPriorityFeePerGas,\n }\n : null),\n };\n\n onStepChange?.(batchStep);\n\n try {\n const txHashes = await signBatch(\n [approvalRequest, swapRequest],\n async (signedTxHash) => sourceClient.sendRawTransaction({ serializedTransaction: signedTxHash }),\n batchStep,\n );\n\n const swapTxHash = txHashes.at(-1);\n\n if (!swapTxHash) {\n throw new SdkError('One-click batch signing returned no transaction hashes.', ErrorCode.SIGNING_FAILED);\n }\n\n return makePendingTransfer(swapTxHash);\n } catch (error) {\n if (!fallbackToDefaultOnBatchFailure) {\n throw error;\n }\n }\n }\n\n if (requiresApprovalSignature && approvalRequest) {\n const approvalStep: TransferStepDetails = {\n currentSignature: 1,\n currentSignatureReason: TransferSignatureReason.AllowanceApproval,\n quote,\n requiredSignatures: 2,\n };\n\n onStepChange?.(approvalStep);\n\n const approvalTxHash = await evmSigner.sign(\n approvalRequest,\n async (signedTxHash) => sourceClient.sendRawTransaction({ serializedTransaction: signedTxHash }),\n approvalStep,\n );\n\n const approvalReceipt = await sourceClient.waitForTransactionReceipt({ hash: approvalTxHash });\n\n if (approvalReceipt.status === 'reverted') {\n return makeFailedTransferFromQuote(quote, {\n environment,\n errorCode: ErrorCode.TRANSACTION_REVERTED,\n errorReason: 'ERC20 approval transaction was reverted',\n });\n }\n }\n\n const swapGasWithMargin = await _estimateGasFromSwapResponse({\n crossChain: isCrossChainSwap,\n fromAddress,\n feeUnitsMarginBps: gasSettings?.estimateGasMarginBps,\n sourceClient,\n swap,\n });\n\n const swapRequest: EvmTransactionRequest = {\n chainId: caip2ToEip155HexChainId(quote.sourceChain.chainId),\n data: swap.data,\n from: fromAddress,\n gas: swapGasWithMargin,\n to: swap.to,\n value: swap.value,\n ...(gasSettings?.maxFeePerGas !== undefined\n ? {\n maxFeePerGas: gasSettings.maxFeePerGas,\n maxPriorityFeePerGas: gasSettings.maxPriorityFeePerGas,\n }\n : null),\n };\n\n const step: TransferStepDetails = {\n currentSignature: requiresApprovalSignature ? 2 : 1,\n currentSignatureReason: TransferSignatureReason.TokensTransfer,\n quote,\n requiredSignatures: requiresApprovalSignature ? 2 : 1,\n };\n\n onStepChange?.(step);\n\n const startedAtMs = Date.now();\n\n const txHash = await evmSigner.sign(\n swapRequest,\n async (signedTxHash) => sourceClient.sendRawTransaction({ serializedTransaction: signedTxHash }),\n step,\n );\n\n return makePendingTransfer(txHash, startedAtMs);\n}\n\n// ---------------------------------------------------------------------------\n// SVM (Solana) transfer path\n// ---------------------------------------------------------------------------\n\ninterface SvmTransferParams {\n apiOptions: ApiOptions;\n appId: string;\n environment: Environment;\n solanaSigner?: SolanaSigner;\n quote: Parameters<TransferService['transferAsset']>[0]['quote'];\n onStepChange?: Parameters<TransferService['transferAsset']>[0]['onStepChange'];\n}\n\nasync function _executeSvmTransfer({\n apiOptions,\n appId,\n environment,\n solanaSigner,\n quote,\n onStepChange,\n}: SvmTransferParams): Promise<Transfer> {\n if (!solanaSigner) {\n throw new SdkError(ErrorReason.INVALID_PARAMS, ErrorCode.INVALID_PARAMS, {\n details: 'solanaSigner is required for Solana transfers but was not provided.',\n });\n }\n\n if (!isSolAddress(quote.fromAddress)) {\n throw new SdkError(ErrorReason.INVALID_PARAMS, ErrorCode.INVALID_PARAMS, {\n details: 'fromAddress is not a valid Solana address.',\n });\n }\n\n const minAmountOut = calculateMarkrMinimumAmountOut({\n amountOut: quote.amountOut,\n assetOut: quote.assetOut,\n slippageBps: quote.slippageBps,\n });\n\n const tokenInAddressString = assetToAddressString(quote.assetIn, quote.sourceChain.chainId);\n const tokenOutAddressString = assetToAddressString(quote.assetOut, quote.targetChain.chainId);\n\n const swap = await markrSwap(apiOptions, {\n amountIn: quote.amountIn.toString(),\n appId,\n minAmountOut: minAmountOut.toString(),\n tokenIn: tokenInAddressString,\n tokenOut: tokenOutAddressString,\n userPublicKey: quote.fromAddress,\n uuid: quote.id,\n });\n\n if (!isSolanaSwapResponse(swap)) {\n throw new SdkError(ErrorReason.CHAIN_NOT_SUPPORTED, ErrorCode.INVALID_PARAMS, {\n details: 'Received non-SVM swap response from Markr, but only SVM swaps are supported for this source chain.',\n });\n }\n\n // TODO: Cleanup\n console.debug('[Fusion SDK] Original swap transaction (base64):', swap.swapTransaction);\n\n const swapTransactionBase64 = await refreshSolanaSwapTransactionBlockhash(\n swap.swapTransaction,\n getSolanaRpcForChain({ chain: quote.sourceChain }),\n );\n\n // TODO: Cleanup\n console.debug('[Fusion SDK] Refreshed swap transaction with new blockhash (base64):', swapTransactionBase64);\n\n const step: TransferStepDetails = {\n currentSignature: 1,\n currentSignatureReason: TransferSignatureReason.TokensTransfer,\n quote,\n requiredSignatures: 1,\n };\n\n onStepChange?.(step);\n\n const startedAtMs = Date.now();\n\n const txHash = await solanaSigner.signAndSend(\n {\n account: quote.fromAddress,\n serializedTx: swapTransactionBase64,\n },\n step,\n );\n\n const isCrossChainSwap = quote.sourceChain.chainId.toLowerCase() !== quote.targetChain.chainId.toLowerCase();\n\n return {\n amountIn: quote.amountIn,\n amountOut: quote.amountOut,\n environment,\n fees: quote.fees,\n fromAddress: quote.fromAddress,\n id: quote.id,\n partnerFeeBps: quote.partnerFeeBps,\n sourceAsset: quote.assetIn,\n sourceChain: quote.sourceChain,\n status: 'source-pending',\n targetAsset: quote.assetOut,\n targetChain: quote.targetChain,\n toAddress: quote.toAddress,\n type: ServiceType.MARKR,\n source: {\n confirmationCount: 0,\n requiredConfirmationCount: isCrossChainSwap ? 2 : SOLANA_REQUIRED_CONFIRMATIONS,\n startedAtMs,\n txHash,\n },\n };\n}\n\n/**\n * Determines whether one-click swap eligibility criteria is met.\n *\n * Only same-chain EVM swaps are currently eligible.\n */\nfunction isOneClickBatchEligible({\n approvalRequest,\n requiresApprovalSignature,\n signBatch,\n sourceChainId,\n targetChainId,\n}: {\n approvalRequest?: EvmTransactionRequest;\n requiresApprovalSignature: boolean;\n signBatch?: EvmSigner['signBatch'];\n sourceChainId: Caip2ChainId;\n targetChainId: Caip2ChainId;\n}): boolean {\n return (\n isEvmNamespace(sourceChainId) &&\n isEvmNamespace(targetChainId) &&\n sourceChainId === targetChainId &&\n requiresApprovalSignature &&\n approvalRequest !== undefined &&\n typeof signBatch === 'function'\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ require(`../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../utils/caip.cjs`),t=require(`../service-schemas.cjs`);let n=require(`zod`);const r=n.z.string().refine(t=>e.isCaip2ChainId(t),{message:`Invalid CAIP-2 chain ID`}).transform(e=>e),i=n.z.object({chainId:n.z.union([n.z.number(),n.z.string()]),chainType:n.z.string(),enabled_services:n.z.array(n.z.enum([`cross-chain-swap`,`cross-chain-quote`,`quote`,`swap`,`token-list`])),logo_url:n.z.url(),name:n.z.string(),lanes:n.z.array(n.z.union([n.z.coerce.number().int().nonnegative(),r]))}),a=i.extend({chainId:n.z.coerce.number().int().nonnegative(),chainType:n.z.literal(`evm`),router:t.EvmAddressSchema.optional(),wrapped_token:t.EvmAddressSchema.optional()}),o=i.extend({chainId:n.z.string().refine(t=>e.isCaip2ChainId(t)&&t.startsWith(`solana:`),{error:`Is not a valid Solana CAIP-2 ID`}).transform(e=>e),chainType:n.z.literal(`svm`)}),s=n.z.array(n.z.union([a,o,i.refine(e=>e.chainType!==`evm`&&e.chainType!==`svm`,`Known chain types must match their expected schema`)])),c=n.z.array(n.z.object({address:t.EvmAddressSchema,decimals:n.z.number().int().nonnegative().max(18),logo_url:n.z.url(),name:n.z.string(),symbol:n.z.string()})),l=n.z.union([n.z.object({aggregator:n.z.object({id:n.z.string(),logo_url:n.z.url(),name:n.z.string()}),amountIn:n.z.coerce.bigint().nonnegative(),amountOut:n.z.coerce.bigint().nonnegative(),chainId:n.z.union([n.z.number().int().nonnegative(),r]),expiredAt:n.z.number().int().nonnegative(),fees:n.z.array(n.z.object({type:n.z.enum([`protocol`,`gas`,`bridge`,`slippage`,`swap`,`other`]),name:n.z.string(),amount:n.z.coerce.bigint().nonnegative(),token:n.z.object({chainId:n.z.union([n.z.number().int().nonnegative(),r]),address:n.z.union([t.EvmAddressSchema,t.SolAddressSchema])}),extra:n.z.boolean().optional()})).optional(),gasEstimate:n.z.coerce.bigint().nonnegative().optional(),recommendedSlippage:n.z.number().int().nonnegative(),tokenIn:n.z.union([t.EvmAddressSchema,t.SolAddressSchema]),tokenInDecimals:n.z.number().int().nonnegative().max(18),tokenOut:n.z.union([t.EvmAddressSchema,t.SolAddressSchema]),tokenOutDecimals:n.z.number().int().nonnegative().max(18),uuid:n.z.uuid()}),n.z.object({done:n.z.literal(!0)})]),u=n.z.object({data:t.HexSchema,to:t.EvmAddressSchema,value:n.z.coerce.bigint().nonnegative()}),d=n.z.object({chainType:n.z.literal(`svm`),swapTransaction:n.z.base64()}),f=n.z.union([u,d]),p=n.z.object({fee:n.z.int().nonnegative(),name:n.z.string()}),m=/[zZ]|[+-]\d{2}:?\d{2}$/,h=n.z.iso.datetime({local:!0}).refine(e=>{let t=m.test(e)?e:e+`Z`;return n.z.iso.datetime().safeParse(t).success},{error:`Invalid ISO-8601 datetime (must be valid with timezone, or local assumed UTC)`}).transform(e=>m.test(e)?e:e+`Z`),g=n.z.object({messageId:n.z.string().nullable(),status:n.z.enum([`pending`,`committed`,`pending_execution`,`completed`,`failed`,`refunded`,`unknown`]),description:n.z.string(),sourceChain:n.z.object({name:n.z.string(),transactionHash:n.z.union([t.HashSchema,t.SolSignatureSchema]),timestamp:h,finalized:h.or(n.z.boolean()).nullable()}),destinationChain:n.z.object({name:n.z.string().nullable(),transactionHash:n.z.union([t.HashSchema,t.SolSignatureSchema]).nullable(),bridgeHash:n.z.union([t.HashSchema,t.SolSignatureSchema]).nullable().optional(),timestamp:h.nullable(),finalized:h.nullable()}),progress:n.z.object({committed:n.z.boolean(),commitTimestamp:h.nullable().optional(),executed:n.z.boolean()}),fees:n.z.object({token:n.z.union([t.EvmAddressSchema,t.SolAddressSchema]).nullable(),amount:n.z.coerce.bigint().nonnegative().nullable()}).nullable(),transferredTokens:n.z.array(n.z.object({token:n.z.union([t.EvmAddressSchema,t.SolAddressSchema]),amount:n.z.coerce.bigint().nonnegative()})),debug:n.z.looseObject({messageId:n.z.string(),status:n.z.string(),destinationChain:n.z.string(),destinationTxHash:n.z.string(),relayTxHash:n.z.string(),retryCount:n.z.number().int().nonnegative(),lastRetryAt:n.z.iso.datetime(),sourceChain:n.z.string(),sourceTxHash:n.z.string(),createdAt:n.z.iso.datetime()}).partial().nullable().optional()}),_=n.z.object({address:t.EvmAddressSchema});exports.CrossChainStatusResponseSchema=g,exports.PartnerInfoResponseSchema=p,exports.QuoteResponseSchema=l,exports.SpenderAddressResponseSchema=_,exports.SupportedChainsResponseSchema=s,exports.SwapResponseSchema=f,exports.TokenListResponseSchema=c;
2
+ //# sourceMappingURL=_schema.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_schema.cjs","names":["z","isCaip2ChainId","EvmAddressSchema","SolAddressSchema","HexSchema","HashSchema","SolSignatureSchema"],"sources":["../../../src/transfer-service/markr/_schema.ts"],"sourcesContent":["import type { Signature, Address as SolAddress } from '@solana/kit';\nimport { z } from 'zod';\nimport type { Address as EvmAddress, Hash } from 'viem';\nimport { EvmAddressSchema, HashSchema, HexSchema, SolAddressSchema, SolSignatureSchema } from '../service-schemas';\nimport { isCaip2ChainId } from '../../utils/caip';\nimport type { Caip2ChainId } from '../../types/caip';\nimport type { Hex } from '../../types/signer';\n\ninterface SupportedChainsResponseItemBase {\n chainId: number | string;\n chainType: string;\n /** Available services on the chain. Each service has specific functionality */\n enabled_services: Array<'cross-chain-swap' | 'cross-chain-quote' | 'quote' | 'swap' | 'token-list'>;\n /** Chain logo URL */\n logo_url: string;\n /** Chain display name */\n name: string;\n /**\n * List of chain IDs that this chain can swap to via cross-chain aggregators.\n *\n * Empty array means no cross-chain routes available.\n */\n lanes: ReadonlyArray<number | Caip2ChainId>;\n}\n\nexport interface SupportedChainsResponseItemEvm extends SupportedChainsResponseItemBase {\n /** Chain identifier */\n chainId: number;\n /** Chain virtual machine type */\n chainType: 'evm';\n /** Router contract address */\n router?: EvmAddress;\n /** Native token wrapped contract address */\n wrapped_token?: EvmAddress;\n}\n\nexport interface SupportedChainsResponseItemSvm extends SupportedChainsResponseItemBase {\n /** Chain identifier */\n chainId: Caip2ChainId;\n /** Chain virtual machine type */\n chainType: 'svm';\n}\n\nexport type SupportedChainsResponse = Array<\n SupportedChainsResponseItemEvm | SupportedChainsResponseItemSvm | SupportedChainsResponseItemBase\n>;\n\nexport const Caip2ChainIdSchema: z.ZodType<Caip2ChainId> = z\n .string()\n .refine((value) => isCaip2ChainId(value), {\n message: 'Invalid CAIP-2 chain ID',\n })\n .transform((value) => value as Caip2ChainId);\n\nconst SupportedChainsResponseItemBaseSchema = z.object({\n chainId: z.union([z.number(), z.string()]),\n chainType: z.string(),\n enabled_services: z.array(z.enum(['cross-chain-swap', 'cross-chain-quote', 'quote', 'swap', 'token-list'])),\n logo_url: z.url(),\n name: z.string(),\n lanes: z.array(z.union([z.coerce.number().int().nonnegative(), Caip2ChainIdSchema])),\n});\n\nconst SupportedChainsResponseItemEvmSchema: z.ZodType<SupportedChainsResponseItemEvm> =\n SupportedChainsResponseItemBaseSchema.extend({\n chainId: z.coerce.number().int().nonnegative(),\n chainType: z.literal('evm'),\n router: EvmAddressSchema.optional(),\n wrapped_token: EvmAddressSchema.optional(),\n });\n\nconst SupportedChainsResponseItemSvmSchema: z.ZodType<SupportedChainsResponseItemSvm> =\n SupportedChainsResponseItemBaseSchema.extend({\n chainId: z\n .string()\n .refine((value) => isCaip2ChainId(value) && value.startsWith('solana:'), {\n error: 'Is not a valid Solana CAIP-2 ID',\n })\n .transform((value) => value as Caip2ChainId),\n chainType: z.literal('svm'),\n });\n\n/**\n * Schema for the response from Markr's /info/chains endpoint.\n *\n * @see https://orchestrator-docs.markr.io/#/paths/~1info~1chains/get\n */\nexport const SupportedChainsResponseSchema: z.ZodType<SupportedChainsResponse> = z.array(\n z.union([\n SupportedChainsResponseItemEvmSchema,\n SupportedChainsResponseItemSvmSchema,\n SupportedChainsResponseItemBaseSchema.refine(\n (item) => item.chainType !== 'evm' && item.chainType !== 'svm',\n 'Known chain types must match their expected schema',\n ),\n ]),\n);\n\nexport type TokenListResponse = Array<{\n address: EvmAddress;\n decimals: number;\n logo_url: string;\n name: string;\n symbol: string;\n}>;\n\n/**\n * Schema for the response Markr's /tokens/{chainId}/list endpoint.\n *\n * @see https://orchestrator-docs.markr.io/#/paths/~1tokens~1%7BchainId%7D~1list/get\n */\nexport const TokenListResponseSchema: z.ZodType<TokenListResponse> = z.array(\n z.object({\n address: EvmAddressSchema,\n decimals: z.number().int().nonnegative().max(18),\n logo_url: z.url(),\n name: z.string(),\n symbol: z.string(),\n }),\n);\n\nexport interface QuoteResponseData {\n aggregator: {\n id: string;\n logo_url: string;\n name: string;\n };\n amountIn: bigint;\n amountOut: bigint;\n /** Chain identifier (number for EVM chains, CAIP-2 ID for SVM chains) */\n chainId: number | Caip2ChainId;\n expiredAt: number;\n /**\n * Fee breakdown for cross-chain bridge transactions.\n *\n * Only included in quotes from cross-chain aggregators (DeBridge, LiFi).\n */\n fees?: ReadonlyArray<{\n type: 'protocol' | 'gas' | 'bridge' | 'slippage' | 'swap' | 'other';\n /** Human-readable fee name */\n name: string;\n /** Fee amount in token's smallest unit */\n amount: bigint;\n /**\n * When `true`, indicates the fee is an additional fee on top of the input\n * amount that the user needs to pay. These fees need checked against the user's\n * balance to prevent insufficient balance errors.\n */\n extra?: boolean;\n /** Token the fee is deducted from */\n token: {\n /** Chain ID where fee is deducted */\n chainId: number | Caip2ChainId;\n /** Token address (EVM hex or Solana base58) */\n address: EvmAddress | SolAddress;\n };\n }>;\n gasEstimate?: bigint;\n recommendedSlippage: number;\n /** Input token address (EVM hex or Solana base58) */\n tokenIn: EvmAddress | SolAddress;\n tokenInDecimals: number;\n /** Output token address (EVM hex or Solana base58) */\n tokenOut: EvmAddress | SolAddress;\n tokenOutDecimals: number;\n uuid: string;\n}\n\nexport interface QuoteResponseDataDone {\n done: true;\n}\n\nexport type QuoteResponse = QuoteResponseData | QuoteResponseDataDone;\n\n/**\n * Schema for the response from Markr's /quote endpoint.\n *\n * @see https://orchestrator-docs.markr.io/#/paths/~1quote/post\n */\nexport const QuoteResponseSchema: z.ZodType<QuoteResponse> = z.union([\n z.object({\n aggregator: z.object({\n id: z.string(),\n logo_url: z.url(),\n name: z.string(),\n }),\n amountIn: z.coerce.bigint().nonnegative(),\n amountOut: z.coerce.bigint().nonnegative(),\n chainId: z.union([z.number().int().nonnegative(), Caip2ChainIdSchema]),\n /**\n * Unix time in seconds when the quote expires.\n */\n expiredAt: z.number().int().nonnegative(),\n fees: z\n .array(\n z.object({\n type: z.enum(['protocol', 'gas', 'bridge', 'slippage', 'swap', 'other']),\n name: z.string(),\n amount: z.coerce.bigint().nonnegative(),\n token: z.object({\n chainId: z.union([z.number().int().nonnegative(), Caip2ChainIdSchema]),\n address: z.union([EvmAddressSchema, SolAddressSchema]),\n }),\n extra: z.boolean().optional(),\n }),\n )\n .optional(),\n /**\n * Estimated gas for the swap transaction.\n * Markr estimates already include a buffer.\n *\n * The API docs do not specify this field as optional, but in practice it can be missing.\n */\n gasEstimate: z.coerce.bigint().nonnegative().optional(),\n /** Recommended slippage in basis points. */\n recommendedSlippage: z.number().int().nonnegative(),\n tokenIn: z.union([EvmAddressSchema, SolAddressSchema]),\n tokenInDecimals: z.number().int().nonnegative().max(18),\n tokenOut: z.union([EvmAddressSchema, SolAddressSchema]),\n tokenOutDecimals: z.number().int().nonnegative().max(18),\n uuid: z.uuid(),\n }),\n z.object({\n done: z.literal(true),\n }),\n]);\n\n/**\n * Response type for Markr's /swap endpoint.\n *\n * @see https://orchestrator-docs.markr.io/#/paths/~1swap/post\n */\nexport interface WrappedSwapTransactionResponse {\n data: Hex;\n to: EvmAddress;\n value: bigint;\n}\n\nexport const WrappedSwapTransactionResponseSchema: z.ZodType<WrappedSwapTransactionResponse> = z.object({\n data: HexSchema,\n to: EvmAddressSchema,\n value: z.coerce.bigint().nonnegative(),\n});\n\n/**\n * Solana swap transaction (returned for SVM chains).\n */\nexport interface SolanaSwapTransactionResponse {\n /** Chain type identifier */\n chainType: 'svm';\n /** Base64-encoded Solana transaction to be signed and sent by the client */\n swapTransaction: string;\n}\n\nexport const SolanaSwapTransactionResponseSchema: z.ZodType<SolanaSwapTransactionResponse> = z.object({\n chainType: z.literal('svm'),\n swapTransaction: z.base64(),\n});\n\nexport type SwapResponse = WrappedSwapTransactionResponse | SolanaSwapTransactionResponse;\n\nexport const SwapResponseSchema: z.ZodType<SwapResponse> = z.union([\n WrappedSwapTransactionResponseSchema,\n SolanaSwapTransactionResponseSchema,\n]);\n\nexport interface PartnerInfoResponse {\n /**\n * The partner fee in basis points collected on each swap.\n */\n fee: number;\n name: string;\n}\n\nexport const PartnerInfoResponseSchema: z.ZodType<PartnerInfoResponse> = z.object({\n fee: z.int().nonnegative(),\n name: z.string(),\n});\n\n/**\n * If the destination token is USDC, the flow is:\n * - pending -> committed -> completed\n *\n * If the destination token is not USDC, the flow is:\n * - pending -> committed -> pending_execution -> completed\n *\n * If the transaction fails at any point, the status will be 'failed'.\n */\nexport type CrossChainStatus =\n | /** Transaction submitted to CCIP */\n 'pending'\n /** Message committed, awaiting execution on destination chain */\n | 'committed'\n /** Message received on destination, swap pending execution by relayer */\n | 'pending_execution'\n /** Message executed successfully on destination chain */\n | 'completed'\n /** Swap expired, and funds were refunded (CCIP only) */\n | 'refunded'\n /** Execution failed */\n | 'failed'\n /** Unknown state */\n | 'unknown';\n\nexport interface CrossChainStatusResponse {\n /**\n * Cross-chain transaction identifier.\n *\n * For CCIP: The CCIP message ID.\n * For DeBridge: The DeBridge order ID.\n */\n messageId: string | null;\n /** Current status of the cross-chain transaction. */\n status: CrossChainStatus;\n /** Human-readable status description */\n description: string;\n /** Source chain information */\n sourceChain: {\n /** Source chain network name */\n name: string;\n /** Source chain transaction hash */\n transactionHash: Hash | Signature;\n /** Transaction timestamp on source chain (ISO 8601) */\n timestamp: string;\n /** When the source transaction was finalized (ISO 8601) */\n finalized: string | boolean | null;\n };\n /** Destination chain information */\n destinationChain: {\n /** Destination chain network name */\n name: string | null;\n /**\n * Destination chain tx hash.\n *\n * - For direct transfers (USDC -> USDC): The CCIP bridge transaction hash.\n * - For successful swaps: The actual swap transaction hash from the relayer.\n * - For pending swaps: null (swap not yet executed).\n */\n transactionHash: Hash | Signature | null;\n /**\n * CCIP bridge tx hash (only present for swaps, not direct transfers).\n *\n * This is the transaction that delivered USDC to the destination chain via CCIP.\n * The `transactionHash` field contains the subsequent swap transaction.\n */\n bridgeHash?: Hash | Signature | null;\n /** Transaction timestamp on destination chain (null if not yet executed) (ISO 8601) */\n timestamp: string | null;\n /** When the destination transaction was finalized (null if not yet executed) (ISO 8601) */\n finalized: string | null;\n };\n /** Transaction progress information */\n progress: {\n /** Whether the message has been committed on destination chain */\n committed: boolean;\n /** When the message was committed (null if not committed) (ISO 8601) */\n commitTimestamp?: string | null;\n /** Whether the message has been executed on destination chain */\n executed: boolean;\n };\n /** Fee information */\n fees: {\n /** Fee token address */\n token: EvmAddress | SolAddress | null;\n /** Fee amount in wei */\n amount: bigint | null;\n } | null;\n /** Tokens transferred in this cross-chain transaction */\n transferredTokens: ReadonlyArray<{\n /** Token address */\n token: EvmAddress | SolAddress;\n /** Token amount */\n amount: bigint;\n }>;\n /**\n * Debug information from Markr transaction API (only present for swaps that have been executed).\n *\n * Contains detailed information about the relayer execution, retry attempts, and transaction details.\n */\n debug?: Partial<{\n /** CCIP message ID */\n messageId: string;\n /** Execution status from relayer */\n status: string;\n /** Destination chain name */\n destinationChain: string;\n /** Destination swap transaction hash */\n destinationTxHash: string;\n /** Relay transaction hash */\n relayTxHash: string;\n /** Number of retry attempts */\n retryCount: number;\n /** Timestamp of last retry attempt (ISO 8601) */\n lastRetryAt: string;\n /** Source chain name */\n sourceChain: string;\n /** Source transaction hash */\n sourceTxHash: string;\n /** When the record was created (ISO 8601) */\n createdAt: string;\n }> | null;\n}\n\nconst ISO_8601_TIMEZONE_DESIGNATOR_REGEX = /[zZ]|[+-]\\d{2}:?\\d{2}$/;\n\n// Markr API returns ISO-8601 datetime strings that are sometimes missing a timezone designator (\"local\" ISO).\n// We assume these are meant to be UTC and append 'Z' if missing, then validate as strict ISO-8601 with timezone.\nconst datetime = z.iso\n .datetime({ local: true })\n .refine(\n (value) => {\n // Accept at least local ISO format\n // If missing timezone, treat as UTC\n const hasTimezone = ISO_8601_TIMEZONE_DESIGNATOR_REGEX.test(value);\n const isoString = hasTimezone ? value : value + 'Z';\n // Validate as strict ISO-8601 with timezone\n return z.iso.datetime().safeParse(isoString).success;\n },\n {\n error: 'Invalid ISO-8601 datetime (must be valid with timezone, or local assumed UTC)',\n },\n )\n .transform((value) => {\n const hasTimezone = ISO_8601_TIMEZONE_DESIGNATOR_REGEX.test(value);\n return hasTimezone ? value : value + 'Z';\n });\n\nexport const CrossChainStatusResponseSchema: z.ZodType<CrossChainStatusResponse> = z.object({\n messageId: z.string().nullable(),\n status: z.enum(['pending', 'committed', 'pending_execution', 'completed', 'failed', 'refunded', 'unknown']),\n description: z.string(),\n sourceChain: z.object({\n name: z.string(),\n transactionHash: z.union([HashSchema, SolSignatureSchema]),\n timestamp: datetime,\n finalized: datetime.or(z.boolean()).nullable(),\n }),\n destinationChain: z.object({\n name: z.string().nullable(),\n transactionHash: z.union([HashSchema, SolSignatureSchema]).nullable(),\n bridgeHash: z.union([HashSchema, SolSignatureSchema]).nullable().optional(),\n timestamp: datetime.nullable(),\n finalized: datetime.nullable(),\n }),\n progress: z.object({\n committed: z.boolean(),\n commitTimestamp: datetime.nullable().optional(),\n executed: z.boolean(),\n }),\n fees: z\n .object({\n token: z.union([EvmAddressSchema, SolAddressSchema]).nullable(),\n amount: z.coerce.bigint().nonnegative().nullable(),\n })\n .nullable(),\n transferredTokens: z.array(\n z.object({\n token: z.union([EvmAddressSchema, SolAddressSchema]),\n amount: z.coerce.bigint().nonnegative(),\n }),\n ),\n debug: z\n .looseObject({\n messageId: z.string(),\n status: z.string(),\n destinationChain: z.string(),\n destinationTxHash: z.string(),\n relayTxHash: z.string(),\n retryCount: z.number().int().nonnegative(),\n lastRetryAt: z.iso.datetime(),\n sourceChain: z.string(),\n sourceTxHash: z.string(),\n createdAt: z.iso.datetime(),\n })\n .partial()\n .nullable()\n .optional(),\n});\n\nexport interface SpenderAddressResponse {\n address: EvmAddress;\n}\n\nexport const SpenderAddressResponseSchema: z.ZodType<SpenderAddressResponse> = z.object({\n address: EvmAddressSchema,\n});\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{isCaip2ChainId as e}from"../../utils/caip.js";import{EvmAddressSchema as t,HashSchema as n,HexSchema as r,SolAddressSchema as i,SolSignatureSchema as a}from"../service-schemas.js";import{z as o}from"zod";const s=o.string().refine(t=>e(t),{message:`Invalid CAIP-2 chain ID`}).transform(e=>e),c=o.object({chainId:o.union([o.number(),o.string()]),chainType:o.string(),enabled_services:o.array(o.enum([`cross-chain-swap`,`cross-chain-quote`,`quote`,`swap`,`token-list`])),logo_url:o.url(),name:o.string(),lanes:o.array(o.union([o.coerce.number().int().nonnegative(),s]))}),l=c.extend({chainId:o.coerce.number().int().nonnegative(),chainType:o.literal(`evm`),router:t.optional(),wrapped_token:t.optional()}),u=c.extend({chainId:o.string().refine(t=>e(t)&&t.startsWith(`solana:`),{error:`Is not a valid Solana CAIP-2 ID`}).transform(e=>e),chainType:o.literal(`svm`)}),d=o.array(o.union([l,u,c.refine(e=>e.chainType!==`evm`&&e.chainType!==`svm`,`Known chain types must match their expected schema`)])),f=o.array(o.object({address:t,decimals:o.number().int().nonnegative().max(18),logo_url:o.url(),name:o.string(),symbol:o.string()})),p=o.union([o.object({aggregator:o.object({id:o.string(),logo_url:o.url(),name:o.string()}),amountIn:o.coerce.bigint().nonnegative(),amountOut:o.coerce.bigint().nonnegative(),chainId:o.union([o.number().int().nonnegative(),s]),expiredAt:o.number().int().nonnegative(),fees:o.array(o.object({type:o.enum([`protocol`,`gas`,`bridge`,`slippage`,`swap`,`other`]),name:o.string(),amount:o.coerce.bigint().nonnegative(),token:o.object({chainId:o.union([o.number().int().nonnegative(),s]),address:o.union([t,i])}),extra:o.boolean().optional()})).optional(),gasEstimate:o.coerce.bigint().nonnegative().optional(),recommendedSlippage:o.number().int().nonnegative(),tokenIn:o.union([t,i]),tokenInDecimals:o.number().int().nonnegative().max(18),tokenOut:o.union([t,i]),tokenOutDecimals:o.number().int().nonnegative().max(18),uuid:o.uuid()}),o.object({done:o.literal(!0)})]),m=o.object({data:r,to:t,value:o.coerce.bigint().nonnegative()}),h=o.object({chainType:o.literal(`svm`),swapTransaction:o.base64()}),g=o.union([m,h]),_=o.object({fee:o.int().nonnegative(),name:o.string()}),v=/[zZ]|[+-]\d{2}:?\d{2}$/,y=o.iso.datetime({local:!0}).refine(e=>{let t=v.test(e)?e:e+`Z`;return o.iso.datetime().safeParse(t).success},{error:`Invalid ISO-8601 datetime (must be valid with timezone, or local assumed UTC)`}).transform(e=>v.test(e)?e:e+`Z`),b=o.object({messageId:o.string().nullable(),status:o.enum([`pending`,`committed`,`pending_execution`,`completed`,`failed`,`refunded`,`unknown`]),description:o.string(),sourceChain:o.object({name:o.string(),transactionHash:o.union([n,a]),timestamp:y,finalized:y.or(o.boolean()).nullable()}),destinationChain:o.object({name:o.string().nullable(),transactionHash:o.union([n,a]).nullable(),bridgeHash:o.union([n,a]).nullable().optional(),timestamp:y.nullable(),finalized:y.nullable()}),progress:o.object({committed:o.boolean(),commitTimestamp:y.nullable().optional(),executed:o.boolean()}),fees:o.object({token:o.union([t,i]).nullable(),amount:o.coerce.bigint().nonnegative().nullable()}).nullable(),transferredTokens:o.array(o.object({token:o.union([t,i]),amount:o.coerce.bigint().nonnegative()})),debug:o.looseObject({messageId:o.string(),status:o.string(),destinationChain:o.string(),destinationTxHash:o.string(),relayTxHash:o.string(),retryCount:o.number().int().nonnegative(),lastRetryAt:o.iso.datetime(),sourceChain:o.string(),sourceTxHash:o.string(),createdAt:o.iso.datetime()}).partial().nullable().optional()}),x=o.object({address:t});export{b as CrossChainStatusResponseSchema,_ as PartnerInfoResponseSchema,p as QuoteResponseSchema,x as SpenderAddressResponseSchema,d as SupportedChainsResponseSchema,g as SwapResponseSchema,f as TokenListResponseSchema};
2
+ //# sourceMappingURL=_schema.js.map