@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":"fetch-utilities.js","names":[],"sources":["../../src/transfer-service/fetch-utilities.ts"],"sourcesContent":["import { AbortedError, HttpError, isAbortedError, TimeoutError } from '../errors';\nimport type { Fetch } from '../types/utility-types';\n\nconst DEFAULT_BACKOFF_BASE_MS = 200;\nconst DEFAULT_BACKOFF_MAX_MS = 5_000;\nconst DEFAULT_RETRY_COUNT = 3;\n/**\n * Default HTTP methods to retry on.\n *\n * Only includes safe methods.\n * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Methods#safe_idempotent_and_cacheable_request_methods\n */\nconst DEFAULT_RETRY_METHODS = ['GET', 'HEAD', 'OPTIONS', 'TRACE'];\n\nexport interface BackoffOptions {\n /** Base backoff in milliseconds */\n readonly baseMs?: number;\n /** Maximum backoff in milliseconds */\n readonly maxMs?: number;\n}\n\nexport interface RetryContext {\n /** Zero based attempt index */\n readonly attempt: number;\n /** Network or other thrown error */\n readonly error?: unknown;\n readonly init: RequestInit;\n readonly input: RequestInfo | URL;\n /** Failed response (non-2xx) */\n readonly response?: Response;\n}\n\nexport interface RetryOptions {\n readonly backoff?: BackoffOptions | ((ctx: RetryContext) => number);\n /**\n * Total number of retries to attempt.\n *\n * Default: {@link DEFAULT_RETRY_COUNT}\n */\n readonly retries?: number;\n /**\n * HTTP methods to retry on.\n *\n * Default: {@link DEFAULT_RETRY_METHODS}\n */\n readonly retryMethods?: string[];\n /**\n * Custom retry decider.\n */\n readonly retryOn?: (ctx: RetryContext) => boolean | Promise<boolean>;\n /**\n * Per attempt timeout in milliseconds.\n *\n * A `0` or `undefined` value means no timeout.\n */\n readonly timeoutMs?: number;\n}\n\nexport interface FetchWithRetryOptions extends RetryOptions {\n /**\n * Custom fetch implementation to use for the request.\n * @default globalThis.fetch\n */\n readonly fetch?: Fetch;\n /** Export abort. Applies to all attempts. */\n readonly signal?: AbortSignal;\n}\n\nexport async function _wait(delayMs: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (delayMs <= 0) {\n return resolve();\n }\n\n const timeoutId = setTimeout(() => {\n cleanup();\n resolve();\n }, delayMs);\n\n const onAbort = () => {\n cleanup();\n reject(new AbortedError());\n };\n\n const cleanup = () => {\n clearTimeout(timeoutId);\n\n if (signal) {\n signal.removeEventListener('abort', onAbort);\n }\n };\n\n if (signal) {\n if (signal.aborted) {\n cleanup();\n\n return reject(new AbortedError());\n }\n\n signal.addEventListener('abort', onAbort);\n }\n });\n}\n\n/**\n * @internal\n *\n * Parses a Retry-After header value.\n *\n * @param retryAfter - The value of the Retry-After header.\n * @returns The number of milliseconds to wait before retrying, or null if the header is not present or invalid.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Retry-After\n */\nexport function _parseRetryAfterHeader(retryAfter: string | null): number | null {\n if (!retryAfter) {\n return null;\n }\n\n const seconds = Number(retryAfter);\n\n if (!Number.isNaN(seconds) && seconds >= 0) {\n return Math.floor(seconds) * 1_000;\n }\n\n const date = new Date(retryAfter);\n\n const delta = date.getTime() - Date.now();\n\n return Number.isFinite(delta) && delta > 0 ? delta : null;\n}\n\nexport function _exponentialBackoff(attempt: number, options: BackoffOptions = {}): number {\n const base = Math.max(1, Math.floor(options.baseMs ?? DEFAULT_BACKOFF_BASE_MS));\n const max = Math.max(base, Math.floor(options.maxMs ?? DEFAULT_BACKOFF_MAX_MS));\n\n const raw = Math.min(max, base * 2 ** attempt);\n\n // Add some jitter.\n return Math.floor(Math.random() * raw);\n}\n\nexport function _shouldRetry(ctx: RetryContext, retryMethods: string[]): boolean {\n const method = (ctx.init.method ?? 'GET').toUpperCase();\n\n if (!retryMethods.includes(method)) {\n return false;\n }\n\n if (ctx.error) {\n if (ctx.error instanceof AbortedError) {\n return false;\n }\n\n return true;\n }\n\n const status = ctx.response?.status ?? 0;\n\n if (status === 408 || status === 425 || status === 429 || (status >= 500 && status <= 599)) {\n return true;\n }\n\n return false;\n}\n\nexport function _composeAbortSignals(\n external?: AbortSignal,\n timeoutMs?: number,\n): { signal: AbortSignal; cleanup: () => void; timedOut: () => boolean } {\n const controller = new AbortController();\n\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n let didTimeout = false;\n\n const onExternalAbort = () => {\n controller.abort(external?.reason ?? new AbortedError());\n };\n\n if (external) {\n if (external.aborted) {\n controller.abort(external.reason ?? new AbortedError());\n } else {\n external.addEventListener('abort', onExternalAbort);\n }\n }\n\n if (timeoutMs && timeoutMs > 0) {\n timeoutId = setTimeout(() => {\n didTimeout = true;\n controller.abort(new TimeoutError());\n }, timeoutMs);\n }\n\n const cleanup = () => {\n if (external) {\n external.removeEventListener('abort', onExternalAbort);\n }\n\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n };\n\n return {\n cleanup,\n signal: controller.signal,\n timedOut: () => didTimeout,\n };\n}\n\nexport function _resolveBackoffDelay(\n attempt: number,\n ctx: RetryContext,\n retryAfterMs: number | null,\n options?: RetryOptions,\n): number {\n if (retryAfterMs != null) {\n return retryAfterMs;\n }\n\n if (typeof options?.backoff === 'function') {\n return options.backoff(ctx);\n }\n\n return _exponentialBackoff(attempt, options?.backoff);\n}\n\nasync function _safeParseResponse(response: Response): Promise<unknown> {\n const contentType = response.headers.get('content-type') ?? '';\n\n if (contentType.includes('application/json')) {\n try {\n return await response.clone().json();\n } catch {\n // Ignore\n }\n }\n\n try {\n return await response.clone().text();\n } catch {\n // Ignore\n }\n\n return undefined;\n}\n\nexport async function _fetchWithRetry(\n input: RequestInfo | URL,\n init: RequestInit = {},\n options: FetchWithRetryOptions = {},\n): Promise<Response> {\n const {\n fetch: customFetch,\n retries = DEFAULT_RETRY_COUNT,\n retryMethods = DEFAULT_RETRY_METHODS,\n retryOn = (ctx: RetryContext) => _shouldRetry(ctx, retryMethods),\n } = options;\n\n const fetchImpl: Fetch = customFetch ?? globalThis.fetch;\n\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= retries; attempt++) {\n const { cleanup, signal, timedOut } = _composeAbortSignals(options.signal, options.timeoutMs);\n\n try {\n const response = await fetchImpl(input, { ...init, signal });\n\n if (response.ok) {\n cleanup();\n return response;\n }\n\n const ctx: RetryContext = {\n attempt,\n init,\n input,\n response,\n };\n\n const doRetry = await retryOn(ctx);\n\n if (!doRetry || attempt === retries) {\n // Try to extract error payload best-effort.\n // Do not throw if stream already consumed.\n let data: unknown;\n try {\n data = await _safeParseResponse(response);\n } catch {\n // Ignore\n }\n\n cleanup();\n\n throw new HttpError(`HTTP ${response.status} ${response.statusText}`, response, data);\n }\n\n const retryAfterMs = _parseRetryAfterHeader(response.headers.get('retry-after'));\n const delay = _resolveBackoffDelay(attempt, ctx, retryAfterMs, options);\n\n cleanup();\n\n await _wait(delay, options.signal);\n\n continue;\n } catch (error: unknown) {\n cleanup();\n\n lastError = error;\n\n const isAbortError = isAbortedError(error);\n\n const ctx: RetryContext = {\n attempt,\n error,\n init,\n input,\n };\n\n const doRetry = !isAbortError && (await retryOn(ctx));\n\n if (!doRetry || attempt === retries) {\n if (timedOut()) {\n throw new TimeoutError();\n }\n\n if (isAbortError) {\n throw new AbortedError(error.message ?? 'Aborted');\n }\n\n throw error;\n }\n\n const delay = _resolveBackoffDelay(attempt, ctx, null, options);\n\n await _wait(delay, options.signal);\n\n continue;\n }\n }\n\n // Should never reach here.\n throw lastError ?? new Error('Unknown fetch error.');\n}\n\nexport function _sseLineParser(): (line: string) => SseEvent | null {\n let currentEvent: Partial<SseEvent> | null = null;\n\n return (line: string): SseEvent | null => {\n // Blank line indicates dispatch.\n if (line.trim() === '') {\n if (currentEvent && typeof currentEvent.data === 'string') {\n const out: SseEvent = {\n data: currentEvent.data,\n event: currentEvent.event,\n id: currentEvent.id,\n retry: currentEvent.retry,\n };\n\n currentEvent = null;\n\n return out;\n }\n\n currentEvent = null;\n\n return null;\n }\n\n const colonIndex = line.indexOf(':');\n const field = colonIndex >= 0 ? line.slice(0, colonIndex) : line;\n let value = colonIndex >= 0 ? line.slice(colonIndex + 1) : '';\n\n if (value.startsWith(' ')) {\n value = value.slice(1);\n }\n\n currentEvent = currentEvent ?? {};\n\n switch (field) {\n case 'data': {\n currentEvent.data = (currentEvent.data ? currentEvent.data + '\\n' : '') + value;\n break;\n }\n case 'event': {\n currentEvent.event = value;\n break;\n }\n case 'id': {\n currentEvent.id = value;\n break;\n }\n case 'retry': {\n const retry = Number(value);\n\n if (Number.isFinite(retry)) {\n currentEvent.retry = Math.floor(retry);\n break;\n }\n }\n }\n\n return null;\n };\n}\n\nexport interface JsonRequestOptions extends FetchWithRetryOptions {\n readonly accept?: string;\n readonly body?: BodyInit | null;\n readonly contentType?: string;\n readonly headers?: Record<string, string>;\n readonly method?: string;\n}\n\nexport async function fetchJson(input: RequestInfo | URL, options: JsonRequestOptions = {}): Promise<unknown> {\n const headers: Record<string, string> = {\n Accept: options.accept ?? 'application/json',\n ...(options.headers ?? {}),\n };\n\n const body = options.body;\n const hasBody = body !== undefined && body !== null;\n const method = (options.method ?? (hasBody ? 'POST' : 'GET')).toUpperCase();\n\n if (hasBody) {\n const contentType = options.contentType ?? 'application/json';\n\n if (!headers['Content-Type']) {\n headers['Content-Type'] = contentType;\n }\n }\n\n const response = await _fetchWithRetry(input, { method, headers, body }, options);\n\n if (!response.headers.get('content-type')?.includes('application/json')) {\n const text = await response.text();\n\n throw new HttpError('Expected application/json response.', response, text);\n }\n\n const data = (await response.json()) as unknown;\n\n return data;\n}\n\nexport function combineUrlPathnames(baseUrl: URL, pathname: string): URL {\n const baseUrlPathname = baseUrl.pathname;\n\n const newPath =\n baseUrlPathname.endsWith('/') && pathname.startsWith('/')\n ? baseUrlPathname + pathname.slice(1)\n : !baseUrlPathname.endsWith('/') && !pathname.startsWith('/')\n ? baseUrlPathname + '/' + pathname\n : baseUrlPathname + pathname;\n\n return new URL(newPath, baseUrl);\n}\n\nexport interface EventStreamOptions extends FetchWithRetryOptions {\n readonly accept?: string;\n readonly body?: BodyInit | null;\n readonly contentType?: string;\n readonly headers?: Record<string, string>;\n readonly method?: string;\n /**\n * When true, parse as SSE (Server-Sent Events);\n * otherwise, return newline-delimited chunks as strings.\n *\n * @default true\n */\n sse?: boolean;\n}\n\nexport interface SseEvent {\n data: string;\n event?: string;\n id?: string;\n retry?: number;\n}\n\n// Generic signature to narrow return type based on `sse` option\nexport function fetchEventStream<S extends boolean | undefined = true>(\n input: RequestInfo | URL,\n options?: Omit<EventStreamOptions, 'sse'> & { sse?: S },\n): S extends false ? AsyncGenerator<string> : AsyncGenerator<SseEvent>;\nexport async function* fetchEventStream(\n input: RequestInfo | URL,\n options: EventStreamOptions = {},\n): AsyncGenerator<SseEvent | string> {\n const headers: Record<string, string> = {\n Accept: options.accept ?? (options.sse === false ? '*/*' : 'text/event-stream'),\n ...(options.headers ?? {}),\n };\n const body = options.body;\n const hasBody = body !== undefined && body !== null;\n const method = (options.method ?? (hasBody ? 'POST' : 'GET')).toUpperCase();\n\n if (hasBody) {\n const contentType = options.contentType ?? 'application/json';\n\n if (!headers['Content-Type']) {\n headers['Content-Type'] = contentType;\n }\n }\n\n const response = await _fetchWithRetry(input, { body, headers, method }, options);\n\n if (!response.body) {\n throw new HttpError('Response body is not a readable stream.', response);\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n const parse = _sseLineParser();\n\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n\n let lineEndIndex: number;\n\n while ((lineEndIndex = buffer.indexOf('\\n')) >= 0) {\n const line = buffer.slice(0, lineEndIndex);\n buffer = buffer.slice(lineEndIndex + 1);\n\n if (options.sse === false) {\n if (line.length) {\n yield line;\n }\n } else {\n const event = parse(line);\n\n if (event) {\n yield event;\n }\n }\n }\n }\n\n if (options.sse === false && buffer.length) {\n yield buffer;\n }\n } finally {\n try {\n reader.releaseLock();\n } catch {\n // Ignore\n }\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ require(`../../_virtual/_rolldown/runtime.cjs`);let e=require(`zod`);const t=e.z.object({blockHeight:e.z.number(),confirmations:e.z.number(),index:e.z.number(),script:e.z.string(),txHash:e.z.string(),txHex:e.z.string().optional(),value:e.z.number()}),n=e.z.array(t),r=e.z.object({address:e.z.string(),value:e.z.number()}),i=e.z.array(r);exports.BitcoinInputUTXOArraySchema=n,exports.BitcoinOutputUTXOArraySchema=i;
2
+ //# sourceMappingURL=_schema.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_schema.cjs","names":["z"],"sources":["../../../src/transfer-service/lombard/_schema.ts"],"sourcesContent":["import { z } from 'zod';\nimport type { BitcoinInputUTXO, BitcoinOutputUTXO } from '../../types/bitcoin';\n\nexport const BitcoinInputUTXOSchema: z.ZodType<BitcoinInputUTXO> = z.object({\n blockHeight: z.number(),\n confirmations: z.number(),\n index: z.number(),\n script: z.string(),\n txHash: z.string(),\n txHex: z.string().optional(),\n value: z.number(),\n});\n\nexport const BitcoinInputUTXOArraySchema: z.ZodType<BitcoinInputUTXO[]> = z.array(BitcoinInputUTXOSchema);\n\nexport const BitcoinOutputUTXOSchema: z.ZodType<BitcoinOutputUTXO> = z.object({\n address: z.string(),\n value: z.number(),\n});\n\nexport const BitcoinOutputUTXOArraySchema: z.ZodType<BitcoinOutputUTXO[]> = z.array(BitcoinOutputUTXOSchema);\n"],"mappings":"qEAGA,MAAa,EAAsDA,EAAAA,EAAE,OAAO,CAC1E,YAAaA,EAAAA,EAAE,QAAQ,CACvB,cAAeA,EAAAA,EAAE,QAAQ,CACzB,MAAOA,EAAAA,EAAE,QAAQ,CACjB,OAAQA,EAAAA,EAAE,QAAQ,CAClB,OAAQA,EAAAA,EAAE,QAAQ,CAClB,MAAOA,EAAAA,EAAE,QAAQ,CAAC,UAAU,CAC5B,MAAOA,EAAAA,EAAE,QAAQ,CAClB,CAAC,CAEW,EAA6DA,EAAAA,EAAE,MAAM,EAAuB,CAE5F,EAAwDA,EAAAA,EAAE,OAAO,CAC5E,QAASA,EAAAA,EAAE,QAAQ,CACnB,MAAOA,EAAAA,EAAE,QAAQ,CAClB,CAAC,CAEW,EAA+DA,EAAAA,EAAE,MAAM,EAAwB"}
@@ -0,0 +1,2 @@
1
+ import{z as e}from"zod";const t=e.object({blockHeight:e.number(),confirmations:e.number(),index:e.number(),script:e.string(),txHash:e.string(),txHex:e.string().optional(),value:e.number()}),n=e.array(t),r=e.object({address:e.string(),value:e.number()}),i=e.array(r);export{n as BitcoinInputUTXOArraySchema,i as BitcoinOutputUTXOArraySchema};
2
+ //# sourceMappingURL=_schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_schema.js","names":[],"sources":["../../../src/transfer-service/lombard/_schema.ts"],"sourcesContent":["import { z } from 'zod';\nimport type { BitcoinInputUTXO, BitcoinOutputUTXO } from '../../types/bitcoin';\n\nexport const BitcoinInputUTXOSchema: z.ZodType<BitcoinInputUTXO> = z.object({\n blockHeight: z.number(),\n confirmations: z.number(),\n index: z.number(),\n script: z.string(),\n txHash: z.string(),\n txHex: z.string().optional(),\n value: z.number(),\n});\n\nexport const BitcoinInputUTXOArraySchema: z.ZodType<BitcoinInputUTXO[]> = z.array(BitcoinInputUTXOSchema);\n\nexport const BitcoinOutputUTXOSchema: z.ZodType<BitcoinOutputUTXO> = z.object({\n address: z.string(),\n value: z.number(),\n});\n\nexport const BitcoinOutputUTXOArraySchema: z.ZodType<BitcoinOutputUTXO[]> = z.array(BitcoinOutputUTXOSchema);\n"],"mappings":"wBAGA,MAAa,EAAsD,EAAE,OAAO,CAC1E,YAAa,EAAE,QAAQ,CACvB,cAAe,EAAE,QAAQ,CACzB,MAAO,EAAE,QAAQ,CACjB,OAAQ,EAAE,QAAQ,CAClB,OAAQ,EAAE,QAAQ,CAClB,MAAO,EAAE,QAAQ,CAAC,UAAU,CAC5B,MAAO,EAAE,QAAQ,CAClB,CAAC,CAEW,EAA6D,EAAE,MAAM,EAAuB,CAE5F,EAAwD,EAAE,OAAO,CAC5E,QAAS,EAAE,QAAQ,CACnB,MAAO,EAAE,QAAQ,CAClB,CAAC,CAEW,EAA+D,EAAE,MAAM,EAAwB"}
@@ -0,0 +1,2 @@
1
+ const e=require(`../../../constants.cjs`),t=require(`../../../errors.cjs`),n=require(`../constants.cjs`);function r(r,i){let a=n.BTCB_ADDRESSES[i]?.[r];if(!a)throw new t.SdkError(t.ErrorReason.CHAIN_NOT_SUPPORTED,t.ErrorCode.INVALID_PARAMS,{details:`No BTCb address configured for env: ${i}, chainId: ${r}`});return{type:e.TokenType.ERC20,name:`Bitcoin`,symbol:`BTC.b`,decimals:8,address:a}}exports.getBTCbAsset=r;
2
+ //# sourceMappingURL=asset.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asset.cjs","names":["BTCB_ADDRESSES","SdkError","ErrorReason","ErrorCode","TokenType"],"sources":["../../../../src/transfer-service/lombard/_utils/asset.ts"],"sourcesContent":["import type { ChainId, Env } from '@lombard.finance/sdk';\nimport { TokenType } from '../../../constants';\nimport { ErrorCode, ErrorReason, SdkError } from '../../../errors';\nimport type { Erc20Asset } from '../../../types/asset';\nimport { BTCB_ADDRESSES } from '../constants';\n\nexport function getBTCbAsset(chainId: ChainId, env: Env): Erc20Asset {\n const address = BTCB_ADDRESSES[env]?.[chainId];\n\n if (!address) {\n throw new SdkError(ErrorReason.CHAIN_NOT_SUPPORTED, ErrorCode.INVALID_PARAMS, {\n details: `No BTCb address configured for env: ${env}, chainId: ${chainId}`,\n });\n }\n\n return {\n type: TokenType.ERC20,\n name: 'Bitcoin',\n symbol: 'BTC.b',\n decimals: 8,\n address,\n };\n}\n"],"mappings":"yGAMA,SAAgB,EAAa,EAAkB,EAAsB,CACnE,IAAM,EAAUA,EAAAA,eAAe,KAAO,GAEtC,GAAI,CAAC,EACH,MAAM,IAAIC,EAAAA,SAASC,EAAAA,YAAY,oBAAqBC,EAAAA,UAAU,eAAgB,CAC5E,QAAS,uCAAuC,EAAI,aAAa,IAClE,CAAC,CAGJ,MAAO,CACL,KAAMC,EAAAA,UAAU,MAChB,KAAM,UACN,OAAQ,QACR,SAAU,EACV,UACD"}
@@ -0,0 +1,2 @@
1
+ import{TokenType as e}from"../../../constants.js";import{ErrorCode as t,ErrorReason as n,SdkError as r}from"../../../errors.js";import{BTCB_ADDRESSES as i}from"../constants.js";function a(a,o){let s=i[o]?.[a];if(!s)throw new r(n.CHAIN_NOT_SUPPORTED,t.INVALID_PARAMS,{details:`No BTCb address configured for env: ${o}, chainId: ${a}`});return{type:e.ERC20,name:`Bitcoin`,symbol:`BTC.b`,decimals:8,address:s}}export{a as getBTCbAsset};
2
+ //# sourceMappingURL=asset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asset.js","names":[],"sources":["../../../../src/transfer-service/lombard/_utils/asset.ts"],"sourcesContent":["import type { ChainId, Env } from '@lombard.finance/sdk';\nimport { TokenType } from '../../../constants';\nimport { ErrorCode, ErrorReason, SdkError } from '../../../errors';\nimport type { Erc20Asset } from '../../../types/asset';\nimport { BTCB_ADDRESSES } from '../constants';\n\nexport function getBTCbAsset(chainId: ChainId, env: Env): Erc20Asset {\n const address = BTCB_ADDRESSES[env]?.[chainId];\n\n if (!address) {\n throw new SdkError(ErrorReason.CHAIN_NOT_SUPPORTED, ErrorCode.INVALID_PARAMS, {\n details: `No BTCb address configured for env: ${env}, chainId: ${chainId}`,\n });\n }\n\n return {\n type: TokenType.ERC20,\n name: 'Bitcoin',\n symbol: 'BTC.b',\n decimals: 8,\n address,\n };\n}\n"],"mappings":"iLAMA,SAAgB,EAAa,EAAkB,EAAsB,CACnE,IAAM,EAAU,EAAe,KAAO,GAEtC,GAAI,CAAC,EACH,MAAM,IAAI,EAAS,EAAY,oBAAqB,EAAU,eAAgB,CAC5E,QAAS,uCAAuC,EAAI,aAAa,IAClE,CAAC,CAGJ,MAAO,CACL,KAAM,EAAU,MAChB,KAAM,UACN,OAAQ,QACR,SAAU,EACV,UACD"}
@@ -0,0 +1,2 @@
1
+ require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../errors.cjs`);let t=require(`@lombard.finance/sdk`);const n=Object.values(t.ChainId);function r(e){return n.includes(e)}function i(t){if(!r(t))throw new e.SdkError(e.ErrorReason.CHAIN_NOT_SUPPORTED,e.ErrorCode.INVALID_PARAMS,{details:`Unsupported chain ID: ${t}`})}exports.assertSupportedChainId=i;
2
+ //# sourceMappingURL=chain.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chain.cjs","names":["ChainId","SdkError","ErrorReason","ErrorCode"],"sources":["../../../../src/transfer-service/lombard/_utils/chain.ts"],"sourcesContent":["import { ChainId } from '@lombard.finance/sdk';\nimport { ErrorCode, ErrorReason, SdkError } from '../../../errors';\n\nconst SUPPORTED_CHAIN_IDS = Object.values(ChainId);\n\nexport function isSupportedChainId(chainId: number): chainId is ChainId {\n return SUPPORTED_CHAIN_IDS.includes(chainId as ChainId);\n}\n\nexport function assertSupportedChainId(chainId: number): asserts chainId is ChainId {\n if (!isSupportedChainId(chainId)) {\n throw new SdkError(ErrorReason.CHAIN_NOT_SUPPORTED, ErrorCode.INVALID_PARAMS, {\n details: `Unsupported chain ID: ${chainId}`,\n });\n }\n}\n"],"mappings":"gIAGA,MAAM,EAAsB,OAAO,OAAOA,EAAAA,QAAQ,CAElD,SAAgB,EAAmB,EAAqC,CACtE,OAAO,EAAoB,SAAS,EAAmB,CAGzD,SAAgB,EAAuB,EAA6C,CAClF,GAAI,CAAC,EAAmB,EAAQ,CAC9B,MAAM,IAAIC,EAAAA,SAASC,EAAAA,YAAY,oBAAqBC,EAAAA,UAAU,eAAgB,CAC5E,QAAS,yBAAyB,IACnC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import{ErrorCode as e,ErrorReason as t,SdkError as n}from"../../../errors.js";import{ChainId as r}from"@lombard.finance/sdk";const i=Object.values(r);function a(e){return i.includes(e)}function o(r){if(!a(r))throw new n(t.CHAIN_NOT_SUPPORTED,e.INVALID_PARAMS,{details:`Unsupported chain ID: ${r}`})}export{o as assertSupportedChainId};
2
+ //# sourceMappingURL=chain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chain.js","names":[],"sources":["../../../../src/transfer-service/lombard/_utils/chain.ts"],"sourcesContent":["import { ChainId } from '@lombard.finance/sdk';\nimport { ErrorCode, ErrorReason, SdkError } from '../../../errors';\n\nconst SUPPORTED_CHAIN_IDS = Object.values(ChainId);\n\nexport function isSupportedChainId(chainId: number): chainId is ChainId {\n return SUPPORTED_CHAIN_IDS.includes(chainId as ChainId);\n}\n\nexport function assertSupportedChainId(chainId: number): asserts chainId is ChainId {\n if (!isSupportedChainId(chainId)) {\n throw new SdkError(ErrorReason.CHAIN_NOT_SUPPORTED, ErrorCode.INVALID_PARAMS, {\n details: `Unsupported chain ID: ${chainId}`,\n });\n }\n}\n"],"mappings":"6HAGA,MAAM,EAAsB,OAAO,OAAO,EAAQ,CAElD,SAAgB,EAAmB,EAAqC,CACtE,OAAO,EAAoB,SAAS,EAAmB,CAGzD,SAAgB,EAAuB,EAA6C,CAClF,GAAI,CAAC,EAAmB,EAAQ,CAC9B,MAAM,IAAI,EAAS,EAAY,oBAAqB,EAAU,eAAgB,CAC5E,QAAS,yBAAyB,IACnC,CAAC"}
@@ -0,0 +1,2 @@
1
+ require(`../../../_virtual/_rolldown/runtime.cjs`);let e=require(`@lombard.finance/sdk`);async function t(t,n,r){let[i,a,o]=await Promise.all([(0,e.getMintingFee)({token:t,chainId:n,env:r}),(0,e.getRedeemFee)({token:t,chainId:n,env:r}),(0,e.getMinRedeemAmount)({token:t,chainId:n,env:r})]);return{mintingFee:BigInt((0,e.toBaseDenomination)(i,8).toFixed()),redeemFee:BigInt((0,e.toBaseDenomination)(a,8).toFixed()),minRedeemAmount:BigInt((0,e.toBaseDenomination)(o,8).toFixed())}}exports.getFees=t;
2
+ //# sourceMappingURL=fee.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fee.cjs","names":[],"sources":["../../../../src/transfer-service/lombard/_utils/fee.ts"],"sourcesContent":["import {\n ChainId,\n Env,\n getMinRedeemAmount,\n getMintingFee,\n getRedeemFee,\n toBaseDenomination,\n Token,\n} from '@lombard.finance/sdk';\n\nexport async function getFees(\n token: Token,\n chainId: ChainId,\n env?: Env,\n): Promise<{ minRedeemAmount: bigint; mintingFee: bigint; redeemFee: bigint }> {\n const [mintingFeeValue, redeemFeeValue, minRedeemAmountValue] = await Promise.all([\n getMintingFee({ token, chainId, env }),\n getRedeemFee({ token, chainId, env }),\n getMinRedeemAmount({ token, chainId, env }),\n ]);\n\n return {\n mintingFee: BigInt(toBaseDenomination(mintingFeeValue, 8).toFixed()),\n redeemFee: BigInt(toBaseDenomination(redeemFeeValue, 8).toFixed()),\n minRedeemAmount: BigInt(toBaseDenomination(minRedeemAmountValue, 8).toFixed()),\n };\n}\n"],"mappings":"yFAUA,eAAsB,EACpB,EACA,EACA,EAC6E,CAC7E,GAAM,CAAC,EAAiB,EAAgB,GAAwB,MAAM,QAAQ,IAAI,qBAClE,CAAE,QAAO,UAAS,MAAK,CAAC,oBACzB,CAAE,QAAO,UAAS,MAAK,CAAC,0BAClB,CAAE,QAAO,UAAS,MAAK,CAAC,CAC5C,CAAC,CAEF,MAAO,CACL,WAAY,QAAA,EAAA,EAAA,oBAA0B,EAAiB,EAAE,CAAC,SAAS,CAAC,CACpE,UAAW,QAAA,EAAA,EAAA,oBAA0B,EAAgB,EAAE,CAAC,SAAS,CAAC,CAClE,gBAAiB,QAAA,EAAA,EAAA,oBAA0B,EAAsB,EAAE,CAAC,SAAS,CAAC,CAC/E"}
@@ -0,0 +1,2 @@
1
+ import{ChainId as e,Env as t,Token as n,getMinRedeemAmount as r,getMintingFee as i,getRedeemFee as a,toBaseDenomination as o}from"@lombard.finance/sdk";async function s(e,t,n){let[s,c,l]=await Promise.all([i({token:e,chainId:t,env:n}),a({token:e,chainId:t,env:n}),r({token:e,chainId:t,env:n})]);return{mintingFee:BigInt(o(s,8).toFixed()),redeemFee:BigInt(o(c,8).toFixed()),minRedeemAmount:BigInt(o(l,8).toFixed())}}export{s as getFees};
2
+ //# sourceMappingURL=fee.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fee.js","names":[],"sources":["../../../../src/transfer-service/lombard/_utils/fee.ts"],"sourcesContent":["import {\n ChainId,\n Env,\n getMinRedeemAmount,\n getMintingFee,\n getRedeemFee,\n toBaseDenomination,\n Token,\n} from '@lombard.finance/sdk';\n\nexport async function getFees(\n token: Token,\n chainId: ChainId,\n env?: Env,\n): Promise<{ minRedeemAmount: bigint; mintingFee: bigint; redeemFee: bigint }> {\n const [mintingFeeValue, redeemFeeValue, minRedeemAmountValue] = await Promise.all([\n getMintingFee({ token, chainId, env }),\n getRedeemFee({ token, chainId, env }),\n getMinRedeemAmount({ token, chainId, env }),\n ]);\n\n return {\n mintingFee: BigInt(toBaseDenomination(mintingFeeValue, 8).toFixed()),\n redeemFee: BigInt(toBaseDenomination(redeemFeeValue, 8).toFixed()),\n minRedeemAmount: BigInt(toBaseDenomination(minRedeemAmountValue, 8).toFixed()),\n };\n}\n"],"mappings":"wJAUA,eAAsB,EACpB,EACA,EACA,EAC6E,CAC7E,GAAM,CAAC,EAAiB,EAAgB,GAAwB,MAAM,QAAQ,IAAI,CAChF,EAAc,CAAE,QAAO,UAAS,MAAK,CAAC,CACtC,EAAa,CAAE,QAAO,UAAS,MAAK,CAAC,CACrC,EAAmB,CAAE,QAAO,UAAS,MAAK,CAAC,CAC5C,CAAC,CAEF,MAAO,CACL,WAAY,OAAO,EAAmB,EAAiB,EAAE,CAAC,SAAS,CAAC,CACpE,UAAW,OAAO,EAAmB,EAAgB,EAAE,CAAC,SAAS,CAAC,CAClE,gBAAiB,OAAO,EAAmB,EAAsB,EAAE,CAAC,SAAS,CAAC,CAC/E"}
@@ -0,0 +1,2 @@
1
+ require(`../../../_virtual/_rolldown/runtime.cjs`);let e=require(`@lombard.finance/sdk`);const t=t=>t.notarizationStatus===e.ENotarizationStatus.NOTARIZATION_STATUS_FAILED||t.sessionState===e.ESessionState.SESSION_STATE_EXPIRED,n=(e,t,n)=>({needsNotarizationUpdate:t!==void 0&&e?.notarizationStatus!==t,needsSessionStateUpdate:n!==void 0&&e?.sessionState!==n});exports.getMetadataUpdates=n,exports.isDepositFailed=t;
2
+ //# sourceMappingURL=metadata.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.cjs","names":["ENotarizationStatus","ESessionState"],"sources":["../../../../src/transfer-service/lombard/_utils/metadata.ts"],"sourcesContent":["import { ENotarizationStatus, ESessionState } from '@lombard.finance/sdk';\nimport type { Transfer } from '../../../types/transfer';\n\n/**\n * Type definition for Lombard deposit metadata\n */\nexport interface LombardDepositMetadata extends Record<string, unknown> {\n notarizationStatus?: ENotarizationStatus;\n sessionState?: ESessionState;\n}\n\n/**\n * Helper to check if a deposit has failed\n * @param deposit - An object containing notarizationStatus and/or sessionState\n * @returns True if the deposit has failed or expired\n */\nexport const isDepositFailed = (deposit: {\n notarizationStatus?: ENotarizationStatus;\n sessionState?: ESessionState;\n}): boolean => {\n return (\n deposit.notarizationStatus === ENotarizationStatus.NOTARIZATION_STATUS_FAILED ||\n deposit.sessionState === ESessionState.SESSION_STATE_EXPIRED\n );\n};\n\n/**\n * Helper to check if metadata needs to be updated with new values\n * @param currentMetadata - Current transfer metadata\n * @param newNotarizationStatus - New notarization status\n * @param newSessionState - New session state\n * @returns Object indicating which fields need updating\n */\nexport const getMetadataUpdates = (\n currentMetadata: Transfer['metadata'],\n newNotarizationStatus?: ENotarizationStatus,\n newSessionState?: ESessionState,\n): { needsNotarizationUpdate: boolean; needsSessionStateUpdate: boolean } => {\n const needsNotarizationUpdate =\n newNotarizationStatus !== undefined && currentMetadata?.['notarizationStatus'] !== newNotarizationStatus;\n\n const needsSessionStateUpdate =\n newSessionState !== undefined && currentMetadata?.['sessionState'] !== newSessionState;\n\n return { needsNotarizationUpdate, needsSessionStateUpdate };\n};\n"],"mappings":"yFAgBA,MAAa,EAAmB,GAK5B,EAAQ,qBAAuBA,EAAAA,oBAAoB,4BACnD,EAAQ,eAAiBC,EAAAA,cAAc,sBAW9B,GACX,EACA,EACA,KAQO,CAAE,wBALP,IAA0B,IAAA,IAAa,GAAkB,qBAA0B,EAKnD,wBAFhC,IAAoB,IAAA,IAAa,GAAkB,eAAoB,EAEd"}
@@ -0,0 +1,2 @@
1
+ import{ENotarizationStatus as e,ESessionState as t}from"@lombard.finance/sdk";const n=n=>n.notarizationStatus===e.NOTARIZATION_STATUS_FAILED||n.sessionState===t.SESSION_STATE_EXPIRED,r=(e,t,n)=>({needsNotarizationUpdate:t!==void 0&&e?.notarizationStatus!==t,needsSessionStateUpdate:n!==void 0&&e?.sessionState!==n});export{r as getMetadataUpdates,n as isDepositFailed};
2
+ //# sourceMappingURL=metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.js","names":[],"sources":["../../../../src/transfer-service/lombard/_utils/metadata.ts"],"sourcesContent":["import { ENotarizationStatus, ESessionState } from '@lombard.finance/sdk';\nimport type { Transfer } from '../../../types/transfer';\n\n/**\n * Type definition for Lombard deposit metadata\n */\nexport interface LombardDepositMetadata extends Record<string, unknown> {\n notarizationStatus?: ENotarizationStatus;\n sessionState?: ESessionState;\n}\n\n/**\n * Helper to check if a deposit has failed\n * @param deposit - An object containing notarizationStatus and/or sessionState\n * @returns True if the deposit has failed or expired\n */\nexport const isDepositFailed = (deposit: {\n notarizationStatus?: ENotarizationStatus;\n sessionState?: ESessionState;\n}): boolean => {\n return (\n deposit.notarizationStatus === ENotarizationStatus.NOTARIZATION_STATUS_FAILED ||\n deposit.sessionState === ESessionState.SESSION_STATE_EXPIRED\n );\n};\n\n/**\n * Helper to check if metadata needs to be updated with new values\n * @param currentMetadata - Current transfer metadata\n * @param newNotarizationStatus - New notarization status\n * @param newSessionState - New session state\n * @returns Object indicating which fields need updating\n */\nexport const getMetadataUpdates = (\n currentMetadata: Transfer['metadata'],\n newNotarizationStatus?: ENotarizationStatus,\n newSessionState?: ESessionState,\n): { needsNotarizationUpdate: boolean; needsSessionStateUpdate: boolean } => {\n const needsNotarizationUpdate =\n newNotarizationStatus !== undefined && currentMetadata?.['notarizationStatus'] !== newNotarizationStatus;\n\n const needsSessionStateUpdate =\n newSessionState !== undefined && currentMetadata?.['sessionState'] !== newSessionState;\n\n return { needsNotarizationUpdate, needsSessionStateUpdate };\n};\n"],"mappings":"8EAgBA,MAAa,EAAmB,GAK5B,EAAQ,qBAAuB,EAAoB,4BACnD,EAAQ,eAAiB,EAAc,sBAW9B,GACX,EACA,EACA,KAQO,CAAE,wBALP,IAA0B,IAAA,IAAa,GAAkB,qBAA0B,EAKnD,wBAFhC,IAAoB,IAAA,IAAa,GAAkB,eAAoB,EAEd"}
@@ -0,0 +1,2 @@
1
+ const e=require(`../../../_virtual/_rolldown/runtime.cjs`),t=require(`../../../errors.cjs`),n=require(`../_schema.cjs`);let r=require(`coinselect`);r=e.__toESM(r);function i(e){let t=[];return e.filter(e=>{let n=e.txHash+e.index.toString();return t.includes(n)?!1:(t.push(n),!0)})}async function a(e,a,o,s,c,l){let{inputs:u,outputs:d,fee:f}=(0,r.default)(i(c),[{address:e,value:Number(o)}],s);if(typeof f!=`number`)throw new t.SdkError(t.ErrorReason.UNKNOWN,t.ErrorCode.UNKNOWN,{details:`Unable to choose utxo properly`});if(!u||!d||!d.length)return{fee:f};let p=await l.getScriptsForUtxos(u),m=n.BitcoinInputUTXOArraySchema.parse(p),h=[d[0]],g=d[1];return g&&h.push({address:a,value:g.value}),{fee:f,inputs:m,outputs:n.BitcoinOutputUTXOArraySchema.parse(h)}}exports.selectUtxos=a;
2
+ //# sourceMappingURL=utxo.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utxo.cjs","names":["SdkError","ErrorReason","ErrorCode","BitcoinInputUTXOArraySchema","BitcoinOutputUTXOArraySchema"],"sources":["../../../../src/transfer-service/lombard/_utils/utxo.ts"],"sourcesContent":["import coinSelect from 'coinselect';\nimport { ErrorCode, ErrorReason, SdkError } from '../../../errors';\nimport type {\n BitcoinInputUTXO,\n BitcoinFunctions,\n BitcoinInputUTXOWithOptionalScript,\n BitcoinOutputUTXO,\n} from '../../../types/bitcoin';\nimport { BitcoinInputUTXOArraySchema, BitcoinOutputUTXOArraySchema } from '../_schema';\n\nfunction filterDuplicateUTXOs<\n InputUtxo extends BitcoinInputUTXO | BitcoinInputUTXOWithOptionalScript = BitcoinInputUTXO,\n>(utxos: InputUtxo[]) {\n const seen: string[] = [];\n return utxos.filter((utxo) => {\n const key = utxo.txHash + utxo.index.toString();\n if (seen.includes(key)) return false;\n seen.push(key);\n return true;\n });\n}\n\n/**\n * Uses coinselect to select the input and output utxos for the given information.\n *\n * @param to Destination address.\n * @param changeAddress Change address.\n * @param amount Amount to send in satoshis.\n * @param feeRate Satoshis per byte.\n * @param sourceUtxos UTXOs to pick from to construct the transaction.\n * @param bitcoinFunctions bitcoinFunctions from initializer\n */\nexport async function selectUtxos(\n to: string,\n changeAddress: string,\n amount: bigint,\n feeRate: number,\n sourceUtxos: BitcoinInputUTXOWithOptionalScript[],\n bitcoinFunctions: BitcoinFunctions,\n): Promise<{ fee: number; inputs?: BitcoinInputUTXO[]; outputs?: BitcoinOutputUTXO[] }> {\n const filtered = filterDuplicateUTXOs(sourceUtxos);\n const targets = [{ address: to, value: Number(amount) }];\n\n /**\n * Note: Each algorithm will add a change output if the input - output - fee\n * value difference is over a dust threshold. This is calculated independently\n * by utils.finalize, irrespective of the algorithm chosen, for the purposes\n * of safety.\n */\n const { inputs, outputs, fee } = coinSelect(filtered, targets, feeRate);\n\n // Should not get here but we need to check the returned value types\n if (typeof fee !== 'number') {\n throw new SdkError(ErrorReason.UNKNOWN, ErrorCode.UNKNOWN, { details: 'Unable to choose utxo properly' });\n }\n\n // If inputs or outputs is not defined then we can not complete this transaction\n if (!inputs || !outputs || !outputs.length) return { fee };\n const inputsWithScript = await bitcoinFunctions.getScriptsForUtxos(inputs);\n\n const validatedInput = BitcoinInputUTXOArraySchema.parse(inputsWithScript);\n\n // Change is only returned if it's above the dust threshold\n // address is missing in change. So assigning it before validation to keep force the address to be required.\n const finalOuts = [outputs[0]];\n const change = outputs[1];\n if (change) {\n finalOuts.push({\n address: changeAddress,\n value: change.value,\n });\n }\n\n const validatedOutput = BitcoinOutputUTXOArraySchema.parse(finalOuts);\n\n return {\n fee,\n inputs: validatedInput,\n outputs: validatedOutput,\n };\n}\n"],"mappings":"mKAUA,SAAS,EAEP,EAAoB,CACpB,IAAM,EAAiB,EAAE,CACzB,OAAO,EAAM,OAAQ,GAAS,CAC5B,IAAM,EAAM,EAAK,OAAS,EAAK,MAAM,UAAU,CAG/C,OAFI,EAAK,SAAS,EAAI,CAAS,IAC/B,EAAK,KAAK,EAAI,CACP,KACP,CAaJ,eAAsB,EACpB,EACA,EACA,EACA,EACA,EACA,EACsF,CAUtF,GAAM,CAAE,SAAQ,UAAS,QAAA,EAAA,EAAA,SATR,EAAqB,EAAY,CAClC,CAAC,CAAE,QAAS,EAAI,MAAO,OAAO,EAAO,CAAE,CAAC,CAQO,EAAQ,CAGvE,GAAI,OAAO,GAAQ,SACjB,MAAM,IAAIA,EAAAA,SAASC,EAAAA,YAAY,QAASC,EAAAA,UAAU,QAAS,CAAE,QAAS,iCAAkC,CAAC,CAI3G,GAAI,CAAC,GAAU,CAAC,GAAW,CAAC,EAAQ,OAAQ,MAAO,CAAE,MAAK,CAC1D,IAAM,EAAmB,MAAM,EAAiB,mBAAmB,EAAO,CAEpE,EAAiBC,EAAAA,4BAA4B,MAAM,EAAiB,CAIpE,EAAY,CAAC,EAAQ,GAAG,CACxB,EAAS,EAAQ,GAUvB,OATI,GACF,EAAU,KAAK,CACb,QAAS,EACT,MAAO,EAAO,MACf,CAAC,CAKG,CACL,MACA,OAAQ,EACR,QALsBC,EAAAA,6BAA6B,MAAM,EAAU,CAMpE"}
@@ -0,0 +1,2 @@
1
+ import{ErrorCode as e,ErrorReason as t,SdkError as n}from"../../../errors.js";import{BitcoinInputUTXOArraySchema as r,BitcoinOutputUTXOArraySchema as i}from"../_schema.js";import a from"coinselect";function o(e){let t=[];return e.filter(e=>{let n=e.txHash+e.index.toString();return t.includes(n)?!1:(t.push(n),!0)})}async function s(s,c,l,u,d,f){let{inputs:p,outputs:m,fee:h}=a(o(d),[{address:s,value:Number(l)}],u);if(typeof h!=`number`)throw new n(t.UNKNOWN,e.UNKNOWN,{details:`Unable to choose utxo properly`});if(!p||!m||!m.length)return{fee:h};let g=await f.getScriptsForUtxos(p),_=r.parse(g),v=[m[0]],y=m[1];return y&&v.push({address:c,value:y.value}),{fee:h,inputs:_,outputs:i.parse(v)}}export{s as selectUtxos};
2
+ //# sourceMappingURL=utxo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utxo.js","names":[],"sources":["../../../../src/transfer-service/lombard/_utils/utxo.ts"],"sourcesContent":["import coinSelect from 'coinselect';\nimport { ErrorCode, ErrorReason, SdkError } from '../../../errors';\nimport type {\n BitcoinInputUTXO,\n BitcoinFunctions,\n BitcoinInputUTXOWithOptionalScript,\n BitcoinOutputUTXO,\n} from '../../../types/bitcoin';\nimport { BitcoinInputUTXOArraySchema, BitcoinOutputUTXOArraySchema } from '../_schema';\n\nfunction filterDuplicateUTXOs<\n InputUtxo extends BitcoinInputUTXO | BitcoinInputUTXOWithOptionalScript = BitcoinInputUTXO,\n>(utxos: InputUtxo[]) {\n const seen: string[] = [];\n return utxos.filter((utxo) => {\n const key = utxo.txHash + utxo.index.toString();\n if (seen.includes(key)) return false;\n seen.push(key);\n return true;\n });\n}\n\n/**\n * Uses coinselect to select the input and output utxos for the given information.\n *\n * @param to Destination address.\n * @param changeAddress Change address.\n * @param amount Amount to send in satoshis.\n * @param feeRate Satoshis per byte.\n * @param sourceUtxos UTXOs to pick from to construct the transaction.\n * @param bitcoinFunctions bitcoinFunctions from initializer\n */\nexport async function selectUtxos(\n to: string,\n changeAddress: string,\n amount: bigint,\n feeRate: number,\n sourceUtxos: BitcoinInputUTXOWithOptionalScript[],\n bitcoinFunctions: BitcoinFunctions,\n): Promise<{ fee: number; inputs?: BitcoinInputUTXO[]; outputs?: BitcoinOutputUTXO[] }> {\n const filtered = filterDuplicateUTXOs(sourceUtxos);\n const targets = [{ address: to, value: Number(amount) }];\n\n /**\n * Note: Each algorithm will add a change output if the input - output - fee\n * value difference is over a dust threshold. This is calculated independently\n * by utils.finalize, irrespective of the algorithm chosen, for the purposes\n * of safety.\n */\n const { inputs, outputs, fee } = coinSelect(filtered, targets, feeRate);\n\n // Should not get here but we need to check the returned value types\n if (typeof fee !== 'number') {\n throw new SdkError(ErrorReason.UNKNOWN, ErrorCode.UNKNOWN, { details: 'Unable to choose utxo properly' });\n }\n\n // If inputs or outputs is not defined then we can not complete this transaction\n if (!inputs || !outputs || !outputs.length) return { fee };\n const inputsWithScript = await bitcoinFunctions.getScriptsForUtxos(inputs);\n\n const validatedInput = BitcoinInputUTXOArraySchema.parse(inputsWithScript);\n\n // Change is only returned if it's above the dust threshold\n // address is missing in change. So assigning it before validation to keep force the address to be required.\n const finalOuts = [outputs[0]];\n const change = outputs[1];\n if (change) {\n finalOuts.push({\n address: changeAddress,\n value: change.value,\n });\n }\n\n const validatedOutput = BitcoinOutputUTXOArraySchema.parse(finalOuts);\n\n return {\n fee,\n inputs: validatedInput,\n outputs: validatedOutput,\n };\n}\n"],"mappings":"sMAUA,SAAS,EAEP,EAAoB,CACpB,IAAM,EAAiB,EAAE,CACzB,OAAO,EAAM,OAAQ,GAAS,CAC5B,IAAM,EAAM,EAAK,OAAS,EAAK,MAAM,UAAU,CAG/C,OAFI,EAAK,SAAS,EAAI,CAAS,IAC/B,EAAK,KAAK,EAAI,CACP,KACP,CAaJ,eAAsB,EACpB,EACA,EACA,EACA,EACA,EACA,EACsF,CAUtF,GAAM,CAAE,SAAQ,UAAS,OAAQ,EAThB,EAAqB,EAAY,CAClC,CAAC,CAAE,QAAS,EAAI,MAAO,OAAO,EAAO,CAAE,CAAC,CAQO,EAAQ,CAGvE,GAAI,OAAO,GAAQ,SACjB,MAAM,IAAI,EAAS,EAAY,QAAS,EAAU,QAAS,CAAE,QAAS,iCAAkC,CAAC,CAI3G,GAAI,CAAC,GAAU,CAAC,GAAW,CAAC,EAAQ,OAAQ,MAAO,CAAE,MAAK,CAC1D,IAAM,EAAmB,MAAM,EAAiB,mBAAmB,EAAO,CAEpE,EAAiB,EAA4B,MAAM,EAAiB,CAIpE,EAAY,CAAC,EAAQ,GAAG,CACxB,EAAS,EAAQ,GAUvB,OATI,GACF,EAAU,KAAK,CACb,QAAS,EACT,MAAO,EAAO,MACf,CAAC,CAKG,CACL,MACA,OAAQ,EACR,QALsB,EAA6B,MAAM,EAAU,CAMpE"}
@@ -0,0 +1,2 @@
1
+ require(`../../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../../constants.cjs`);let t=require(`viem`);function n({config:n}){return({sourceChainId:r,targetChainId:i,sourceAsset:a,targetAsset:o})=>r===n.sourceChain&&i===n.targetChain&&a.type===e.TokenType.NATIVE&&o.type===e.TokenType.ERC20&&(0,t.isAddressEqual)(o.address,n.targetAsset.address)}exports.analyzeSupportFactory=n;
2
+ //# sourceMappingURL=analyze-support.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze-support.cjs","names":["TokenType"],"sources":["../../../../../src/transfer-service/lombard/btc-to-btcb/_handlers/analyze-support.ts"],"sourcesContent":["import { isAddressEqual } from 'viem';\nimport type { BtcToBtcbConfig } from '../../types';\nimport { TokenType } from '../../../../constants';\nimport type { TransferService } from '../../../../types/service';\n\nexport interface AnalyzeSupportFactoryOptions {\n config: BtcToBtcbConfig;\n}\n\nexport function analyzeSupportFactory({ config }: AnalyzeSupportFactoryOptions): TransferService['analyzeSupport'] {\n return ({ sourceChainId, targetChainId, sourceAsset, targetAsset }) => {\n return (\n sourceChainId === config.sourceChain &&\n targetChainId === config.targetChain &&\n sourceAsset.type === TokenType.NATIVE &&\n targetAsset.type === TokenType.ERC20 &&\n isAddressEqual(targetAsset.address, config.targetAsset.address)\n );\n };\n}\n"],"mappings":"yHASA,SAAgB,EAAsB,CAAE,UAA2E,CACjH,OAAQ,CAAE,gBAAe,gBAAe,cAAa,iBAEjD,IAAkB,EAAO,aACzB,IAAkB,EAAO,aACzB,EAAY,OAASA,EAAAA,UAAU,QAC/B,EAAY,OAASA,EAAAA,UAAU,QAAA,EAAA,EAAA,gBAChB,EAAY,QAAS,EAAO,YAAY,QAAQ"}
@@ -0,0 +1,2 @@
1
+ import{TokenType as e}from"../../../../constants.js";import{isAddressEqual as t}from"viem";function n({config:n}){return({sourceChainId:r,targetChainId:i,sourceAsset:a,targetAsset:o})=>r===n.sourceChain&&i===n.targetChain&&a.type===e.NATIVE&&o.type===e.ERC20&&t(o.address,n.targetAsset.address)}export{n as analyzeSupportFactory};
2
+ //# sourceMappingURL=analyze-support.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze-support.js","names":[],"sources":["../../../../../src/transfer-service/lombard/btc-to-btcb/_handlers/analyze-support.ts"],"sourcesContent":["import { isAddressEqual } from 'viem';\nimport type { BtcToBtcbConfig } from '../../types';\nimport { TokenType } from '../../../../constants';\nimport type { TransferService } from '../../../../types/service';\n\nexport interface AnalyzeSupportFactoryOptions {\n config: BtcToBtcbConfig;\n}\n\nexport function analyzeSupportFactory({ config }: AnalyzeSupportFactoryOptions): TransferService['analyzeSupport'] {\n return ({ sourceChainId, targetChainId, sourceAsset, targetAsset }) => {\n return (\n sourceChainId === config.sourceChain &&\n targetChainId === config.targetChain &&\n sourceAsset.type === TokenType.NATIVE &&\n targetAsset.type === TokenType.ERC20 &&\n isAddressEqual(targetAsset.address, config.targetAsset.address)\n );\n };\n}\n"],"mappings":"2FASA,SAAgB,EAAsB,CAAE,UAA2E,CACjH,OAAQ,CAAE,gBAAe,gBAAe,cAAa,iBAEjD,IAAkB,EAAO,aACzB,IAAkB,EAAO,aACzB,EAAY,OAAS,EAAU,QAC/B,EAAY,OAAS,EAAU,OAC/B,EAAe,EAAY,QAAS,EAAO,YAAY,QAAQ"}
@@ -0,0 +1,2 @@
1
+ const e=require(`../../../../constants.cjs`),t=require(`../../_utils/utxo.cjs`);function n({bitcoinFunctions:n,config:r}){return async({amountIn:i,fromAddress:a,sourceChain:o},s)=>{let c=e.FEE_RATE_TIER_TO_BITCOIN[s?.overrides?.feeRateTier??`fast`],l=r.sourceChain===e.BitcoinChainIds.MAINNET?`bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq`:`tb1qw508d6qejxtdg4y5r3zarvary0c5xw7kxpjzsx`,u=(await n.getFeeRates())[c],{utxos:d}=await n.getUtxoBalance(a,!1),{fee:f}=await t.selectUtxos(l,a,i,u,d,n);return{asset:o.networkToken,totalFee:BigInt(f)}}}exports.estimateNativeFeeFactory=n;
2
+ //# sourceMappingURL=estimate-native-fee.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"estimate-native-fee.cjs","names":["FEE_RATE_TIER_TO_BITCOIN","BitcoinChainIds","selectUtxos"],"sources":["../../../../../src/transfer-service/lombard/btc-to-btcb/_handlers/estimate-native-fee.ts"],"sourcesContent":["import type { BtcToBtcbConfig } from '../../types';\nimport { BitcoinChainIds, FEE_RATE_TIER_TO_BITCOIN } from '../../../../constants';\nimport type { BitcoinFunctions } from '../../../../types/bitcoin';\nimport type { TransferService } from '../../../../types/service';\nimport { selectUtxos } from '../../_utils/utxo';\n\n// Placeholder bech32 addresses for fee estimation (address type affects byte length, not the actual value)\nexport const PLACEHOLDER_MAINNET_ADDRESS = 'bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq';\nexport const PLACEHOLDER_TESTNET_ADDRESS = 'tb1qw508d6qejxtdg4y5r3zarvary0c5xw7kxpjzsx';\n\nexport interface EstimateNativeFeeFactoryOptions {\n bitcoinFunctions: BitcoinFunctions;\n config: BtcToBtcbConfig;\n}\n\nexport function estimateNativeFeeFactory({\n bitcoinFunctions,\n config,\n}: EstimateNativeFeeFactoryOptions): TransferService['estimateNativeFee'] {\n return async ({ amountIn, fromAddress, sourceChain }, options) => {\n const bitcoinFeeRateTier = FEE_RATE_TIER_TO_BITCOIN[options?.overrides?.feeRateTier ?? 'fast'];\n\n // Use a placeholder bech32 address for estimation since BTC fees depend on\n // transaction size (byte length), not the actual destination address.\n // The address type (bech32) affects the output script size, but all bech32\n // addresses of the same type have the same size.\n const isMainnet = config.sourceChain === BitcoinChainIds.MAINNET;\n const placeholderAddress = isMainnet ? PLACEHOLDER_MAINNET_ADDRESS : PLACEHOLDER_TESTNET_ADDRESS;\n\n const feeRates = await bitcoinFunctions.getFeeRates();\n const feeRate = feeRates[bitcoinFeeRateTier];\n\n const { utxos } = await bitcoinFunctions.getUtxoBalance(fromAddress, false);\n\n const { fee } = await selectUtxos(placeholderAddress, fromAddress, amountIn, feeRate, utxos, bitcoinFunctions);\n\n return {\n asset: sourceChain.networkToken,\n totalFee: BigInt(fee),\n };\n };\n}\n"],"mappings":"gFAeA,SAAgB,EAAyB,CACvC,mBACA,UACwE,CACxE,OAAO,MAAO,CAAE,WAAU,cAAa,eAAe,IAAY,CAChE,IAAM,EAAqBA,EAAAA,yBAAyB,GAAS,WAAW,aAAe,QAOjF,EADY,EAAO,cAAgBC,EAAAA,gBAAgB,QAClB,6CAA8B,6CAG/D,GADW,MAAM,EAAiB,aAAa,EAC5B,GAEnB,CAAE,SAAU,MAAM,EAAiB,eAAe,EAAa,GAAM,CAErE,CAAE,OAAQ,MAAMC,EAAAA,YAAY,EAAoB,EAAa,EAAU,EAAS,EAAO,EAAiB,CAE9G,MAAO,CACL,MAAO,EAAY,aACnB,SAAU,OAAO,EAAI,CACtB"}
@@ -0,0 +1,2 @@
1
+ import{BitcoinChainIds as e,FEE_RATE_TIER_TO_BITCOIN as t}from"../../../../constants.js";import{selectUtxos as n}from"../../_utils/utxo.js";function r({bitcoinFunctions:r,config:i}){return async({amountIn:a,fromAddress:o,sourceChain:s},c)=>{let l=t[c?.overrides?.feeRateTier??`fast`],u=i.sourceChain===e.MAINNET?`bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq`:`tb1qw508d6qejxtdg4y5r3zarvary0c5xw7kxpjzsx`,d=(await r.getFeeRates())[l],{utxos:f}=await r.getUtxoBalance(o,!1),{fee:p}=await n(u,o,a,d,f,r);return{asset:s.networkToken,totalFee:BigInt(p)}}}export{r as estimateNativeFeeFactory};
2
+ //# sourceMappingURL=estimate-native-fee.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"estimate-native-fee.js","names":[],"sources":["../../../../../src/transfer-service/lombard/btc-to-btcb/_handlers/estimate-native-fee.ts"],"sourcesContent":["import type { BtcToBtcbConfig } from '../../types';\nimport { BitcoinChainIds, FEE_RATE_TIER_TO_BITCOIN } from '../../../../constants';\nimport type { BitcoinFunctions } from '../../../../types/bitcoin';\nimport type { TransferService } from '../../../../types/service';\nimport { selectUtxos } from '../../_utils/utxo';\n\n// Placeholder bech32 addresses for fee estimation (address type affects byte length, not the actual value)\nexport const PLACEHOLDER_MAINNET_ADDRESS = 'bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq';\nexport const PLACEHOLDER_TESTNET_ADDRESS = 'tb1qw508d6qejxtdg4y5r3zarvary0c5xw7kxpjzsx';\n\nexport interface EstimateNativeFeeFactoryOptions {\n bitcoinFunctions: BitcoinFunctions;\n config: BtcToBtcbConfig;\n}\n\nexport function estimateNativeFeeFactory({\n bitcoinFunctions,\n config,\n}: EstimateNativeFeeFactoryOptions): TransferService['estimateNativeFee'] {\n return async ({ amountIn, fromAddress, sourceChain }, options) => {\n const bitcoinFeeRateTier = FEE_RATE_TIER_TO_BITCOIN[options?.overrides?.feeRateTier ?? 'fast'];\n\n // Use a placeholder bech32 address for estimation since BTC fees depend on\n // transaction size (byte length), not the actual destination address.\n // The address type (bech32) affects the output script size, but all bech32\n // addresses of the same type have the same size.\n const isMainnet = config.sourceChain === BitcoinChainIds.MAINNET;\n const placeholderAddress = isMainnet ? PLACEHOLDER_MAINNET_ADDRESS : PLACEHOLDER_TESTNET_ADDRESS;\n\n const feeRates = await bitcoinFunctions.getFeeRates();\n const feeRate = feeRates[bitcoinFeeRateTier];\n\n const { utxos } = await bitcoinFunctions.getUtxoBalance(fromAddress, false);\n\n const { fee } = await selectUtxos(placeholderAddress, fromAddress, amountIn, feeRate, utxos, bitcoinFunctions);\n\n return {\n asset: sourceChain.networkToken,\n totalFee: BigInt(fee),\n };\n };\n}\n"],"mappings":"4IAeA,SAAgB,EAAyB,CACvC,mBACA,UACwE,CACxE,OAAO,MAAO,CAAE,WAAU,cAAa,eAAe,IAAY,CAChE,IAAM,EAAqB,EAAyB,GAAS,WAAW,aAAe,QAOjF,EADY,EAAO,cAAgB,EAAgB,QAClB,6CAA8B,6CAG/D,GADW,MAAM,EAAiB,aAAa,EAC5B,GAEnB,CAAE,SAAU,MAAM,EAAiB,eAAe,EAAa,GAAM,CAErE,CAAE,OAAQ,MAAM,EAAY,EAAoB,EAAa,EAAU,EAAS,EAAO,EAAiB,CAE9G,MAAO,CACL,MAAO,EAAY,aACnB,SAAU,OAAO,EAAI,CACtB"}
@@ -0,0 +1,2 @@
1
+ const e=require(`../../../../constants.cjs`),t=require(`../../constants.cjs`);function n({config:{sourceChain:n,targetAsset:r,targetChain:i}}){return async()=>({[n]:[{...t.BTC_NATIVE_ASSET,destinations:{[i]:{address:r.address,bridgeProviders:[e.ServiceType.LOMBARD_BTC_TO_BTCB]}},swapProviders:[]}]})}exports.getAssetsFactory=n;
2
+ //# sourceMappingURL=get-assets.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-assets.cjs","names":["BTC_NATIVE_ASSET","ServiceType"],"sources":["../../../../../src/transfer-service/lombard/btc-to-btcb/_handlers/get-assets.ts"],"sourcesContent":["import type { BtcToBtcbConfig } from '../../types';\nimport { ServiceType } from '../../../../constants';\nimport type { TransferService } from '../../../../types/service';\nimport { BTC_NATIVE_ASSET } from '../../constants';\n\nexport interface GetAssetsFactoryOptions {\n config: BtcToBtcbConfig;\n}\n\nexport function getAssetsFactory({\n config: { sourceChain, targetAsset, targetChain },\n}: GetAssetsFactoryOptions): TransferService['getAssets'] {\n return async () => {\n return {\n [sourceChain]: [\n {\n ...BTC_NATIVE_ASSET,\n destinations: {\n [targetChain]: {\n address: targetAsset.address,\n bridgeProviders: [ServiceType.LOMBARD_BTC_TO_BTCB],\n },\n },\n swapProviders: [],\n },\n ],\n };\n };\n}\n"],"mappings":"8EASA,SAAgB,EAAiB,CAC/B,OAAQ,CAAE,cAAa,cAAa,gBACoB,CACxD,OAAO,UACE,EACJ,GAAc,CACb,CACE,GAAGA,EAAAA,iBACH,aAAc,EACX,GAAc,CACb,QAAS,EAAY,QACrB,gBAAiB,CAACC,EAAAA,YAAY,oBAAoB,CACnD,CACF,CACD,cAAe,EAAE,CAClB,CACF,CACF"}
@@ -0,0 +1,2 @@
1
+ import{ServiceType as e}from"../../../../constants.js";import{BTC_NATIVE_ASSET as t}from"../../constants.js";function n({config:{sourceChain:n,targetAsset:r,targetChain:i}}){return async()=>({[n]:[{...t,destinations:{[i]:{address:r.address,bridgeProviders:[e.LOMBARD_BTC_TO_BTCB]}},swapProviders:[]}]})}export{n as getAssetsFactory};
2
+ //# sourceMappingURL=get-assets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-assets.js","names":[],"sources":["../../../../../src/transfer-service/lombard/btc-to-btcb/_handlers/get-assets.ts"],"sourcesContent":["import type { BtcToBtcbConfig } from '../../types';\nimport { ServiceType } from '../../../../constants';\nimport type { TransferService } from '../../../../types/service';\nimport { BTC_NATIVE_ASSET } from '../../constants';\n\nexport interface GetAssetsFactoryOptions {\n config: BtcToBtcbConfig;\n}\n\nexport function getAssetsFactory({\n config: { sourceChain, targetAsset, targetChain },\n}: GetAssetsFactoryOptions): TransferService['getAssets'] {\n return async () => {\n return {\n [sourceChain]: [\n {\n ...BTC_NATIVE_ASSET,\n destinations: {\n [targetChain]: {\n address: targetAsset.address,\n bridgeProviders: [ServiceType.LOMBARD_BTC_TO_BTCB],\n },\n },\n swapProviders: [],\n },\n ],\n };\n };\n}\n"],"mappings":"6GASA,SAAgB,EAAiB,CAC/B,OAAQ,CAAE,cAAa,cAAa,gBACoB,CACxD,OAAO,UACE,EACJ,GAAc,CACb,CACE,GAAG,EACH,aAAc,EACX,GAAc,CACb,QAAS,EAAY,QACrB,gBAAiB,CAAC,EAAY,oBAAoB,CACnD,CACF,CACD,cAAe,EAAE,CAClB,CACF,CACF"}
@@ -0,0 +1,2 @@
1
+ const e=require(`../../constants.cjs`);function t(){return e.MIN_DEPOSIT_BTC_AMOUNT_SATOSHI}exports.getMinimumTransferAmount=t;
2
+ //# sourceMappingURL=get-minimum-transfer-amount.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-minimum-transfer-amount.cjs","names":["MIN_DEPOSIT_BTC_AMOUNT_SATOSHI"],"sources":["../../../../../src/transfer-service/lombard/btc-to-btcb/_handlers/get-minimum-transfer-amount.ts"],"sourcesContent":["import { MIN_DEPOSIT_BTC_AMOUNT_SATOSHI } from '../../constants';\n\nexport function getMinimumTransferAmount(): bigint {\n return MIN_DEPOSIT_BTC_AMOUNT_SATOSHI;\n}\n"],"mappings":"uCAEA,SAAgB,GAAmC,CACjD,OAAOA,EAAAA"}
@@ -0,0 +1,2 @@
1
+ import{MIN_DEPOSIT_BTC_AMOUNT_SATOSHI as e}from"../../constants.js";function t(){return e}export{t as getMinimumTransferAmount};
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/lombard/btc-to-btcb/_handlers/get-minimum-transfer-amount.ts"],"sourcesContent":["import { MIN_DEPOSIT_BTC_AMOUNT_SATOSHI } from '../../constants';\n\nexport function getMinimumTransferAmount(): bigint {\n return MIN_DEPOSIT_BTC_AMOUNT_SATOSHI;\n}\n"],"mappings":"oEAEA,SAAgB,GAAmC,CACjD,OAAO"}
@@ -0,0 +1,2 @@
1
+ const e=require(`../../../../constants.cjs`),t=require(`../../../../errors.cjs`),n=require(`../../../../utils/evm-address.cjs`),r=require(`../../../../utils/bitcoin-address.cjs`),i=require(`../../../../utils/quote-fees.cjs`),a=require(`./analyze-support.cjs`),o=require(`./get-minimum-transfer-amount.cjs`);function s({config:s}){let c=a.analyzeSupportFactory({config:s});return(a,l)=>{let u=new AbortController,d=()=>{u.abort()};return!c({sourceAsset:a.sourceAsset,sourceChainId:a.sourceChain.chainId,targetAsset:a.targetAsset,targetChainId:a.targetChain.chainId})||!r.isBech32AddressInNetwork(a.fromAddress,s.sourceChain===e.BitcoinChainIds.MAINNET)||!n.isEvmAddress(a.toAddress)?(u.signal.aborted||(l(`error`,new t.InvalidParamsError(t.ErrorReason.INVALID_PARAMS,`Invalid addresses, assets, or chains provided.`)),l(`done`)),{cancel:d}):((async()=>{let n=o.getMinimumTransferAmount();if(a.amount<n){u.signal.aborted||(l(`error`,new t.InvalidParamsError(t.ErrorReason.INVALID_PARAMS,`Transfer amount is below the minimum transfer amount of ${n.toString()}.`)),l(`done`));return}let r={aggregator:{name:`Lombard`,id:`lombard-btc-to-btcb`},amountIn:a.amount,amountOut:a.amount-s.mintingFee,assetIn:a.sourceAsset,assetOut:a.targetAsset,expiresAt:Math.floor(Date.now()/1e3)+60,fees:[{type:`bridge`,name:`Bridge Fee`,amount:s.mintingFee,chainId:a.sourceChain.chainId,token:i.assetToQuoteFeeToken(a.sourceAsset)}],fromAddress:a.fromAddress,id:crypto.randomUUID(),partnerFeeBps:null,serviceType:e.ServiceType.LOMBARD_BTC_TO_BTCB,slippageBps:a.slippageBps??0,sourceChain:a.sourceChain,targetChain:a.targetChain,toAddress:a.toAddress};u.signal.aborted||(l(`quote`,r),l(`done`))})().catch(e=>{u.signal.aborted||(l(`error`,new t.SdkError(t.ErrorReason.UNKNOWN,t.ErrorCode.UNKNOWN,{cause:e,details:`Failed to stream quotes`})),l(`done`))}),{cancel:d})}}exports.streamQuotesFactory=s;
2
+ //# sourceMappingURL=stream-quotes.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream-quotes.cjs","names":["analyzeSupportFactory","isBech32AddressInNetwork","BitcoinChainIds","isEvmAddress","InvalidParamsError","ErrorReason","getMinimumTransferAmount","assetToQuoteFeeToken","ServiceType","SdkError","ErrorCode"],"sources":["../../../../../src/transfer-service/lombard/btc-to-btcb/_handlers/stream-quotes.ts"],"sourcesContent":["import { BitcoinChainIds, ServiceType } from '../../../../constants';\nimport { ErrorCode, ErrorReason, InvalidParamsError, SdkError } from '../../../../errors';\nimport type { Quote } from '../../../../types/quote';\nimport type { TransferService } from '../../../../types/service';\nimport type { Mutable } from '../../../../types/utility-types';\nimport { isBech32AddressInNetwork } from '../../../../utils/bitcoin-address';\nimport { isEvmAddress } from '../../../../utils/evm-address';\nimport { assetToQuoteFeeToken } from '../../../../utils/quote-fees';\nimport type { BtcToBtcbConfig } from '../../types';\nimport { analyzeSupportFactory } from './analyze-support';\nimport { getMinimumTransferAmount } from './get-minimum-transfer-amount';\n\nexport interface StreamQuotesFactoryOptions {\n config: BtcToBtcbConfig;\n}\n\nexport function streamQuotesFactory({ config }: StreamQuotesFactoryOptions): TransferService['streamQuotes'] {\n const analyzeSupport = analyzeSupportFactory({ config });\n\n return (props, handler) => {\n const ac = new AbortController();\n const cancel = () => {\n ac.abort();\n };\n\n const hasValidAssetsAndChains = analyzeSupport({\n sourceAsset: props.sourceAsset,\n sourceChainId: props.sourceChain.chainId,\n targetAsset: props.targetAsset,\n targetChainId: props.targetChain.chainId,\n });\n\n if (\n !hasValidAssetsAndChains ||\n !isBech32AddressInNetwork(props.fromAddress, config.sourceChain === BitcoinChainIds.MAINNET) ||\n !isEvmAddress(props.toAddress)\n ) {\n if (!ac.signal.aborted) {\n handler(\n 'error',\n new InvalidParamsError(ErrorReason.INVALID_PARAMS, 'Invalid addresses, assets, or chains provided.'),\n );\n handler('done');\n }\n\n return { cancel };\n }\n\n (async () => {\n const minimumAmount = getMinimumTransferAmount();\n\n if (props.amount < minimumAmount) {\n if (!ac.signal.aborted) {\n handler(\n 'error',\n new InvalidParamsError(\n ErrorReason.INVALID_PARAMS,\n `Transfer amount is below the minimum transfer amount of ${minimumAmount.toString()}.`,\n ),\n );\n handler('done');\n }\n\n return;\n }\n\n const quote: Mutable<Quote> = {\n aggregator: {\n name: 'Lombard',\n id: 'lombard-btc-to-btcb',\n },\n amountIn: props.amount,\n amountOut: props.amount - config.mintingFee,\n assetIn: props.sourceAsset,\n assetOut: props.targetAsset,\n // Set the expiration time further out since the amountOut isn't expected to change,\n // since the fee is fixed in the config at service initialization.\n expiresAt: Math.floor(Date.now() / 1_000) + 60,\n fees: [\n {\n type: 'bridge',\n name: 'Bridge Fee',\n amount: config.mintingFee,\n chainId: props.sourceChain.chainId,\n token: assetToQuoteFeeToken(props.sourceAsset),\n },\n ],\n fromAddress: props.fromAddress,\n id: crypto.randomUUID(),\n partnerFeeBps: null,\n serviceType: ServiceType.LOMBARD_BTC_TO_BTCB,\n slippageBps: props.slippageBps ?? 0,\n sourceChain: props.sourceChain,\n targetChain: props.targetChain,\n toAddress: props.toAddress,\n };\n\n if (!ac.signal.aborted) {\n handler('quote', quote);\n handler('done');\n }\n })().catch((error) => {\n if (!ac.signal.aborted) {\n handler(\n 'error',\n new SdkError(ErrorReason.UNKNOWN, ErrorCode.UNKNOWN, { cause: error, details: 'Failed to stream quotes' }),\n );\n handler('done');\n }\n });\n\n return {\n cancel,\n };\n };\n}\n"],"mappings":"mTAgBA,SAAgB,EAAoB,CAAE,UAAuE,CAC3G,IAAM,EAAiBA,EAAAA,sBAAsB,CAAE,SAAQ,CAAC,CAExD,OAAQ,EAAO,IAAY,CACzB,IAAM,EAAK,IAAI,gBACT,MAAe,CACnB,EAAG,OAAO,EAyFZ,MA9EE,CAR8B,EAAe,CAC7C,YAAa,EAAM,YACnB,cAAe,EAAM,YAAY,QACjC,YAAa,EAAM,YACnB,cAAe,EAAM,YAAY,QAClC,CAAC,EAIA,CAACC,EAAAA,yBAAyB,EAAM,YAAa,EAAO,cAAgBC,EAAAA,gBAAgB,QAAQ,EAC5F,CAACC,EAAAA,aAAa,EAAM,UAAU,EAEzB,EAAG,OAAO,UACb,EACE,QACA,IAAIC,EAAAA,mBAAmBC,EAAAA,YAAY,eAAgB,iDAAiD,CACrG,CACD,EAAQ,OAAO,EAGV,CAAE,SAAQ,IAGlB,SAAY,CACX,IAAM,EAAgBC,EAAAA,0BAA0B,CAEhD,GAAI,EAAM,OAAS,EAAe,CAC3B,EAAG,OAAO,UACb,EACE,QACA,IAAIF,EAAAA,mBACFC,EAAAA,YAAY,eACZ,2DAA2D,EAAc,UAAU,CAAC,GACrF,CACF,CACD,EAAQ,OAAO,EAGjB,OAGF,IAAM,EAAwB,CAC5B,WAAY,CACV,KAAM,UACN,GAAI,sBACL,CACD,SAAU,EAAM,OAChB,UAAW,EAAM,OAAS,EAAO,WACjC,QAAS,EAAM,YACf,SAAU,EAAM,YAGhB,UAAW,KAAK,MAAM,KAAK,KAAK,CAAG,IAAM,CAAG,GAC5C,KAAM,CACJ,CACE,KAAM,SACN,KAAM,aACN,OAAQ,EAAO,WACf,QAAS,EAAM,YAAY,QAC3B,MAAOE,EAAAA,qBAAqB,EAAM,YAAY,CAC/C,CACF,CACD,YAAa,EAAM,YACnB,GAAI,OAAO,YAAY,CACvB,cAAe,KACf,YAAaC,EAAAA,YAAY,oBACzB,YAAa,EAAM,aAAe,EAClC,YAAa,EAAM,YACnB,YAAa,EAAM,YACnB,UAAW,EAAM,UAClB,CAEI,EAAG,OAAO,UACb,EAAQ,QAAS,EAAM,CACvB,EAAQ,OAAO,KAEf,CAAC,MAAO,GAAU,CACf,EAAG,OAAO,UACb,EACE,QACA,IAAIC,EAAAA,SAASJ,EAAAA,YAAY,QAASK,EAAAA,UAAU,QAAS,CAAE,MAAO,EAAO,QAAS,0BAA2B,CAAC,CAC3G,CACD,EAAQ,OAAO,GAEjB,CAEK,CACL,SACD"}
@@ -0,0 +1,2 @@
1
+ import{BitcoinChainIds as e,ServiceType as t}from"../../../../constants.js";import{ErrorCode as n,ErrorReason as r,InvalidParamsError as i,SdkError as a}from"../../../../errors.js";import{isEvmAddress as o}from"../../../../utils/evm-address.js";import{isBech32AddressInNetwork as s}from"../../../../utils/bitcoin-address.js";import{assetToQuoteFeeToken as c}from"../../../../utils/quote-fees.js";import{analyzeSupportFactory as l}from"./analyze-support.js";import{getMinimumTransferAmount as u}from"./get-minimum-transfer-amount.js";function d({config:d}){let f=l({config:d});return(l,p)=>{let m=new AbortController,h=()=>{m.abort()};return!f({sourceAsset:l.sourceAsset,sourceChainId:l.sourceChain.chainId,targetAsset:l.targetAsset,targetChainId:l.targetChain.chainId})||!s(l.fromAddress,d.sourceChain===e.MAINNET)||!o(l.toAddress)?(m.signal.aborted||(p(`error`,new i(r.INVALID_PARAMS,`Invalid addresses, assets, or chains provided.`)),p(`done`)),{cancel:h}):((async()=>{let e=u();if(l.amount<e){m.signal.aborted||(p(`error`,new i(r.INVALID_PARAMS,`Transfer amount is below the minimum transfer amount of ${e.toString()}.`)),p(`done`));return}let n={aggregator:{name:`Lombard`,id:`lombard-btc-to-btcb`},amountIn:l.amount,amountOut:l.amount-d.mintingFee,assetIn:l.sourceAsset,assetOut:l.targetAsset,expiresAt:Math.floor(Date.now()/1e3)+60,fees:[{type:`bridge`,name:`Bridge Fee`,amount:d.mintingFee,chainId:l.sourceChain.chainId,token:c(l.sourceAsset)}],fromAddress:l.fromAddress,id:crypto.randomUUID(),partnerFeeBps:null,serviceType:t.LOMBARD_BTC_TO_BTCB,slippageBps:l.slippageBps??0,sourceChain:l.sourceChain,targetChain:l.targetChain,toAddress:l.toAddress};m.signal.aborted||(p(`quote`,n),p(`done`))})().catch(e=>{m.signal.aborted||(p(`error`,new a(r.UNKNOWN,n.UNKNOWN,{cause:e,details:`Failed to stream quotes`})),p(`done`))}),{cancel:h})}}export{d as streamQuotesFactory};
2
+ //# sourceMappingURL=stream-quotes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream-quotes.js","names":[],"sources":["../../../../../src/transfer-service/lombard/btc-to-btcb/_handlers/stream-quotes.ts"],"sourcesContent":["import { BitcoinChainIds, ServiceType } from '../../../../constants';\nimport { ErrorCode, ErrorReason, InvalidParamsError, SdkError } from '../../../../errors';\nimport type { Quote } from '../../../../types/quote';\nimport type { TransferService } from '../../../../types/service';\nimport type { Mutable } from '../../../../types/utility-types';\nimport { isBech32AddressInNetwork } from '../../../../utils/bitcoin-address';\nimport { isEvmAddress } from '../../../../utils/evm-address';\nimport { assetToQuoteFeeToken } from '../../../../utils/quote-fees';\nimport type { BtcToBtcbConfig } from '../../types';\nimport { analyzeSupportFactory } from './analyze-support';\nimport { getMinimumTransferAmount } from './get-minimum-transfer-amount';\n\nexport interface StreamQuotesFactoryOptions {\n config: BtcToBtcbConfig;\n}\n\nexport function streamQuotesFactory({ config }: StreamQuotesFactoryOptions): TransferService['streamQuotes'] {\n const analyzeSupport = analyzeSupportFactory({ config });\n\n return (props, handler) => {\n const ac = new AbortController();\n const cancel = () => {\n ac.abort();\n };\n\n const hasValidAssetsAndChains = analyzeSupport({\n sourceAsset: props.sourceAsset,\n sourceChainId: props.sourceChain.chainId,\n targetAsset: props.targetAsset,\n targetChainId: props.targetChain.chainId,\n });\n\n if (\n !hasValidAssetsAndChains ||\n !isBech32AddressInNetwork(props.fromAddress, config.sourceChain === BitcoinChainIds.MAINNET) ||\n !isEvmAddress(props.toAddress)\n ) {\n if (!ac.signal.aborted) {\n handler(\n 'error',\n new InvalidParamsError(ErrorReason.INVALID_PARAMS, 'Invalid addresses, assets, or chains provided.'),\n );\n handler('done');\n }\n\n return { cancel };\n }\n\n (async () => {\n const minimumAmount = getMinimumTransferAmount();\n\n if (props.amount < minimumAmount) {\n if (!ac.signal.aborted) {\n handler(\n 'error',\n new InvalidParamsError(\n ErrorReason.INVALID_PARAMS,\n `Transfer amount is below the minimum transfer amount of ${minimumAmount.toString()}.`,\n ),\n );\n handler('done');\n }\n\n return;\n }\n\n const quote: Mutable<Quote> = {\n aggregator: {\n name: 'Lombard',\n id: 'lombard-btc-to-btcb',\n },\n amountIn: props.amount,\n amountOut: props.amount - config.mintingFee,\n assetIn: props.sourceAsset,\n assetOut: props.targetAsset,\n // Set the expiration time further out since the amountOut isn't expected to change,\n // since the fee is fixed in the config at service initialization.\n expiresAt: Math.floor(Date.now() / 1_000) + 60,\n fees: [\n {\n type: 'bridge',\n name: 'Bridge Fee',\n amount: config.mintingFee,\n chainId: props.sourceChain.chainId,\n token: assetToQuoteFeeToken(props.sourceAsset),\n },\n ],\n fromAddress: props.fromAddress,\n id: crypto.randomUUID(),\n partnerFeeBps: null,\n serviceType: ServiceType.LOMBARD_BTC_TO_BTCB,\n slippageBps: props.slippageBps ?? 0,\n sourceChain: props.sourceChain,\n targetChain: props.targetChain,\n toAddress: props.toAddress,\n };\n\n if (!ac.signal.aborted) {\n handler('quote', quote);\n handler('done');\n }\n })().catch((error) => {\n if (!ac.signal.aborted) {\n handler(\n 'error',\n new SdkError(ErrorReason.UNKNOWN, ErrorCode.UNKNOWN, { cause: error, details: 'Failed to stream quotes' }),\n );\n handler('done');\n }\n });\n\n return {\n cancel,\n };\n };\n}\n"],"mappings":"qhBAgBA,SAAgB,EAAoB,CAAE,UAAuE,CAC3G,IAAM,EAAiB,EAAsB,CAAE,SAAQ,CAAC,CAExD,OAAQ,EAAO,IAAY,CACzB,IAAM,EAAK,IAAI,gBACT,MAAe,CACnB,EAAG,OAAO,EAyFZ,MA9EE,CAR8B,EAAe,CAC7C,YAAa,EAAM,YACnB,cAAe,EAAM,YAAY,QACjC,YAAa,EAAM,YACnB,cAAe,EAAM,YAAY,QAClC,CAAC,EAIA,CAAC,EAAyB,EAAM,YAAa,EAAO,cAAgB,EAAgB,QAAQ,EAC5F,CAAC,EAAa,EAAM,UAAU,EAEzB,EAAG,OAAO,UACb,EACE,QACA,IAAI,EAAmB,EAAY,eAAgB,iDAAiD,CACrG,CACD,EAAQ,OAAO,EAGV,CAAE,SAAQ,IAGlB,SAAY,CACX,IAAM,EAAgB,GAA0B,CAEhD,GAAI,EAAM,OAAS,EAAe,CAC3B,EAAG,OAAO,UACb,EACE,QACA,IAAI,EACF,EAAY,eACZ,2DAA2D,EAAc,UAAU,CAAC,GACrF,CACF,CACD,EAAQ,OAAO,EAGjB,OAGF,IAAM,EAAwB,CAC5B,WAAY,CACV,KAAM,UACN,GAAI,sBACL,CACD,SAAU,EAAM,OAChB,UAAW,EAAM,OAAS,EAAO,WACjC,QAAS,EAAM,YACf,SAAU,EAAM,YAGhB,UAAW,KAAK,MAAM,KAAK,KAAK,CAAG,IAAM,CAAG,GAC5C,KAAM,CACJ,CACE,KAAM,SACN,KAAM,aACN,OAAQ,EAAO,WACf,QAAS,EAAM,YAAY,QAC3B,MAAO,EAAqB,EAAM,YAAY,CAC/C,CACF,CACD,YAAa,EAAM,YACnB,GAAI,OAAO,YAAY,CACvB,cAAe,KACf,YAAa,EAAY,oBACzB,YAAa,EAAM,aAAe,EAClC,YAAa,EAAM,YACnB,YAAa,EAAM,YACnB,UAAW,EAAM,UAClB,CAEI,EAAG,OAAO,UACb,EAAQ,QAAS,EAAM,CACvB,EAAQ,OAAO,KAEf,CAAC,MAAO,GAAU,CACf,EAAG,OAAO,UACb,EACE,QACA,IAAI,EAAS,EAAY,QAAS,EAAU,QAAS,CAAE,MAAO,EAAO,QAAS,0BAA2B,CAAC,CAC3G,CACD,EAAQ,OAAO,GAEjB,CAEK,CACL,SACD"}
@@ -0,0 +1,2 @@
1
+ require(`../../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../../errors.cjs`),t=require(`../../../_utils.cjs`),n=require(`../../constants.cjs`),r=require(`../../_utils/metadata.cjs`);let i=require(`viem`),a=require(`@lombard.finance/sdk`);function o({bitcoinFunctions:e,config:n}){return({transfer:r,updateListener:i})=>{let a=new AbortController,o=()=>{a.abort()};return r.status===`completed`||r.status===`failed`?{cancel:o,result:Promise.resolve(r)}:{cancel:o,result:(async()=>{let o=structuredClone(r),l=t.getEvmClientForChain({chain:r.targetChain});for(;!a.signal.aborted;){let r=o.status;switch(o.status){case`source-pending`:o=await s({bitcoinFunctions:e,currentTransfer:o,signal:a.signal}),a.signal.aborted||i(o);break;case`source-completed`:case`target-pending`:o=await c({config:n,currentTransfer:o,signal:a.signal,targetClient:l}),a.signal.aborted||i(o);break;default:return o}o.status===r&&await t.waitForTimeoutOrAbort({timeoutMs:3e4,signal:a.signal})}return o})()}}}async function s({bitcoinFunctions:e,currentTransfer:n,signal:r}){let i=await t.awaitOrAbort(e.getTransaction(n.source.txHash),r);if(i.status===`aborted`)return n;let{confirmations:a}=i.value;return a<n.source.requiredConfirmationCount?{...n,source:{...n.source,confirmationCount:a}}:{...n,source:{...n.source,confirmationCount:a},status:`source-completed`}}async function c({config:o,currentTransfer:s,signal:c,targetClient:l}){switch(s.status){case`source-completed`:{let i=await t.awaitOrAbort((0,a.getDepositsByAddress)({address:s.toAddress,env:o.env}),c);if(i.status===`aborted`)return s;let l=i.value.find(e=>e.txHash.toLowerCase()===s.source.txHash.toLowerCase());if(!l)return s;let{needsNotarizationUpdate:u,needsSessionStateUpdate:d}=r.getMetadataUpdates(s.metadata,l.notarizationStatus,l.sessionState);return u||d?{...s,metadata:{...s.metadata,...u&&{notarizationStatus:l.notarizationStatus},...d&&{sessionState:l.sessionState}}}:r.isDepositFailed(l)?{...s,errorCode:e.ErrorCode.NOTARIZATION_FAILED,failedAtMs:Date.now(),status:`failed`}:l.claimTxHash?{...s,status:`target-pending`,target:{confirmationCount:0,requiredConfirmationCount:n.EVM_CONFIRMATION_COUNT,startedAtMs:Date.now(),txHash:l.claimTxHash}}:s}default:{if(!s.target?.txHash)return{...s,errorCode:e.ErrorCode.UNKNOWN,errorReason:`Missing target transaction hash`,failedAtMs:Date.now(),status:`failed`};let{confirmationCount:n,requiredConfirmationCount:r,txHash:a}=s.target;if(!(0,i.isHash)(a))return{...s,errorCode:e.ErrorCode.UNKNOWN,errorReason:`Invalid target transaction hash`,failedAtMs:Date.now(),status:`failed`};try{let i=await t.awaitOrAbort(l.waitForTransactionReceipt({confirmations:Math.min(n+1,r),hash:a}),c);if(i.status===`aborted`)return s;let o=i.value;if(o.status===`reverted`)return{...s,errorCode:e.ErrorCode.TRANSACTION_REVERTED,failedAtMs:Date.now(),status:`failed`};let u=await l.getTransactionConfirmations({transactionReceipt:o}).then(e=>Number(e)).catch(()=>n+1);return u<r?{...s,target:{...s.target,confirmationCount:u}}:{...s,completedAtMs:Date.now(),status:`completed`,target:{...s.target,confirmationCount:u}}}catch(e){return{...s,errorCode:t.getErrorCodeForViemError(e),failedAtMs:Date.now(),status:`failed`}}}}}exports.trackTransferFactory=o;
2
+ //# sourceMappingURL=track-transfer.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"track-transfer.cjs","names":["getEvmClientForChain","waitForTimeoutOrAbort","awaitOrAbort","getMetadataUpdates","isDepositFailed","ErrorCode","EVM_CONFIRMATION_COUNT","getErrorCodeForViemError"],"sources":["../../../../../src/transfer-service/lombard/btc-to-btcb/_handlers/track-transfer.ts"],"sourcesContent":["import { getDepositsByAddress } from '@lombard.finance/sdk';\nimport { ErrorCode } from '../../../../errors';\nimport type { BitcoinFunctions } from '../../../../types/bitcoin';\nimport type { TransferService } from '../../../../types/service';\nimport type {\n CompletedTransfer,\n FailedTransfer,\n SourceCompletedTransfer,\n SourcePendingTransfer,\n TargetPendingTransfer,\n Transfer,\n} from '../../../../types/transfer';\nimport { awaitOrAbort, getErrorCodeForViemError, getEvmClientForChain, waitForTimeoutOrAbort } from '../../../_utils';\nimport type { BtcToBtcbConfig } from '../../types';\nimport { isHash } from 'viem';\nimport { getMetadataUpdates, isDepositFailed } from '../../_utils/metadata';\nimport { EVM_CONFIRMATION_COUNT } from '../../constants';\n\n// Polling interval for BTC deposits (30 seconds - faster than BTC block time since we also poll Lombard API)\nconst DEPOSIT_POLLING_INTERVAL_MS = 1000 * 30;\n\nexport interface TrackTransferFactoryOptions {\n bitcoinFunctions: BitcoinFunctions;\n config: BtcToBtcbConfig;\n}\n\nexport function trackTransferFactory({\n bitcoinFunctions,\n config,\n}: TrackTransferFactoryOptions): TransferService['trackTransfer'] {\n return ({ transfer, updateListener }) => {\n const ac = new AbortController();\n const cancel = () => {\n ac.abort();\n };\n\n if (transfer.status === 'completed' || transfer.status === 'failed') {\n return {\n cancel,\n result: Promise.resolve(transfer),\n };\n }\n\n const executeTracking = async (): Promise<Transfer> => {\n let currentTransfer: Transfer = structuredClone(transfer);\n\n const targetClient = getEvmClientForChain({ chain: transfer.targetChain });\n\n while (!ac.signal.aborted) {\n const statusBeforeTracking = currentTransfer.status;\n\n switch (currentTransfer.status) {\n case 'source-pending': {\n currentTransfer = await _trackSourceTx({\n bitcoinFunctions,\n currentTransfer,\n signal: ac.signal,\n });\n\n if (!ac.signal.aborted) {\n updateListener(currentTransfer);\n }\n\n break;\n }\n case 'source-completed':\n case 'target-pending': {\n currentTransfer = await _trackTargetTx({\n config,\n currentTransfer,\n signal: ac.signal,\n targetClient,\n });\n\n if (!ac.signal.aborted) {\n updateListener(currentTransfer);\n }\n\n break;\n }\n default: {\n return currentTransfer;\n }\n }\n\n const hasStatusChanged = currentTransfer.status !== statusBeforeTracking;\n\n if (!hasStatusChanged) {\n await waitForTimeoutOrAbort({ timeoutMs: DEPOSIT_POLLING_INTERVAL_MS, signal: ac.signal });\n }\n }\n\n return currentTransfer;\n };\n\n return {\n cancel,\n result: executeTracking(),\n };\n };\n}\n\nexport interface TrackBaseParams {\n currentTransfer: Transfer;\n signal: AbortSignal;\n}\n\nexport interface TrackSourceTxParams extends TrackBaseParams {\n bitcoinFunctions: BitcoinFunctions;\n currentTransfer: SourcePendingTransfer;\n}\n\nexport interface TrackTargetTxParams extends TrackBaseParams {\n config: BtcToBtcbConfig;\n currentTransfer: SourceCompletedTransfer | TargetPendingTransfer;\n targetClient: ReturnType<typeof getEvmClientForChain>;\n}\n\nexport async function _trackSourceTx({\n bitcoinFunctions,\n currentTransfer,\n signal,\n}: TrackSourceTxParams): Promise<SourcePendingTransfer | SourceCompletedTransfer | FailedTransfer> {\n const transactionResult = await awaitOrAbort(bitcoinFunctions.getTransaction(currentTransfer.source.txHash), signal);\n\n if (transactionResult.status === 'aborted') {\n return currentTransfer;\n }\n\n const { confirmations: confirmationCount } = transactionResult.value;\n\n if (confirmationCount < currentTransfer.source.requiredConfirmationCount) {\n return {\n ...currentTransfer,\n source: {\n ...currentTransfer.source,\n confirmationCount,\n },\n } satisfies SourcePendingTransfer;\n }\n\n return {\n ...currentTransfer,\n source: {\n ...currentTransfer.source,\n confirmationCount,\n },\n status: 'source-completed',\n } satisfies SourceCompletedTransfer;\n}\n\nexport async function _trackTargetTx({\n config,\n currentTransfer,\n signal,\n targetClient,\n}: TrackTargetTxParams): Promise<SourceCompletedTransfer | TargetPendingTransfer | FailedTransfer | CompletedTransfer> {\n switch (currentTransfer.status) {\n case 'source-completed': {\n const depositsResult = await awaitOrAbort(\n getDepositsByAddress({ address: currentTransfer.toAddress, env: config.env }),\n signal,\n );\n\n if (depositsResult.status === 'aborted') {\n return currentTransfer;\n }\n\n const transferDeposit = depositsResult.value.find(\n (d) => d.txHash.toLowerCase() === currentTransfer.source.txHash.toLowerCase(),\n );\n\n if (!transferDeposit) {\n // Source Completed but no deposit found yet on target\n return currentTransfer;\n }\n\n const { needsNotarizationUpdate, needsSessionStateUpdate } = getMetadataUpdates(\n currentTransfer.metadata,\n transferDeposit.notarizationStatus,\n transferDeposit.sessionState,\n );\n\n // Update metadata if needed\n if (needsNotarizationUpdate || needsSessionStateUpdate) {\n return {\n ...currentTransfer,\n metadata: {\n ...currentTransfer.metadata,\n ...(needsNotarizationUpdate && { notarizationStatus: transferDeposit.notarizationStatus }),\n ...(needsSessionStateUpdate && { sessionState: transferDeposit.sessionState }),\n },\n } satisfies SourceCompletedTransfer;\n }\n\n if (isDepositFailed(transferDeposit)) {\n return {\n ...currentTransfer,\n errorCode: ErrorCode.NOTARIZATION_FAILED,\n failedAtMs: Date.now(),\n status: 'failed',\n } satisfies FailedTransfer;\n }\n\n if (!transferDeposit.claimTxHash) {\n return currentTransfer;\n }\n\n return {\n ...currentTransfer,\n status: 'target-pending',\n target: {\n confirmationCount: 0,\n requiredConfirmationCount: EVM_CONFIRMATION_COUNT,\n startedAtMs: Date.now(),\n txHash: transferDeposit.claimTxHash,\n },\n } satisfies TargetPendingTransfer;\n }\n default: {\n // target-pending\n\n if (!currentTransfer.target?.txHash) {\n // Transfer missing target info, should not reach here\n return {\n ...currentTransfer,\n errorCode: ErrorCode.UNKNOWN,\n errorReason: 'Missing target transaction hash',\n failedAtMs: Date.now(),\n status: 'failed',\n } satisfies FailedTransfer;\n }\n\n const { confirmationCount, requiredConfirmationCount, txHash } = currentTransfer.target;\n\n if (!isHash(txHash)) {\n // Invalid tx hash\n return {\n ...currentTransfer,\n errorCode: ErrorCode.UNKNOWN,\n errorReason: 'Invalid target transaction hash',\n failedAtMs: Date.now(),\n status: 'failed',\n } satisfies FailedTransfer;\n }\n\n try {\n const transactionResult = await awaitOrAbort(\n targetClient.waitForTransactionReceipt({\n confirmations: Math.min(confirmationCount + 1, requiredConfirmationCount),\n hash: txHash,\n }),\n signal,\n );\n\n if (transactionResult.status === 'aborted') {\n return currentTransfer;\n }\n\n const transactionReceipt = transactionResult.value;\n\n if (transactionReceipt.status === 'reverted') {\n return {\n ...currentTransfer,\n errorCode: ErrorCode.TRANSACTION_REVERTED,\n failedAtMs: Date.now(),\n status: 'failed',\n } satisfies FailedTransfer;\n }\n\n const newConfirmationCount: number = await targetClient\n .getTransactionConfirmations({\n transactionReceipt,\n })\n .then((count) => Number(count))\n .catch(() => confirmationCount + 1);\n\n // If still not enough confirmations, update the count\n if (newConfirmationCount < requiredConfirmationCount) {\n return {\n ...currentTransfer,\n target: {\n ...currentTransfer.target,\n confirmationCount: newConfirmationCount,\n },\n } satisfies TargetPendingTransfer;\n }\n\n return {\n ...currentTransfer,\n completedAtMs: Date.now(),\n status: 'completed',\n target: {\n ...currentTransfer.target,\n confirmationCount: newConfirmationCount,\n },\n } satisfies CompletedTransfer;\n } catch (error) {\n return {\n ...currentTransfer,\n errorCode: getErrorCodeForViemError(error),\n failedAtMs: Date.now(),\n status: 'failed',\n } satisfies FailedTransfer;\n }\n }\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{ErrorCode as e}from"../../../../errors.js";import{awaitOrAbort as t,getErrorCodeForViemError as n,getEvmClientForChain as r,waitForTimeoutOrAbort as i}from"../../../_utils.js";import{EVM_CONFIRMATION_COUNT as a}from"../../constants.js";import{getMetadataUpdates as o,isDepositFailed as s}from"../../_utils/metadata.js";import{isHash as c}from"viem";import{getDepositsByAddress as l}from"@lombard.finance/sdk";function u({bitcoinFunctions:e,config:t}){return({transfer:n,updateListener:a})=>{let o=new AbortController,s=()=>{o.abort()};return n.status===`completed`||n.status===`failed`?{cancel:s,result:Promise.resolve(n)}:{cancel:s,result:(async()=>{let s=structuredClone(n),c=r({chain:n.targetChain});for(;!o.signal.aborted;){let n=s.status;switch(s.status){case`source-pending`:s=await d({bitcoinFunctions:e,currentTransfer:s,signal:o.signal}),o.signal.aborted||a(s);break;case`source-completed`:case`target-pending`:s=await f({config:t,currentTransfer:s,signal:o.signal,targetClient:c}),o.signal.aborted||a(s);break;default:return s}s.status===n&&await i({timeoutMs:3e4,signal:o.signal})}return s})()}}}async function d({bitcoinFunctions:e,currentTransfer:n,signal:r}){let i=await t(e.getTransaction(n.source.txHash),r);if(i.status===`aborted`)return n;let{confirmations:a}=i.value;return a<n.source.requiredConfirmationCount?{...n,source:{...n.source,confirmationCount:a}}:{...n,source:{...n.source,confirmationCount:a},status:`source-completed`}}async function f({config:r,currentTransfer:i,signal:u,targetClient:d}){switch(i.status){case`source-completed`:{let n=await t(l({address:i.toAddress,env:r.env}),u);if(n.status===`aborted`)return i;let c=n.value.find(e=>e.txHash.toLowerCase()===i.source.txHash.toLowerCase());if(!c)return i;let{needsNotarizationUpdate:d,needsSessionStateUpdate:f}=o(i.metadata,c.notarizationStatus,c.sessionState);return d||f?{...i,metadata:{...i.metadata,...d&&{notarizationStatus:c.notarizationStatus},...f&&{sessionState:c.sessionState}}}:s(c)?{...i,errorCode:e.NOTARIZATION_FAILED,failedAtMs:Date.now(),status:`failed`}:c.claimTxHash?{...i,status:`target-pending`,target:{confirmationCount:0,requiredConfirmationCount:a,startedAtMs:Date.now(),txHash:c.claimTxHash}}:i}default:{if(!i.target?.txHash)return{...i,errorCode:e.UNKNOWN,errorReason:`Missing target transaction hash`,failedAtMs:Date.now(),status:`failed`};let{confirmationCount:r,requiredConfirmationCount:a,txHash:o}=i.target;if(!c(o))return{...i,errorCode:e.UNKNOWN,errorReason:`Invalid target transaction hash`,failedAtMs:Date.now(),status:`failed`};try{let n=await t(d.waitForTransactionReceipt({confirmations:Math.min(r+1,a),hash:o}),u);if(n.status===`aborted`)return i;let s=n.value;if(s.status===`reverted`)return{...i,errorCode:e.TRANSACTION_REVERTED,failedAtMs:Date.now(),status:`failed`};let c=await d.getTransactionConfirmations({transactionReceipt:s}).then(e=>Number(e)).catch(()=>r+1);return c<a?{...i,target:{...i.target,confirmationCount:c}}:{...i,completedAtMs:Date.now(),status:`completed`,target:{...i.target,confirmationCount:c}}}catch(e){return{...i,errorCode:n(e),failedAtMs:Date.now(),status:`failed`}}}}}export{u as trackTransferFactory};
2
+ //# sourceMappingURL=track-transfer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"track-transfer.js","names":[],"sources":["../../../../../src/transfer-service/lombard/btc-to-btcb/_handlers/track-transfer.ts"],"sourcesContent":["import { getDepositsByAddress } from '@lombard.finance/sdk';\nimport { ErrorCode } from '../../../../errors';\nimport type { BitcoinFunctions } from '../../../../types/bitcoin';\nimport type { TransferService } from '../../../../types/service';\nimport type {\n CompletedTransfer,\n FailedTransfer,\n SourceCompletedTransfer,\n SourcePendingTransfer,\n TargetPendingTransfer,\n Transfer,\n} from '../../../../types/transfer';\nimport { awaitOrAbort, getErrorCodeForViemError, getEvmClientForChain, waitForTimeoutOrAbort } from '../../../_utils';\nimport type { BtcToBtcbConfig } from '../../types';\nimport { isHash } from 'viem';\nimport { getMetadataUpdates, isDepositFailed } from '../../_utils/metadata';\nimport { EVM_CONFIRMATION_COUNT } from '../../constants';\n\n// Polling interval for BTC deposits (30 seconds - faster than BTC block time since we also poll Lombard API)\nconst DEPOSIT_POLLING_INTERVAL_MS = 1000 * 30;\n\nexport interface TrackTransferFactoryOptions {\n bitcoinFunctions: BitcoinFunctions;\n config: BtcToBtcbConfig;\n}\n\nexport function trackTransferFactory({\n bitcoinFunctions,\n config,\n}: TrackTransferFactoryOptions): TransferService['trackTransfer'] {\n return ({ transfer, updateListener }) => {\n const ac = new AbortController();\n const cancel = () => {\n ac.abort();\n };\n\n if (transfer.status === 'completed' || transfer.status === 'failed') {\n return {\n cancel,\n result: Promise.resolve(transfer),\n };\n }\n\n const executeTracking = async (): Promise<Transfer> => {\n let currentTransfer: Transfer = structuredClone(transfer);\n\n const targetClient = getEvmClientForChain({ chain: transfer.targetChain });\n\n while (!ac.signal.aborted) {\n const statusBeforeTracking = currentTransfer.status;\n\n switch (currentTransfer.status) {\n case 'source-pending': {\n currentTransfer = await _trackSourceTx({\n bitcoinFunctions,\n currentTransfer,\n signal: ac.signal,\n });\n\n if (!ac.signal.aborted) {\n updateListener(currentTransfer);\n }\n\n break;\n }\n case 'source-completed':\n case 'target-pending': {\n currentTransfer = await _trackTargetTx({\n config,\n currentTransfer,\n signal: ac.signal,\n targetClient,\n });\n\n if (!ac.signal.aborted) {\n updateListener(currentTransfer);\n }\n\n break;\n }\n default: {\n return currentTransfer;\n }\n }\n\n const hasStatusChanged = currentTransfer.status !== statusBeforeTracking;\n\n if (!hasStatusChanged) {\n await waitForTimeoutOrAbort({ timeoutMs: DEPOSIT_POLLING_INTERVAL_MS, signal: ac.signal });\n }\n }\n\n return currentTransfer;\n };\n\n return {\n cancel,\n result: executeTracking(),\n };\n };\n}\n\nexport interface TrackBaseParams {\n currentTransfer: Transfer;\n signal: AbortSignal;\n}\n\nexport interface TrackSourceTxParams extends TrackBaseParams {\n bitcoinFunctions: BitcoinFunctions;\n currentTransfer: SourcePendingTransfer;\n}\n\nexport interface TrackTargetTxParams extends TrackBaseParams {\n config: BtcToBtcbConfig;\n currentTransfer: SourceCompletedTransfer | TargetPendingTransfer;\n targetClient: ReturnType<typeof getEvmClientForChain>;\n}\n\nexport async function _trackSourceTx({\n bitcoinFunctions,\n currentTransfer,\n signal,\n}: TrackSourceTxParams): Promise<SourcePendingTransfer | SourceCompletedTransfer | FailedTransfer> {\n const transactionResult = await awaitOrAbort(bitcoinFunctions.getTransaction(currentTransfer.source.txHash), signal);\n\n if (transactionResult.status === 'aborted') {\n return currentTransfer;\n }\n\n const { confirmations: confirmationCount } = transactionResult.value;\n\n if (confirmationCount < currentTransfer.source.requiredConfirmationCount) {\n return {\n ...currentTransfer,\n source: {\n ...currentTransfer.source,\n confirmationCount,\n },\n } satisfies SourcePendingTransfer;\n }\n\n return {\n ...currentTransfer,\n source: {\n ...currentTransfer.source,\n confirmationCount,\n },\n status: 'source-completed',\n } satisfies SourceCompletedTransfer;\n}\n\nexport async function _trackTargetTx({\n config,\n currentTransfer,\n signal,\n targetClient,\n}: TrackTargetTxParams): Promise<SourceCompletedTransfer | TargetPendingTransfer | FailedTransfer | CompletedTransfer> {\n switch (currentTransfer.status) {\n case 'source-completed': {\n const depositsResult = await awaitOrAbort(\n getDepositsByAddress({ address: currentTransfer.toAddress, env: config.env }),\n signal,\n );\n\n if (depositsResult.status === 'aborted') {\n return currentTransfer;\n }\n\n const transferDeposit = depositsResult.value.find(\n (d) => d.txHash.toLowerCase() === currentTransfer.source.txHash.toLowerCase(),\n );\n\n if (!transferDeposit) {\n // Source Completed but no deposit found yet on target\n return currentTransfer;\n }\n\n const { needsNotarizationUpdate, needsSessionStateUpdate } = getMetadataUpdates(\n currentTransfer.metadata,\n transferDeposit.notarizationStatus,\n transferDeposit.sessionState,\n );\n\n // Update metadata if needed\n if (needsNotarizationUpdate || needsSessionStateUpdate) {\n return {\n ...currentTransfer,\n metadata: {\n ...currentTransfer.metadata,\n ...(needsNotarizationUpdate && { notarizationStatus: transferDeposit.notarizationStatus }),\n ...(needsSessionStateUpdate && { sessionState: transferDeposit.sessionState }),\n },\n } satisfies SourceCompletedTransfer;\n }\n\n if (isDepositFailed(transferDeposit)) {\n return {\n ...currentTransfer,\n errorCode: ErrorCode.NOTARIZATION_FAILED,\n failedAtMs: Date.now(),\n status: 'failed',\n } satisfies FailedTransfer;\n }\n\n if (!transferDeposit.claimTxHash) {\n return currentTransfer;\n }\n\n return {\n ...currentTransfer,\n status: 'target-pending',\n target: {\n confirmationCount: 0,\n requiredConfirmationCount: EVM_CONFIRMATION_COUNT,\n startedAtMs: Date.now(),\n txHash: transferDeposit.claimTxHash,\n },\n } satisfies TargetPendingTransfer;\n }\n default: {\n // target-pending\n\n if (!currentTransfer.target?.txHash) {\n // Transfer missing target info, should not reach here\n return {\n ...currentTransfer,\n errorCode: ErrorCode.UNKNOWN,\n errorReason: 'Missing target transaction hash',\n failedAtMs: Date.now(),\n status: 'failed',\n } satisfies FailedTransfer;\n }\n\n const { confirmationCount, requiredConfirmationCount, txHash } = currentTransfer.target;\n\n if (!isHash(txHash)) {\n // Invalid tx hash\n return {\n ...currentTransfer,\n errorCode: ErrorCode.UNKNOWN,\n errorReason: 'Invalid target transaction hash',\n failedAtMs: Date.now(),\n status: 'failed',\n } satisfies FailedTransfer;\n }\n\n try {\n const transactionResult = await awaitOrAbort(\n targetClient.waitForTransactionReceipt({\n confirmations: Math.min(confirmationCount + 1, requiredConfirmationCount),\n hash: txHash,\n }),\n signal,\n );\n\n if (transactionResult.status === 'aborted') {\n return currentTransfer;\n }\n\n const transactionReceipt = transactionResult.value;\n\n if (transactionReceipt.status === 'reverted') {\n return {\n ...currentTransfer,\n errorCode: ErrorCode.TRANSACTION_REVERTED,\n failedAtMs: Date.now(),\n status: 'failed',\n } satisfies FailedTransfer;\n }\n\n const newConfirmationCount: number = await targetClient\n .getTransactionConfirmations({\n transactionReceipt,\n })\n .then((count) => Number(count))\n .catch(() => confirmationCount + 1);\n\n // If still not enough confirmations, update the count\n if (newConfirmationCount < requiredConfirmationCount) {\n return {\n ...currentTransfer,\n target: {\n ...currentTransfer.target,\n confirmationCount: newConfirmationCount,\n },\n } satisfies TargetPendingTransfer;\n }\n\n return {\n ...currentTransfer,\n completedAtMs: Date.now(),\n status: 'completed',\n target: {\n ...currentTransfer.target,\n confirmationCount: newConfirmationCount,\n },\n } satisfies CompletedTransfer;\n } catch (error) {\n return {\n ...currentTransfer,\n errorCode: getErrorCodeForViemError(error),\n failedAtMs: Date.now(),\n status: 'failed',\n } satisfies FailedTransfer;\n }\n }\n }\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.cjs`),i=require(`../../../../utils/bitcoin-address.cjs`),a=require(`../../constants.cjs`),o=require(`../../_utils/utxo.cjs`);let s=require(`viem`),c=require(`@lombard.finance/sdk`);function l({bitcoinFunctions:l,btcSigner:u,config:d,evmSigner:f}){return async({quote:p,onStepChange:m})=>{if(!i.isBech32AddressInNetwork(p.fromAddress,d.environment===e.Environment.PROD))throw new t.InvalidParamsError(t.ErrorReason.INCORRECT_ADDRESS_PROVIDED,`Invalid fromAddress was provided. Make sure it is a BTC address from correct environment.`);if(!(0,s.isAddress)(p.toAddress))throw new t.InvalidParamsError(t.ErrorReason.INCORRECT_ADDRESS_PROVIDED,`Invalid toAddress was provided. Must be a valid EVM address.`);let h=p.toAddress,g=n.caip2ToEip155ChainId(p.targetChain.chainId),_;try{_=await(0,c.getDepositBtcAddress)({address:h,chainId:g,partnerId:a.LOMBARD_PARTNER_ID,env:d.env,token:d.targetToken})}catch{}let v=_?1:2,y={currentSignature:1,currentSignatureReason:_?e.TransferSignatureReason.TokensTransfer:e.TransferSignatureReason.AddressOwnership,quote:p,requiredSignatures:v};if(!_){let n=r.getEvmClientForChain({chain:p.targetChain}),i=(0,c.getAddressConfirmationMessage)(g),o=await f.signMessage({message:i,address:h,chainId:g},e=>n.sendRawTransaction({serializedTransaction:e}),y);if(y.currentSignature=2,y.currentSignatureReason=e.TransferSignatureReason.TokensTransfer,_=await(0,c.generateDepositBtcAddress)({address:h,chainId:g,env:d.env,partnerId:a.LOMBARD_PARTNER_ID,signature:o,token:d.targetToken}),_===c.SANCTIONED_ADDRESS)throw new t.InvalidParamsError(t.ErrorReason.ADDRESS_IS_BLOCKED,_)}if(!i.isBech32AddressInNetwork(_,d.environment===e.Environment.PROD))throw new t.InvalidParamsError(t.ErrorReason.INCORRECT_ADDRESS_PROVIDED,`Generated deposit address is invalid`);let{low:b,high:x}=await l.getFeeRates(),S=d.environment===e.Environment.PROD?x:b,{utxos:C}=await l.getUtxoBalance(p.fromAddress,!1),{inputs:w,outputs:T}=await o.selectUtxos(_,p.fromAddress,p.amountIn,S,C,l);if(!w||!T)throw new t.InvalidParamsError(t.ErrorReason.INVALID_PARAMS,`Unable to create transaction. UTXO selection failed.`);let E=Date.now();m?.(y);let D;try{D=await r.getEvmClientForChain({chain:p.targetChain}).getBlockNumber()}catch{return{amountIn:p.amountIn,amountOut:p.amountOut,environment:d.environment,errorCode:t.ErrorCode.UNKNOWN,errorReason:`Unable to fetch target chain block number`,failedAtMs:Date.now(),fees:p.fees,fromAddress:p.fromAddress,id:p.id,partnerFeeBps:p.partnerFeeBps,sourceAsset:p.assetIn,sourceChain:p.sourceChain,targetAsset:p.assetOut,targetChain:p.targetChain,toAddress:p.toAddress,status:`failed`,type:e.ServiceType.LOMBARD_BTC_TO_BTCB}}let O=await u.sign({inputs:w,outputs:T},l.issueRawTx,y);return{amountIn:p.amountIn,amountOut:p.amountOut,environment:d.environment,fees:p.fees,fromAddress:p.fromAddress,id:p.id,partnerFeeBps:p.partnerFeeBps,source:{confirmationCount:0,requiredConfirmationCount:a.BTC_CONFIRMATION_COUNT,startedAtMs:E,txHash:O,targetStartBlockNumber:D},sourceAsset:p.assetIn,sourceChain:p.sourceChain,status:`source-pending`,targetAsset:p.assetOut,targetChain:p.targetChain,toAddress:p.toAddress,type:e.ServiceType.LOMBARD_BTC_TO_BTCB}}}exports.transferAssetFactory=l;
2
+ //# sourceMappingURL=transfer-asset.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transfer-asset.cjs","names":["isBech32AddressInNetwork","Environment","InvalidParamsError","ErrorReason","caip2ToEip155ChainId","LOMBARD_PARTNER_ID","TransferSignatureReason","getEvmClientForChain","SANCTIONED_ADDRESS","selectUtxos","ErrorCode","ServiceType","BTC_CONFIRMATION_COUNT"],"sources":["../../../../../src/transfer-service/lombard/btc-to-btcb/_handlers/transfer-asset.ts"],"sourcesContent":["import { isAddress, type Mutable } from 'viem';\nimport { Environment, ServiceType, TransferSignatureReason } from '../../../../constants';\nimport { ErrorCode, ErrorReason, InvalidParamsError } from '../../../../errors';\nimport { caip2ToEip155ChainId } from '../../../../utils/caip';\nimport type { BitcoinFunctions } from '../../../../types/bitcoin';\nimport type { TransferService } from '../../../../types/service';\nimport type { BtcSigner, EvmSignerWithMessage } from '../../../../types/signer';\nimport type { FailedTransfer, SourcePendingTransfer, TransferStepDetails } from '../../../../types/transfer';\nimport { isBech32AddressInNetwork } from '../../../../utils/bitcoin-address';\nimport type { BtcToBtcbConfig } from '../../types';\nimport {\n generateDepositBtcAddress,\n getDepositBtcAddress,\n SANCTIONED_ADDRESS,\n getAddressConfirmationMessage,\n type ChainId,\n} from '@lombard.finance/sdk';\nimport { BTC_CONFIRMATION_COUNT, LOMBARD_PARTNER_ID } from '../../constants';\nimport { getEvmClientForChain } from '../../../_utils';\nimport { selectUtxos } from '../../_utils/utxo';\n\nexport interface TransferAssetFactoryOptions {\n bitcoinFunctions: BitcoinFunctions;\n btcSigner: BtcSigner;\n config: BtcToBtcbConfig;\n evmSigner: EvmSignerWithMessage;\n}\n\nexport function transferAssetFactory({\n bitcoinFunctions,\n btcSigner,\n config,\n evmSigner,\n}: TransferAssetFactoryOptions): TransferService['transferAsset'] {\n return async ({ quote, onStepChange }) => {\n if (!isBech32AddressInNetwork(quote.fromAddress, config.environment === Environment.PROD)) {\n throw new InvalidParamsError(\n ErrorReason.INCORRECT_ADDRESS_PROVIDED,\n 'Invalid fromAddress was provided. Make sure it is a BTC address from correct environment.',\n );\n }\n\n if (!isAddress(quote.toAddress)) {\n throw new InvalidParamsError(\n ErrorReason.INCORRECT_ADDRESS_PROVIDED,\n 'Invalid toAddress was provided. Must be a valid EVM address.',\n );\n }\n\n const targetAddress = quote.toAddress;\n const targetChainId: number = caip2ToEip155ChainId(quote.targetChain.chainId);\n\n let btcDepositAddress: string | undefined;\n\n try {\n btcDepositAddress = await getDepositBtcAddress({\n address: targetAddress,\n chainId: targetChainId as ChainId,\n partnerId: LOMBARD_PARTNER_ID,\n env: config.env,\n token: config.targetToken,\n });\n } catch {\n // Deposit address not found. Generate a new one.\n }\n\n const requiredSignatures: number = btcDepositAddress ? 1 : 2;\n const transferStep: Mutable<TransferStepDetails> = {\n currentSignature: 1,\n currentSignatureReason: btcDepositAddress\n ? TransferSignatureReason.TokensTransfer\n : TransferSignatureReason.AddressOwnership,\n quote,\n requiredSignatures,\n };\n\n // Generate a new deposit address if not existing\n if (!btcDepositAddress) {\n const client = getEvmClientForChain({ chain: quote.targetChain });\n\n // This message MUST match whatever Lombard is using to verify the provided signature.\n const message = getAddressConfirmationMessage(targetChainId);\n const signature = await evmSigner.signMessage(\n { message, address: targetAddress, chainId: targetChainId },\n (signedTxHash) => client.sendRawTransaction({ serializedTransaction: signedTxHash }),\n transferStep,\n );\n\n // Update step for the next signature (tokens transfer)\n transferStep.currentSignature = 2;\n transferStep.currentSignatureReason = TransferSignatureReason.TokensTransfer;\n\n btcDepositAddress = await generateDepositBtcAddress({\n address: targetAddress,\n chainId: targetChainId as ChainId,\n env: config.env,\n partnerId: LOMBARD_PARTNER_ID,\n signature,\n token: config.targetToken,\n });\n\n if (btcDepositAddress === SANCTIONED_ADDRESS) {\n throw new InvalidParamsError(ErrorReason.ADDRESS_IS_BLOCKED, btcDepositAddress);\n }\n }\n\n if (!isBech32AddressInNetwork(btcDepositAddress, config.environment === Environment.PROD)) {\n throw new InvalidParamsError(ErrorReason.INCORRECT_ADDRESS_PROVIDED, 'Generated deposit address is invalid');\n }\n\n const { low, high } = await bitcoinFunctions.getFeeRates();\n const feeRate = config.environment === Environment.PROD ? high : low;\n const { utxos } = await bitcoinFunctions.getUtxoBalance(quote.fromAddress, false);\n\n const { inputs, outputs } = await selectUtxos(\n btcDepositAddress,\n quote.fromAddress,\n quote.amountIn,\n feeRate,\n utxos,\n bitcoinFunctions,\n );\n\n if (!inputs || !outputs) {\n throw new InvalidParamsError(ErrorReason.INVALID_PARAMS, 'Unable to create transaction. UTXO selection failed.');\n }\n\n const startedAtMs = Date.now();\n\n onStepChange?.(transferStep);\n\n let targetStartBlockNumber: bigint;\n\n try {\n const targetClient = getEvmClientForChain({ chain: quote.targetChain });\n targetStartBlockNumber = await targetClient.getBlockNumber();\n } catch {\n // Unable to get the target block number. Can't track from this point.\n\n return {\n amountIn: quote.amountIn,\n amountOut: quote.amountOut,\n environment: config.environment,\n errorCode: ErrorCode.UNKNOWN,\n errorReason: 'Unable to fetch target chain block number',\n failedAtMs: Date.now(),\n fees: quote.fees,\n fromAddress: quote.fromAddress,\n id: quote.id,\n partnerFeeBps: quote.partnerFeeBps,\n sourceAsset: quote.assetIn,\n sourceChain: quote.sourceChain,\n targetAsset: quote.assetOut,\n targetChain: quote.targetChain,\n toAddress: quote.toAddress,\n status: 'failed',\n type: ServiceType.LOMBARD_BTC_TO_BTCB,\n } satisfies FailedTransfer;\n }\n\n const txHash = await btcSigner.sign({ inputs, outputs }, bitcoinFunctions.issueRawTx, transferStep);\n\n return {\n amountIn: quote.amountIn,\n amountOut: quote.amountOut,\n environment: config.environment,\n fees: quote.fees,\n fromAddress: quote.fromAddress,\n id: quote.id,\n partnerFeeBps: quote.partnerFeeBps,\n source: {\n confirmationCount: 0,\n requiredConfirmationCount: BTC_CONFIRMATION_COUNT,\n startedAtMs,\n txHash,\n targetStartBlockNumber,\n },\n sourceAsset: quote.assetIn,\n sourceChain: quote.sourceChain,\n status: 'source-pending',\n targetAsset: quote.assetOut,\n targetChain: quote.targetChain,\n toAddress: quote.toAddress,\n type: ServiceType.LOMBARD_BTC_TO_BTCB,\n } satisfies SourcePendingTransfer;\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{Environment as e,ServiceType as t,TransferSignatureReason as n}from"../../../../constants.js";import{ErrorCode as r,ErrorReason as i,InvalidParamsError as a}from"../../../../errors.js";import{caip2ToEip155ChainId as o}from"../../../../utils/caip.js";import{getEvmClientForChain as s}from"../../../_utils.js";import{isBech32AddressInNetwork as c}from"../../../../utils/bitcoin-address.js";import{BTC_CONFIRMATION_COUNT as l,LOMBARD_PARTNER_ID as u}from"../../constants.js";import{selectUtxos as d}from"../../_utils/utxo.js";import{isAddress as f}from"viem";import{SANCTIONED_ADDRESS as p,generateDepositBtcAddress as m,getAddressConfirmationMessage as h,getDepositBtcAddress as g}from"@lombard.finance/sdk";function _({bitcoinFunctions:_,btcSigner:v,config:y,evmSigner:b}){return async({quote:x,onStepChange:S})=>{if(!c(x.fromAddress,y.environment===e.PROD))throw new a(i.INCORRECT_ADDRESS_PROVIDED,`Invalid fromAddress was provided. Make sure it is a BTC address from correct environment.`);if(!f(x.toAddress))throw new a(i.INCORRECT_ADDRESS_PROVIDED,`Invalid toAddress was provided. Must be a valid EVM address.`);let C=x.toAddress,w=o(x.targetChain.chainId),T;try{T=await g({address:C,chainId:w,partnerId:u,env:y.env,token:y.targetToken})}catch{}let E=T?1:2,D={currentSignature:1,currentSignatureReason:T?n.TokensTransfer:n.AddressOwnership,quote:x,requiredSignatures:E};if(!T){let e=s({chain:x.targetChain}),t=h(w),r=await b.signMessage({message:t,address:C,chainId:w},t=>e.sendRawTransaction({serializedTransaction:t}),D);if(D.currentSignature=2,D.currentSignatureReason=n.TokensTransfer,T=await m({address:C,chainId:w,env:y.env,partnerId:u,signature:r,token:y.targetToken}),T===p)throw new a(i.ADDRESS_IS_BLOCKED,T)}if(!c(T,y.environment===e.PROD))throw new a(i.INCORRECT_ADDRESS_PROVIDED,`Generated deposit address is invalid`);let{low:O,high:k}=await _.getFeeRates(),A=y.environment===e.PROD?k:O,{utxos:j}=await _.getUtxoBalance(x.fromAddress,!1),{inputs:M,outputs:N}=await d(T,x.fromAddress,x.amountIn,A,j,_);if(!M||!N)throw new a(i.INVALID_PARAMS,`Unable to create transaction. UTXO selection failed.`);let P=Date.now();S?.(D);let F;try{F=await s({chain:x.targetChain}).getBlockNumber()}catch{return{amountIn:x.amountIn,amountOut:x.amountOut,environment:y.environment,errorCode:r.UNKNOWN,errorReason:`Unable to fetch target chain block number`,failedAtMs:Date.now(),fees:x.fees,fromAddress:x.fromAddress,id:x.id,partnerFeeBps:x.partnerFeeBps,sourceAsset:x.assetIn,sourceChain:x.sourceChain,targetAsset:x.assetOut,targetChain:x.targetChain,toAddress:x.toAddress,status:`failed`,type:t.LOMBARD_BTC_TO_BTCB}}let I=await v.sign({inputs:M,outputs:N},_.issueRawTx,D);return{amountIn:x.amountIn,amountOut:x.amountOut,environment:y.environment,fees:x.fees,fromAddress:x.fromAddress,id:x.id,partnerFeeBps:x.partnerFeeBps,source:{confirmationCount:0,requiredConfirmationCount:l,startedAtMs:P,txHash:I,targetStartBlockNumber:F},sourceAsset:x.assetIn,sourceChain:x.sourceChain,status:`source-pending`,targetAsset:x.assetOut,targetChain:x.targetChain,toAddress:x.toAddress,type:t.LOMBARD_BTC_TO_BTCB}}}export{_ as transferAssetFactory};
2
+ //# sourceMappingURL=transfer-asset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transfer-asset.js","names":[],"sources":["../../../../../src/transfer-service/lombard/btc-to-btcb/_handlers/transfer-asset.ts"],"sourcesContent":["import { isAddress, type Mutable } from 'viem';\nimport { Environment, ServiceType, TransferSignatureReason } from '../../../../constants';\nimport { ErrorCode, ErrorReason, InvalidParamsError } from '../../../../errors';\nimport { caip2ToEip155ChainId } from '../../../../utils/caip';\nimport type { BitcoinFunctions } from '../../../../types/bitcoin';\nimport type { TransferService } from '../../../../types/service';\nimport type { BtcSigner, EvmSignerWithMessage } from '../../../../types/signer';\nimport type { FailedTransfer, SourcePendingTransfer, TransferStepDetails } from '../../../../types/transfer';\nimport { isBech32AddressInNetwork } from '../../../../utils/bitcoin-address';\nimport type { BtcToBtcbConfig } from '../../types';\nimport {\n generateDepositBtcAddress,\n getDepositBtcAddress,\n SANCTIONED_ADDRESS,\n getAddressConfirmationMessage,\n type ChainId,\n} from '@lombard.finance/sdk';\nimport { BTC_CONFIRMATION_COUNT, LOMBARD_PARTNER_ID } from '../../constants';\nimport { getEvmClientForChain } from '../../../_utils';\nimport { selectUtxos } from '../../_utils/utxo';\n\nexport interface TransferAssetFactoryOptions {\n bitcoinFunctions: BitcoinFunctions;\n btcSigner: BtcSigner;\n config: BtcToBtcbConfig;\n evmSigner: EvmSignerWithMessage;\n}\n\nexport function transferAssetFactory({\n bitcoinFunctions,\n btcSigner,\n config,\n evmSigner,\n}: TransferAssetFactoryOptions): TransferService['transferAsset'] {\n return async ({ quote, onStepChange }) => {\n if (!isBech32AddressInNetwork(quote.fromAddress, config.environment === Environment.PROD)) {\n throw new InvalidParamsError(\n ErrorReason.INCORRECT_ADDRESS_PROVIDED,\n 'Invalid fromAddress was provided. Make sure it is a BTC address from correct environment.',\n );\n }\n\n if (!isAddress(quote.toAddress)) {\n throw new InvalidParamsError(\n ErrorReason.INCORRECT_ADDRESS_PROVIDED,\n 'Invalid toAddress was provided. Must be a valid EVM address.',\n );\n }\n\n const targetAddress = quote.toAddress;\n const targetChainId: number = caip2ToEip155ChainId(quote.targetChain.chainId);\n\n let btcDepositAddress: string | undefined;\n\n try {\n btcDepositAddress = await getDepositBtcAddress({\n address: targetAddress,\n chainId: targetChainId as ChainId,\n partnerId: LOMBARD_PARTNER_ID,\n env: config.env,\n token: config.targetToken,\n });\n } catch {\n // Deposit address not found. Generate a new one.\n }\n\n const requiredSignatures: number = btcDepositAddress ? 1 : 2;\n const transferStep: Mutable<TransferStepDetails> = {\n currentSignature: 1,\n currentSignatureReason: btcDepositAddress\n ? TransferSignatureReason.TokensTransfer\n : TransferSignatureReason.AddressOwnership,\n quote,\n requiredSignatures,\n };\n\n // Generate a new deposit address if not existing\n if (!btcDepositAddress) {\n const client = getEvmClientForChain({ chain: quote.targetChain });\n\n // This message MUST match whatever Lombard is using to verify the provided signature.\n const message = getAddressConfirmationMessage(targetChainId);\n const signature = await evmSigner.signMessage(\n { message, address: targetAddress, chainId: targetChainId },\n (signedTxHash) => client.sendRawTransaction({ serializedTransaction: signedTxHash }),\n transferStep,\n );\n\n // Update step for the next signature (tokens transfer)\n transferStep.currentSignature = 2;\n transferStep.currentSignatureReason = TransferSignatureReason.TokensTransfer;\n\n btcDepositAddress = await generateDepositBtcAddress({\n address: targetAddress,\n chainId: targetChainId as ChainId,\n env: config.env,\n partnerId: LOMBARD_PARTNER_ID,\n signature,\n token: config.targetToken,\n });\n\n if (btcDepositAddress === SANCTIONED_ADDRESS) {\n throw new InvalidParamsError(ErrorReason.ADDRESS_IS_BLOCKED, btcDepositAddress);\n }\n }\n\n if (!isBech32AddressInNetwork(btcDepositAddress, config.environment === Environment.PROD)) {\n throw new InvalidParamsError(ErrorReason.INCORRECT_ADDRESS_PROVIDED, 'Generated deposit address is invalid');\n }\n\n const { low, high } = await bitcoinFunctions.getFeeRates();\n const feeRate = config.environment === Environment.PROD ? high : low;\n const { utxos } = await bitcoinFunctions.getUtxoBalance(quote.fromAddress, false);\n\n const { inputs, outputs } = await selectUtxos(\n btcDepositAddress,\n quote.fromAddress,\n quote.amountIn,\n feeRate,\n utxos,\n bitcoinFunctions,\n );\n\n if (!inputs || !outputs) {\n throw new InvalidParamsError(ErrorReason.INVALID_PARAMS, 'Unable to create transaction. UTXO selection failed.');\n }\n\n const startedAtMs = Date.now();\n\n onStepChange?.(transferStep);\n\n let targetStartBlockNumber: bigint;\n\n try {\n const targetClient = getEvmClientForChain({ chain: quote.targetChain });\n targetStartBlockNumber = await targetClient.getBlockNumber();\n } catch {\n // Unable to get the target block number. Can't track from this point.\n\n return {\n amountIn: quote.amountIn,\n amountOut: quote.amountOut,\n environment: config.environment,\n errorCode: ErrorCode.UNKNOWN,\n errorReason: 'Unable to fetch target chain block number',\n failedAtMs: Date.now(),\n fees: quote.fees,\n fromAddress: quote.fromAddress,\n id: quote.id,\n partnerFeeBps: quote.partnerFeeBps,\n sourceAsset: quote.assetIn,\n sourceChain: quote.sourceChain,\n targetAsset: quote.assetOut,\n targetChain: quote.targetChain,\n toAddress: quote.toAddress,\n status: 'failed',\n type: ServiceType.LOMBARD_BTC_TO_BTCB,\n } satisfies FailedTransfer;\n }\n\n const txHash = await btcSigner.sign({ inputs, outputs }, bitcoinFunctions.issueRawTx, transferStep);\n\n return {\n amountIn: quote.amountIn,\n amountOut: quote.amountOut,\n environment: config.environment,\n fees: quote.fees,\n fromAddress: quote.fromAddress,\n id: quote.id,\n partnerFeeBps: quote.partnerFeeBps,\n source: {\n confirmationCount: 0,\n requiredConfirmationCount: BTC_CONFIRMATION_COUNT,\n startedAtMs,\n txHash,\n targetStartBlockNumber,\n },\n sourceAsset: quote.assetIn,\n sourceChain: quote.sourceChain,\n status: 'source-pending',\n targetAsset: quote.assetOut,\n targetChain: quote.targetChain,\n toAddress: quote.toAddress,\n type: ServiceType.LOMBARD_BTC_TO_BTCB,\n } satisfies SourcePendingTransfer;\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ require(`../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../constants.cjs`),t=require(`../../utils/caip.cjs`),n=require(`./constants.cjs`),r=require(`./_utils/asset.cjs`),i=require(`./_utils/chain.cjs`),a=require(`./_utils/fee.cjs`),o=require(`./btc-to-btcb/_handlers/get-assets.cjs`),s=require(`./btc-to-btcb/_handlers/analyze-support.cjs`),c=require(`./btc-to-btcb/_handlers/estimate-native-fee.cjs`),l=require(`./btc-to-btcb/_handlers/get-minimum-transfer-amount.cjs`),u=require(`./btc-to-btcb/_handlers/stream-quotes.cjs`),d=require(`./btc-to-btcb/_handlers/track-transfer.cjs`),f=require(`./btc-to-btcb/_handlers/transfer-asset.cjs`);let p=require(`@lombard.finance/sdk`);async function m({bitcoinFunctions:m,btcSigner:h,environment:g,evmSigner:_}){let v=n.ENV_MAP[g],y=v===p.Env.prod?e.BitcoinChainIds.MAINNET:e.BitcoinChainIds.TESTNET,b=v===p.Env.prod?e.AvalancheChainIds.MAINNET:e.AvalancheChainIds.FUJI,x=t.caip2ToEip155ChainId(b),S=p.Token.BTCb;i.assertSupportedChainId(x);let C={environment:g,env:v,sourceChain:y,targetChain:b,targetChainId:x,targetAsset:r.getBTCbAsset(x,v),targetToken:S,mintingFee:(await a.getFees(S,x,v)).mintingFee};return{analyzeSupport:s.analyzeSupportFactory({config:C}),estimateNativeFee:c.estimateNativeFeeFactory({bitcoinFunctions:m,config:C}),getAssets:o.getAssetsFactory({config:C}),getMinimumTransferAmount:async()=>l.getMinimumTransferAmount(),getSupportedChains:async()=>new Map([[y,new Set([b])]]),streamQuotes:u.streamQuotesFactory({config:C}),trackTransfer:d.trackTransferFactory({bitcoinFunctions:m,config:C}),transferAsset:f.transferAssetFactory({bitcoinFunctions:m,btcSigner:h,config:C,evmSigner:_}),type:e.ServiceType.LOMBARD_BTC_TO_BTCB}}exports.createBtcToBtcbService=m;
2
+ //# sourceMappingURL=btc-to-btcb-service.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"btc-to-btcb-service.cjs","names":["ENV_MAP","Env","BitcoinChainIds","AvalancheChainIds","caip2ToEip155ChainId","Token","getBTCbAsset","getFees","analyzeSupportFactory","estimateNativeFeeFactory","getAssetsFactory","getMinimumTransferAmount","streamQuotesFactory","trackTransferFactory","transferAssetFactory","ServiceType"],"sources":["../../../src/transfer-service/lombard/btc-to-btcb-service.ts"],"sourcesContent":["import { Env, Token } from '@lombard.finance/sdk';\nimport { AvalancheChainIds, BitcoinChainIds, ServiceType } from '../../constants';\nimport type { Environment } from '../../constants';\nimport { caip2ToEip155ChainId } from '../../utils/caip';\nimport type { BitcoinFunctions } from '../../types/bitcoin';\nimport type { TransferService } from '../../types/service';\nimport type { BtcSigner, EvmSignerWithMessage } from '../../types/signer';\nimport { ENV_MAP } from './constants';\nimport { getBTCbAsset } from './_utils/asset';\nimport { assertSupportedChainId } from './_utils/chain';\nimport type { BtcToBtcbConfig } from './types';\nimport { getFees } from './_utils/fee';\nimport { getAssetsFactory } from './btc-to-btcb/_handlers/get-assets';\nimport { analyzeSupportFactory } from './btc-to-btcb/_handlers/analyze-support';\nimport { estimateNativeFeeFactory } from './btc-to-btcb/_handlers/estimate-native-fee';\nimport { getMinimumTransferAmount } from './btc-to-btcb/_handlers/get-minimum-transfer-amount';\nimport { streamQuotesFactory } from './btc-to-btcb/_handlers/stream-quotes';\nimport { trackTransferFactory } from './btc-to-btcb/_handlers/track-transfer';\nimport { transferAssetFactory } from './btc-to-btcb/_handlers/transfer-asset';\nimport type { Fetch } from '../../types/utility-types';\n\nexport interface BtcToBtcbServiceOptions {\n bitcoinFunctions: BitcoinFunctions;\n btcSigner: BtcSigner;\n environment: Environment;\n evmSigner: EvmSignerWithMessage;\n fetch?: Fetch;\n}\n\nexport async function createBtcToBtcbService({\n bitcoinFunctions,\n btcSigner,\n environment,\n evmSigner,\n}: BtcToBtcbServiceOptions): Promise<TransferService> {\n const env = ENV_MAP[environment];\n\n const sourceChain = env === Env.prod ? BitcoinChainIds.MAINNET : BitcoinChainIds.TESTNET;\n const targetChain = env === Env.prod ? AvalancheChainIds.MAINNET : AvalancheChainIds.FUJI;\n const targetChainId = caip2ToEip155ChainId(targetChain);\n const targetToken = Token.BTCb;\n\n assertSupportedChainId(targetChainId);\n\n const targetAsset = getBTCbAsset(targetChainId, env);\n\n const fees = await getFees(targetToken, targetChainId, env);\n\n const config: BtcToBtcbConfig = {\n environment,\n env,\n sourceChain,\n targetChain,\n targetChainId,\n targetAsset,\n targetToken,\n mintingFee: fees.mintingFee,\n };\n\n return {\n analyzeSupport: analyzeSupportFactory({ config }),\n estimateNativeFee: estimateNativeFeeFactory({ bitcoinFunctions, config }),\n getAssets: getAssetsFactory({ config }),\n getMinimumTransferAmount: async () => {\n return getMinimumTransferAmount();\n },\n getSupportedChains: async () => {\n return new Map([[sourceChain, new Set([targetChain])]]);\n },\n streamQuotes: streamQuotesFactory({ config }),\n trackTransfer: trackTransferFactory({ bitcoinFunctions, config }),\n transferAsset: transferAssetFactory({ bitcoinFunctions, btcSigner, config, evmSigner }),\n type: ServiceType.LOMBARD_BTC_TO_BTCB,\n } satisfies TransferService;\n}\n"],"mappings":"grBA6BA,eAAsB,EAAuB,CAC3C,mBACA,YACA,cACA,aACoD,CACpD,IAAM,EAAMA,EAAAA,QAAQ,GAEd,EAAc,IAAQC,EAAAA,IAAI,KAAOC,EAAAA,gBAAgB,QAAUA,EAAAA,gBAAgB,QAC3E,EAAc,IAAQD,EAAAA,IAAI,KAAOE,EAAAA,kBAAkB,QAAUA,EAAAA,kBAAkB,KAC/E,EAAgBC,EAAAA,qBAAqB,EAAY,CACjD,EAAcC,EAAAA,MAAM,KAE1B,EAAA,uBAAuB,EAAc,CAMrC,IAAM,EAA0B,CAC9B,cACA,MACA,cACA,cACA,gBACA,YAVkBC,EAAAA,aAAa,EAAe,EAAI,CAWlD,cACA,YAVW,MAAMC,EAAAA,QAAQ,EAAa,EAAe,EAAI,EAUxC,WAClB,CAED,MAAO,CACL,eAAgBC,EAAAA,sBAAsB,CAAE,SAAQ,CAAC,CACjD,kBAAmBC,EAAAA,yBAAyB,CAAE,mBAAkB,SAAQ,CAAC,CACzE,UAAWC,EAAAA,iBAAiB,CAAE,SAAQ,CAAC,CACvC,yBAA0B,SACjBC,EAAAA,0BAA0B,CAEnC,mBAAoB,SACX,IAAI,IAAI,CAAC,CAAC,EAAa,IAAI,IAAI,CAAC,EAAY,CAAC,CAAC,CAAC,CAAC,CAEzD,aAAcC,EAAAA,oBAAoB,CAAE,SAAQ,CAAC,CAC7C,cAAeC,EAAAA,qBAAqB,CAAE,mBAAkB,SAAQ,CAAC,CACjE,cAAeC,EAAAA,qBAAqB,CAAE,mBAAkB,YAAW,SAAQ,YAAW,CAAC,CACvF,KAAMC,EAAAA,YAAY,oBACnB"}
@@ -0,0 +1,2 @@
1
+ import{AvalancheChainIds as e,BitcoinChainIds as t,ServiceType as n}from"../../constants.js";import{caip2ToEip155ChainId as r}from"../../utils/caip.js";import{ENV_MAP as i}from"./constants.js";import{getBTCbAsset as a}from"./_utils/asset.js";import{assertSupportedChainId as o}from"./_utils/chain.js";import{getFees as s}from"./_utils/fee.js";import{getAssetsFactory as c}from"./btc-to-btcb/_handlers/get-assets.js";import{analyzeSupportFactory as l}from"./btc-to-btcb/_handlers/analyze-support.js";import{estimateNativeFeeFactory as u}from"./btc-to-btcb/_handlers/estimate-native-fee.js";import{getMinimumTransferAmount as d}from"./btc-to-btcb/_handlers/get-minimum-transfer-amount.js";import{streamQuotesFactory as f}from"./btc-to-btcb/_handlers/stream-quotes.js";import{trackTransferFactory as p}from"./btc-to-btcb/_handlers/track-transfer.js";import{transferAssetFactory as m}from"./btc-to-btcb/_handlers/transfer-asset.js";import{Env as h,Token as g}from"@lombard.finance/sdk";async function _({bitcoinFunctions:_,btcSigner:v,environment:y,evmSigner:b}){let x=i[y],S=x===h.prod?t.MAINNET:t.TESTNET,C=x===h.prod?e.MAINNET:e.FUJI,w=r(C),T=g.BTCb;o(w);let E={environment:y,env:x,sourceChain:S,targetChain:C,targetChainId:w,targetAsset:a(w,x),targetToken:T,mintingFee:(await s(T,w,x)).mintingFee};return{analyzeSupport:l({config:E}),estimateNativeFee:u({bitcoinFunctions:_,config:E}),getAssets:c({config:E}),getMinimumTransferAmount:async()=>d(),getSupportedChains:async()=>new Map([[S,new Set([C])]]),streamQuotes:f({config:E}),trackTransfer:p({bitcoinFunctions:_,config:E}),transferAsset:m({bitcoinFunctions:_,btcSigner:v,config:E,evmSigner:b}),type:n.LOMBARD_BTC_TO_BTCB}}export{_ as createBtcToBtcbService};
2
+ //# sourceMappingURL=btc-to-btcb-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"btc-to-btcb-service.js","names":[],"sources":["../../../src/transfer-service/lombard/btc-to-btcb-service.ts"],"sourcesContent":["import { Env, Token } from '@lombard.finance/sdk';\nimport { AvalancheChainIds, BitcoinChainIds, ServiceType } from '../../constants';\nimport type { Environment } from '../../constants';\nimport { caip2ToEip155ChainId } from '../../utils/caip';\nimport type { BitcoinFunctions } from '../../types/bitcoin';\nimport type { TransferService } from '../../types/service';\nimport type { BtcSigner, EvmSignerWithMessage } from '../../types/signer';\nimport { ENV_MAP } from './constants';\nimport { getBTCbAsset } from './_utils/asset';\nimport { assertSupportedChainId } from './_utils/chain';\nimport type { BtcToBtcbConfig } from './types';\nimport { getFees } from './_utils/fee';\nimport { getAssetsFactory } from './btc-to-btcb/_handlers/get-assets';\nimport { analyzeSupportFactory } from './btc-to-btcb/_handlers/analyze-support';\nimport { estimateNativeFeeFactory } from './btc-to-btcb/_handlers/estimate-native-fee';\nimport { getMinimumTransferAmount } from './btc-to-btcb/_handlers/get-minimum-transfer-amount';\nimport { streamQuotesFactory } from './btc-to-btcb/_handlers/stream-quotes';\nimport { trackTransferFactory } from './btc-to-btcb/_handlers/track-transfer';\nimport { transferAssetFactory } from './btc-to-btcb/_handlers/transfer-asset';\nimport type { Fetch } from '../../types/utility-types';\n\nexport interface BtcToBtcbServiceOptions {\n bitcoinFunctions: BitcoinFunctions;\n btcSigner: BtcSigner;\n environment: Environment;\n evmSigner: EvmSignerWithMessage;\n fetch?: Fetch;\n}\n\nexport async function createBtcToBtcbService({\n bitcoinFunctions,\n btcSigner,\n environment,\n evmSigner,\n}: BtcToBtcbServiceOptions): Promise<TransferService> {\n const env = ENV_MAP[environment];\n\n const sourceChain = env === Env.prod ? BitcoinChainIds.MAINNET : BitcoinChainIds.TESTNET;\n const targetChain = env === Env.prod ? AvalancheChainIds.MAINNET : AvalancheChainIds.FUJI;\n const targetChainId = caip2ToEip155ChainId(targetChain);\n const targetToken = Token.BTCb;\n\n assertSupportedChainId(targetChainId);\n\n const targetAsset = getBTCbAsset(targetChainId, env);\n\n const fees = await getFees(targetToken, targetChainId, env);\n\n const config: BtcToBtcbConfig = {\n environment,\n env,\n sourceChain,\n targetChain,\n targetChainId,\n targetAsset,\n targetToken,\n mintingFee: fees.mintingFee,\n };\n\n return {\n analyzeSupport: analyzeSupportFactory({ config }),\n estimateNativeFee: estimateNativeFeeFactory({ bitcoinFunctions, config }),\n getAssets: getAssetsFactory({ config }),\n getMinimumTransferAmount: async () => {\n return getMinimumTransferAmount();\n },\n getSupportedChains: async () => {\n return new Map([[sourceChain, new Set([targetChain])]]);\n },\n streamQuotes: streamQuotesFactory({ config }),\n trackTransfer: trackTransferFactory({ bitcoinFunctions, config }),\n transferAsset: transferAssetFactory({ bitcoinFunctions, btcSigner, config, evmSigner }),\n type: ServiceType.LOMBARD_BTC_TO_BTCB,\n } satisfies TransferService;\n}\n"],"mappings":"s9BA6BA,eAAsB,EAAuB,CAC3C,mBACA,YACA,cACA,aACoD,CACpD,IAAM,EAAM,EAAQ,GAEd,EAAc,IAAQ,EAAI,KAAO,EAAgB,QAAU,EAAgB,QAC3E,EAAc,IAAQ,EAAI,KAAO,EAAkB,QAAU,EAAkB,KAC/E,EAAgB,EAAqB,EAAY,CACjD,EAAc,EAAM,KAE1B,EAAuB,EAAc,CAMrC,IAAM,EAA0B,CAC9B,cACA,MACA,cACA,cACA,gBACA,YAVkB,EAAa,EAAe,EAAI,CAWlD,cACA,YAVW,MAAM,EAAQ,EAAa,EAAe,EAAI,EAUxC,WAClB,CAED,MAAO,CACL,eAAgB,EAAsB,CAAE,SAAQ,CAAC,CACjD,kBAAmB,EAAyB,CAAE,mBAAkB,SAAQ,CAAC,CACzE,UAAW,EAAiB,CAAE,SAAQ,CAAC,CACvC,yBAA0B,SACjB,GAA0B,CAEnC,mBAAoB,SACX,IAAI,IAAI,CAAC,CAAC,EAAa,IAAI,IAAI,CAAC,EAAY,CAAC,CAAC,CAAC,CAAC,CAEzD,aAAc,EAAoB,CAAE,SAAQ,CAAC,CAC7C,cAAe,EAAqB,CAAE,mBAAkB,SAAQ,CAAC,CACjE,cAAe,EAAqB,CAAE,mBAAkB,YAAW,SAAQ,YAAW,CAAC,CACvF,KAAM,EAAY,oBACnB"}
@@ -0,0 +1,2 @@
1
+ require(`../../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../../constants.cjs`);let t=require(`viem`);function n({config:n}){return({sourceChainId:r,targetChainId:i,sourceAsset:a,targetAsset:o})=>r===n.sourceChain&&i===n.targetChain&&a.type===e.TokenType.ERC20&&o.type===e.TokenType.NATIVE&&(0,t.isAddressEqual)(a.address,n.sourceAsset.address)}exports.analyzeSupportFactory=n;
2
+ //# sourceMappingURL=analyze-support.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze-support.cjs","names":["TokenType"],"sources":["../../../../../src/transfer-service/lombard/btcb-to-btc/_handlers/analyze-support.ts"],"sourcesContent":["import { isAddressEqual } from 'viem';\nimport type { BtcbToBtcConfig } from '../../types';\nimport { TokenType } from '../../../../constants';\nimport type { TransferService } from '../../../../types/service';\n\nexport interface AnalyzeSupportFactoryOptions {\n config: BtcbToBtcConfig;\n}\n\nexport function analyzeSupportFactory({ config }: AnalyzeSupportFactoryOptions): TransferService['analyzeSupport'] {\n return ({ sourceChainId, targetChainId, sourceAsset, targetAsset }) => {\n return (\n sourceChainId === config.sourceChain &&\n targetChainId === config.targetChain &&\n sourceAsset.type === TokenType.ERC20 &&\n targetAsset.type === TokenType.NATIVE &&\n isAddressEqual(sourceAsset.address, config.sourceAsset.address)\n );\n };\n}\n"],"mappings":"yHASA,SAAgB,EAAsB,CAAE,UAA2E,CACjH,OAAQ,CAAE,gBAAe,gBAAe,cAAa,iBAEjD,IAAkB,EAAO,aACzB,IAAkB,EAAO,aACzB,EAAY,OAASA,EAAAA,UAAU,OAC/B,EAAY,OAASA,EAAAA,UAAU,SAAA,EAAA,EAAA,gBAChB,EAAY,QAAS,EAAO,YAAY,QAAQ"}