@avalabs/fusion-sdk 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (398) hide show
  1. package/LICENSE +9 -0
  2. package/README.md +264 -0
  3. package/dist/_utils/chain.cjs +2 -0
  4. package/dist/_utils/chain.cjs.map +1 -0
  5. package/dist/_utils/chain.js +2 -0
  6. package/dist/_utils/chain.js.map +1 -0
  7. package/dist/_utils/math.cjs +2 -0
  8. package/dist/_utils/math.cjs.map +1 -0
  9. package/dist/_utils/math.js +2 -0
  10. package/dist/_utils/math.js.map +1 -0
  11. package/dist/_utils/merge-assets.cjs +2 -0
  12. package/dist/_utils/merge-assets.cjs.map +1 -0
  13. package/dist/_utils/merge-assets.js +2 -0
  14. package/dist/_utils/merge-assets.js.map +1 -0
  15. package/dist/_virtual/_rolldown/runtime.cjs +1 -0
  16. package/dist/constants.cjs +2 -0
  17. package/dist/constants.cjs.map +1 -0
  18. package/dist/constants.d.cts +102 -0
  19. package/dist/constants.d.ts +102 -0
  20. package/dist/constants.js +2 -0
  21. package/dist/constants.js.map +1 -0
  22. package/dist/errors.cjs +2 -0
  23. package/dist/errors.cjs.map +1 -0
  24. package/dist/errors.d.cts +115 -0
  25. package/dist/errors.d.ts +115 -0
  26. package/dist/errors.js +2 -0
  27. package/dist/errors.js.map +1 -0
  28. package/dist/mod.cjs +1 -0
  29. package/dist/mod.d.cts +19 -0
  30. package/dist/mod.d.ts +19 -0
  31. package/dist/mod.js +1 -0
  32. package/dist/quoter/_utils.cjs +2 -0
  33. package/dist/quoter/_utils.cjs.map +1 -0
  34. package/dist/quoter/_utils.js +2 -0
  35. package/dist/quoter/_utils.js.map +1 -0
  36. package/dist/quoter/constants.cjs +2 -0
  37. package/dist/quoter/constants.cjs.map +1 -0
  38. package/dist/quoter/constants.js +2 -0
  39. package/dist/quoter/constants.js.map +1 -0
  40. package/dist/quoter/quoter.cjs +2 -0
  41. package/dist/quoter/quoter.cjs.map +1 -0
  42. package/dist/quoter/quoter.d.cts +31 -0
  43. package/dist/quoter/quoter.d.ts +34 -0
  44. package/dist/quoter/quoter.js +2 -0
  45. package/dist/quoter/quoter.js.map +1 -0
  46. package/dist/transfer-manager.cjs +2 -0
  47. package/dist/transfer-manager.cjs.map +1 -0
  48. package/dist/transfer-manager.d.cts +17 -0
  49. package/dist/transfer-manager.d.ts +17 -0
  50. package/dist/transfer-manager.js +2 -0
  51. package/dist/transfer-manager.js.map +1 -0
  52. package/dist/transfer-service/_abis.cjs +2 -0
  53. package/dist/transfer-service/_abis.cjs.map +1 -0
  54. package/dist/transfer-service/_abis.js +2 -0
  55. package/dist/transfer-service/_abis.js.map +1 -0
  56. package/dist/transfer-service/_evm-gas.cjs +2 -0
  57. package/dist/transfer-service/_evm-gas.cjs.map +1 -0
  58. package/dist/transfer-service/_evm-gas.js +2 -0
  59. package/dist/transfer-service/_evm-gas.js.map +1 -0
  60. package/dist/transfer-service/_tracking-utilities.cjs +2 -0
  61. package/dist/transfer-service/_tracking-utilities.cjs.map +1 -0
  62. package/dist/transfer-service/_tracking-utilities.js +2 -0
  63. package/dist/transfer-service/_tracking-utilities.js.map +1 -0
  64. package/dist/transfer-service/_transfer-utilities.cjs +2 -0
  65. package/dist/transfer-service/_transfer-utilities.cjs.map +1 -0
  66. package/dist/transfer-service/_transfer-utilities.js +2 -0
  67. package/dist/transfer-service/_transfer-utilities.js.map +1 -0
  68. package/dist/transfer-service/_utils.cjs +2 -0
  69. package/dist/transfer-service/_utils.cjs.map +1 -0
  70. package/dist/transfer-service/_utils.js +2 -0
  71. package/dist/transfer-service/_utils.js.map +1 -0
  72. package/dist/transfer-service/_warden-config-schema.cjs +2 -0
  73. package/dist/transfer-service/_warden-config-schema.cjs.map +1 -0
  74. package/dist/transfer-service/_warden-config-schema.js +2 -0
  75. package/dist/transfer-service/_warden-config-schema.js.map +1 -0
  76. package/dist/transfer-service/_warden-config.cjs +2 -0
  77. package/dist/transfer-service/_warden-config.cjs.map +1 -0
  78. package/dist/transfer-service/_warden-config.js +2 -0
  79. package/dist/transfer-service/_warden-config.js.map +1 -0
  80. package/dist/transfer-service/avalanche-evm/_constants.cjs +2 -0
  81. package/dist/transfer-service/avalanche-evm/_constants.cjs.map +1 -0
  82. package/dist/transfer-service/avalanche-evm/_constants.js +2 -0
  83. package/dist/transfer-service/avalanche-evm/_constants.js.map +1 -0
  84. package/dist/transfer-service/avalanche-evm/_handlers/analyze-support.cjs +2 -0
  85. package/dist/transfer-service/avalanche-evm/_handlers/analyze-support.cjs.map +1 -0
  86. package/dist/transfer-service/avalanche-evm/_handlers/analyze-support.js +2 -0
  87. package/dist/transfer-service/avalanche-evm/_handlers/analyze-support.js.map +1 -0
  88. package/dist/transfer-service/avalanche-evm/_handlers/estimate-native-fee.cjs +2 -0
  89. package/dist/transfer-service/avalanche-evm/_handlers/estimate-native-fee.cjs.map +1 -0
  90. package/dist/transfer-service/avalanche-evm/_handlers/estimate-native-fee.js +2 -0
  91. package/dist/transfer-service/avalanche-evm/_handlers/estimate-native-fee.js.map +1 -0
  92. package/dist/transfer-service/avalanche-evm/_handlers/get-assets.cjs +2 -0
  93. package/dist/transfer-service/avalanche-evm/_handlers/get-assets.cjs.map +1 -0
  94. package/dist/transfer-service/avalanche-evm/_handlers/get-assets.js +2 -0
  95. package/dist/transfer-service/avalanche-evm/_handlers/get-assets.js.map +1 -0
  96. package/dist/transfer-service/avalanche-evm/_handlers/get-minimum-transfer-amount.cjs +2 -0
  97. package/dist/transfer-service/avalanche-evm/_handlers/get-minimum-transfer-amount.cjs.map +1 -0
  98. package/dist/transfer-service/avalanche-evm/_handlers/get-minimum-transfer-amount.js +2 -0
  99. package/dist/transfer-service/avalanche-evm/_handlers/get-minimum-transfer-amount.js.map +1 -0
  100. package/dist/transfer-service/avalanche-evm/_handlers/get-supported-chains.cjs +2 -0
  101. package/dist/transfer-service/avalanche-evm/_handlers/get-supported-chains.cjs.map +1 -0
  102. package/dist/transfer-service/avalanche-evm/_handlers/get-supported-chains.js +2 -0
  103. package/dist/transfer-service/avalanche-evm/_handlers/get-supported-chains.js.map +1 -0
  104. package/dist/transfer-service/avalanche-evm/_handlers/stream-quotes.cjs +2 -0
  105. package/dist/transfer-service/avalanche-evm/_handlers/stream-quotes.cjs.map +1 -0
  106. package/dist/transfer-service/avalanche-evm/_handlers/stream-quotes.js +2 -0
  107. package/dist/transfer-service/avalanche-evm/_handlers/stream-quotes.js.map +1 -0
  108. package/dist/transfer-service/avalanche-evm/_handlers/track-transfer.cjs +2 -0
  109. package/dist/transfer-service/avalanche-evm/_handlers/track-transfer.cjs.map +1 -0
  110. package/dist/transfer-service/avalanche-evm/_handlers/track-transfer.js +2 -0
  111. package/dist/transfer-service/avalanche-evm/_handlers/track-transfer.js.map +1 -0
  112. package/dist/transfer-service/avalanche-evm/_handlers/transfer-asset.cjs +2 -0
  113. package/dist/transfer-service/avalanche-evm/_handlers/transfer-asset.cjs.map +1 -0
  114. package/dist/transfer-service/avalanche-evm/_handlers/transfer-asset.js +2 -0
  115. package/dist/transfer-service/avalanche-evm/_handlers/transfer-asset.js.map +1 -0
  116. package/dist/transfer-service/avalanche-evm/_utils/fee.cjs +2 -0
  117. package/dist/transfer-service/avalanche-evm/_utils/fee.cjs.map +1 -0
  118. package/dist/transfer-service/avalanche-evm/_utils/fee.js +2 -0
  119. package/dist/transfer-service/avalanche-evm/_utils/fee.js.map +1 -0
  120. package/dist/transfer-service/avalanche-evm/_utils/get-config.cjs +2 -0
  121. package/dist/transfer-service/avalanche-evm/_utils/get-config.cjs.map +1 -0
  122. package/dist/transfer-service/avalanche-evm/_utils/get-config.js +2 -0
  123. package/dist/transfer-service/avalanche-evm/_utils/get-config.js.map +1 -0
  124. package/dist/transfer-service/avalanche-evm/_utils/transfer-data.cjs +2 -0
  125. package/dist/transfer-service/avalanche-evm/_utils/transfer-data.cjs.map +1 -0
  126. package/dist/transfer-service/avalanche-evm/_utils/transfer-data.js +2 -0
  127. package/dist/transfer-service/avalanche-evm/_utils/transfer-data.js.map +1 -0
  128. package/dist/transfer-service/avalanche-evm/_utils/unwrap.cjs +2 -0
  129. package/dist/transfer-service/avalanche-evm/_utils/unwrap.cjs.map +1 -0
  130. package/dist/transfer-service/avalanche-evm/_utils/unwrap.js +2 -0
  131. package/dist/transfer-service/avalanche-evm/_utils/unwrap.js.map +1 -0
  132. package/dist/transfer-service/avalanche-evm/_utils/validations.cjs +2 -0
  133. package/dist/transfer-service/avalanche-evm/_utils/validations.cjs.map +1 -0
  134. package/dist/transfer-service/avalanche-evm/_utils/validations.js +2 -0
  135. package/dist/transfer-service/avalanche-evm/_utils/validations.js.map +1 -0
  136. package/dist/transfer-service/avalanche-evm/_utils/wrap.cjs +2 -0
  137. package/dist/transfer-service/avalanche-evm/_utils/wrap.cjs.map +1 -0
  138. package/dist/transfer-service/avalanche-evm/_utils/wrap.js +2 -0
  139. package/dist/transfer-service/avalanche-evm/_utils/wrap.js.map +1 -0
  140. package/dist/transfer-service/avalanche-evm/avalanche-evm-service.cjs +2 -0
  141. package/dist/transfer-service/avalanche-evm/avalanche-evm-service.cjs.map +1 -0
  142. package/dist/transfer-service/avalanche-evm/avalanche-evm-service.js +2 -0
  143. package/dist/transfer-service/avalanche-evm/avalanche-evm-service.js.map +1 -0
  144. package/dist/transfer-service/fetch-utilities.cjs +4 -0
  145. package/dist/transfer-service/fetch-utilities.cjs.map +1 -0
  146. package/dist/transfer-service/fetch-utilities.js +4 -0
  147. package/dist/transfer-service/fetch-utilities.js.map +1 -0
  148. package/dist/transfer-service/lombard/_schema.cjs +2 -0
  149. package/dist/transfer-service/lombard/_schema.cjs.map +1 -0
  150. package/dist/transfer-service/lombard/_schema.js +2 -0
  151. package/dist/transfer-service/lombard/_schema.js.map +1 -0
  152. package/dist/transfer-service/lombard/_utils/asset.cjs +2 -0
  153. package/dist/transfer-service/lombard/_utils/asset.cjs.map +1 -0
  154. package/dist/transfer-service/lombard/_utils/asset.js +2 -0
  155. package/dist/transfer-service/lombard/_utils/asset.js.map +1 -0
  156. package/dist/transfer-service/lombard/_utils/chain.cjs +2 -0
  157. package/dist/transfer-service/lombard/_utils/chain.cjs.map +1 -0
  158. package/dist/transfer-service/lombard/_utils/chain.js +2 -0
  159. package/dist/transfer-service/lombard/_utils/chain.js.map +1 -0
  160. package/dist/transfer-service/lombard/_utils/fee.cjs +2 -0
  161. package/dist/transfer-service/lombard/_utils/fee.cjs.map +1 -0
  162. package/dist/transfer-service/lombard/_utils/fee.js +2 -0
  163. package/dist/transfer-service/lombard/_utils/fee.js.map +1 -0
  164. package/dist/transfer-service/lombard/_utils/metadata.cjs +2 -0
  165. package/dist/transfer-service/lombard/_utils/metadata.cjs.map +1 -0
  166. package/dist/transfer-service/lombard/_utils/metadata.js +2 -0
  167. package/dist/transfer-service/lombard/_utils/metadata.js.map +1 -0
  168. package/dist/transfer-service/lombard/_utils/utxo.cjs +2 -0
  169. package/dist/transfer-service/lombard/_utils/utxo.cjs.map +1 -0
  170. package/dist/transfer-service/lombard/_utils/utxo.js +2 -0
  171. package/dist/transfer-service/lombard/_utils/utxo.js.map +1 -0
  172. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/analyze-support.cjs +2 -0
  173. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/analyze-support.cjs.map +1 -0
  174. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/analyze-support.js +2 -0
  175. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/analyze-support.js.map +1 -0
  176. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/estimate-native-fee.cjs +2 -0
  177. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/estimate-native-fee.cjs.map +1 -0
  178. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/estimate-native-fee.js +2 -0
  179. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/estimate-native-fee.js.map +1 -0
  180. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/get-assets.cjs +2 -0
  181. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/get-assets.cjs.map +1 -0
  182. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/get-assets.js +2 -0
  183. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/get-assets.js.map +1 -0
  184. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/get-minimum-transfer-amount.cjs +2 -0
  185. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/get-minimum-transfer-amount.cjs.map +1 -0
  186. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/get-minimum-transfer-amount.js +2 -0
  187. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/get-minimum-transfer-amount.js.map +1 -0
  188. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/stream-quotes.cjs +2 -0
  189. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/stream-quotes.cjs.map +1 -0
  190. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/stream-quotes.js +2 -0
  191. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/stream-quotes.js.map +1 -0
  192. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/track-transfer.cjs +2 -0
  193. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/track-transfer.cjs.map +1 -0
  194. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/track-transfer.js +2 -0
  195. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/track-transfer.js.map +1 -0
  196. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/transfer-asset.cjs +2 -0
  197. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/transfer-asset.cjs.map +1 -0
  198. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/transfer-asset.js +2 -0
  199. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/transfer-asset.js.map +1 -0
  200. package/dist/transfer-service/lombard/btc-to-btcb-service.cjs +2 -0
  201. package/dist/transfer-service/lombard/btc-to-btcb-service.cjs.map +1 -0
  202. package/dist/transfer-service/lombard/btc-to-btcb-service.js +2 -0
  203. package/dist/transfer-service/lombard/btc-to-btcb-service.js.map +1 -0
  204. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/analyze-support.cjs +2 -0
  205. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/analyze-support.cjs.map +1 -0
  206. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/analyze-support.js +2 -0
  207. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/analyze-support.js.map +1 -0
  208. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/estimate-native-fee.cjs +2 -0
  209. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/estimate-native-fee.cjs.map +1 -0
  210. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/estimate-native-fee.js +2 -0
  211. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/estimate-native-fee.js.map +1 -0
  212. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/get-assets.cjs +2 -0
  213. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/get-assets.cjs.map +1 -0
  214. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/get-assets.js +2 -0
  215. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/get-assets.js.map +1 -0
  216. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/stream-quotes.cjs +2 -0
  217. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/stream-quotes.cjs.map +1 -0
  218. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/stream-quotes.js +2 -0
  219. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/stream-quotes.js.map +1 -0
  220. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/track-transfer.cjs +2 -0
  221. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/track-transfer.cjs.map +1 -0
  222. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/track-transfer.js +2 -0
  223. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/track-transfer.js.map +1 -0
  224. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/transfer-asset.cjs +2 -0
  225. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/transfer-asset.cjs.map +1 -0
  226. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/transfer-asset.js +2 -0
  227. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/transfer-asset.js.map +1 -0
  228. package/dist/transfer-service/lombard/btcb-to-btc-service.cjs +2 -0
  229. package/dist/transfer-service/lombard/btcb-to-btc-service.cjs.map +1 -0
  230. package/dist/transfer-service/lombard/btcb-to-btc-service.js +2 -0
  231. package/dist/transfer-service/lombard/btcb-to-btc-service.js.map +1 -0
  232. package/dist/transfer-service/lombard/constants.cjs +2 -0
  233. package/dist/transfer-service/lombard/constants.cjs.map +1 -0
  234. package/dist/transfer-service/lombard/constants.js +2 -0
  235. package/dist/transfer-service/lombard/constants.js.map +1 -0
  236. package/dist/transfer-service/markr/_abis/cross-chain-swap-wrapper-abi.cjs +2 -0
  237. package/dist/transfer-service/markr/_abis/cross-chain-swap-wrapper-abi.cjs.map +1 -0
  238. package/dist/transfer-service/markr/_abis/cross-chain-swap-wrapper-abi.js +2 -0
  239. package/dist/transfer-service/markr/_abis/cross-chain-swap-wrapper-abi.js.map +1 -0
  240. package/dist/transfer-service/markr/_abis/swap-wrapper-abi.cjs +2 -0
  241. package/dist/transfer-service/markr/_abis/swap-wrapper-abi.cjs.map +1 -0
  242. package/dist/transfer-service/markr/_abis/swap-wrapper-abi.js +2 -0
  243. package/dist/transfer-service/markr/_abis/swap-wrapper-abi.js.map +1 -0
  244. package/dist/transfer-service/markr/_api.cjs +2 -0
  245. package/dist/transfer-service/markr/_api.cjs.map +1 -0
  246. package/dist/transfer-service/markr/_api.js +2 -0
  247. package/dist/transfer-service/markr/_api.js.map +1 -0
  248. package/dist/transfer-service/markr/_handlers/analyze-support.cjs +2 -0
  249. package/dist/transfer-service/markr/_handlers/analyze-support.cjs.map +1 -0
  250. package/dist/transfer-service/markr/_handlers/analyze-support.js +2 -0
  251. package/dist/transfer-service/markr/_handlers/analyze-support.js.map +1 -0
  252. package/dist/transfer-service/markr/_handlers/estimate-native-fee.cjs +2 -0
  253. package/dist/transfer-service/markr/_handlers/estimate-native-fee.cjs.map +1 -0
  254. package/dist/transfer-service/markr/_handlers/estimate-native-fee.js +2 -0
  255. package/dist/transfer-service/markr/_handlers/estimate-native-fee.js.map +1 -0
  256. package/dist/transfer-service/markr/_handlers/get-assets.cjs +2 -0
  257. package/dist/transfer-service/markr/_handlers/get-assets.cjs.map +1 -0
  258. package/dist/transfer-service/markr/_handlers/get-assets.js +2 -0
  259. package/dist/transfer-service/markr/_handlers/get-assets.js.map +1 -0
  260. package/dist/transfer-service/markr/_handlers/get-minimum-transfer-amount.cjs +2 -0
  261. package/dist/transfer-service/markr/_handlers/get-minimum-transfer-amount.cjs.map +1 -0
  262. package/dist/transfer-service/markr/_handlers/get-minimum-transfer-amount.js +2 -0
  263. package/dist/transfer-service/markr/_handlers/get-minimum-transfer-amount.js.map +1 -0
  264. package/dist/transfer-service/markr/_handlers/stream-quotes.cjs +2 -0
  265. package/dist/transfer-service/markr/_handlers/stream-quotes.cjs.map +1 -0
  266. package/dist/transfer-service/markr/_handlers/stream-quotes.js +2 -0
  267. package/dist/transfer-service/markr/_handlers/stream-quotes.js.map +1 -0
  268. package/dist/transfer-service/markr/_handlers/track-transfer.cjs +2 -0
  269. package/dist/transfer-service/markr/_handlers/track-transfer.cjs.map +1 -0
  270. package/dist/transfer-service/markr/_handlers/track-transfer.js +2 -0
  271. package/dist/transfer-service/markr/_handlers/track-transfer.js.map +1 -0
  272. package/dist/transfer-service/markr/_handlers/transfer-asset.cjs +2 -0
  273. package/dist/transfer-service/markr/_handlers/transfer-asset.cjs.map +1 -0
  274. package/dist/transfer-service/markr/_handlers/transfer-asset.js +2 -0
  275. package/dist/transfer-service/markr/_handlers/transfer-asset.js.map +1 -0
  276. package/dist/transfer-service/markr/_schema.cjs +2 -0
  277. package/dist/transfer-service/markr/_schema.cjs.map +1 -0
  278. package/dist/transfer-service/markr/_schema.js +2 -0
  279. package/dist/transfer-service/markr/_schema.js.map +1 -0
  280. package/dist/transfer-service/markr/_type-guards.cjs +2 -0
  281. package/dist/transfer-service/markr/_type-guards.cjs.map +1 -0
  282. package/dist/transfer-service/markr/_type-guards.js +2 -0
  283. package/dist/transfer-service/markr/_type-guards.js.map +1 -0
  284. package/dist/transfer-service/markr/_utils.cjs +2 -0
  285. package/dist/transfer-service/markr/_utils.cjs.map +1 -0
  286. package/dist/transfer-service/markr/_utils.js +2 -0
  287. package/dist/transfer-service/markr/_utils.js.map +1 -0
  288. package/dist/transfer-service/markr/constants.cjs +2 -0
  289. package/dist/transfer-service/markr/constants.cjs.map +1 -0
  290. package/dist/transfer-service/markr/constants.js +2 -0
  291. package/dist/transfer-service/markr/constants.js.map +1 -0
  292. package/dist/transfer-service/markr/markr-service.cjs +2 -0
  293. package/dist/transfer-service/markr/markr-service.cjs.map +1 -0
  294. package/dist/transfer-service/markr/markr-service.js +2 -0
  295. package/dist/transfer-service/markr/markr-service.js.map +1 -0
  296. package/dist/transfer-service/service-schemas.cjs +2 -0
  297. package/dist/transfer-service/service-schemas.cjs.map +1 -0
  298. package/dist/transfer-service/service-schemas.js +2 -0
  299. package/dist/transfer-service/service-schemas.js.map +1 -0
  300. package/dist/transfer-service/wrap-unwrap/_handlers/analyze-support.cjs +2 -0
  301. package/dist/transfer-service/wrap-unwrap/_handlers/analyze-support.cjs.map +1 -0
  302. package/dist/transfer-service/wrap-unwrap/_handlers/analyze-support.js +2 -0
  303. package/dist/transfer-service/wrap-unwrap/_handlers/analyze-support.js.map +1 -0
  304. package/dist/transfer-service/wrap-unwrap/_handlers/estimate-native-fee.cjs +2 -0
  305. package/dist/transfer-service/wrap-unwrap/_handlers/estimate-native-fee.cjs.map +1 -0
  306. package/dist/transfer-service/wrap-unwrap/_handlers/estimate-native-fee.js +2 -0
  307. package/dist/transfer-service/wrap-unwrap/_handlers/estimate-native-fee.js.map +1 -0
  308. package/dist/transfer-service/wrap-unwrap/_handlers/get-assets.cjs +2 -0
  309. package/dist/transfer-service/wrap-unwrap/_handlers/get-assets.cjs.map +1 -0
  310. package/dist/transfer-service/wrap-unwrap/_handlers/get-assets.js +2 -0
  311. package/dist/transfer-service/wrap-unwrap/_handlers/get-assets.js.map +1 -0
  312. package/dist/transfer-service/wrap-unwrap/_handlers/get-minimum-transfer-amount.cjs +2 -0
  313. package/dist/transfer-service/wrap-unwrap/_handlers/get-minimum-transfer-amount.cjs.map +1 -0
  314. package/dist/transfer-service/wrap-unwrap/_handlers/get-minimum-transfer-amount.js +2 -0
  315. package/dist/transfer-service/wrap-unwrap/_handlers/get-minimum-transfer-amount.js.map +1 -0
  316. package/dist/transfer-service/wrap-unwrap/_handlers/stream-quotes.cjs +2 -0
  317. package/dist/transfer-service/wrap-unwrap/_handlers/stream-quotes.cjs.map +1 -0
  318. package/dist/transfer-service/wrap-unwrap/_handlers/stream-quotes.js +2 -0
  319. package/dist/transfer-service/wrap-unwrap/_handlers/stream-quotes.js.map +1 -0
  320. package/dist/transfer-service/wrap-unwrap/_handlers/track-transfer.cjs +2 -0
  321. package/dist/transfer-service/wrap-unwrap/_handlers/track-transfer.cjs.map +1 -0
  322. package/dist/transfer-service/wrap-unwrap/_handlers/track-transfer.js +2 -0
  323. package/dist/transfer-service/wrap-unwrap/_handlers/track-transfer.js.map +1 -0
  324. package/dist/transfer-service/wrap-unwrap/_handlers/transfer-asset.cjs +2 -0
  325. package/dist/transfer-service/wrap-unwrap/_handlers/transfer-asset.cjs.map +1 -0
  326. package/dist/transfer-service/wrap-unwrap/_handlers/transfer-asset.js +2 -0
  327. package/dist/transfer-service/wrap-unwrap/_handlers/transfer-asset.js.map +1 -0
  328. package/dist/transfer-service/wrap-unwrap/_utils.cjs +2 -0
  329. package/dist/transfer-service/wrap-unwrap/_utils.cjs.map +1 -0
  330. package/dist/transfer-service/wrap-unwrap/_utils.js +2 -0
  331. package/dist/transfer-service/wrap-unwrap/_utils.js.map +1 -0
  332. package/dist/transfer-service/wrap-unwrap/constants.cjs +2 -0
  333. package/dist/transfer-service/wrap-unwrap/constants.cjs.map +1 -0
  334. package/dist/transfer-service/wrap-unwrap/constants.js +2 -0
  335. package/dist/transfer-service/wrap-unwrap/constants.js.map +1 -0
  336. package/dist/transfer-service/wrap-unwrap/wrap-unwrap-service.cjs +2 -0
  337. package/dist/transfer-service/wrap-unwrap/wrap-unwrap-service.cjs.map +1 -0
  338. package/dist/transfer-service/wrap-unwrap/wrap-unwrap-service.js +2 -0
  339. package/dist/transfer-service/wrap-unwrap/wrap-unwrap-service.js.map +1 -0
  340. package/dist/type-guards.cjs +2 -0
  341. package/dist/type-guards.cjs.map +1 -0
  342. package/dist/type-guards.d.cts +16 -0
  343. package/dist/type-guards.d.ts +16 -0
  344. package/dist/type-guards.js +2 -0
  345. package/dist/type-guards.js.map +1 -0
  346. package/dist/types/asset.d.cts +61 -0
  347. package/dist/types/asset.d.ts +61 -0
  348. package/dist/types/bitcoin.d.cts +66 -0
  349. package/dist/types/bitcoin.d.ts +66 -0
  350. package/dist/types/caip.d.cts +30 -0
  351. package/dist/types/caip.d.ts +30 -0
  352. package/dist/types/chain.d.cts +17 -0
  353. package/dist/types/chain.d.ts +17 -0
  354. package/dist/types/fee.d.cts +13 -0
  355. package/dist/types/fee.d.ts +13 -0
  356. package/dist/types/quote.d.cts +140 -0
  357. package/dist/types/quote.d.ts +140 -0
  358. package/dist/types/service.d.cts +224 -0
  359. package/dist/types/service.d.ts +224 -0
  360. package/dist/types/signer.d.cts +50 -0
  361. package/dist/types/signer.d.ts +50 -0
  362. package/dist/types/transfer-manager.d.cts +115 -0
  363. package/dist/types/transfer-manager.d.ts +115 -0
  364. package/dist/types/transfer.d.cts +107 -0
  365. package/dist/types/transfer.d.ts +107 -0
  366. package/dist/types/utility-types.d.cts +21 -0
  367. package/dist/types/utility-types.d.ts +21 -0
  368. package/dist/utils/bitcoin-address.cjs +2 -0
  369. package/dist/utils/bitcoin-address.cjs.map +1 -0
  370. package/dist/utils/bitcoin-address.js +2 -0
  371. package/dist/utils/bitcoin-address.js.map +1 -0
  372. package/dist/utils/caip.cjs +2 -0
  373. package/dist/utils/caip.cjs.map +1 -0
  374. package/dist/utils/caip.d.cts +49 -0
  375. package/dist/utils/caip.d.ts +49 -0
  376. package/dist/utils/caip.js +2 -0
  377. package/dist/utils/caip.js.map +1 -0
  378. package/dist/utils/evm-address.cjs +2 -0
  379. package/dist/utils/evm-address.cjs.map +1 -0
  380. package/dist/utils/evm-address.js +2 -0
  381. package/dist/utils/evm-address.js.map +1 -0
  382. package/dist/utils/quote-fees.cjs +2 -0
  383. package/dist/utils/quote-fees.cjs.map +1 -0
  384. package/dist/utils/quote-fees.js +2 -0
  385. package/dist/utils/quote-fees.js.map +1 -0
  386. package/dist/utils/sol-address.cjs +2 -0
  387. package/dist/utils/sol-address.cjs.map +1 -0
  388. package/dist/utils/sol-address.js +2 -0
  389. package/dist/utils/sol-address.js.map +1 -0
  390. package/dist/utils/solana-transaction.d.cts +15 -0
  391. package/dist/utils/solana-transaction.d.ts +17 -0
  392. package/dist/utils/transfer-utils.cjs +2 -0
  393. package/dist/utils/transfer-utils.cjs.map +1 -0
  394. package/dist/utils/transfer-utils.d.cts +8 -0
  395. package/dist/utils/transfer-utils.d.ts +8 -0
  396. package/dist/utils/transfer-utils.js +2 -0
  397. package/dist/utils/transfer-utils.js.map +1 -0
  398. package/package.json +63 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"estimate-native-fee.js","names":["isEvmAddress","isSolanaAddress"],"sources":["../../../../src/transfer-service/markr/_handlers/estimate-native-fee.ts"],"sourcesContent":["import {\n type CompiledTransactionMessage,\n getCompiledTransactionMessageDecoder,\n getTransactionDecoder,\n isAddress as isSolanaAddress,\n type Base64EncodedWireTransaction,\n type Rpc,\n type SolanaRpcApi,\n type TransactionMessageBytes,\n type TransactionMessageBytesBase64,\n} from '@solana/kit';\nimport { encodeFunctionData, erc20Abi, type Address as EvmAddress, isAddress as isEvmAddress } from 'viem';\nimport { ErrorCode, ErrorReason, InvalidParamsError, SdkError } from '../../../errors';\nimport type { EstimateNativeFeeOptions, NativeFeeEstimate, TransferService } from '../../../types/service';\nimport { applyFeeUnitsBpsMargin, getEvmClientForChain, getSolanaRpcForChain } from '../../_utils';\nimport { estimateEvmFeesPerGas } from '../../_evm-gas';\nimport { markrGetSpenderAddress, markrSwap, type ApiOptions } from '../_api';\nimport {\n assetToAddressString,\n calculateMarkrMinimumAmountOut,\n decodeMarkrRevertError,\n getMarkrSwapWrapperAbi,\n isTokenAddressNative,\n} from '../_utils';\nimport type { WrappedSwapTransactionResponse } from '../_schema';\nimport { isEvmSwapResponse, isSolanaSwapResponse } from '../_type-guards';\nimport { caip2ToEip155ChainId } from '../../../utils/caip';\nimport type { Quote } from '../../../types/quote';\nimport { isEvmNamespace, isSolanaNamespace } from '../../../_utils/chain';\n\n/**\n * This is just a fallback value used in the case that an\n * allowance approval is needed, and Markr didn't return us any gas estimate data.\n *\n * Just based on my review of some quotes, I think this is a reasonable estimate\n * left on the higher end.\n *\n * Assume this could need to change.\n */\nconst EVM_SWAP_FALLBACK_GAS_ESTIMATE = 700_000n;\n\n/**\n * Compute Budget program address.\n *\n * Used to detect `SetComputeUnitPrice` instructions when deriving\n * the Solana priority fee component from transaction message bytes.\n */\nconst SOLANA_COMPUTE_BUDGET_PROGRAM = 'ComputeBudget111111111111111111111111111111';\n\n/**\n * System Program address.\n *\n * Used to detect account-creation instructions and extract lamports\n * funded upfront for newly created system accounts.\n */\nconst SOLANA_SYSTEM_PROGRAM = '11111111111111111111111111111111';\n\n/**\n * Associated Token Account (ATA) program address.\n *\n * Used to detect ATA create instructions so the estimator can include\n * rent-exempt funding when the ATA does not already exist on-chain.\n */\nconst SOLANA_ASSOCIATED_TOKEN_PROGRAM = 'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL';\n\n/**\n * Legacy SPL Token program address.\n *\n * Used to detect close-account instructions that may refund lamports\n * from temporary token accounts back to the sender.\n */\nconst SOLANA_SPL_TOKEN_PROGRAM = 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA';\n\n/**\n * SPL Token-2022 program address.\n *\n * Used alongside the legacy token program for close-account detection\n * when computing expected refundable lamports.\n */\nconst SOLANA_SPL_TOKEN_2022_PROGRAM = 'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb';\n\n/**\n * SPL token account size for rent-exemption calculations.\n *\n * Used with `getMinimumBalanceForRentExemption` to estimate ATA\n * creation funding requirements.\n */\nconst SPL_TOKEN_ACCOUNT_SIZE_BYTES = 165n;\n\nexport interface EstimateNativeFeeFactoryConfig {\n apiOptions: ApiOptions;\n appId: string;\n}\n\ninterface CreatedRentAccount {\n address: string;\n kind: 'ata' | 'system';\n lamports: bigint;\n refunded: boolean;\n}\n\ninterface SolanaRentEstimate {\n createdAccounts: CreatedRentAccount[];\n rentFee: bigint;\n rentFeeNet: bigint;\n refundable: bigint;\n}\n\nexport function estimateNativeFeeFactory(config: EstimateNativeFeeFactoryConfig): TransferService['estimateNativeFee'] {\n return async (quote, options) => {\n // Either the source chain is EVM or Solana, we need to call different functions that\n // calculate the native fee depending on the chain kind.\n\n if (isEvmNamespace(quote.sourceChain.chainId)) {\n return await _estimateNativeFeeEvm(quote, options, config);\n }\n\n if (isSolanaNamespace(quote.sourceChain.chainId)) {\n return await _estimateNativeFeeSolana(quote, options, config);\n }\n\n throw new InvalidParamsError(\n ErrorReason.INVALID_PARAMS,\n `Unsupported source chain namespace for estimateNativeFee: ${quote.sourceChain.chainId}`,\n );\n };\n}\n\n/** @internal */\nexport async function _estimateNativeFeeEvm(\n quote: Quote,\n options: EstimateNativeFeeOptions | undefined,\n { apiOptions, appId }: EstimateNativeFeeFactoryConfig,\n): Promise<NativeFeeEstimate> {\n if (!isEvmAddress(quote.fromAddress)) {\n throw new InvalidParamsError(ErrorReason.INVALID_PARAMS, `Invalid fromAddress: ${quote.fromAddress}`);\n }\n\n const sourceClient = getEvmClientForChain({ chain: quote.sourceChain });\n\n const assetInAddressString = assetToAddressString(quote.assetIn, quote.sourceChain.chainId);\n\n if (!isEvmAddress(assetInAddressString)) {\n throw new SdkError(ErrorReason.INVALID_PARAMS, ErrorCode.INVALID_PARAMS, {\n details: `assetIn address is not a valid EVM address. Can not call estimateGas.`,\n });\n }\n\n const isAssetInNative = isTokenAddressNative(assetInAddressString);\n const isCrossChainSwap = quote.sourceChain.chainId.toLowerCase() !== quote.targetChain.chainId.toLowerCase();\n\n let allowanceApprovalGas = 0n;\n if (!isAssetInNative) {\n // Check if approval is needed, and if so, calculate the gas cost for the approval.\n let allowance: bigint;\n\n const { address: spenderAddress } = await markrGetSpenderAddress(\n apiOptions,\n caip2ToEip155ChainId(quote.sourceChain.chainId),\n isCrossChainSwap,\n );\n\n try {\n allowance = await sourceClient.readContract({\n address: assetInAddressString,\n abi: erc20Abi,\n functionName: 'allowance',\n args: [quote.fromAddress, spenderAddress],\n });\n } catch (error) {\n throw new SdkError('Error during allowance check', ErrorCode.VIEM_ERROR, {\n cause: error,\n details: 'Failed to read ERC20 allowance for Markr spender.',\n });\n }\n\n const approvalNeeded = allowance < quote.amountIn;\n\n if (approvalNeeded) {\n try {\n allowanceApprovalGas = await sourceClient.estimateGas({\n account: quote.fromAddress,\n to: assetInAddressString,\n data: encodeFunctionData({\n abi: erc20Abi,\n functionName: 'approve',\n args: [spenderAddress, quote.amountIn],\n }),\n value: 0n,\n });\n } catch (error) {\n throw new SdkError('Error during gas estimation', ErrorCode.VIEM_ERROR, {\n cause: error,\n details: 'Failed to estimate gas for ERC20 approval transaction.',\n });\n }\n }\n }\n\n const allowanceApprovalIsNeeded = allowanceApprovalGas > 0n;\n\n const minAmountOut = calculateMarkrMinimumAmountOut({\n amountOut: quote.amountOut,\n assetOut: quote.assetOut,\n slippageBps: quote.slippageBps,\n });\n\n const swap = await markrSwap(apiOptions, {\n amountIn: quote.amountIn.toString(),\n appId,\n minAmountOut: minAmountOut.toString(),\n tokenIn: assetInAddressString,\n tokenOut: assetToAddressString(quote.assetOut, quote.targetChain.chainId),\n uuid: quote.id,\n });\n\n if (!isEvmSwapResponse(swap)) {\n // Should hopefully never happen.\n throw new SdkError(ErrorReason.CHAIN_NOT_SUPPORTED, ErrorCode.INVALID_PARAMS, {\n details: `Received non-EVM swap response from Markr. Expected EVM transaction data for gas estimation, but got response with chainType ${swap.chainType}.`,\n });\n }\n\n let gasWithMargin = 0n;\n\n // If an approval is needed, we can't call `eth_estimateGas` on the\n // swap transaction because no actual allowance approval was performed yet,\n // so a gas estimation would fail due to needing allowance.\n //\n // So if an allowance approval is needed, we fall back to some other logic for\n // estimating the swap tx gas.\n if (allowanceApprovalIsNeeded) {\n // Attempt to use the Markr provided `gasEstimate` first if available.\n // Otherwise we attempt to get the gas from the `fees` component that are applicable\n // to the source chain. If neither of those are available, we fall back to a hardcoded value.\n if (quote.gasEstimate) {\n gasWithMargin = applyFeeUnitsBpsMargin(quote.gasEstimate, options?.feeUnitsMarginBps);\n } else {\n const sourceGasFee = quote.fees\n .filter((fee) => fee.type === 'gas' && fee.chainId === quote.sourceChain.chainId)\n .reduce((acc, fee) => acc + fee.amount, 0n);\n\n gasWithMargin = applyFeeUnitsBpsMargin(\n sourceGasFee || EVM_SWAP_FALLBACK_GAS_ESTIMATE,\n options?.feeUnitsMarginBps,\n );\n }\n } else {\n gasWithMargin = await _estimateGasFromSwapResponse({\n crossChain: isCrossChainSwap,\n feeUnitsMarginBps: options?.feeUnitsMarginBps,\n fromAddress: quote.fromAddress,\n sourceClient,\n swap,\n });\n }\n\n const fees = await estimateEvmFeesPerGas(sourceClient, quote.sourceChain, options?.overrides?.feeRateTier);\n\n const maxFeePerGas = options?.overrides?.maxFeePerGas ?? fees.maxFeePerGas;\n const maxPriorityFeePerGas = options?.overrides?.maxPriorityFeePerGas ?? fees.maxPriorityFeePerGas;\n\n const totalFee =\n (gasWithMargin + applyFeeUnitsBpsMargin(allowanceApprovalGas, options?.feeUnitsMarginBps)) * maxFeePerGas;\n\n return {\n asset: quote.sourceChain.networkToken,\n totalFee,\n meta: {\n approvalFee: allowanceApprovalIsNeeded\n ? applyFeeUnitsBpsMargin(allowanceApprovalGas, options?.feeUnitsMarginBps) * maxFeePerGas\n : undefined,\n maxFeePerGas,\n maxPriorityFeePerGas,\n },\n };\n}\n\n/** @internal */\nexport async function _estimateNativeFeeSolana(\n quote: Quote,\n options: EstimateNativeFeeOptions | undefined,\n { apiOptions, appId }: EstimateNativeFeeFactoryConfig,\n): Promise<NativeFeeEstimate> {\n const assetInAddressString = assetToAddressString(quote.assetIn, quote.sourceChain.chainId);\n\n if (!isSolanaAddress(assetInAddressString)) {\n throw new SdkError(ErrorReason.INVALID_PARAMS, ErrorCode.INVALID_PARAMS, {\n details: `assetIn address is not a valid Solana address. Can not call estimateGas.`,\n });\n }\n\n const minAmountOut = calculateMarkrMinimumAmountOut({\n amountOut: quote.amountOut,\n assetOut: quote.assetOut,\n slippageBps: quote.slippageBps,\n });\n\n const swap = await markrSwap(apiOptions, {\n amountIn: quote.amountIn.toString(),\n appId,\n minAmountOut: minAmountOut.toString(),\n tokenIn: assetInAddressString,\n tokenOut: assetToAddressString(quote.assetOut, quote.targetChain.chainId),\n userPublicKey: quote.fromAddress,\n uuid: quote.id,\n });\n\n if (!isSolanaSwapResponse(swap)) {\n // Should hopefully never happen.\n throw new SdkError(ErrorReason.CHAIN_NOT_SUPPORTED, ErrorCode.INVALID_PARAMS, {\n details: 'Received non-Solana swap response from Markr. Expected Solana transaction data for fee estimation.',\n });\n }\n\n const rpc = getSolanaRpcForChain({ chain: quote.sourceChain });\n\n const txBytes = base64ToBytes(swap.swapTransaction);\n const tx = getTransactionDecoder().decode(txBytes);\n\n const messageBase64: TransactionMessageBytesBase64 = _transactionMessageBytesToBase64(tx.messageBytes);\n\n // Base fee (signature fee etc.) in lamports.\n const feeForMessageResponse = await rpc.getFeeForMessage(messageBase64).send();\n\n if (!feeForMessageResponse.value) {\n // This can happen if the block hash is expired or invalid.\n // Most likely expired. Use a new \"swapTxBase64\" with a recent block hash and try again.\n throw new SdkError(\n 'Failed to get fee for message. Most likely the block hash in the transaction is expired.',\n ErrorCode.TIMEOUT,\n {\n details: 'Please use a new quote with a recent block hash and try again.',\n },\n );\n }\n\n const baseFeeLamports = feeForMessageResponse.value;\n\n const sim = await rpc\n .simulateTransaction(swap.swapTransaction as Base64EncodedWireTransaction, {\n encoding: 'base64',\n sigVerify: false,\n })\n .send();\n\n if (sim.value.err) {\n throw new SdkError('Failed to simulate transaction for estimating fee.', ErrorCode.SOLANA_ERROR, {\n cause: sim.value.err,\n });\n }\n\n const unitsConsumed = applyFeeUnitsBpsMargin(sim.value.unitsConsumed ?? 0n, options?.feeUnitsMarginBps);\n // Lamports\n const computeUnitPriceMicroLamports = _getComputeUnitPriceMicroLamports(tx.messageBytes);\n const priorityFee = (unitsConsumed * computeUnitPriceMicroLamports) / 1_000_000n;\n const rentEstimate = await _estimateRentFeesFromTransactionMessage({\n fromAddress: quote.fromAddress,\n rpc,\n transactionMessageBytes: tx.messageBytes,\n });\n const totalLamports = baseFeeLamports + priorityFee + rentEstimate.rentFee;\n\n return {\n asset: quote.sourceChain.networkToken,\n totalFee: totalLamports,\n refundable: rentEstimate.refundable,\n meta: {\n baseFee: baseFeeLamports,\n priorityFee,\n computeUnitPriceMicroLamports,\n unitsConsumed,\n createdAccounts: rentEstimate.createdAccounts,\n rentFee: rentEstimate.rentFee,\n rentFeeNet: rentEstimate.rentFeeNet,\n },\n };\n}\n\n/** @internal */\nexport async function _estimateGasFromSwapResponse({\n crossChain,\n feeUnitsMarginBps,\n fromAddress,\n sourceClient,\n swap,\n}: {\n crossChain: boolean;\n feeUnitsMarginBps?: number;\n fromAddress: EvmAddress;\n sourceClient: ReturnType<typeof getEvmClientForChain>;\n swap: WrappedSwapTransactionResponse;\n}): Promise<bigint> {\n try {\n const gasEstimate = await sourceClient.estimateGas({\n account: fromAddress,\n to: swap.to,\n data: swap.data,\n value: swap.value,\n });\n\n return applyFeeUnitsBpsMargin(gasEstimate, feeUnitsMarginBps);\n } catch (err) {\n let details = 'Failed to estimate gas for Markr swap transaction.';\n\n try {\n const markrSwapWrapperAbi = await getMarkrSwapWrapperAbi(crossChain);\n const decodedRevert = decodeMarkrRevertError(markrSwapWrapperAbi, err);\n\n if (decodedRevert) {\n details = `${details} Markr revert: ${decodedRevert}.`;\n }\n } catch {\n // Keep the base details message if revert decoding fails.\n }\n\n throw new SdkError('Error during gas estimation', ErrorCode.VIEM_ERROR, {\n cause: err,\n details,\n });\n }\n}\n\nfunction base64ToBytes(base64: string): Uint8Array {\n return Uint8Array.from(atob(base64), (c) => c.charCodeAt(0));\n}\n\nfunction _transactionMessageBytesToBase64(bytes: TransactionMessageBytes): TransactionMessageBytesBase64 {\n let binary = '';\n for (const b of bytes) {\n binary += String.fromCharCode(b);\n }\n return btoa(binary) as TransactionMessageBytesBase64;\n}\n\nfunction _getComputeUnitPriceMicroLamports(transactionMessageBytes: TransactionMessageBytes): bigint {\n const compiledTxMessage = getCompiledTransactionMessageDecoder().decode(transactionMessageBytes);\n\n for (const instruction of compiledTxMessage.instructions) {\n const programAddress = compiledTxMessage.staticAccounts[instruction.programAddressIndex];\n if (programAddress !== SOLANA_COMPUTE_BUDGET_PROGRAM) {\n continue;\n }\n\n const data = instruction.data;\n\n if (!data || data.length < 1 + 8) {\n continue;\n }\n\n // ComputeBudget: u8 discriminator, then args\n // discriminator 3 = SetComputeUnitPrice, args = u64 microLamports\n const discriminator = data[0];\n if (discriminator !== 3) {\n continue;\n }\n\n const view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n\n return view.getBigUint64(1, true);\n }\n\n return 0n;\n}\n\nasync function _estimateRentFeesFromTransactionMessage({\n fromAddress,\n rpc,\n transactionMessageBytes,\n}: {\n fromAddress: string;\n rpc: Rpc<SolanaRpcApi>;\n transactionMessageBytes: TransactionMessageBytes;\n}): Promise<SolanaRentEstimate> {\n const compiledMessage: CompiledTransactionMessage =\n getCompiledTransactionMessageDecoder().decode(transactionMessageBytes);\n\n const createdAccounts = new Map<string, Omit<CreatedRentAccount, 'refunded'>>();\n const closedAccountDestinationByAddress = new Map<string, string>();\n\n let ataRentLamports: bigint | undefined;\n\n for (const instruction of compiledMessage.instructions) {\n const programAddress = compiledMessage.staticAccounts[instruction.programAddressIndex];\n\n if (programAddress === SOLANA_SYSTEM_PROGRAM) {\n const createdAccountAddress = _getInstructionAccountAddress(compiledMessage, instruction, 1);\n const lamports = _getSystemCreateAccountLamports(instruction.data);\n if (createdAccountAddress && lamports > 0n) {\n createdAccounts.set(createdAccountAddress, {\n address: createdAccountAddress,\n kind: 'system',\n lamports,\n });\n }\n continue;\n }\n\n if (programAddress === SOLANA_ASSOCIATED_TOKEN_PROGRAM) {\n const discriminator = instruction.data?.[0];\n const isAssociatedTokenCreateInstruction =\n discriminator === undefined || discriminator === 0 || discriminator === 1;\n\n if (!isAssociatedTokenCreateInstruction) {\n continue;\n }\n\n const associatedTokenAddress = _getInstructionAccountAddress(compiledMessage, instruction, 1);\n if (!associatedTokenAddress) {\n continue;\n }\n\n const accountInfo = await rpc.getAccountInfo(associatedTokenAddress).send();\n if (accountInfo.value) {\n continue;\n }\n\n if (ataRentLamports === undefined) {\n ataRentLamports = await rpc.getMinimumBalanceForRentExemption(SPL_TOKEN_ACCOUNT_SIZE_BYTES).send();\n }\n\n createdAccounts.set(associatedTokenAddress, {\n address: associatedTokenAddress,\n kind: 'ata',\n lamports: ataRentLamports,\n });\n\n continue;\n }\n\n const isSplTokenProgram =\n programAddress === SOLANA_SPL_TOKEN_PROGRAM || programAddress === SOLANA_SPL_TOKEN_2022_PROGRAM;\n if (!isSplTokenProgram) {\n continue;\n }\n\n const discriminator = instruction.data?.[0];\n if (discriminator !== 9) {\n continue;\n }\n\n const closedAccountAddress = _getInstructionAccountAddress(compiledMessage, instruction, 0);\n const refundDestinationAddress = _getInstructionAccountAddress(compiledMessage, instruction, 1);\n\n if (closedAccountAddress && refundDestinationAddress) {\n closedAccountDestinationByAddress.set(closedAccountAddress, refundDestinationAddress);\n }\n }\n\n const normalizedFromAddress = isSolanaAddress(fromAddress) ? fromAddress : undefined;\n const createdAccountEntries = Array.from(createdAccounts.values()).map((createdAccount) => {\n const refundDestinationAddress = closedAccountDestinationByAddress.get(createdAccount.address);\n const refunded = normalizedFromAddress !== undefined && refundDestinationAddress === normalizedFromAddress;\n\n return {\n ...createdAccount,\n refunded,\n } satisfies CreatedRentAccount;\n });\n\n const rentLamportsUpfront = createdAccountEntries.reduce((acc, account) => acc + account.lamports, 0n);\n const refundedLamports = createdAccountEntries.reduce(\n (acc, account) => acc + (account.refunded ? account.lamports : 0n),\n 0n,\n );\n const rentFeeNet = rentLamportsUpfront - refundedLamports;\n\n return {\n createdAccounts: createdAccountEntries,\n rentFee: rentLamportsUpfront,\n rentFeeNet,\n refundable: refundedLamports,\n };\n}\n\n/**\n * Resolves an account address used by a compiled instruction.\n *\n * Compiled instructions reference accounts by index into the transaction\n * message's `staticAccounts` list. This helper converts an instruction-local\n * `accountIndex` into the corresponding static account address.\n *\n * Returns `undefined` when the instruction does not provide an account at the\n * requested index.\n */\nfunction _getInstructionAccountAddress(\n message: CompiledTransactionMessage,\n instruction: CompiledTransactionMessage['instructions'][number],\n accountIndex: number,\n): CompiledTransactionMessage['staticAccounts'][number] | undefined {\n const messageAccountIndex = instruction.accountIndices?.[accountIndex];\n\n if (messageAccountIndex === undefined) {\n return undefined;\n }\n\n return message.staticAccounts[messageAccountIndex];\n}\n\n/**\n * Extracts lamports from System Program account-creation instruction data.\n *\n * Supported instruction layouts:\n * - `CreateAccount` (`u32 discriminator = 0`): lamports at byte offset `4`.\n * - `CreateAccountWithSeed` (`u32 discriminator = 3`): lamports are located\n * after the variable-length seed field.\n *\n * Returns `0n` when data is missing, malformed, or not one of the supported\n * System Program create-account variants.\n */\nfunction _getSystemCreateAccountLamports(data: CompiledTransactionMessage['instructions'][number]['data']): bigint {\n if (!data || data.length < 12) {\n return 0n;\n }\n\n const view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n const instructionDiscriminator = view.getUint32(0, true);\n\n if (instructionDiscriminator === 0 && data.length >= 12) {\n return view.getBigUint64(4, true);\n }\n\n if (instructionDiscriminator === 3 && data.length >= 44) {\n const seedLenOffset = 36;\n const seedLength = Number(view.getBigUint64(seedLenOffset, true));\n if (!Number.isSafeInteger(seedLength) || seedLength < 0) {\n return 0n;\n }\n\n const lamportsOffset = seedLenOffset + 8 + seedLength;\n if (lamportsOffset + 8 > data.length) {\n return 0n;\n }\n\n return new DataView(data.buffer, data.byteOffset + lamportsOffset, 8).getBigUint64(0, true);\n }\n\n return 0n;\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ const e=require(`../../../constants.cjs`),t=require(`../../../utils/evm-address.cjs`),n=require(`../_utils.cjs`);function r({supportedChains:r,supportedTokens:i}){return async()=>{let a=Array.from(r.entries()).filter(([,e])=>e.swapEnabled).map(([e])=>e),o={};for(let[r,s]of i.entries())try{o[r]=(await s).map(i=>{let o=a.includes(r)?[e.ServiceType.MARKR]:[];return n.isTokenAddressNative(i.address)?{decimals:i.decimals,destinations:{},name:i.name,symbol:i.symbol,swapProviders:o,type:e.TokenType.NATIVE}:{address:t.formatEvmAddress(i.address),decimals:i.decimals,destinations:{},name:i.name,symbol:i.symbol,swapProviders:o,type:e.TokenType.ERC20}})}catch{continue}return o}}exports.getAssetsFactory=r;
2
+ //# sourceMappingURL=get-assets.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-assets.cjs","names":["ServiceType","isTokenAddressNative","TokenType","formatEvmAddress"],"sources":["../../../../src/transfer-service/markr/_handlers/get-assets.ts"],"sourcesContent":["import { ServiceType, TokenType } from '../../../constants';\nimport type { ChainAssetMap, TransferableAsset } from '../../../types/asset';\nimport type { TransferService } from '../../../types/service';\nimport type { Mutable } from '../../../types/utility-types';\nimport { formatEvmAddress } from '../../../utils/evm-address';\nimport { isTokenAddressNative, type getSupportedTokens, type SupportedChainsMap } from '../_utils';\n\nexport interface GetAssetsFactoryConfig {\n supportedChains: SupportedChainsMap;\n supportedTokens: Awaited<ReturnType<typeof getSupportedTokens>>;\n}\n\nexport function getAssetsFactory({\n supportedChains,\n supportedTokens,\n}: GetAssetsFactoryConfig): TransferService['getAssets'] {\n return async () => {\n const swapEnabledChainIds = Array.from(supportedChains.entries())\n .filter(([, info]) => info.swapEnabled)\n .map(([chainId]) => chainId);\n const chainAssetMap: Mutable<ChainAssetMap> = {};\n\n for (const [caip2ChainId, tokenListPromise] of supportedTokens.entries()) {\n try {\n const tokenList = await tokenListPromise;\n\n chainAssetMap[caip2ChainId] = tokenList.map((token) => {\n const swapProviders: TransferableAsset['swapProviders'] = swapEnabledChainIds.includes(caip2ChainId)\n ? [ServiceType.MARKR]\n : [];\n\n if (isTokenAddressNative(token.address)) {\n return {\n decimals: token.decimals,\n destinations: {},\n name: token.name,\n symbol: token.symbol,\n swapProviders,\n type: TokenType.NATIVE,\n } satisfies TransferableAsset;\n } else {\n return {\n address: formatEvmAddress(token.address),\n decimals: token.decimals,\n destinations: {},\n name: token.name,\n symbol: token.symbol,\n swapProviders,\n type: TokenType.ERC20,\n } satisfies TransferableAsset;\n }\n });\n } catch {\n // Ignore token list fetch errors for individual chains.\n // TODO: Logger?\n continue;\n }\n }\n\n return chainAssetMap;\n };\n}\n"],"mappings":"iHAYA,SAAgB,EAAiB,CAC/B,kBACA,mBACuD,CACvD,OAAO,SAAY,CACjB,IAAM,EAAsB,MAAM,KAAK,EAAgB,SAAS,CAAC,CAC9D,QAAQ,EAAG,KAAU,EAAK,YAAY,CACtC,KAAK,CAAC,KAAa,EAAQ,CACxB,EAAwC,EAAE,CAEhD,IAAK,GAAM,CAAC,EAAc,KAAqB,EAAgB,SAAS,CACtE,GAAI,CAGF,EAAc,IAFI,MAAM,GAEgB,IAAK,GAAU,CACrD,IAAM,EAAoD,EAAoB,SAAS,EAAa,CAChG,CAACA,EAAAA,YAAY,MAAM,CACnB,EAAE,CAYJ,OAVEC,EAAAA,qBAAqB,EAAM,QAAQ,CAC9B,CACL,SAAU,EAAM,SAChB,aAAc,EAAE,CAChB,KAAM,EAAM,KACZ,OAAQ,EAAM,OACd,gBACA,KAAMC,EAAAA,UAAU,OACjB,CAEM,CACL,QAASC,EAAAA,iBAAiB,EAAM,QAAQ,CACxC,SAAU,EAAM,SAChB,aAAc,EAAE,CAChB,KAAM,EAAM,KACZ,OAAQ,EAAM,OACd,gBACA,KAAMD,EAAAA,UAAU,MACjB,EAEH,MACI,CAGN,SAIJ,OAAO"}
@@ -0,0 +1,2 @@
1
+ import{ServiceType as e,TokenType as t}from"../../../constants.js";import{formatEvmAddress as n}from"../../../utils/evm-address.js";import{isTokenAddressNative as r}from"../_utils.js";function i({supportedChains:i,supportedTokens:a}){return async()=>{let o=Array.from(i.entries()).filter(([,e])=>e.swapEnabled).map(([e])=>e),s={};for(let[i,c]of a.entries())try{s[i]=(await c).map(a=>{let s=o.includes(i)?[e.MARKR]:[];return r(a.address)?{decimals:a.decimals,destinations:{},name:a.name,symbol:a.symbol,swapProviders:s,type:t.NATIVE}:{address:n(a.address),decimals:a.decimals,destinations:{},name:a.name,symbol:a.symbol,swapProviders:s,type:t.ERC20}})}catch{continue}return s}}export{i as getAssetsFactory};
2
+ //# sourceMappingURL=get-assets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-assets.js","names":[],"sources":["../../../../src/transfer-service/markr/_handlers/get-assets.ts"],"sourcesContent":["import { ServiceType, TokenType } from '../../../constants';\nimport type { ChainAssetMap, TransferableAsset } from '../../../types/asset';\nimport type { TransferService } from '../../../types/service';\nimport type { Mutable } from '../../../types/utility-types';\nimport { formatEvmAddress } from '../../../utils/evm-address';\nimport { isTokenAddressNative, type getSupportedTokens, type SupportedChainsMap } from '../_utils';\n\nexport interface GetAssetsFactoryConfig {\n supportedChains: SupportedChainsMap;\n supportedTokens: Awaited<ReturnType<typeof getSupportedTokens>>;\n}\n\nexport function getAssetsFactory({\n supportedChains,\n supportedTokens,\n}: GetAssetsFactoryConfig): TransferService['getAssets'] {\n return async () => {\n const swapEnabledChainIds = Array.from(supportedChains.entries())\n .filter(([, info]) => info.swapEnabled)\n .map(([chainId]) => chainId);\n const chainAssetMap: Mutable<ChainAssetMap> = {};\n\n for (const [caip2ChainId, tokenListPromise] of supportedTokens.entries()) {\n try {\n const tokenList = await tokenListPromise;\n\n chainAssetMap[caip2ChainId] = tokenList.map((token) => {\n const swapProviders: TransferableAsset['swapProviders'] = swapEnabledChainIds.includes(caip2ChainId)\n ? [ServiceType.MARKR]\n : [];\n\n if (isTokenAddressNative(token.address)) {\n return {\n decimals: token.decimals,\n destinations: {},\n name: token.name,\n symbol: token.symbol,\n swapProviders,\n type: TokenType.NATIVE,\n } satisfies TransferableAsset;\n } else {\n return {\n address: formatEvmAddress(token.address),\n decimals: token.decimals,\n destinations: {},\n name: token.name,\n symbol: token.symbol,\n swapProviders,\n type: TokenType.ERC20,\n } satisfies TransferableAsset;\n }\n });\n } catch {\n // Ignore token list fetch errors for individual chains.\n // TODO: Logger?\n continue;\n }\n }\n\n return chainAssetMap;\n };\n}\n"],"mappings":"wLAYA,SAAgB,EAAiB,CAC/B,kBACA,mBACuD,CACvD,OAAO,SAAY,CACjB,IAAM,EAAsB,MAAM,KAAK,EAAgB,SAAS,CAAC,CAC9D,QAAQ,EAAG,KAAU,EAAK,YAAY,CACtC,KAAK,CAAC,KAAa,EAAQ,CACxB,EAAwC,EAAE,CAEhD,IAAK,GAAM,CAAC,EAAc,KAAqB,EAAgB,SAAS,CACtE,GAAI,CAGF,EAAc,IAFI,MAAM,GAEgB,IAAK,GAAU,CACrD,IAAM,EAAoD,EAAoB,SAAS,EAAa,CAChG,CAAC,EAAY,MAAM,CACnB,EAAE,CAYJ,OAVE,EAAqB,EAAM,QAAQ,CAC9B,CACL,SAAU,EAAM,SAChB,aAAc,EAAE,CAChB,KAAM,EAAM,KACZ,OAAQ,EAAM,OACd,gBACA,KAAM,EAAU,OACjB,CAEM,CACL,QAAS,EAAiB,EAAM,QAAQ,CACxC,SAAU,EAAM,SAChB,aAAc,EAAE,CAChB,KAAM,EAAM,KACZ,OAAQ,EAAM,OACd,gBACA,KAAM,EAAU,MACjB,EAEH,MACI,CAGN,SAIJ,OAAO"}
@@ -0,0 +1,2 @@
1
+ const e=require(`../../../errors.cjs`),t=1n,n=200n;function r({analyzeSupport:r,partnerFeeBps:i}){return async({sourceAsset:a,sourceChainId:o,targetAsset:s,targetChainId:c})=>{if(!Number.isInteger(i)||i<0)throw new e.SdkError(e.ErrorReason.UNKNOWN,e.ErrorCode.INVALID_PARAMS,{details:`Invalid partner fee basis points: ${i}`});if(i===0)return t;if(!r({sourceAsset:a,sourceChainId:o,targetAsset:s,targetChainId:c}))throw new e.SdkError(e.ErrorReason.UNKNOWN,e.ErrorCode.INVALID_PARAMS,{details:`Transfer not supported by Markr. Unable to get minimum transfer amount.`});return(BigInt(t*10000n/BigInt(i))*10000n+(10000n-n)-1n)/(10000n-n)}}exports.getMinimumTransferAmountFactory=r;
2
+ //# sourceMappingURL=get-minimum-transfer-amount.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-minimum-transfer-amount.cjs","names":["SdkError","ErrorReason","ErrorCode"],"sources":["../../../../src/transfer-service/markr/_handlers/get-minimum-transfer-amount.ts"],"sourcesContent":["import { ErrorCode, ErrorReason, SdkError } from '../../../errors';\nimport type { TransferService } from '../../../types/service';\n\nexport const MINIMUM_CORE_FEE = 1n; // 1 unit of the source asset\nconst SLIPPAGE_BUFFER_BPS = 200n; // 2% buffer \"slippage\" buffer.\n\nexport interface GetMinimumTransferAmountFactoryConfig {\n analyzeSupport: TransferService['analyzeSupport'];\n partnerFeeBps: number;\n}\n\n/**\n * The minimum transfer amount is calculated based on the partner fee basis points.\n *\n * The minimum here guarantees that Core can extract a fee of at least MINIMUM_CORE_FEE.\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 (partnerFeeBps === 0) {\n // No fee, so minimum is just the base minimum.\n return MINIMUM_CORE_FEE;\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 const minimumAmount = BigInt((MINIMUM_CORE_FEE * 10_000n) / BigInt(partnerFeeBps));\n\n const minimumAmountWithBuffer =\n (minimumAmount * 10_000n + (10_000n - SLIPPAGE_BUFFER_BPS) - 1n) / (10_000n - SLIPPAGE_BUFFER_BPS);\n\n return minimumAmountWithBuffer;\n };\n}\n"],"mappings":"uCAGa,EAAmB,GAC1B,EAAsB,KAY5B,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,IAAkB,EAEpB,OAAO,EAGT,GAAI,CAAC,EAAe,CAAE,cAAa,gBAAe,cAAa,gBAAe,CAAC,CAE7E,MAAM,IAAIF,EAAAA,SAASC,EAAAA,YAAY,QAASC,EAAAA,UAAU,eAAgB,CAChE,QAAS,0EACV,CAAC,CAQJ,OALsB,OAAQ,EAAmB,OAAW,OAAO,EAAc,CAAC,CAG/D,QAAW,OAAU,GAAuB,KAAO,OAAU"}
@@ -0,0 +1,2 @@
1
+ import{ErrorCode as e,ErrorReason as t,SdkError as n}from"../../../errors.js";const r=1n,i=200n;function a({analyzeSupport:a,partnerFeeBps:o}){return async({sourceAsset:s,sourceChainId:c,targetAsset:l,targetChainId:u})=>{if(!Number.isInteger(o)||o<0)throw new n(t.UNKNOWN,e.INVALID_PARAMS,{details:`Invalid partner fee basis points: ${o}`});if(o===0)return r;if(!a({sourceAsset:s,sourceChainId:c,targetAsset:l,targetChainId:u}))throw new n(t.UNKNOWN,e.INVALID_PARAMS,{details:`Transfer not supported by Markr. Unable to get minimum transfer amount.`});return(BigInt(r*10000n/BigInt(o))*10000n+(10000n-i)-1n)/(10000n-i)}}export{a 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 { ErrorCode, ErrorReason, SdkError } from '../../../errors';\nimport type { TransferService } from '../../../types/service';\n\nexport const MINIMUM_CORE_FEE = 1n; // 1 unit of the source asset\nconst SLIPPAGE_BUFFER_BPS = 200n; // 2% buffer \"slippage\" buffer.\n\nexport interface GetMinimumTransferAmountFactoryConfig {\n analyzeSupport: TransferService['analyzeSupport'];\n partnerFeeBps: number;\n}\n\n/**\n * The minimum transfer amount is calculated based on the partner fee basis points.\n *\n * The minimum here guarantees that Core can extract a fee of at least MINIMUM_CORE_FEE.\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 (partnerFeeBps === 0) {\n // No fee, so minimum is just the base minimum.\n return MINIMUM_CORE_FEE;\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 const minimumAmount = BigInt((MINIMUM_CORE_FEE * 10_000n) / BigInt(partnerFeeBps));\n\n const minimumAmountWithBuffer =\n (minimumAmount * 10_000n + (10_000n - SLIPPAGE_BUFFER_BPS) - 1n) / (10_000n - SLIPPAGE_BUFFER_BPS);\n\n return minimumAmountWithBuffer;\n };\n}\n"],"mappings":"8EAGA,MAAa,EAAmB,GAC1B,EAAsB,KAY5B,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,IAAkB,EAEpB,OAAO,EAGT,GAAI,CAAC,EAAe,CAAE,cAAa,gBAAe,cAAa,gBAAe,CAAC,CAE7E,MAAM,IAAI,EAAS,EAAY,QAAS,EAAU,eAAgB,CAChE,QAAS,0EACV,CAAC,CAQJ,OALsB,OAAQ,EAAmB,OAAW,OAAO,EAAc,CAAC,CAG/D,QAAW,OAAU,GAAuB,KAAO,OAAU"}
@@ -0,0 +1,2 @@
1
+ const e=require(`../../../utils/caip.cjs`),t=require(`../../../_utils/chain.cjs`),n=require(`../_api.cjs`),r=require(`../_utils.cjs`);function i({apiOptions:i,appId:a,partnerFeeBps:o}){return(s,c)=>{let l=new AbortController;return n.markrStreamQuote(i,{amount:s.amount.toString(),appId:a,chainId:t.isEvmNamespace(s.sourceChain.chainId)?e.caip2ToEip155ChainId(s.sourceChain.chainId):s.sourceChain.chainId,destinationChainId:s.sourceChain.chainId!==s.targetChain.chainId&&t.isEvmNamespace(s.targetChain.chainId)?e.caip2ToEip155ChainId(s.targetChain.chainId):void 0,slippage:s.slippageBps,tokenIn:r.assetToAddressString(s.sourceAsset,s.sourceChain.chainId),tokenInDecimals:s.sourceAsset.decimals,tokenOut:r.assetToAddressString(s.targetAsset,s.targetChain.chainId),tokenOutDecimals:s.targetAsset.decimals},{onDone:()=>{l.signal.aborted||c(`done`)},onError:e=>{l.signal.aborted||(c(`error`,e),c(`done`))},onQuote:e=>{l.signal.aborted||c(`quote`,r.quoteFromMarkrQuoteResponseData(e,s,o))},signal:l.signal}),{cancel:()=>{l.abort()}}}}exports.streamQuotesFactory=i;
2
+ //# sourceMappingURL=stream-quotes.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream-quotes.cjs","names":["markrStreamQuote","isEvmNamespace","caip2ToEip155ChainId","assetToAddressString","quoteFromMarkrQuoteResponseData"],"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 } from '../_api';\nimport { assetToAddressString, quoteFromMarkrQuoteResponseData } from '../_utils';\nimport { isEvmNamespace } from '../../../_utils/chain';\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\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 // Destination chain ID currently only supports EVM chains.\n destinationChainId:\n props.sourceChain.chainId !== props.targetChain.chainId && isEvmNamespace(props.targetChain.chainId)\n ? caip2ToEip155ChainId(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 },\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"],"mappings":"sIAYA,SAAgB,EAAoB,CAClC,aACA,QACA,iBAC6D,CAC7D,OAAQ,EAAO,IAAY,CACzB,IAAM,EAAK,IAAI,gBA0Cf,OAxCKA,EAAAA,iBACH,EACA,CACE,OAAQ,EAAM,OAAO,UAAU,CAC/B,QACA,QAASC,EAAAA,eAAe,EAAM,YAAY,QAAQ,CAC9CC,EAAAA,qBAAqB,EAAM,YAAY,QAAQ,CAC/C,EAAM,YAAY,QAEtB,mBACE,EAAM,YAAY,UAAY,EAAM,YAAY,SAAWD,EAAAA,eAAe,EAAM,YAAY,QAAQ,CAChGC,EAAAA,qBAAqB,EAAM,YAAY,QAAQ,CAC/C,IAAA,GACN,SAAU,EAAM,YAChB,QAASC,EAAAA,qBAAqB,EAAM,YAAa,EAAM,YAAY,QAAQ,CAC3E,gBAAiB,EAAM,YAAY,SACnC,SAAUA,EAAAA,qBAAqB,EAAM,YAAa,EAAM,YAAY,QAAQ,CAC5E,iBAAkB,EAAM,YAAY,SACrC,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,QAASC,EAAAA,gCAAgC,EAAM,EAAO,EAAc,CAAC,EAGjF,OAAQ,EAAG,OACZ,CACF,CAEM,CACL,WAAc,CACZ,EAAG,OAAO,EAEb"}
@@ -0,0 +1,2 @@
1
+ import{caip2ToEip155ChainId as e}from"../../../utils/caip.js";import{isEvmNamespace as t}from"../../../_utils/chain.js";import{markrStreamQuote as n}from"../_api.js";import{assetToAddressString as r,quoteFromMarkrQuoteResponseData as i}from"../_utils.js";function a({apiOptions:a,appId:o,partnerFeeBps:s}){return(c,l)=>{let u=new AbortController;return n(a,{amount:c.amount.toString(),appId:o,chainId:t(c.sourceChain.chainId)?e(c.sourceChain.chainId):c.sourceChain.chainId,destinationChainId:c.sourceChain.chainId!==c.targetChain.chainId&&t(c.targetChain.chainId)?e(c.targetChain.chainId):void 0,slippage:c.slippageBps,tokenIn:r(c.sourceAsset,c.sourceChain.chainId),tokenInDecimals:c.sourceAsset.decimals,tokenOut:r(c.targetAsset,c.targetChain.chainId),tokenOutDecimals:c.targetAsset.decimals},{onDone:()=>{u.signal.aborted||l(`done`)},onError:e=>{u.signal.aborted||(l(`error`,e),l(`done`))},onQuote:e=>{u.signal.aborted||l(`quote`,i(e,c,s))},signal:u.signal}),{cancel:()=>{u.abort()}}}}export{a 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 } from '../_api';\nimport { assetToAddressString, quoteFromMarkrQuoteResponseData } from '../_utils';\nimport { isEvmNamespace } from '../../../_utils/chain';\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\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 // Destination chain ID currently only supports EVM chains.\n destinationChainId:\n props.sourceChain.chainId !== props.targetChain.chainId && isEvmNamespace(props.targetChain.chainId)\n ? caip2ToEip155ChainId(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 },\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"],"mappings":"+PAYA,SAAgB,EAAoB,CAClC,aACA,QACA,iBAC6D,CAC7D,OAAQ,EAAO,IAAY,CACzB,IAAM,EAAK,IAAI,gBA0Cf,OAxCK,EACH,EACA,CACE,OAAQ,EAAM,OAAO,UAAU,CAC/B,QACA,QAAS,EAAe,EAAM,YAAY,QAAQ,CAC9C,EAAqB,EAAM,YAAY,QAAQ,CAC/C,EAAM,YAAY,QAEtB,mBACE,EAAM,YAAY,UAAY,EAAM,YAAY,SAAW,EAAe,EAAM,YAAY,QAAQ,CAChG,EAAqB,EAAM,YAAY,QAAQ,CAC/C,IAAA,GACN,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,SACrC,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"}
@@ -0,0 +1,2 @@
1
+ require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../errors.cjs`),t=require(`../../../_utils/chain.cjs`),n=require(`../../_utils.cjs`),r=require(`../_api.cjs`),i=require(`../../_tracking-utilities.cjs`),a=require(`../constants.cjs`);let o=require(`viem`),s=require(`@solana/kit`);const c=3e3;function l({apiOptions:e}){return({transfer:n,updateListener:r})=>n.sourceChain.chainId===n.targetChain.chainId?t.isSolanaNamespace(n.sourceChain.chainId)?u({transfer:n,updateListener:r}):i.trackSameChainEvmTransfer({transfer:n,updateListener:r}):f({transfer:n,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(t,r,i){let{txHash:o}=t.source;try{(0,s.assertIsSignature)(o)}catch{let n={...t,errorCode:e.ErrorCode.INVALID_PARAMS,failedAtMs:Date.now(),status:`failed`};return r(n),n}let c=n.getSolanaRpcForChain({chain:t.sourceChain}),l=Date.now();for(;!i.aborted;){if(Date.now()-l>a.SOLANA_TX_TIMEOUT_MS){let n={...t,errorCode:e.ErrorCode.TIMEOUT,failedAtMs:Date.now(),status:`failed`};return r(n),n}try{let{value:s}=await c.getSignatureStatuses([o],{searchTransactionHistory:!0}).send(),l=s[0];if(!l){await n.waitForTimeoutOrAbort({timeoutMs:a.SOLANA_POLLING_INTERVAL_MS,signal:i});continue}if(l.err!==null){let n={...t,errorCode:e.ErrorCode.TRANSACTION_REVERTED,failedAtMs:Date.now(),status:`failed`};return r(n),n}if(l.confirmationStatus===`finalized`){let e={...t,completedAtMs:Date.now(),source:{...t.source,confirmationCount:t.source.requiredConfirmationCount},status:`completed`,target:null};return r(e),e}let u=Number(l.confirmations??0),d=Math.min(u,t.source.requiredConfirmationCount-1);d!==t.source.confirmationCount&&(t={...t,source:{...t.source,confirmationCount:d}},r(t)),await n.waitForTimeoutOrAbort({timeoutMs:a.SOLANA_POLLING_INTERVAL_MS,signal:i})}catch(e){let i={...t,errorCode:n.getErrorCodeForSolanaRpcError(e),failedAtMs:Date.now(),status:`failed`};return r(i),i}}return t}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`)return e;await new Promise(e=>{let t=setTimeout(e,c);r.signal.addEventListener(`abort`,()=>clearTimeout(t),{once:!0})})}return i})()}}async function p(i,a,c){if(i.status===`completed`||i.status===`failed`)return i;if(!g(i.source.txHash,i.sourceChain.chainId))return{...i,errorCode:e.ErrorCode.INVALID_PARAMS,errorReason:`Invalid source transaction hash`,failedAtMs:Date.now(),status:`failed`};if(i.status===`source-pending`){if(t.isEvmNamespace(i.sourceChain.chainId)){let t=i.source.txHash;if(!(0,o.isHash)(t))return{...i,errorCode:e.ErrorCode.INVALID_PARAMS,errorReason:`Invalid source transaction hash`,failedAtMs:Date.now(),status:`failed`};let r=n.getEvmClientForChain({chain:i.sourceChain});try{let a=await n.awaitOrAbort(r.waitForTransactionReceipt({hash:t}),c);if(a.status===`aborted`)return i;let o=a.value;return o.status===`reverted`?{...i,errorCode:e.ErrorCode.TRANSACTION_REVERTED,errorReason:`Source transaction was reverted`,failedAtMs:Date.now(),status:`failed`}:(await m(r,o.blockNumber,c)).status===`aborted`?i:v(i)}catch(e){return{...i,errorCode:n.getErrorCodeForViemError(e),errorReason:`Failed to confirm source transaction finality`,failedAtMs:Date.now(),status:`failed`}}}if(t.isSolanaNamespace(i.sourceChain.chainId)){let t=i.source.txHash;try{(0,s.assertIsSignature)(t)}catch{return{...i,errorCode:e.ErrorCode.INVALID_PARAMS,errorReason:`Invalid source transaction hash`,failedAtMs:Date.now(),status:`failed`}}let n=await h(i.sourceChain,t,c);return n.status===`aborted`?i:n.status===`failed`?{...i,errorCode:n.errorCode,errorReason:`Failed to confirm source transaction finality`,failedAtMs:Date.now(),status:`failed`}:v(i)}}try{let t=await r.markrGetCrossChainStatus(a,i.source.txHash,{signal:c});switch(t.status){case`failed`:return{...i,errorCode:e.ErrorCode.TRANSACTION_REVERTED,errorReason:`Transaction execution failed.`,failedAtMs:S(t),status:`failed`};case`pending`:return _(t.sourceChain.finalized)?v(i):i;case`committed`:case`pending_execution`:return y(i,t);case`completed`:return b(i,t);default:return x(i,t)}}catch(t){return console.error(`[Unified Asset Transfer] Error fetching cross-chain status from Markr API`,{error:t,now:Date.now()}),{...i,errorCode:e.ErrorCode.UNKNOWN,errorReason:`Failed to fetch cross-chain tx status`,failedAtMs:Date.now(),status:`failed`}}}async function m(e,t,r){for(;!r.aborted;){let i=await n.awaitOrAbort(e.getBlock({blockTag:`finalized`}),r);if(i.status===`aborted`)return{status:`aborted`};if(i.value.number>=t)return{status:`ok`};await n.waitForTimeoutOrAbort({timeoutMs:c,signal:r})}return{status:`aborted`}}async function h(t,r,i){let o=n.getSolanaRpcForChain({chain:t}),s=Date.now();for(;!i.aborted;){if(Date.now()-s>a.SOLANA_TX_TIMEOUT_MS)return{status:`failed`,errorCode:e.ErrorCode.TIMEOUT};try{let{value:t}=await o.getSignatureStatuses([r],{searchTransactionHistory:!0}).send(),s=t[0];if(!s){await n.waitForTimeoutOrAbort({timeoutMs:a.SOLANA_POLLING_INTERVAL_MS,signal:i});continue}if(s.err!==null)return{status:`failed`,errorCode:e.ErrorCode.TRANSACTION_REVERTED};if(s.confirmationStatus===`finalized`)return{status:`ok`};await n.waitForTimeoutOrAbort({timeoutMs:a.SOLANA_POLLING_INTERVAL_MS,signal:i})}catch(e){return{status:`failed`,errorCode:n.getErrorCodeForSolanaRpcError(e)}}}return{status:`aborted`}}function g(e,n){if(t.isEvmNamespace(n))return(0,o.isHash)(e);if(t.isSolanaNamespace(n))try{return(0,s.assertIsSignature)(e),!0}catch{return!1}return!1}function _(e){return e===!0||typeof e==`string`}function v(e){return{...e,source:{...e.source,confirmationCount:2,requiredConfirmationCount:2},status:`source-completed`}}function y(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 b(e,t){let{timestamp:n,transactionHash:r}=t.destinationChain;return{...e,completedAtMs:S(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 x(e,t){return t.progress.executed===!0?b(e,t):t.progress.committed===!0?y(e,t):_(t.sourceChain.finalized)?v(e):{...e,source:{...e.source,confirmationCount:0,requiredConfirmationCount:2},status:`source-pending`}}function S(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","getErrorCodeForSolanaRpcError","isEvmNamespace","getEvmClientForChain","awaitOrAbort","getErrorCodeForViemError","markrGetCrossChainStatus"],"sources":["../../../../src/transfer-service/markr/_handlers/track-transfer.ts"],"sourcesContent":["import { assertIsSignature, type Signature } from '@solana/kit';\nimport { isHash } from 'viem';\nimport { isEvmNamespace, isSolanaNamespace } from '../../../_utils/chain';\nimport { ErrorCode } from '../../../errors';\nimport type { TransferService, TrackTransferProps } from '../../../types/service';\nimport type {\n CompletedTransfer,\n FailedTransfer,\n SourceCompletedTransfer,\n SourcePendingTransfer,\n TargetPendingTransfer,\n Transfer,\n} from '../../../types/transfer';\nimport {\n awaitOrAbort,\n getErrorCodeForSolanaRpcError,\n getErrorCodeForViemError,\n getEvmClientForChain,\n getSolanaRpcForChain,\n waitForTimeoutOrAbort,\n} from '../../_utils';\nimport { trackSameChainEvmTransfer } from '../../_tracking-utilities';\nimport { markrGetCrossChainStatus, type ApiOptions } from '../_api';\nimport type { CrossChainStatusResponse } from '../_schema';\nimport { SOLANA_POLLING_INTERVAL_MS, SOLANA_TX_TIMEOUT_MS } from '../constants';\nimport type { Caip2ChainId } from '../../../mod';\n\nconst CROSS_CHAIN_POLLING_INTERVAL_MS = 3_000;\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 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 const failed: FailedTransfer = {\n ...transfer,\n errorCode: ErrorCode.TIMEOUT,\n failedAtMs: Date.now(),\n status: 'failed',\n };\n updateListener(failed);\n return failed;\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 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 (error) {\n const failed: FailedTransfer = {\n ...transfer,\n errorCode: getErrorCodeForSolanaRpcError(error),\n failedAtMs: Date.now(),\n status: 'failed',\n };\n updateListener(failed);\n return failed;\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 (updatedTransfer.status === 'completed' || updatedTransfer.status === 'failed') {\n return updatedTransfer;\n }\n\n // Wait before polling again.\n await new Promise((resolve) => {\n const timeoutId = setTimeout(resolve, CROSS_CHAIN_POLLING_INTERVAL_MS);\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') {\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(client, receipt.blockNumber, signal);\n if (finalityResult.status === 'aborted') {\n return transfer;\n }\n\n return _toSourceCompletedTransfer(transfer);\n } catch (error) {\n const failedTransfer: FailedTransfer = {\n ...transfer,\n errorCode: getErrorCodeForViemError(error),\n errorReason: 'Failed to confirm source transaction finality',\n failedAtMs: Date.now(),\n status: 'failed',\n };\n return failedTransfer;\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 === 'failed') {\n const failedTransfer: FailedTransfer = {\n ...transfer,\n errorCode: finalityResult.errorCode,\n errorReason: 'Failed to confirm source transaction finality',\n failedAtMs: Date.now(),\n status: 'failed',\n };\n return failedTransfer;\n }\n\n return _toSourceCompletedTransfer(transfer);\n }\n }\n\n try {\n const statusResponse = await markrGetCrossChainStatus(apiOptions, transfer.source.txHash, { signal });\n\n switch (statusResponse.status) {\n case 'failed': {\n const failedTransfer: FailedTransfer = {\n ...transfer,\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(transfer)\n : transfer;\n }\n\n case 'committed':\n case 'pending_execution': {\n return _toTargetPendingTransfer(transfer, statusResponse);\n }\n\n case 'completed': {\n return _toCompletedTransfer(transfer, statusResponse);\n }\n\n case 'unknown':\n default: {\n return _deriveTransferFromUnknownStatus(transfer, 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('[Unified Asset Transfer] Error fetching cross-chain status from Markr API', {\n error,\n now: Date.now(),\n });\n\n const failedTransfer: FailedTransfer = {\n ...transfer,\n errorCode: ErrorCode.UNKNOWN,\n errorReason: 'Failed to fetch cross-chain tx status',\n failedAtMs: Date.now(),\n status: 'failed',\n };\n return failedTransfer;\n }\n}\n\nasync function _waitForEvmSourceFinalization(\n client: ReturnType<typeof getEvmClientForChain>,\n txBlockNumber: bigint,\n signal: AbortSignal,\n): Promise<{ status: 'aborted' } | { status: 'ok' }> {\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: CROSS_CHAIN_POLLING_INTERVAL_MS,\n signal,\n });\n }\n\n return { status: 'aborted' };\n}\n\nasync function _waitForSolanaSourceFinalization(\n chain: SourcePendingTransfer['sourceChain'],\n txHash: Signature,\n signal: AbortSignal,\n): Promise<{ status: 'aborted' } | { status: 'ok' } | { status: 'failed'; errorCode: ErrorCode }> {\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 {\n status: 'failed',\n errorCode: ErrorCode.TIMEOUT,\n };\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 {\n status: 'failed',\n errorCode: ErrorCode.TRANSACTION_REVERTED,\n };\n }\n\n if (txStatus.confirmationStatus === 'finalized') {\n return { status: 'ok' };\n }\n\n await waitForTimeoutOrAbort({ timeoutMs: SOLANA_POLLING_INTERVAL_MS, signal });\n } catch (error) {\n return {\n status: 'failed',\n errorCode: getErrorCodeForSolanaRpcError(error),\n };\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 _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 _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{ErrorCode as e}from"../../../errors.js";import{isEvmNamespace as t,isSolanaNamespace as n}from"../../../_utils/chain.js";import{awaitOrAbort as r,getErrorCodeForSolanaRpcError as i,getErrorCodeForViemError as a,getEvmClientForChain as o,getSolanaRpcForChain as s,waitForTimeoutOrAbort as c}from"../../_utils.js";import{markrGetCrossChainStatus as l}from"../_api.js";import{trackSameChainEvmTransfer as u}from"../../_tracking-utilities.js";import{SOLANA_POLLING_INTERVAL_MS as d,SOLANA_TX_TIMEOUT_MS as f}from"../constants.js";import{isHash as p}from"viem";import{assertIsSignature as m}from"@solana/kit";const h=3e3;function g({apiOptions:e}){return({transfer:t,updateListener:r})=>t.sourceChain.chainId===t.targetChain.chainId?n(t.sourceChain.chainId)?_({transfer:t,updateListener:r}):u({transfer:t,updateListener:r}):y({transfer:t,updateListener:r},e)}function _({transfer:e,updateListener:t}){let n=new AbortController,r=()=>n.abort();return e.status===`source-pending`?{cancel:r,result:v(e,t,n.signal)}:{cancel:r,result:Promise.resolve(e)}}async function v(t,n,r){let{txHash:a}=t.source;try{m(a)}catch{let r={...t,errorCode:e.INVALID_PARAMS,failedAtMs:Date.now(),status:`failed`};return n(r),r}let o=s({chain:t.sourceChain}),l=Date.now();for(;!r.aborted;){if(Date.now()-l>f){let r={...t,errorCode:e.TIMEOUT,failedAtMs:Date.now(),status:`failed`};return n(r),r}try{let{value:i}=await o.getSignatureStatuses([a],{searchTransactionHistory:!0}).send(),s=i[0];if(!s){await c({timeoutMs:d,signal:r});continue}if(s.err!==null){let r={...t,errorCode:e.TRANSACTION_REVERTED,failedAtMs:Date.now(),status:`failed`};return n(r),r}if(s.confirmationStatus===`finalized`){let e={...t,completedAtMs:Date.now(),source:{...t.source,confirmationCount:t.source.requiredConfirmationCount},status:`completed`,target:null};return n(e),e}let l=Number(s.confirmations??0),u=Math.min(l,t.source.requiredConfirmationCount-1);u!==t.source.confirmationCount&&(t={...t,source:{...t.source,confirmationCount:u}},n(t)),await c({timeoutMs:d,signal:r})}catch(e){let r={...t,errorCode:i(e),failedAtMs:Date.now(),status:`failed`};return n(r),r}}return t}function y({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 b(i,n,r.signal);if(r.signal.aborted)break;if(i=e,t(e),e.status===`completed`||e.status===`failed`)return e;await new Promise(e=>{let t=setTimeout(e,h);r.signal.addEventListener(`abort`,()=>clearTimeout(t),{once:!0})})}return i})()}}async function b(i,s,c){if(i.status===`completed`||i.status===`failed`)return i;if(!C(i.source.txHash,i.sourceChain.chainId))return{...i,errorCode:e.INVALID_PARAMS,errorReason:`Invalid source transaction hash`,failedAtMs:Date.now(),status:`failed`};if(i.status===`source-pending`){if(t(i.sourceChain.chainId)){let t=i.source.txHash;if(!p(t))return{...i,errorCode:e.INVALID_PARAMS,errorReason:`Invalid source transaction hash`,failedAtMs:Date.now(),status:`failed`};let n=o({chain:i.sourceChain});try{let a=await r(n.waitForTransactionReceipt({hash:t}),c);if(a.status===`aborted`)return i;let o=a.value;return o.status===`reverted`?{...i,errorCode:e.TRANSACTION_REVERTED,errorReason:`Source transaction was reverted`,failedAtMs:Date.now(),status:`failed`}:(await x(n,o.blockNumber,c)).status===`aborted`?i:T(i)}catch(e){return{...i,errorCode:a(e),errorReason:`Failed to confirm source transaction finality`,failedAtMs:Date.now(),status:`failed`}}}if(n(i.sourceChain.chainId)){let t=i.source.txHash;try{m(t)}catch{return{...i,errorCode:e.INVALID_PARAMS,errorReason:`Invalid source transaction hash`,failedAtMs:Date.now(),status:`failed`}}let n=await S(i.sourceChain,t,c);return n.status===`aborted`?i:n.status===`failed`?{...i,errorCode:n.errorCode,errorReason:`Failed to confirm source transaction finality`,failedAtMs:Date.now(),status:`failed`}:T(i)}}try{let t=await l(s,i.source.txHash,{signal:c});switch(t.status){case`failed`:return{...i,errorCode:e.TRANSACTION_REVERTED,errorReason:`Transaction execution failed.`,failedAtMs:k(t),status:`failed`};case`pending`:return w(t.sourceChain.finalized)?T(i):i;case`committed`:case`pending_execution`:return E(i,t);case`completed`:return D(i,t);default:return O(i,t)}}catch(t){return console.error(`[Unified Asset Transfer] Error fetching cross-chain status from Markr API`,{error:t,now:Date.now()}),{...i,errorCode:e.UNKNOWN,errorReason:`Failed to fetch cross-chain tx status`,failedAtMs:Date.now(),status:`failed`}}}async function x(e,t,n){for(;!n.aborted;){let i=await r(e.getBlock({blockTag:`finalized`}),n);if(i.status===`aborted`)return{status:`aborted`};if(i.value.number>=t)return{status:`ok`};await c({timeoutMs:h,signal:n})}return{status:`aborted`}}async function S(t,n,r){let a=s({chain:t}),o=Date.now();for(;!r.aborted;){if(Date.now()-o>f)return{status:`failed`,errorCode:e.TIMEOUT};try{let{value:t}=await a.getSignatureStatuses([n],{searchTransactionHistory:!0}).send(),i=t[0];if(!i){await c({timeoutMs:d,signal:r});continue}if(i.err!==null)return{status:`failed`,errorCode:e.TRANSACTION_REVERTED};if(i.confirmationStatus===`finalized`)return{status:`ok`};await c({timeoutMs:d,signal:r})}catch(e){return{status:`failed`,errorCode:i(e)}}}return{status:`aborted`}}function C(e,r){if(t(r))return p(e);if(n(r))try{return m(e),!0}catch{return!1}return!1}function w(e){return e===!0||typeof e==`string`}function T(e){return{...e,source:{...e.source,confirmationCount:2,requiredConfirmationCount:2},status:`source-completed`}}function E(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 D(e,t){let{timestamp:n,transactionHash:r}=t.destinationChain;return{...e,completedAtMs:k(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 O(e,t){return t.progress.executed===!0?D(e,t):t.progress.committed===!0?E(e,t):w(t.sourceChain.finalized)?T(e):{...e,source:{...e.source,confirmationCount:0,requiredConfirmationCount:2},status:`source-pending`}}function k(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{g as trackTransferFactory};
2
+ //# sourceMappingURL=track-transfer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"track-transfer.js","names":[],"sources":["../../../../src/transfer-service/markr/_handlers/track-transfer.ts"],"sourcesContent":["import { assertIsSignature, type Signature } from '@solana/kit';\nimport { isHash } from 'viem';\nimport { isEvmNamespace, isSolanaNamespace } from '../../../_utils/chain';\nimport { ErrorCode } from '../../../errors';\nimport type { TransferService, TrackTransferProps } from '../../../types/service';\nimport type {\n CompletedTransfer,\n FailedTransfer,\n SourceCompletedTransfer,\n SourcePendingTransfer,\n TargetPendingTransfer,\n Transfer,\n} from '../../../types/transfer';\nimport {\n awaitOrAbort,\n getErrorCodeForSolanaRpcError,\n getErrorCodeForViemError,\n getEvmClientForChain,\n getSolanaRpcForChain,\n waitForTimeoutOrAbort,\n} from '../../_utils';\nimport { trackSameChainEvmTransfer } from '../../_tracking-utilities';\nimport { markrGetCrossChainStatus, type ApiOptions } from '../_api';\nimport type { CrossChainStatusResponse } from '../_schema';\nimport { SOLANA_POLLING_INTERVAL_MS, SOLANA_TX_TIMEOUT_MS } from '../constants';\nimport type { Caip2ChainId } from '../../../mod';\n\nconst CROSS_CHAIN_POLLING_INTERVAL_MS = 3_000;\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 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 const failed: FailedTransfer = {\n ...transfer,\n errorCode: ErrorCode.TIMEOUT,\n failedAtMs: Date.now(),\n status: 'failed',\n };\n updateListener(failed);\n return failed;\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 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 (error) {\n const failed: FailedTransfer = {\n ...transfer,\n errorCode: getErrorCodeForSolanaRpcError(error),\n failedAtMs: Date.now(),\n status: 'failed',\n };\n updateListener(failed);\n return failed;\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 (updatedTransfer.status === 'completed' || updatedTransfer.status === 'failed') {\n return updatedTransfer;\n }\n\n // Wait before polling again.\n await new Promise((resolve) => {\n const timeoutId = setTimeout(resolve, CROSS_CHAIN_POLLING_INTERVAL_MS);\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') {\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(client, receipt.blockNumber, signal);\n if (finalityResult.status === 'aborted') {\n return transfer;\n }\n\n return _toSourceCompletedTransfer(transfer);\n } catch (error) {\n const failedTransfer: FailedTransfer = {\n ...transfer,\n errorCode: getErrorCodeForViemError(error),\n errorReason: 'Failed to confirm source transaction finality',\n failedAtMs: Date.now(),\n status: 'failed',\n };\n return failedTransfer;\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 === 'failed') {\n const failedTransfer: FailedTransfer = {\n ...transfer,\n errorCode: finalityResult.errorCode,\n errorReason: 'Failed to confirm source transaction finality',\n failedAtMs: Date.now(),\n status: 'failed',\n };\n return failedTransfer;\n }\n\n return _toSourceCompletedTransfer(transfer);\n }\n }\n\n try {\n const statusResponse = await markrGetCrossChainStatus(apiOptions, transfer.source.txHash, { signal });\n\n switch (statusResponse.status) {\n case 'failed': {\n const failedTransfer: FailedTransfer = {\n ...transfer,\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(transfer)\n : transfer;\n }\n\n case 'committed':\n case 'pending_execution': {\n return _toTargetPendingTransfer(transfer, statusResponse);\n }\n\n case 'completed': {\n return _toCompletedTransfer(transfer, statusResponse);\n }\n\n case 'unknown':\n default: {\n return _deriveTransferFromUnknownStatus(transfer, 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('[Unified Asset Transfer] Error fetching cross-chain status from Markr API', {\n error,\n now: Date.now(),\n });\n\n const failedTransfer: FailedTransfer = {\n ...transfer,\n errorCode: ErrorCode.UNKNOWN,\n errorReason: 'Failed to fetch cross-chain tx status',\n failedAtMs: Date.now(),\n status: 'failed',\n };\n return failedTransfer;\n }\n}\n\nasync function _waitForEvmSourceFinalization(\n client: ReturnType<typeof getEvmClientForChain>,\n txBlockNumber: bigint,\n signal: AbortSignal,\n): Promise<{ status: 'aborted' } | { status: 'ok' }> {\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: CROSS_CHAIN_POLLING_INTERVAL_MS,\n signal,\n });\n }\n\n return { status: 'aborted' };\n}\n\nasync function _waitForSolanaSourceFinalization(\n chain: SourcePendingTransfer['sourceChain'],\n txHash: Signature,\n signal: AbortSignal,\n): Promise<{ status: 'aborted' } | { status: 'ok' } | { status: 'failed'; errorCode: ErrorCode }> {\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 {\n status: 'failed',\n errorCode: ErrorCode.TIMEOUT,\n };\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 {\n status: 'failed',\n errorCode: ErrorCode.TRANSACTION_REVERTED,\n };\n }\n\n if (txStatus.confirmationStatus === 'finalized') {\n return { status: 'ok' };\n }\n\n await waitForTimeoutOrAbort({ timeoutMs: SOLANA_POLLING_INTERVAL_MS, signal });\n } catch (error) {\n return {\n status: 'failed',\n errorCode: getErrorCodeForSolanaRpcError(error),\n };\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 _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 _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.cjs`),s=require(`../_type-guards.cjs`),c=require(`./estimate-native-fee.cjs`),l=require(`../constants.cjs`),u=require(`../../../utils/sol-address.cjs`);let d=require(`viem`);function f({apiOptions:n,appId:i,environment:a,evmSigner:o,solanaSigner:s}){return async({quote:c,gasSettings:l,onStepChange:u})=>{if(c.serviceType!==e.ServiceType.MARKR)throw new t.SdkError(t.ErrorReason.INCORRECT_PROVIDER_PROVIDED,t.ErrorCode.INVALID_PARAMS);let d=Math.floor(Date.now()/1e3);if(c.expiresAt<=d)throw new t.SdkError(t.ErrorReason.QUOTE_EXPIRED,t.ErrorCode.INVALID_PARAMS);let f=c.sourceChain.chainId;if(r.isSolanaNamespace(f))return m({apiOptions:n,appId:i,environment:a,solanaSigner:s,quote:c,onStepChange:u});if(r.isEvmNamespace(f))return p({apiOptions:n,appId:i,environment:a,evmSigner:o,quote:c,gasSettings:l,onStepChange:u});throw new t.SdkError(t.ErrorReason.CHAIN_NOT_SUPPORTED,t.ErrorCode.INVALID_PARAMS,{details:`Unsupported source chain namespace: ${f}`})}}async function p({apiOptions:r,appId:l,environment:u,evmSigner:f,quote:p,gasSettings:m,onStepChange:h}){let g=p.fromAddress;if(!(0,d.isAddress)(g))throw new t.SdkError(t.ErrorReason.INVALID_PARAMS,t.ErrorCode.INVALID_PARAMS,{details:`fromAddress is not a valid EVM address.`});let _=o.calculateMarkrMinimumAmountOut({amountOut:p.amountOut,assetOut:p.assetOut,slippageBps:p.slippageBps}),v=i.getEvmClientForChain({chain:p.sourceChain}),y=o.assetToAddressString(p.assetIn,p.sourceChain.chainId),b=o.assetToAddressString(p.assetOut,p.targetChain.chainId);if(!(0,d.isAddress)(y))throw new t.SdkError(t.ErrorReason.INVALID_PARAMS,t.ErrorCode.INVALID_PARAMS,{details:`assetIn address is not a valid EVM address.`});let x=y,S=o.isTokenAddressNative(x),C=p.sourceChain.chainId.toLowerCase()!==p.targetChain.chainId.toLowerCase(),{address:w}=await a.markrGetSpenderAddress(r,n.caip2ToEip155ChainId(p.sourceChain.chainId),C);if(!S&&!w)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 T=!1;if(!S&&w&&await v.readContract({address:x,abi:d.erc20Abi,functionName:`allowance`,args:[g,w]})<p.amountIn){T=!0;let r={currentSignature:1,currentSignatureReason:e.TransferSignatureReason.AllowanceApproval,quote:p,requiredSignatures:2};h?.(r);let a=(0,d.encodeFunctionData)({abi:d.erc20Abi,functionName:`approve`,args:[w,p.amountIn]}),o;try{o=i.applyFeeUnitsBpsMargin(await v.estimateGas({account:g,to:x,data:a,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.`})}let s={chainId:n.caip2ToEip155HexChainId(p.sourceChain.chainId),data:a,from:g,gas:o,to:x,value:0n,...m?.maxFeePerGas===void 0?null:{maxFeePerGas:m.maxFeePerGas,maxPriorityFeePerGas:m.maxPriorityFeePerGas}},c=await f.sign(s,async e=>v.sendRawTransaction({serializedTransaction:e}),r);if((await v.waitForTransactionReceipt({hash:c})).status===`reverted`)return i.makeFailedTransferFromQuote(p,{environment:u,errorCode:t.ErrorCode.TRANSACTION_REVERTED,errorReason:`ERC20 approval transaction was reverted`})}let E=await a.markrSwap(r,{amountIn:p.amountIn.toString(),appId:l,minAmountOut:_.toString(),tokenIn:y,tokenOut:b,uuid:p.id});if(!s.isEvmSwapResponse(E))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 D=await c._estimateGasFromSwapResponse({crossChain:C,fromAddress:g,feeUnitsMarginBps:m?.estimateGasMarginBps,sourceClient:v,swap:E}),O={chainId:n.caip2ToEip155HexChainId(p.sourceChain.chainId),data:E.data,from:g,gas:D,to:E.to,value:E.value,...m?.maxFeePerGas===void 0?null:{maxFeePerGas:m.maxFeePerGas,maxPriorityFeePerGas:m.maxPriorityFeePerGas}},k={currentSignature:T?2:1,currentSignatureReason:e.TransferSignatureReason.TokensTransfer,quote:p,requiredSignatures:T?2:1};h?.(k);let A=Date.now(),j=await f.sign(O,async e=>v.sendRawTransaction({serializedTransaction:e}),k),M=p.sourceChain.chainId===p.targetChain.chainId;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:M?1:2,startedAtMs:A,txHash:j}}}async function m({apiOptions:n,appId:r,environment:i,solanaSigner:c,quote:d,onStepChange:f}){if(!c)throw new t.SdkError(t.ErrorReason.INVALID_PARAMS,t.ErrorCode.INVALID_PARAMS,{details:`solanaSigner is required for Solana transfers but was not provided.`});if(!u.isSolAddress(d.fromAddress))throw new t.SdkError(t.ErrorReason.INVALID_PARAMS,t.ErrorCode.INVALID_PARAMS,{details:`fromAddress is not a valid Solana address.`});let p=o.calculateMarkrMinimumAmountOut({amountOut:d.amountOut,assetOut:d.assetOut,slippageBps:d.slippageBps}),m=o.assetToAddressString(d.assetIn,d.sourceChain.chainId),h=o.assetToAddressString(d.assetOut,d.targetChain.chainId),g=await a.markrSwap(n,{amountIn:d.amountIn.toString(),appId:r,minAmountOut:p.toString(),tokenIn:m,tokenOut:h,userPublicKey:d.fromAddress,uuid:d.id});if(!s.isSolanaSwapResponse(g))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.`});let _={currentSignature:1,currentSignatureReason:e.TransferSignatureReason.TokensTransfer,quote:d,requiredSignatures:1};f?.(_);let v=Date.now(),y=await c.signAndSend({account:d.fromAddress,serializedTx:g.swapTransaction},_);return{amountIn:d.amountIn,amountOut:d.amountOut,environment:i,fees:d.fees,fromAddress:d.fromAddress,id:d.id,partnerFeeBps:d.partnerFeeBps,sourceAsset:d.assetIn,sourceChain:d.sourceChain,status:`source-pending`,targetAsset:d.assetOut,targetChain:d.targetChain,toAddress:d.toAddress,type:e.ServiceType.MARKR,source:{confirmationCount:0,requiredConfirmationCount:l.SOLANA_REQUIRED_CONFIRMATIONS,startedAtMs:v,txHash:y}}}exports.transferAssetFactory=f;
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","markrGetSpenderAddress","caip2ToEip155ChainId","erc20Abi","TransferSignatureReason","applyFeeUnitsBpsMargin","caip2ToEip155HexChainId","makeFailedTransferFromQuote","markrSwap","isEvmSwapResponse","_estimateGasFromSwapResponse","isSolAddress","isSolanaSwapResponse","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 { applyFeeUnitsBpsMargin, getEvmClientForChain, makeFailedTransferFromQuote } from '../../_utils';\nimport { markrGetSpenderAddress, markrSwap, type ApiOptions } from '../_api';\nimport { assetToAddressString, calculateMarkrMinimumAmountOut, isTokenAddressNative } from '../_utils';\nimport { isEvmSwapResponse, isSolanaSwapResponse } from '../_type-guards';\nimport { SOLANA_REQUIRED_CONFIRMATIONS } from '../constants';\nimport { _estimateGasFromSwapResponse } from './estimate-native-fee';\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, 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 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 onStepChange?: Parameters<TransferService['transferAsset']>[0]['onStepChange'];\n}\n\nasync function _executeEvmTransfer({\n apiOptions,\n appId,\n environment,\n evmSigner,\n quote,\n gasSettings,\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\n const { address: spenderAddress } = await markrGetSpenderAddress(\n apiOptions,\n caip2ToEip155ChainId(quote.sourceChain.chainId),\n isCrossChainSwap,\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\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 < quote.amountIn) {\n requiresApprovalSignature = true;\n\n const requiredSignatures = 2;\n const approvalStep: TransferStepDetails = {\n currentSignature: 1,\n currentSignatureReason: TransferSignatureReason.AllowanceApproval,\n quote,\n requiredSignatures,\n };\n\n onStepChange?.(approvalStep);\n\n const approvalData = encodeFunctionData({\n abi: erc20Abi,\n functionName: 'approve',\n args: [spenderAddress, quote.amountIn],\n });\n\n let approvalGas: 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 approvalGas = 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 const approvalRequest: EvmTransactionRequest = {\n chainId: caip2ToEip155HexChainId(quote.sourceChain.chainId),\n data: approvalData,\n from: fromAddress,\n gas: approvalGas,\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 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\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 gas = await _estimateGasFromSwapResponse({\n crossChain: isCrossChainSwap,\n fromAddress,\n feeUnitsMarginBps: gasSettings?.estimateGasMarginBps,\n sourceClient,\n swap,\n });\n\n const request: EvmTransactionRequest = {\n chainId: caip2ToEip155HexChainId(quote.sourceChain.chainId),\n data: swap.data,\n from: fromAddress,\n gas,\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 request,\n async (signedTxHash) => sourceClient.sendRawTransaction({ serializedTransaction: signedTxHash }),\n step,\n );\n\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// ---------------------------------------------------------------------------\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 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: swap.swapTransaction,\n },\n step,\n );\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: SOLANA_REQUIRED_CONFIRMATIONS,\n startedAtMs,\n txHash,\n },\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,makeFailedTransferFromQuote as d}from"../../_utils.js";import{markrGetSpenderAddress as f,markrSwap as p}from"../_api.js";import{assetToAddressString as m,calculateMarkrMinimumAmountOut as h,isTokenAddressNative as g}from"../_utils.js";import{isEvmSwapResponse as _,isSolanaSwapResponse as v}from"../_type-guards.js";import{_estimateGasFromSwapResponse as y}from"./estimate-native-fee.js";import{SOLANA_REQUIRED_CONFIRMATIONS as b}from"../constants.js";import{isSolAddress as x}from"../../../utils/sol-address.js";import{encodeFunctionData as S,erc20Abi as C,isAddress as w}from"viem";function T({apiOptions:t,appId:a,environment:o,evmSigner:l,solanaSigner:u}){return async({quote:d,gasSettings:f,onStepChange:p})=>{if(d.serviceType!==e.MARKR)throw new i(r.INCORRECT_PROVIDER_PROVIDED,n.INVALID_PARAMS);let m=Math.floor(Date.now()/1e3);if(d.expiresAt<=m)throw new i(r.QUOTE_EXPIRED,n.INVALID_PARAMS);let h=d.sourceChain.chainId;if(c(h))return D({apiOptions:t,appId:a,environment:o,solanaSigner:u,quote:d,onStepChange:p});if(s(h))return E({apiOptions:t,appId:a,environment:o,evmSigner:l,quote:d,gasSettings:f,onStepChange:p});throw new i(r.CHAIN_NOT_SUPPORTED,n.INVALID_PARAMS,{details:`Unsupported source chain namespace: ${h}`})}}async function E({apiOptions:s,appId:c,environment:v,evmSigner:b,quote:x,gasSettings:T,onStepChange:E}){let D=x.fromAddress;if(!w(D))throw new i(r.INVALID_PARAMS,n.INVALID_PARAMS,{details:`fromAddress is not a valid EVM address.`});let O=h({amountOut:x.amountOut,assetOut:x.assetOut,slippageBps:x.slippageBps}),k=u({chain:x.sourceChain}),A=m(x.assetIn,x.sourceChain.chainId),j=m(x.assetOut,x.targetChain.chainId);if(!w(A))throw new i(r.INVALID_PARAMS,n.INVALID_PARAMS,{details:`assetIn address is not a valid EVM address.`});let M=A,N=g(M),P=x.sourceChain.chainId.toLowerCase()!==x.targetChain.chainId.toLowerCase(),{address:F}=await f(s,a(x.sourceChain.chainId),P);if(!N&&!F)throw new i(r.CHAIN_NOT_SUPPORTED,n.INVALID_PARAMS,{details:`Missing Markr spender address for source chain ${x.sourceChain.chainId}.`});let I=!1;if(!N&&F&&await k.readContract({address:M,abi:C,functionName:`allowance`,args:[D,F]})<x.amountIn){I=!0;let e={currentSignature:1,currentSignatureReason:t.AllowanceApproval,quote:x,requiredSignatures:2};E?.(e);let r=S({abi:C,functionName:`approve`,args:[F,x.amountIn]}),a;try{a=l(await k.estimateGas({account:D,to:M,data:r,value:0n}),T?.estimateGasMarginBps)}catch(e){throw new i(`Error during gas estimation`,n.VIEM_ERROR,{cause:e,details:`Failed to estimate gas for ERC20 approval transaction.`})}let s={chainId:o(x.sourceChain.chainId),data:r,from:D,gas:a,to:M,value:0n,...T?.maxFeePerGas===void 0?null:{maxFeePerGas:T.maxFeePerGas,maxPriorityFeePerGas:T.maxPriorityFeePerGas}},c=await b.sign(s,async e=>k.sendRawTransaction({serializedTransaction:e}),e);if((await k.waitForTransactionReceipt({hash:c})).status===`reverted`)return d(x,{environment:v,errorCode:n.TRANSACTION_REVERTED,errorReason:`ERC20 approval transaction was reverted`})}let L=await p(s,{amountIn:x.amountIn.toString(),appId:c,minAmountOut:O.toString(),tokenIn:A,tokenOut:j,uuid:x.id});if(!_(L))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 R=await y({crossChain:P,fromAddress:D,feeUnitsMarginBps:T?.estimateGasMarginBps,sourceClient:k,swap:L}),z={chainId:o(x.sourceChain.chainId),data:L.data,from:D,gas:R,to:L.to,value:L.value,...T?.maxFeePerGas===void 0?null:{maxFeePerGas:T.maxFeePerGas,maxPriorityFeePerGas:T.maxPriorityFeePerGas}},B={currentSignature:I?2:1,currentSignatureReason:t.TokensTransfer,quote:x,requiredSignatures:I?2:1};E?.(B);let V=Date.now(),H=await b.sign(z,async e=>k.sendRawTransaction({serializedTransaction:e}),B),U=x.sourceChain.chainId===x.targetChain.chainId;return{amountIn:x.amountIn,amountOut:x.amountOut,environment:v,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:U?1:2,startedAtMs:V,txHash:H}}}async function D({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(!x(l.fromAddress))throw new i(r.INVALID_PARAMS,n.INVALID_PARAMS,{details:`fromAddress is not a valid Solana address.`});let d=h({amountOut:l.amountOut,assetOut:l.assetOut,slippageBps:l.slippageBps}),f=m(l.assetIn,l.sourceChain.chainId),g=m(l.assetOut,l.targetChain.chainId),_=await p(a,{amountIn:l.amountIn.toString(),appId:o,minAmountOut:d.toString(),tokenIn:f,tokenOut:g,userPublicKey:l.fromAddress,uuid:l.id});if(!v(_))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.`});let y={currentSignature:1,currentSignatureReason:t.TokensTransfer,quote:l,requiredSignatures:1};u?.(y);let S=Date.now(),C=await c.signAndSend({account:l.fromAddress,serializedTx:_.swapTransaction},y);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:b,startedAtMs:S,txHash:C}}}export{T 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 { applyFeeUnitsBpsMargin, getEvmClientForChain, makeFailedTransferFromQuote } from '../../_utils';\nimport { markrGetSpenderAddress, markrSwap, type ApiOptions } from '../_api';\nimport { assetToAddressString, calculateMarkrMinimumAmountOut, isTokenAddressNative } from '../_utils';\nimport { isEvmSwapResponse, isSolanaSwapResponse } from '../_type-guards';\nimport { SOLANA_REQUIRED_CONFIRMATIONS } from '../constants';\nimport { _estimateGasFromSwapResponse } from './estimate-native-fee';\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, 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 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 onStepChange?: Parameters<TransferService['transferAsset']>[0]['onStepChange'];\n}\n\nasync function _executeEvmTransfer({\n apiOptions,\n appId,\n environment,\n evmSigner,\n quote,\n gasSettings,\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\n const { address: spenderAddress } = await markrGetSpenderAddress(\n apiOptions,\n caip2ToEip155ChainId(quote.sourceChain.chainId),\n isCrossChainSwap,\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\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 < quote.amountIn) {\n requiresApprovalSignature = true;\n\n const requiredSignatures = 2;\n const approvalStep: TransferStepDetails = {\n currentSignature: 1,\n currentSignatureReason: TransferSignatureReason.AllowanceApproval,\n quote,\n requiredSignatures,\n };\n\n onStepChange?.(approvalStep);\n\n const approvalData = encodeFunctionData({\n abi: erc20Abi,\n functionName: 'approve',\n args: [spenderAddress, quote.amountIn],\n });\n\n let approvalGas: 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 approvalGas = 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 const approvalRequest: EvmTransactionRequest = {\n chainId: caip2ToEip155HexChainId(quote.sourceChain.chainId),\n data: approvalData,\n from: fromAddress,\n gas: approvalGas,\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 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\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 gas = await _estimateGasFromSwapResponse({\n crossChain: isCrossChainSwap,\n fromAddress,\n feeUnitsMarginBps: gasSettings?.estimateGasMarginBps,\n sourceClient,\n swap,\n });\n\n const request: EvmTransactionRequest = {\n chainId: caip2ToEip155HexChainId(quote.sourceChain.chainId),\n data: swap.data,\n from: fromAddress,\n gas,\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 request,\n async (signedTxHash) => sourceClient.sendRawTransaction({ serializedTransaction: signedTxHash }),\n step,\n );\n\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// ---------------------------------------------------------------------------\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 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: swap.swapTransaction,\n },\n step,\n );\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: SOLANA_REQUIRED_CONFIRMATIONS,\n startedAtMs,\n txHash,\n },\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()}),a=i.extend({chainId:n.z.coerce.number().int().nonnegative(),chainType:n.z.literal(`evm`),router:t.EvmAddressSchema,wrapped_token:t.EvmAddressSchema}),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.number().int().nonnegative(),address:t.EvmAddressSchema})})).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`,`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(),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()}),transferredTokens:n.z.array(n.z.object({token:n.z.union([t.EvmAddressSchema,t.SolAddressSchema]),amount:n.z.coerce.bigint().nonnegative()}))}),_=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\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});\n\nconst SupportedChainsResponseItemEvmSchema: z.ZodType<SupportedChainsResponseItemEvm> =\n SupportedChainsResponseItemBaseSchema.extend({\n chainId: z.coerce.number().int().nonnegative(),\n chainType: z.literal('evm'),\n router: EvmAddressSchema,\n wrapped_token: EvmAddressSchema,\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 /** Token the fee is deducted from */\n token: {\n /** Chain ID where fee is deducted */\n chainId: number;\n /** Token address */\n address: EvmAddress;\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.number().int().nonnegative(),\n address: EvmAddressSchema,\n }),\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 /** Execution failed */\n | 'failed'\n /** Unknown state */\n | 'unknown';\n\nexport interface CrossChainStatusResponse {\n /** CCIP message ID */\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 /** Destination chain transaction hash (null if not yet executed) */\n transactionHash: 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 };\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\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', '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 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.object({\n token: z.union([EvmAddressSchema, SolAddressSchema]).nullable(),\n amount: z.coerce.bigint().nonnegative().nullable(),\n }),\n transferredTokens: z.array(\n z.object({\n token: z.union([EvmAddressSchema, SolAddressSchema]),\n amount: z.coerce.bigint().nonnegative(),\n }),\n ),\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()}),l=c.extend({chainId:o.coerce.number().int().nonnegative(),chainType:o.literal(`evm`),router:t,wrapped_token:t}),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.number().int().nonnegative(),address:t})})).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`,`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(),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()}),transferredTokens:o.array(o.object({token:o.union([t,i]),amount:o.coerce.bigint().nonnegative()}))}),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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_schema.js","names":[],"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\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});\n\nconst SupportedChainsResponseItemEvmSchema: z.ZodType<SupportedChainsResponseItemEvm> =\n SupportedChainsResponseItemBaseSchema.extend({\n chainId: z.coerce.number().int().nonnegative(),\n chainType: z.literal('evm'),\n router: EvmAddressSchema,\n wrapped_token: EvmAddressSchema,\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 /** Token the fee is deducted from */\n token: {\n /** Chain ID where fee is deducted */\n chainId: number;\n /** Token address */\n address: EvmAddress;\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.number().int().nonnegative(),\n address: EvmAddressSchema,\n }),\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 /** Execution failed */\n | 'failed'\n /** Unknown state */\n | 'unknown';\n\nexport interface CrossChainStatusResponse {\n /** CCIP message ID */\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 /** Destination chain transaction hash (null if not yet executed) */\n transactionHash: 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 };\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\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', '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 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.object({\n token: z.union([EvmAddressSchema, SolAddressSchema]).nullable(),\n amount: z.coerce.bigint().nonnegative().nullable(),\n }),\n transferredTokens: z.array(\n z.object({\n token: z.union([EvmAddressSchema, SolAddressSchema]),\n amount: z.coerce.bigint().nonnegative(),\n }),\n ),\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
+ function e(e){return`data`in e}function t(e){return`chainType`in e&&e.chainType===`svm`}exports.isEvmSwapResponse=e,exports.isSolanaSwapResponse=t;
2
+ //# sourceMappingURL=_type-guards.cjs.map