@lombard.finance/sdk 4.3.2 → 4.4.1

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 (231) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/LICENSE +21 -0
  3. package/README.md +6 -6
  4. package/dist/api-functions/generateDepositBtcAddress/generateDepositBtcAddress.d.ts.map +1 -1
  5. package/dist/api-functions/getDepositBtcAddress/getDepositBtcAddress.d.ts.map +1 -1
  6. package/dist/api-functions/getDepositsByAddress/getDepositsByAddress.d.ts +13 -1
  7. package/dist/api-functions/getDepositsByAddress/getDepositsByAddress.d.ts.map +1 -1
  8. package/dist/api.cjs +1 -1
  9. package/dist/api.js +29 -29
  10. package/dist/bridge.cjs +1 -1
  11. package/dist/bridge.js +7 -7
  12. package/dist/btc.cjs +1 -1
  13. package/dist/btc.js +10 -10
  14. package/dist/chains/btc/actions/deposit/BtcDeposit.d.ts +7 -4
  15. package/dist/chains/btc/actions/deposit/BtcDeposit.d.ts.map +1 -1
  16. package/dist/chains/btc/actions/deposit/config/index.d.ts +16 -8
  17. package/dist/chains/btc/actions/deposit/config/index.d.ts.map +1 -1
  18. package/dist/chains/btc/actions/deposit/config/solana.d.ts +20 -0
  19. package/dist/chains/btc/actions/deposit/config/solana.d.ts.map +1 -0
  20. package/dist/chains/btc/actions/deposit/config/types.d.ts +4 -3
  21. package/dist/chains/btc/actions/deposit/config/types.d.ts.map +1 -1
  22. package/dist/chains/evm/EvmActions.d.ts +4 -4
  23. package/dist/chains/evm/actions/deposit/config/evm.d.ts +3 -3
  24. package/dist/chains/evm/actions/deposit/config/evm.d.ts.map +1 -1
  25. package/dist/chains/evm/actions/deposit/config/types.d.ts +1 -1
  26. package/dist/chains/evm/actions/deposit/config/types.d.ts.map +1 -1
  27. package/dist/chains/evm/actions/deposit/factory.d.ts +1 -1
  28. package/dist/chains/evm/actions/deposit/types.d.ts +1 -1
  29. package/dist/chains/evm/actions/deposit/types.d.ts.map +1 -1
  30. package/dist/chains/evm/actions/redeem/EvmRedeem.d.ts.map +1 -1
  31. package/dist/chains/evm/actions/unstake/EvmUnstake.d.ts.map +1 -1
  32. package/dist/chains/solana/SolanaActions.d.ts +10 -0
  33. package/dist/chains/solana/SolanaActions.d.ts.map +1 -1
  34. package/dist/chains/solana/actions/index.d.ts +1 -0
  35. package/dist/chains/solana/actions/index.d.ts.map +1 -1
  36. package/dist/chains/solana/actions/redeem/SolanaRedeem.d.ts +37 -0
  37. package/dist/chains/solana/actions/redeem/SolanaRedeem.d.ts.map +1 -0
  38. package/dist/chains/solana/actions/redeem/config/index.d.ts +8 -0
  39. package/dist/chains/solana/actions/redeem/config/index.d.ts.map +1 -0
  40. package/dist/chains/solana/actions/redeem/config/solana.d.ts +22 -0
  41. package/dist/chains/solana/actions/redeem/config/solana.d.ts.map +1 -0
  42. package/dist/chains/solana/actions/redeem/config/types.d.ts +35 -0
  43. package/dist/chains/solana/actions/redeem/config/types.d.ts.map +1 -0
  44. package/dist/chains/solana/actions/redeem/factory.d.ts +12 -0
  45. package/dist/chains/solana/actions/redeem/factory.d.ts.map +1 -0
  46. package/dist/chains/solana/actions/redeem/index.d.ts +9 -0
  47. package/dist/chains/solana/actions/redeem/index.d.ts.map +1 -0
  48. package/dist/chains/solana/actions/redeem/types.d.ts +52 -0
  49. package/dist/chains/solana/actions/redeem/types.d.ts.map +1 -0
  50. package/dist/chains/solana/utils.d.ts +15 -0
  51. package/dist/chains/solana/utils.d.ts.map +1 -0
  52. package/dist/chunks/BtcActions-BIBsbYIt.cjs +2 -0
  53. package/dist/chunks/BtcActions-BIBsbYIt.cjs.map +1 -0
  54. package/dist/chunks/{BtcActions-k-qs1uO0.js → BtcActions-Df41lbsb.js} +457 -414
  55. package/dist/chunks/BtcActions-Df41lbsb.js.map +1 -0
  56. package/dist/chunks/{EvmActions-B_dF42So.js → EvmActions-5lPqhRaM.js} +163 -173
  57. package/dist/chunks/EvmActions-5lPqhRaM.js.map +1 -0
  58. package/dist/chunks/EvmActions-BY_18gTg.cjs +2 -0
  59. package/dist/chunks/EvmActions-BY_18gTg.cjs.map +1 -0
  60. package/dist/chunks/ReferralsClient-Cmrjo9bN.cjs +2 -0
  61. package/dist/chunks/ReferralsClient-Cmrjo9bN.cjs.map +1 -0
  62. package/dist/chunks/{ReferralsClient-DbFWWtVi.js → ReferralsClient-DvEsA3II.js} +160 -160
  63. package/dist/chunks/ReferralsClient-DvEsA3II.js.map +1 -0
  64. package/dist/chunks/{api-config-CtcP3TVl.js → api-config-Dm6dR85f.js} +6 -6
  65. package/dist/chunks/{api-config-CtcP3TVl.js.map → api-config-Dm6dR85f.js.map} +1 -1
  66. package/dist/chunks/{approveLBTC-CZiZmdcX.cjs → approveLBTC-CUXEC3kw.cjs} +2 -2
  67. package/dist/chunks/{approveLBTC-CZiZmdcX.cjs.map → approveLBTC-CUXEC3kw.cjs.map} +1 -1
  68. package/dist/chunks/approveLBTC-Du2El1tW.js +26 -0
  69. package/dist/chunks/{approveLBTC-B5-ZWqct.js.map → approveLBTC-Du2El1tW.js.map} +1 -1
  70. package/dist/chunks/{array-Cev6kyLJ.js → array-DYttUPf5.js} +7 -7
  71. package/dist/chunks/{array-Cev6kyLJ.js.map → array-DYttUPf5.js.map} +1 -1
  72. package/dist/chunks/{blockchain-identifier-BzMQWh-C.cjs → blockchain-identifier-BTPGxLio.cjs} +2 -2
  73. package/dist/chunks/{blockchain-identifier-BzMQWh-C.cjs.map → blockchain-identifier-BTPGxLio.cjs.map} +1 -1
  74. package/dist/chunks/{blockchain-identifier-BmadkNtK.js → blockchain-identifier-CTVaEPpY.js} +24 -24
  75. package/dist/chunks/{blockchain-identifier-BmadkNtK.js.map → blockchain-identifier-CTVaEPpY.js.map} +1 -1
  76. package/dist/chunks/{bridge-CTsiodO1.js → bridge-DqGabhIY.js} +13 -13
  77. package/dist/chunks/{bridge-CTsiodO1.js.map → bridge-DqGabhIY.js.map} +1 -1
  78. package/dist/chunks/{bridge-BzRlY9pP.cjs → bridge-dWaKrMKm.cjs} +2 -2
  79. package/dist/chunks/{bridge-BzRlY9pP.cjs.map → bridge-dWaKrMKm.cjs.map} +1 -1
  80. package/dist/chunks/{config-hFKqUyg3.js → config-DghboRx0.js} +10 -10
  81. package/dist/chunks/{config-hFKqUyg3.js.map → config-DghboRx0.js.map} +1 -1
  82. package/dist/chunks/{config-l4ZaZw_g.cjs → config-DmCmanM_.cjs} +2 -2
  83. package/dist/chunks/{config-l4ZaZw_g.cjs.map → config-DmCmanM_.cjs.map} +1 -1
  84. package/dist/chunks/constants-D1FnS2Z8.js +6 -0
  85. package/dist/chunks/constants-D1FnS2Z8.js.map +1 -0
  86. package/dist/chunks/constants-ueShGH9R.cjs +2 -0
  87. package/dist/chunks/constants-ueShGH9R.cjs.map +1 -0
  88. package/dist/chunks/{defi-registry-BIRv_zkp.cjs → defi-registry-DDNavtO1.cjs} +2 -2
  89. package/dist/chunks/{defi-registry-BIRv_zkp.cjs.map → defi-registry-DDNavtO1.cjs.map} +1 -1
  90. package/dist/chunks/{defi-registry-wNFN3qyB.js → defi-registry-DxjjBQTV.js} +13 -13
  91. package/dist/chunks/{defi-registry-wNFN3qyB.js.map → defi-registry-DxjjBQTV.js.map} +1 -1
  92. package/dist/chunks/depositStatus-CFo5jW89.cjs +2 -0
  93. package/dist/chunks/depositStatus-CFo5jW89.cjs.map +1 -0
  94. package/dist/chunks/{depositStatus-DM7fRmbN.js → depositStatus-DTc01ZoZ.js} +63 -61
  95. package/dist/chunks/depositStatus-DTc01ZoZ.js.map +1 -0
  96. package/dist/chunks/events-6PV6NP-o.cjs +2 -0
  97. package/dist/chunks/events-6PV6NP-o.cjs.map +1 -0
  98. package/dist/chunks/{events-DdV_xi-2.js → events-BvRwXePq.js} +414 -303
  99. package/dist/chunks/events-BvRwXePq.js.map +1 -0
  100. package/dist/chunks/evm-by-btc-address-CZvE15lx.js +39 -0
  101. package/dist/chunks/{evm-by-btc-address-CwLiENtM.js.map → evm-by-btc-address-CZvE15lx.js.map} +1 -1
  102. package/dist/chunks/fee-requirements-CCNsxAvJ.js +14 -0
  103. package/dist/chunks/{fee-requirements-x8-8mpJ7.js.map → fee-requirements-CCNsxAvJ.js.map} +1 -1
  104. package/dist/chunks/get-exchange-ratio-B-xzYND1.js +20 -0
  105. package/dist/chunks/{get-exchange-ratio-NtnkG1kZ.js.map → get-exchange-ratio-B-xzYND1.js.map} +1 -1
  106. package/dist/chunks/{get-exchange-ratio-C-7DadfD.cjs → get-exchange-ratio-BEhD4gLB.cjs} +2 -2
  107. package/dist/chunks/{get-exchange-ratio-C-7DadfD.cjs.map → get-exchange-ratio-BEhD4gLB.cjs.map} +1 -1
  108. package/dist/chunks/{get-positions-summary-DkZZYbGP.cjs → get-positions-summary-Dh1QPLYO.cjs} +2 -2
  109. package/dist/chunks/{get-positions-summary-DkZZYbGP.cjs.map → get-positions-summary-Dh1QPLYO.cjs.map} +1 -1
  110. package/dist/chunks/{get-positions-summary-B_MmGHLv.js → get-positions-summary-iYshN1RQ.js} +28 -28
  111. package/dist/chunks/{get-positions-summary-B_MmGHLv.js.map → get-positions-summary-iYshN1RQ.js.map} +1 -1
  112. package/dist/chunks/{get-vault-tvl-YAXePAW3.js → get-vault-tvl-Ct_Zkg7C.js} +41 -41
  113. package/dist/chunks/{get-vault-tvl-YAXePAW3.js.map → get-vault-tvl-Ct_Zkg7C.js.map} +1 -1
  114. package/dist/chunks/{get-vault-tvl-DmTUbOY7.cjs → get-vault-tvl-D_tQIDAs.cjs} +2 -2
  115. package/dist/chunks/{get-vault-tvl-DmTUbOY7.cjs.map → get-vault-tvl-D_tQIDAs.cjs.map} +1 -1
  116. package/dist/chunks/{get-vault-withdrawals-CWcYy_sH.cjs → get-vault-withdrawals-8ALlEiAC.cjs} +2 -2
  117. package/dist/chunks/{get-vault-withdrawals-CWcYy_sH.cjs.map → get-vault-withdrawals-8ALlEiAC.cjs.map} +1 -1
  118. package/dist/chunks/get-vault-withdrawals-jk7Sv4S4.js +161 -0
  119. package/dist/chunks/{get-vault-withdrawals-BrpZlt6s.js.map → get-vault-withdrawals-jk7Sv4S4.js.map} +1 -1
  120. package/dist/chunks/{getSharesByAddress-BEgOf1C0.cjs → getSharesByAddress-D8hehnP1.cjs} +2 -2
  121. package/dist/chunks/{getSharesByAddress-BEgOf1C0.cjs.map → getSharesByAddress-D8hehnP1.cjs.map} +1 -1
  122. package/dist/chunks/{getSharesByAddress-BiruCDp6.js → getSharesByAddress-_tBaIBsw.js} +38 -38
  123. package/dist/chunks/{getSharesByAddress-BiruCDp6.js.map → getSharesByAddress-_tBaIBsw.js.map} +1 -1
  124. package/dist/chunks/getUserStakeAndBakeSignature-CSEyzgMc.cjs +2 -0
  125. package/dist/chunks/getUserStakeAndBakeSignature-CSEyzgMc.cjs.map +1 -0
  126. package/dist/chunks/getUserStakeAndBakeSignature-Su-k10ap.js +125 -0
  127. package/dist/chunks/getUserStakeAndBakeSignature-Su-k10ap.js.map +1 -0
  128. package/dist/chunks/lbtc-addresses-D8MYCdsx.js +10 -0
  129. package/dist/chunks/{lbtc-addresses-BLRmtR3c.js.map → lbtc-addresses-D8MYCdsx.js.map} +1 -1
  130. package/dist/chunks/{lbtc-addresses-xyTYV7hx.cjs → lbtc-addresses-Kil252DX.cjs} +2 -2
  131. package/dist/chunks/{lbtc-addresses-xyTYV7hx.cjs.map → lbtc-addresses-Kil252DX.cjs.map} +1 -1
  132. package/dist/chunks/numbers-CclN2Ohk.js +15 -0
  133. package/dist/chunks/{numbers-CM-lcmt4.js.map → numbers-CclN2Ohk.js.map} +1 -1
  134. package/dist/chunks/parameters-C_16L5ft.js +11 -0
  135. package/dist/chunks/{parameters-CDV-6Hk5.js.map → parameters-C_16L5ft.js.map} +1 -1
  136. package/dist/chunks/satoshi-CSoJBXc6.js +19 -0
  137. package/dist/chunks/{satoshi-Ch6y8aYG.js.map → satoshi-CSoJBXc6.js.map} +1 -1
  138. package/dist/chunks/{statusConstants-DFxMrVob.js → statusConstants-C4YNx2q0.js} +1134 -1113
  139. package/dist/chunks/statusConstants-C4YNx2q0.js.map +1 -0
  140. package/dist/chunks/statusConstants-DlM2oPfW.cjs +2 -0
  141. package/dist/chunks/statusConstants-DlM2oPfW.cjs.map +1 -0
  142. package/dist/chunks/{storeNetworkFeeSignature-BZGL2Zn_.js → storeNetworkFeeSignature-BODIpq3Y.js} +26 -26
  143. package/dist/chunks/{storeNetworkFeeSignature-BZGL2Zn_.js.map → storeNetworkFeeSignature-BODIpq3Y.js.map} +1 -1
  144. package/dist/chunks/{storeNetworkFeeSignature-D7yo6lDV.cjs → storeNetworkFeeSignature-Buk4091C.cjs} +2 -2
  145. package/dist/chunks/{storeNetworkFeeSignature-D7yo6lDV.cjs.map → storeNetworkFeeSignature-Buk4091C.cjs.map} +1 -1
  146. package/dist/chunks/time-Sa5gggPG.js +24 -0
  147. package/dist/chunks/{time-QPeEEEnQ.js.map → time-Sa5gggPG.js.map} +1 -1
  148. package/dist/chunks/{token-addresses-FKpA3uc4.js → token-addresses-D0v5cR1j.js} +174 -163
  149. package/dist/chunks/{token-addresses-FKpA3uc4.js.map → token-addresses-D0v5cR1j.js.map} +1 -1
  150. package/dist/chunks/{token-addresses-DRBecUa7.cjs → token-addresses-nzvTOi24.cjs} +2 -2
  151. package/dist/chunks/{token-addresses-DRBecUa7.cjs.map → token-addresses-nzvTOi24.cjs.map} +1 -1
  152. package/dist/chunks/{tokens-D_HeVB5p.cjs → tokens-BkvA0Gp1.cjs} +2 -2
  153. package/dist/chunks/{tokens-D_HeVB5p.cjs.map → tokens-BkvA0Gp1.cjs.map} +1 -1
  154. package/dist/chunks/{tokens-C6qZHzph.js → tokens-DgC1hfkm.js} +18 -18
  155. package/dist/chunks/{tokens-C6qZHzph.js.map → tokens-DgC1hfkm.js.map} +1 -1
  156. package/dist/chunks/{unstakeLBTC-H0zdYQa6.cjs → unstakeLBTC-CmoCaGX9.cjs} +2 -2
  157. package/dist/chunks/{unstakeLBTC-H0zdYQa6.cjs.map → unstakeLBTC-CmoCaGX9.cjs.map} +1 -1
  158. package/dist/chunks/{unstakeLBTC-DAIR9NO_.js → unstakeLBTC-DtvVbpbU.js} +50 -50
  159. package/dist/chunks/{unstakeLBTC-DAIR9NO_.js.map → unstakeLBTC-DtvVbpbU.js.map} +1 -1
  160. package/dist/chunks/{withdraw-hHueI2p7.js → withdraw-DgjuaUN3.js} +45 -45
  161. package/dist/chunks/{withdraw-hHueI2p7.js.map → withdraw-DgjuaUN3.js.map} +1 -1
  162. package/dist/chunks/{withdraw-C1fMFSwy.cjs → withdraw-i0AueZ_C.cjs} +2 -2
  163. package/dist/chunks/{withdraw-C1fMFSwy.cjs.map → withdraw-i0AueZ_C.cjs.map} +1 -1
  164. package/dist/common/constants.d.ts +1 -0
  165. package/dist/common/constants.d.ts.map +1 -1
  166. package/dist/contracts.cjs +1 -1
  167. package/dist/contracts.js +16 -16
  168. package/dist/core/assets/catalog.d.ts.map +1 -1
  169. package/dist/core.cjs +1 -1
  170. package/dist/core.js +85 -85
  171. package/dist/debug.js +4 -4
  172. package/dist/defi.cjs +1 -1
  173. package/dist/defi.js +10 -10
  174. package/dist/evm.cjs +1 -1
  175. package/dist/evm.js +34 -34
  176. package/dist/index.cjs +1 -1
  177. package/dist/index.d.ts +2 -1
  178. package/dist/index.d.ts.map +1 -1
  179. package/dist/index.js +287 -283
  180. package/dist/index.js.map +1 -1
  181. package/dist/metrics.cjs +1 -1
  182. package/dist/metrics.js +6 -6
  183. package/dist/shared/deposits/depositStatus.d.ts +9 -5
  184. package/dist/shared/deposits/depositStatus.d.ts.map +1 -1
  185. package/dist/stories/arg-types.d.ts +1 -0
  186. package/dist/stories/arg-types.d.ts.map +1 -1
  187. package/dist/tokens/token-addresses.d.ts +2 -2
  188. package/dist/tokens/token-addresses.d.ts.map +1 -1
  189. package/dist/utils/chain.d.ts +7 -0
  190. package/dist/utils/chain.d.ts.map +1 -1
  191. package/dist/utils.cjs +1 -1
  192. package/dist/utils.js +76 -76
  193. package/dist/vaults.cjs +1 -1
  194. package/dist/vaults.js +14 -14
  195. package/package.json +19 -6
  196. package/dist/chunks/BtcActions-XbVRQEcM.cjs +0 -2
  197. package/dist/chunks/BtcActions-XbVRQEcM.cjs.map +0 -1
  198. package/dist/chunks/BtcActions-k-qs1uO0.js.map +0 -1
  199. package/dist/chunks/EvmActions-BVzQ3fLK.cjs +0 -2
  200. package/dist/chunks/EvmActions-BVzQ3fLK.cjs.map +0 -1
  201. package/dist/chunks/EvmActions-B_dF42So.js.map +0 -1
  202. package/dist/chunks/ReferralsClient-BC-1wT1q.cjs +0 -2
  203. package/dist/chunks/ReferralsClient-BC-1wT1q.cjs.map +0 -1
  204. package/dist/chunks/ReferralsClient-DbFWWtVi.js.map +0 -1
  205. package/dist/chunks/approveLBTC-B5-ZWqct.js +0 -26
  206. package/dist/chunks/constants-BBK-JNcY.cjs +0 -2
  207. package/dist/chunks/constants-BBK-JNcY.cjs.map +0 -1
  208. package/dist/chunks/constants-CuT4axsy.js +0 -5
  209. package/dist/chunks/constants-CuT4axsy.js.map +0 -1
  210. package/dist/chunks/depositStatus-C3-EgT2a.cjs +0 -2
  211. package/dist/chunks/depositStatus-C3-EgT2a.cjs.map +0 -1
  212. package/dist/chunks/depositStatus-DM7fRmbN.js.map +0 -1
  213. package/dist/chunks/events-DdV_xi-2.js.map +0 -1
  214. package/dist/chunks/events-DqIJRzJo.cjs +0 -2
  215. package/dist/chunks/events-DqIJRzJo.cjs.map +0 -1
  216. package/dist/chunks/evm-by-btc-address-CwLiENtM.js +0 -39
  217. package/dist/chunks/fee-requirements-x8-8mpJ7.js +0 -14
  218. package/dist/chunks/get-exchange-ratio-NtnkG1kZ.js +0 -20
  219. package/dist/chunks/get-vault-withdrawals-BrpZlt6s.js +0 -161
  220. package/dist/chunks/getUserStakeAndBakeSignature-BxRq2cI1.cjs +0 -2
  221. package/dist/chunks/getUserStakeAndBakeSignature-BxRq2cI1.cjs.map +0 -1
  222. package/dist/chunks/getUserStakeAndBakeSignature-NGGblnJl.js +0 -120
  223. package/dist/chunks/getUserStakeAndBakeSignature-NGGblnJl.js.map +0 -1
  224. package/dist/chunks/lbtc-addresses-BLRmtR3c.js +0 -10
  225. package/dist/chunks/numbers-CM-lcmt4.js +0 -15
  226. package/dist/chunks/parameters-CDV-6Hk5.js +0 -11
  227. package/dist/chunks/satoshi-Ch6y8aYG.js +0 -19
  228. package/dist/chunks/statusConstants-BLiNBT6s.cjs +0 -2
  229. package/dist/chunks/statusConstants-BLiNBT6s.cjs.map +0 -1
  230. package/dist/chunks/statusConstants-DFxMrVob.js.map +0 -1
  231. package/dist/chunks/time-QPeEEEnQ.js +0 -24
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EvmActions-BY_18gTg.cjs","sources":["../../src/services/EvmService.ts","../../src/modules/evmModule.ts","../../src/chains/evm/actions/deploy/config/evm.ts","../../src/chains/evm/actions/deploy/EvmDeploy.ts","../../src/chains/evm/actions/deploy/factory.ts","../../src/chains/evm/actions/deposit/config/evm.ts","../../src/chains/evm/actions/deposit/types.ts","../../src/chains/evm/actions/deposit/EvmDeposit.ts","../../src/chains/evm/actions/deposit/factory.ts","../../src/chains/evm/actions/redeem/config/evm.ts","../../src/chains/evm/shared/feeAuth.ts","../../src/chains/evm/actions/redeem/EvmRedeem.ts","../../src/chains/evm/actions/redeem/factory.ts","../../src/chains/evm/actions/stake/EvmStake.ts","../../src/chains/evm/actions/stake/factory.ts","../../src/chains/evm/actions/unstake/config/evm.ts","../../src/chains/evm/actions/unstake/EvmUnstake.ts","../../src/chains/evm/actions/unstake/factory.ts","../../src/chains/evm/actions/withdraw/config/evm.ts","../../src/chains/evm/actions/withdraw/EvmCancelWithdraw.ts","../../src/chains/evm/actions/withdraw/EvmWithdraw.ts","../../src/chains/evm/actions/withdraw/factory.ts","../../src/chains/evm/EvmActions.ts"],"sourcesContent":["/**\n * EVM Service\n *\n * Provides EVM-specific operations via contract functions.\n *\n * @module services/EvmService\n */\n\nimport type {\n Env,\n EvmChainId,\n EvmProvider,\n EvmService as IEvmService,\n SignNetworkFeeParams,\n SignNetworkFeeResult,\n SignStakeAndBakeParams,\n} from '@lombard.finance/sdk-common';\nimport BigNumber from 'bignumber.js';\nimport type { EIP1193Provider } from 'viem';\n\nimport type { ChainId } from '../common/chains';\nimport { getMintingFee } from '../contract-functions/getLBTCMintingFee/getLBTCMintingFee';\nimport { getStakeAndBakeFee } from '../contract-functions/getStakeAndBakeFee/getStakeAndBakeFee';\nimport { signLbtcDestinationAddr } from '../contract-functions/signLbtcDestionationAddr/signLbtcDestinationAddr';\nimport { signNetworkFee } from '../contract-functions/signNetworkFee/signNetworkFee';\nimport { signStakeAndBake } from '../contract-functions/signStakeAndBake/signStakeAndBake';\nimport type { DefiProtocol, StakeAndBakeToken } from '../defi/defi-registry';\nimport { Token } from '../tokens/token-addresses';\n\n/**\n * EVM Service\n *\n * Implementation of the EvmService interface from sdk-common.\n * Provides EVM contract interactions and fee authorization.\n */\nexport class EvmService implements IEvmService {\n constructor(private readonly env: Env) {}\n\n /**\n * Get minting fee for a chain\n * @param chainId - The chain ID\n * @param token - Optional token (defaults to LBTC). Use Token.BTCb for BTC.b deposits.\n */\n async getMintingFee(chainId: EvmChainId, token?: string): Promise<string> {\n const fee = await getMintingFee({\n token: (token as Token) || Token.LBTC,\n chainId: chainId as ChainId,\n env: this.env,\n });\n return fee.toString();\n }\n\n /**\n * Sign network fee authorization (EIP-712)\n */\n async signNetworkFee(\n params: SignNetworkFeeParams,\n ): Promise<SignNetworkFeeResult> {\n const result = await signNetworkFee({\n fee: new BigNumber(params.fee),\n account: params.account as `0x${string}`,\n chainId: params.chainId as ChainId,\n provider: params.provider as EIP1193Provider,\n env: this.env,\n // Pass token for signing - defaults to LBTC for backwards compatibility\n token: (params.token as Token) ?? Token.LBTC,\n });\n\n return {\n signature: result.signature,\n typedData: result.typedData,\n };\n }\n\n /**\n * Get stake and bake fee for a vault\n */\n async getStakeAndBakeFee(\n chainId: EvmChainId,\n protocol: DefiProtocol,\n ): Promise<string> {\n const fee = await getStakeAndBakeFee({\n chainId: chainId as ChainId,\n protocol,\n });\n return fee.toString();\n }\n\n /**\n * Sign stake and bake authorization\n */\n async signStakeAndBake(\n params: SignStakeAndBakeParams,\n ): Promise<SignNetworkFeeResult> {\n const result = await signStakeAndBake({\n value: new BigNumber(params.value),\n account: params.account as `0x${string}`,\n chainId: params.chainId as ChainId,\n provider: params.provider as EIP1193Provider,\n env: this.env,\n vaultKey: params.vaultKey as DefiProtocol,\n token: params.token as StakeAndBakeToken,\n });\n\n return {\n signature: result.signature,\n typedData: result.typedData,\n };\n }\n\n /**\n * Sign LBTC destination address (for non-Ethereum EVM chains)\n */\n async signLbtcDestination(params: {\n chainId: EvmChainId;\n address: string;\n provider: EvmProvider;\n }): Promise<{ signature: string }> {\n const signature = await signLbtcDestinationAddr({\n account: params.address as `0x${string}`,\n chainId: params.chainId as ChainId,\n provider: params.provider as EIP1193Provider,\n });\n\n return { signature };\n }\n}\n","/**\n * EVM Module\n *\n * Provides EVM chain service for contract interactions and fee authorization.\n * Uses Service-First pattern: module is a thin factory that instantiates the service.\n *\n * @module modules/evmModule\n */\n\nimport type {\n ChainModule,\n EvmService as IEvmService,\n} from '@lombard.finance/sdk-common';\n\nimport { EvmService } from '../services/EvmService';\n\n/**\n * Create EVM module\n *\n * Built-in module that provides EvmService. Automatically included by createLombardSDK().\n *\n * @example\n * ```ts\n * const sdk = await createLombardSDK({\n * env: Env.prod,\n * providers: { evm: () => window.ethereum },\n * });\n * const unstake = sdk.chain.evm.unstake({ ... });\n * ```\n */\nexport function evmModule(): ChainModule<'evm', IEvmService> {\n return {\n id: 'evm',\n chain: 'evm',\n register(ctx) {\n return new EvmService(ctx.env);\n },\n };\n}\n\n// Re-export service class and interface type\nexport { EvmService };\nexport type { IEvmService as EvmServiceInterface };\nexport type {\n EvmChainId,\n FeeAuthorizationResult,\n StoredFeeSignature,\n} from '@lombard.finance/sdk-common';\n","/**\n * EVM Chain Configuration for Deploy\n *\n * Handles deploying L-Assets to DeFi protocols.\n *\n * @module chains/evm/actions/deploy/config/evm\n */\n\nimport { Env } from '@lombard.finance/sdk-common';\n\nimport { AssetId, Chain, DeployProtocol } from '../../../../../core';\nimport { evmAddressSchema } from '../../../../../shared/validation';\nimport type { ChainConfig } from './types';\n\n/**\n * EVM deploy configuration\n *\n * Protocol availability:\n * - Veda: Ethereum, Base, BSC, Corn (prod only)\n * - Silo: Avalanche (prod only)\n */\nexport const evmConfig: ChainConfig = {\n chainType: 'evm',\n\n routes: [\n // Veda - Ethereum\n {\n asset: AssetId.LBTC,\n sourceChains: [Chain.ETHEREUM],\n protocols: [DeployProtocol.Veda],\n envs: [Env.prod],\n },\n // Veda - Base\n {\n asset: AssetId.LBTC,\n sourceChains: [Chain.BASE],\n protocols: [DeployProtocol.Veda],\n envs: [Env.prod],\n },\n // Veda - BSC\n {\n asset: AssetId.LBTC,\n sourceChains: [Chain.BSC],\n protocols: [DeployProtocol.Veda],\n envs: [Env.prod],\n },\n // Veda - Corn\n {\n asset: AssetId.LBTC,\n sourceChains: [Chain.CORN],\n protocols: [DeployProtocol.Veda],\n envs: [Env.prod],\n },\n // Silo - Avalanche\n {\n asset: AssetId.LBTC,\n sourceChains: [Chain.AVALANCHE],\n protocols: [DeployProtocol.Silo],\n envs: [Env.prod],\n },\n ],\n\n addressSchema: evmAddressSchema,\n};\n\n/**\n * Check if a deploy route is supported\n */\nexport function isDeploySupported(\n asset: AssetId,\n chain: Chain,\n protocol: DeployProtocol,\n env: Env,\n): boolean {\n return evmConfig.routes.some(\n route =>\n route.asset === asset &&\n route.sourceChains.includes(chain) &&\n route.protocols.includes(protocol) &&\n route.envs.includes(env),\n );\n}\n","/**\n * EVM Deploy Action\n *\n * Deploys L-Assets to DeFi protocols (Veda, Silo).\n *\n * Protocol availability:\n * - Veda: Ethereum, Base, BSC, Corn (prod only)\n * - Silo: Avalanche (prod only)\n *\n * @module chains/evm/actions/deploy/EvmDeploy\n */\n\nimport BigNumber from 'bignumber.js';\nimport type { EIP1193Provider } from 'viem';\nimport { z } from 'zod';\n\nimport { makePublicClient } from '../../../../clients/public-client';\nimport { makeWalletClient } from '../../../../clients/wallet-client';\nimport { CHAIN_ID_TO_VIEM_CHAIN_MAP, type ChainId } from '../../../../common/chains';\nimport type { DeployProtocol } from '../../../../core';\nimport { parseChainIdentifier, StepStatus } from '../../../../core';\nimport { BaseAction } from '../../../../shared/actions/BaseAction';\nimport { EvmOperationStatus } from '../../../../shared/constants/statusConstants';\nimport type { EvmCoreContext } from '../../../../shared/context';\nimport { LombardError } from '../../../../shared/errors';\nimport type { DeployEventMap } from '../../../../shared/events';\nimport {\n evmAmountSchema,\n validatePrepareParams,\n} from '../../../../shared/validation';\nimport { Token } from '../../../../tokens/token-addresses';\nimport { getTokenInfo, toBaseDenomination } from '../../../../tokens/tokens';\nimport toBigInt from '../../../../utils/numbers';\nimport { waitForTransactionReceipt } from '../../../../utils/transaction-executor';\nimport { Vault, VAULTS } from '../../../../vaults/lib/config';\nimport { deposit } from '../../../../vaults/lib/ops/deposit';\nimport { evmConfig } from './config';\nimport type {\n EvmDeployParams,\n EvmDeployPrepareParams,\n IEvmDeploy,\n} from './types';\n\nexport class EvmDeploy\n extends BaseAction<DeployEventMap, EvmOperationStatus>\n implements IEvmDeploy\n{\n private _amount?: string;\n private _protocol?: DeployProtocol;\n private _needsApproval = false;\n private _txHash?: string;\n private _account?: `0x${string}`;\n private _chainId?: ChainId;\n\n constructor(\n private readonly ctx: EvmCoreContext,\n private readonly params: EvmDeployParams,\n ) {\n super(EvmOperationStatus.IDLE);\n }\n\n get amount(): string | undefined {\n return this._amount;\n }\n\n get protocol(): DeployProtocol | undefined {\n return this._protocol;\n }\n\n get needsApproval(): boolean {\n return this._needsApproval;\n }\n\n get txHash(): string | undefined {\n return this._txHash;\n }\n\n async prepare(params: EvmDeployPrepareParams): Promise<void> {\n this.assertStatus(EvmOperationStatus.IDLE, 'prepare');\n\n return this.act(async () => {\n const validated = validatePrepareParams(this.prepareSchema, params);\n this._amount = validated.amount;\n this._protocol = params.protocol;\n\n this.validateProtocol(params.protocol);\n\n // Get provider and account\n const provider = await this.ctx.getProvider('evm');\n if (!provider) {\n throw LombardError.providerMissing(this.params.sourceChain, 'evm');\n }\n\n const accounts = await (provider as EIP1193Provider).request({\n method: 'eth_accounts',\n });\n const account = (accounts as string[])[0] as `0x${string}`;\n if (!account) {\n throw LombardError.providerMissing(this.params.sourceChain, 'evm');\n }\n\n this._account = account;\n this._chainId = parseChainIdentifier(this.params.sourceChain) as ChainId;\n\n // Check actual allowance to determine if approval is needed\n const vault = VAULTS[Vault.Veda];\n const depositToken = await getTokenInfo(Token.LBTC, this._chainId, this.ctx.env);\n if (!depositToken) {\n throw LombardError.invalidParameter('token', 'Could not get LBTC token info');\n }\n\n const publicClient = makePublicClient({ chainId: this._chainId });\n const allowanceRaw = await publicClient.readContract({\n address: depositToken.address,\n abi: depositToken.abi,\n functionName: 'allowance',\n args: [account, vault.vaultContract.address],\n });\n\n const amount = new BigNumber(validated.amount);\n const amountBase = toBaseDenomination(amount, depositToken.decimals);\n const allowance = new BigNumber(String(allowanceRaw));\n\n // Check if approval is needed\n this._needsApproval = amountBase.isGreaterThan(allowance);\n\n if (this._needsApproval) {\n this.emitProgress({\n status: EvmOperationStatus.NEEDS_APPROVAL,\n steps: { approval: StepStatus.PENDING, deploying: StepStatus.IDLE },\n });\n this.updateStatus(EvmOperationStatus.NEEDS_APPROVAL);\n } else {\n this.emitProgress({\n status: EvmOperationStatus.READY,\n steps: { approval: StepStatus.COMPLETE, deploying: StepStatus.PENDING },\n });\n this.updateStatus(EvmOperationStatus.READY);\n }\n });\n }\n\n async approve(): Promise<void> {\n this.assertStatus(EvmOperationStatus.NEEDS_APPROVAL, 'approve');\n\n return this.act(async () => {\n if (!this._account || !this._chainId || !this._amount) {\n throw LombardError.missingParameter('account, chainId, or amount');\n }\n\n const provider = await this.ctx.getProvider('evm');\n if (!provider) {\n throw LombardError.providerMissing(this.params.sourceChain, 'evm');\n }\n\n // Get vault and token info\n const vault = VAULTS[Vault.Veda];\n const depositToken = await getTokenInfo(Token.LBTC, this._chainId, this.ctx.env);\n if (!depositToken) {\n throw LombardError.invalidParameter('token', 'Could not get LBTC token info');\n }\n\n const amount = new BigNumber(this._amount);\n const amountBase = toBigInt(toBaseDenomination(amount, depositToken.decimals));\n\n // Execute approval transaction\n const publicClient = makePublicClient({ chainId: this._chainId });\n const walletClient = makeWalletClient({\n provider: provider as EIP1193Provider,\n chainId: this._chainId,\n });\n\n const { request } = await publicClient.simulateContract({\n account: this._account,\n chain: CHAIN_ID_TO_VIEM_CHAIN_MAP[this._chainId],\n address: depositToken.address,\n abi: depositToken.abi,\n functionName: 'approve',\n args: [vault.vaultContract.address, amountBase],\n });\n\n const txHash = await walletClient.writeContract(request);\n await waitForTransactionReceipt(publicClient, txHash, 'LBTC vault deposit approval');\n\n this._needsApproval = false;\n this.emitProgress({\n status: EvmOperationStatus.READY,\n steps: { approval: StepStatus.COMPLETE, deploying: StepStatus.PENDING },\n });\n }, EvmOperationStatus.READY);\n }\n\n async execute(): Promise<{ txHash: string }> {\n this.assertStatus(EvmOperationStatus.READY, 'execute');\n\n return this.act(async () => {\n const provider = await this.ctx.getProvider('evm');\n if (!provider) {\n throw LombardError.providerMissing(this.params.sourceChain, 'evm');\n }\n\n if (!this._account || !this._chainId) {\n throw LombardError.missingParameter('account or chainId');\n }\n\n // Map protocol to vault key\n const vaultKey = this._protocol === 'veda' ? Vault.Veda : Vault.Veda;\n\n this.emitProgress({\n status: EvmOperationStatus.READY,\n steps: { approval: StepStatus.COMPLETE, deploying: StepStatus.PENDING },\n });\n\n // Execute vault deposit (approval already done, so pass approve: false)\n const txHash = await deposit({\n amount: this._amount!,\n approve: false, // Approval was handled in approve() step\n token: Token.LBTC,\n vaultKey,\n account: this._account,\n chainId: this._chainId,\n provider: provider as EIP1193Provider,\n env: this.ctx.env,\n });\n\n this._txHash = txHash;\n\n this.emitProgress({\n status: EvmOperationStatus.COMPLETED,\n steps: { approval: StepStatus.COMPLETE, deploying: StepStatus.COMPLETE },\n });\n\n this.emitCompleted();\n\n return { txHash };\n }, EvmOperationStatus.COMPLETED);\n }\n\n private get prepareSchema() {\n return z.object({\n amount: evmAmountSchema,\n protocol: z.string().min(1, 'Protocol is required'),\n });\n }\n\n private validateProtocol(protocol: DeployProtocol): void {\n const isSupported = evmConfig.routes.some(\n route =>\n route.protocols.includes(protocol) && route.envs.includes(this.ctx.env),\n );\n if (!isSupported) {\n throw LombardError.invalidParameter(\n 'protocol',\n `Protocol ${protocol} is not supported in ${this.ctx.env} environment`,\n );\n }\n }\n}\n","/**\n * EVM Deploy Factory Functions\n *\n * @module chains/evm/actions/deploy/factory\n */\n\nimport type { LombardConfig } from '../../../../config/types';\nimport type { EvmCoreContext } from '../../../../shared/context';\nimport { createEvmCoreContext } from '../../../../shared/context';\nimport { EvmDeploy } from './EvmDeploy';\nimport type { EvmDeployParams } from './types';\n\n/**\n * Create EvmDeploy action from config\n *\n * @internal This factory is for internal use. Use createLombardSDK() instead:\n *\n * @example\n * ```typescript\n * const sdk = await createLombardSDK({ env: Env.prod, providers: { evm: () => window.ethereum } });\n * const deploy = sdk.chain.evm.deploy({\n * sourceChain: Chain.ETHEREUM,\n * protocol: DeployProtocol.Veda,\n * });\n * await deploy.prepare({ amount: '0.1' });\n * ```\n */\nexport function evmDeploy(\n config: LombardConfig,\n params: EvmDeployParams,\n): EvmDeploy {\n const ctx = createEvmCoreContext(config);\n return new EvmDeploy(ctx, params);\n}\n\n/**\n * Create EvmDeploy action from context\n */\nexport function createEvmDeploy(\n ctx: EvmCoreContext,\n params: EvmDeployParams,\n): EvmDeploy {\n return new EvmDeploy(ctx, params);\n}\n","/**\n * EVM Chain Configuration for Deposit\n *\n * Handles depositing BTCb to get LBTC.\n * Routes are derived from ASSET_CATALOG to ensure consistency.\n *\n * @module chains/evm/actions/deposit/config/evm\n */\n\nimport { Env } from '@lombard.finance/sdk-common';\n\nimport {\n AssetId,\n Chain,\n getEvmAssetChains,\n} from '../../../../../core';\nimport { evmAddressSchema } from '../../../../../shared/validation';\nimport type { ChainConfig } from './types';\n\n// ═══════════════════════════════════════════════════════════════════════════\n// Catalog-Derived Chain Lists\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Source chains: EVM chains with BTCb deployed\n */\nconst DEPOSIT_PROD_SOURCE_CHAINS = getEvmAssetChains(AssetId.BTCb, [Env.prod]);\n\nconst DEPOSIT_TESTNET_SOURCE_CHAINS = getEvmAssetChains(AssetId.BTCb, [Env.testnet, Env.stage, Env.dev, Env.ibc]);\n\n/** Dest chains: EVM chains with LBTC deployed */\nconst LBTC_PROD_CHAINS = getEvmAssetChains(AssetId.LBTC, [Env.prod]);\nconst LBTC_TESTNET_CHAINS = getEvmAssetChains(AssetId.LBTC, [\n Env.testnet,\n Env.stage,\n Env.dev,\n Env.ibc,\n]);\n\n// ═══════════════════════════════════════════════════════════════════════════\n// Configuration Objects\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * EVM deposit configuration\n *\n * Supports depositing BTCb to get LBTC on EVM chains.\n * Source chains derived from BTCb deployments.\n * Dest chains derived from LBTC deployments.\n */\nexport const evmConfig: ChainConfig = {\n chainType: 'evm',\n\n routes: [\n // Production: BTCb → LBTC\n {\n assetsIn: [AssetId.BTCb],\n assetOut: AssetId.LBTC,\n sourceChains: DEPOSIT_PROD_SOURCE_CHAINS,\n destChains: LBTC_PROD_CHAINS,\n envs: [Env.prod],\n },\n // Testnet\n {\n assetsIn: [AssetId.BTCb],\n assetOut: AssetId.LBTC,\n sourceChains: DEPOSIT_TESTNET_SOURCE_CHAINS,\n destChains: LBTC_TESTNET_CHAINS,\n envs: [Env.testnet, Env.stage, Env.dev, Env.ibc],\n },\n ],\n\n addressSchema: evmAddressSchema,\n};\n\n/**\n * Check if a deposit route is supported\n */\nexport function isDepositSupported(\n assetIn: AssetId,\n sourceChain: Chain,\n env: Env,\n): boolean {\n return evmConfig.routes.some(\n route =>\n route.assetsIn.includes(assetIn) &&\n route.sourceChains.includes(sourceChain) &&\n route.envs.includes(env),\n );\n}\n","/**\n * EVM Deposit Action Types\n *\n * @module chains/evm/actions/deposit/types\n */\n\nimport type {\n AssetId,\n Chain,\n StepStatus,\n StrategyProgress,\n} from '../../../../core';\nimport type { MonitorableAction } from '../../../../shared/actions/BaseAction';\nimport type { LombardError } from '../../../../shared/errors';\n\n/**\n * EVM Deposit status\n *\n * Note: There is NO 'failed' status. Error handling is separate from status:\n * - `status` = \"What step are you at?\" (flow position)\n * - `error` = \"Did something go wrong?\" (Error | null)\n * - `isFailed` = Derived from `error !== null`\n *\n * Use `isLoading` for operation-in-progress state (no transitional statuses).\n */\nexport enum EvmDepositStatus {\n IDLE = 'idle',\n NEEDS_APPROVAL = 'needs-approval',\n READY = 'ready',\n BRIDGING = 'bridging',\n COMPLETED = 'completed',\n}\n\n/**\n * EVM Deposit parameters\n */\nexport interface EvmDepositParams {\n /** Input asset (BTCb) */\n assetIn: AssetId;\n /** Output asset (LBTC) */\n assetOut: AssetId;\n /** Source chain */\n sourceChain: Chain;\n /** Destination chain */\n destChain: Chain;\n}\n\n/**\n * EVM Deposit prepare parameters\n */\nexport interface EvmDepositPrepareParams {\n /** Amount to deposit */\n amount: string;\n /** Recipient address */\n recipient: string;\n}\n\n/**\n * EVM Deposit progress\n */\nexport interface EvmDepositProgress extends StrategyProgress<EvmDepositStatus> {\n status: EvmDepositStatus;\n steps: {\n approval: StepStatus;\n execution: StepStatus;\n bridging?: StepStatus;\n };\n txHash?: string;\n}\n\n/**\n * EVM Deposit interface\n */\nexport interface IEvmDeposit extends MonitorableAction {\n readonly status: EvmDepositStatus;\n readonly error: LombardError | null;\n readonly amount?: string;\n readonly recipient?: string;\n readonly needsApproval: boolean;\n readonly txHash?: string;\n\n /** Set claim data from a notarized deposit (required before execute) */\n setClaimData(data: string, proofSignature: string): void;\n prepare(params: EvmDepositPrepareParams): Promise<void>;\n approve(): Promise<void>;\n execute(): Promise<{ txHash: string }>;\n}\n","/**\n * EVM Deposit Action\n *\n * Claims LBTC from a notarized BTC deposit.\n *\n * Flow:\n * 1. BTC is deposited to Lombard's BTC address (via BtcDeposit/BtcStake)\n * 2. Deposit is notarized by the consortium\n * 3. User claims LBTC using setClaimData() + execute()\n *\n * @module chains/evm/actions/deposit/EvmDeposit\n */\n\nimport type { EIP1193Provider } from 'viem';\nimport { z } from 'zod';\n\nimport type { ChainId } from '../../../../common/chains';\nimport { claimLBTC } from '../../../../contract-functions';\nimport { parseChainIdentifier,StepStatus } from '../../../../core';\nimport { BaseAction } from '../../../../shared/actions/BaseAction';\nimport type { EvmCoreContext } from '../../../../shared/context';\nimport { LombardError } from '../../../../shared/errors';\nimport type { DepositEventMap } from '../../../../shared/events';\nimport {\n evmAmountSchema,\n validatePrepareParams,\n} from '../../../../shared/validation';\nimport { evmConfig } from './config';\nimport {\n type EvmDepositParams,\n type EvmDepositPrepareParams,\n EvmDepositStatus,\n type IEvmDeposit,\n} from './types';\n\nexport class EvmDeposit\n extends BaseAction<DepositEventMap, EvmDepositStatus>\n implements IEvmDeposit\n{\n private _amount?: string;\n private _recipient?: string;\n private _needsApproval = false;\n private _txHash?: string;\n private _claimData?: { data: string; proofSignature: string };\n\n constructor(\n private readonly ctx: EvmCoreContext,\n private readonly params: EvmDepositParams,\n ) {\n super(EvmDepositStatus.IDLE);\n }\n\n get amount(): string | undefined {\n return this._amount;\n }\n\n get recipient(): string | undefined {\n return this._recipient;\n }\n\n get needsApproval(): boolean {\n return this._needsApproval;\n }\n\n get txHash(): string | undefined {\n return this._txHash;\n }\n\n setClaimData(data: string, proofSignature: string): void {\n this._claimData = { data, proofSignature };\n }\n\n async prepare(params: EvmDepositPrepareParams): Promise<void> {\n this.assertStatus(EvmDepositStatus.IDLE, 'prepare');\n\n return this.act(async () => {\n const validated = validatePrepareParams(this.prepareSchema, params, {\n destChain: this.params.destChain,\n });\n this._amount = validated.amount;\n this._recipient = validated.recipient;\n\n this._needsApproval = false;\n this.emitProgress({\n status: EvmDepositStatus.READY,\n steps: {\n approval: StepStatus.COMPLETE,\n execution: StepStatus.IDLE,\n bridging: StepStatus.IDLE,\n },\n });\n }, EvmDepositStatus.READY);\n }\n\n async approve(): Promise<void> {\n this.assertStatus(EvmDepositStatus.NEEDS_APPROVAL, 'approve');\n\n return this.act(async () => {\n this._needsApproval = false;\n }, EvmDepositStatus.READY);\n }\n\n async execute(): Promise<{ txHash: string }> {\n this.assertStatus(EvmDepositStatus.READY, 'execute');\n\n if (!this._claimData) {\n throw LombardError.missingParameter('claimData');\n }\n\n return this.act(async () => {\n const provider = await this.ctx.getProvider('evm');\n if (!provider) {\n throw LombardError.providerMissing(this.params.sourceChain, 'evm');\n }\n\n const chainId = parseChainIdentifier(this.params.destChain) as ChainId;\n\n this.emitProgress({\n status: EvmDepositStatus.READY,\n steps: {\n approval: StepStatus.COMPLETE,\n execution: StepStatus.PENDING,\n bridging: StepStatus.IDLE,\n },\n });\n\n const txHash = await claimLBTC({\n provider: provider as EIP1193Provider,\n account: this._recipient! as `0x${string}`,\n data: this._claimData!.data,\n proofSignature: this._claimData!.proofSignature,\n chainId,\n env: this.ctx.env,\n });\n\n this._txHash = txHash;\n\n this.emitProgress({\n status: EvmDepositStatus.COMPLETED,\n steps: {\n approval: StepStatus.COMPLETE,\n execution: StepStatus.COMPLETE,\n bridging: StepStatus.IDLE,\n },\n });\n\n this.emitCompleted();\n\n return { txHash };\n }, EvmDepositStatus.COMPLETED);\n }\n\n private get prepareSchema() {\n return z.object({\n amount: evmAmountSchema,\n recipient: evmConfig.addressSchema,\n });\n }\n}\n","/**\n * EVM Deposit Factory Functions\n *\n * @module chains/evm/actions/deposit/factory\n */\n\nimport type { LombardConfig } from '../../../../config/types';\nimport type { EvmCoreContext } from '../../../../shared/context';\nimport { createEvmCoreContext } from '../../../../shared/context';\nimport { EvmDeposit } from './EvmDeposit';\nimport type { EvmDepositParams } from './types';\n\n/**\n * Create EvmDeposit action from config\n *\n * @internal This factory is for internal use. Use createLombardSDK() instead:\n *\n * @example\n * ```typescript\n * const sdk = await createLombardSDK({ env: Env.prod, providers: { evm: () => window.ethereum } });\n * const deposit = sdk.chain.evm.deposit({\n * sourceChain: Chain.ETHEREUM,\n * assetIn: AssetId.BTCb,\n * });\n * await deposit.prepare({ amount: '0.1' });\n * ```\n */\nexport function evmDeposit(\n config: LombardConfig,\n params: EvmDepositParams,\n): EvmDeposit {\n const ctx = createEvmCoreContext(config);\n return new EvmDeposit(ctx, params);\n}\n\n/**\n * Create EvmDeposit action from context\n */\nexport function createEvmDeposit(\n ctx: EvmCoreContext,\n params: EvmDepositParams,\n): EvmDeposit {\n return new EvmDeposit(ctx, params);\n}\n","/**\n * EVM Chain Configuration for Redeem\n *\n * Handles redeeming BTC.b to native BTC (cross-chain).\n * This is the opposite operation to BTC Deposit.\n *\n * Future: Will also support L-Assets (L_ZEC, L_SOL, etc.) → native chains.\n *\n * @module chains/evm/actions/redeem/config/evm\n */\n\nimport { Env } from '@lombard.finance/sdk-common';\n\nimport {\n AssetId,\n Chain,\n getEvmAssetChains,\n} from '../../../../../core';\nimport { bitcoinAddressSchema } from '../../../../../shared/validation';\nimport type { ChainConfig } from './types';\n\n// ═══════════════════════════════════════════════════════════════════════════\n// Catalog-Derived Chain Lists\n// ═══════════════════════════════════════════════════════════════════════════\n\n/** EVM chains with BTC.b deployed (can redeem to BTC) */\nconst BTCB_PROD_CHAINS = getEvmAssetChains(AssetId.BTCb, [Env.prod]);\nconst BTCB_TESTNET_CHAINS = getEvmAssetChains(AssetId.BTCb, [\n Env.testnet,\n Env.stage,\n Env.dev,\n Env.ibc,\n]);\n\n// ═══════════════════════════════════════════════════════════════════════════\n// Configuration Objects\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * EVM redeem configuration\n *\n * Currently supports BTC.b → BTC (cross-chain to Bitcoin).\n * Source chains derived from BTC.b deployments in ASSET_CATALOG.\n */\nexport const evmConfig: ChainConfig = {\n chainType: 'evm',\n\n routes: [\n // BTC.b → BTC (to Bitcoin Mainnet)\n {\n assetIn: AssetId.BTCb,\n assetOut: AssetId.BTC,\n sourceChains: BTCB_PROD_CHAINS,\n destChain: Chain.BITCOIN_MAINNET,\n envs: [Env.prod],\n },\n // BTC.b → BTC (to Bitcoin Signet - testnet)\n {\n assetIn: AssetId.BTCb,\n assetOut: AssetId.BTC,\n sourceChains: BTCB_TESTNET_CHAINS,\n destChain: Chain.BITCOIN_SIGNET,\n envs: [Env.testnet, Env.stage, Env.dev, Env.ibc],\n },\n // TODO: Add L-Asset routes when deployed\n // L-ZEC → ZEC, L-SOL → SOL, L-XRP → XRP, L-DOGE → DOGE\n ],\n\n recipientSchema: bitcoinAddressSchema,\n};\n\n/**\n * Check if a redeem route is supported\n */\nexport function isRedeemSupported(\n assetIn: AssetId,\n sourceChain: Chain,\n env: Env,\n): boolean {\n return evmConfig.routes.some(\n route =>\n route.assetIn === assetIn &&\n route.sourceChains.includes(sourceChain) &&\n route.envs.includes(env),\n );\n}\n","/**\n * Shared Fee Authorization Logic for EVM Actions\n *\n * Provides fee authorization support for EVM actions that require it:\n * - EvmStake (BTC.b → LBTC on Ethereum/Sepolia)\n * - EvmRedeem (BTC.b → BTC on Ethereum/Sepolia)\n * - EvmUnstake (LBTC → BTC.b on Ethereum/Sepolia)\n *\n * Fee authorization is only required on unsubsidized chains (Ethereum, Sepolia).\n * Other chains (Base, BSC, Avalanche) are subsidized by Lombard.\n *\n * @module chains/evm/shared/feeAuth\n */\n\nimport type { Env } from '@lombard.finance/sdk-common';\nimport type { EIP1193Provider } from 'viem';\n\nimport { getNetworkFeeSignature } from '../../../api-functions';\nimport { storeNetworkFeeSignature } from '../../../api-functions/storeNetworkFeeSignature/storeNetworkFeeSignature';\nimport type { ChainId } from '../../../common/chains';\nimport { requiresAutoMintFee } from '../../../common/fee-requirements';\nimport { getMintingFee } from '../../../contract-functions';\nimport { signNetworkFee } from '../../../contract-functions/signNetworkFee/signNetworkFee';\nimport { Token } from '../../../tokens/token-addresses';\nimport { getTokenContractInfo } from '../../../tokens/tokens';\n\n// ═══════════════════════════════════════════════════════════════════════════\n// Types\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Fee authorization state\n */\nexport interface FeeAuthState {\n /** Whether fee authorization is required for this chain */\n requiresAuth: boolean;\n /** Whether fee authorization is complete (valid signature exists) */\n isAuthorized: boolean;\n /** Minting fee in satoshis (for signing) */\n feeInSatoshis: bigint | null;\n /** Minting fee formatted in BTC (for display) */\n feeFormatted: string | null;\n /** Signature expiration date (Unix timestamp in seconds) */\n expirationDate: string | null;\n}\n\n/**\n * Fee authorization check result\n */\nexport interface FeeAuthCheckResult {\n /** Whether fee authorization is required */\n requiresAuth: boolean;\n /** Whether a valid (non-expired) signature exists */\n hasValidSignature: boolean;\n /** Minting fee in satoshis */\n feeInSatoshis: bigint | null;\n /** Minting fee formatted in BTC */\n feeFormatted: string | null;\n /** Expiration date if signature exists */\n expirationDate: string | null;\n}\n\n/**\n * Parameters for fee authorization\n */\nexport interface AuthorizeFeeParams {\n chainId: ChainId;\n account: `0x${string}`;\n feeInSatoshis: bigint;\n provider: EIP1193Provider;\n env: Env;\n token: Token;\n}\n\n// ═══════════════════════════════════════════════════════════════════════════\n// Fee Authorization Logic\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Check if fee authorization is required and if a valid signature exists\n *\n * This should be called in the action's prepare() method to determine\n * whether to transition to NEEDS_FEE_AUTHORIZATION or READY status.\n *\n * @param chainId - The EVM chain ID\n * @param account - The user's EVM account address\n * @param env - The environment (prod, stage, testnet)\n * @param token - The token type (BTCb or LBTC)\n * @returns Fee authorization check result\n */\nexport async function checkFeeAuthorization(\n chainId: ChainId,\n account: `0x${string}`,\n env: Env,\n token: Token,\n): Promise<FeeAuthCheckResult> {\n // Check if this chain requires fee authorization\n if (!requiresAutoMintFee(chainId)) {\n return {\n requiresAuth: false,\n hasValidSignature: false,\n feeInSatoshis: null,\n feeFormatted: null,\n expirationDate: null,\n };\n }\n\n // Get token address for signature lookup\n const tokenInfo = await getTokenContractInfo(token, chainId, env);\n\n // Check for existing valid signature on server\n const existingSignature = await getNetworkFeeSignature({\n address: account,\n chainId,\n env,\n tokenAddress: tokenInfo.address,\n });\n\n // Check if signature exists and is not expired\n const isExpired = existingSignature.expirationDate\n ? new Date(Number(existingSignature.expirationDate) * 1000) < new Date()\n : false;\n\n const hasValidSignature = existingSignature.hasSignature && !isExpired;\n\n // If no valid signature, fetch the minting fee\n let feeInSatoshis: bigint | null = null;\n let feeFormatted: string | null = null;\n\n if (!hasValidSignature) {\n const feeInBtc = await getMintingFee({\n token,\n chainId,\n env,\n });\n feeInSatoshis = BigInt(feeInBtc.times(1e8).toFixed(0));\n feeFormatted = feeInBtc.toFixed(8);\n }\n\n return {\n requiresAuth: true,\n hasValidSignature,\n feeInSatoshis,\n feeFormatted,\n expirationDate: existingSignature.expirationDate ?? null,\n };\n}\n\n/**\n * Authorize fee by signing and storing the signature\n *\n * This should be called from the action's authorizeFee() method.\n *\n * @param params - Authorization parameters\n * @returns The signature\n */\nexport async function authorizeFee(\n params: AuthorizeFeeParams,\n): Promise<{ signature: `0x${string}`; typedData: string }> {\n const { chainId, account, feeInSatoshis, provider, env, token } = params;\n\n // Get token address for storing signature\n const tokenInfo = await getTokenContractInfo(token, chainId, env);\n\n // Sign the network fee\n const signResult = await signNetworkFee({\n fee: feeInSatoshis,\n account,\n chainId,\n provider,\n env,\n token,\n });\n\n // Store the signature on the server\n await storeNetworkFeeSignature({\n signature: signResult.signature,\n typedData: signResult.typedData,\n address: account,\n env,\n tokenAddress: tokenInfo.address,\n });\n\n return signResult;\n}\n\n/**\n * Create initial fee auth state\n */\nexport function createInitialFeeAuthState(): FeeAuthState {\n return {\n requiresAuth: false,\n isAuthorized: false,\n feeInSatoshis: null,\n feeFormatted: null,\n expirationDate: null,\n };\n}\n","/**\n * EVM Redeem Action\n *\n * Redeems BTC.b to native BTC (cross-chain).\n * This is the opposite operation to BTC Deposit.\n *\n * Flow: BTC.b (EVM) → BTC (Bitcoin)\n *\n * ## Fee Authorization\n *\n * On Ethereum/Sepolia, fee authorization is required before redemption.\n * This covers the gas cost of the auto-mint operation on the destination.\n *\n * **Flow with fee auth (Ethereum/Sepolia):**\n * IDLE → NEEDS_FEE_AUTHORIZATION → READY → COMPLETED\n *\n * **Flow without fee auth (Base, BSC - subsidized):**\n * IDLE → READY → COMPLETED\n *\n * @module chains/evm/actions/redeem/EvmRedeem\n */\n\nimport type { EIP1193Provider } from 'viem';\nimport { z } from 'zod';\n\nimport type { ChainId } from '../../../../common/chains';\nimport { redeemToken } from '../../../../contract-functions';\nimport { parseChainIdentifier, StepStatus } from '../../../../core';\nimport { BaseAction } from '../../../../shared/actions/BaseAction';\nimport { EvmOperationStatus } from '../../../../shared/constants/statusConstants';\nimport type { EvmCoreContext } from '../../../../shared/context';\nimport { LombardError } from '../../../../shared/errors';\nimport type { RedeemEventMap } from '../../../../shared/events';\nimport {\n evmAmountSchema,\n validatePrepareParams,\n} from '../../../../shared/validation';\nimport { Token } from '../../../../tokens/token-addresses';\nimport {\n authorizeFee as authorizeFeeShared,\n checkFeeAuthorization,\n createInitialFeeAuthState,\n type FeeAuthState,\n} from '../../shared/feeAuth';\nimport { evmConfig } from './config';\nimport type {\n EvmRedeemParams,\n EvmRedeemPrepareParams,\n IEvmRedeem,\n} from './types';\n\nexport class EvmRedeem\n extends BaseAction<RedeemEventMap, EvmOperationStatus>\n implements IEvmRedeem\n{\n private _amount?: string;\n private _recipient?: string;\n private _needsApproval = false;\n private _txHash?: string;\n private _feeAuth: FeeAuthState = createInitialFeeAuthState();\n\n constructor(\n private readonly ctx: EvmCoreContext,\n private readonly params: EvmRedeemParams,\n ) {\n super(EvmOperationStatus.IDLE);\n }\n\n get amount(): string | undefined {\n return this._amount;\n }\n\n get recipient(): string | undefined {\n return this._recipient;\n }\n\n get needsApproval(): boolean {\n return this._needsApproval;\n }\n\n get txHash(): string | undefined {\n return this._txHash;\n }\n\n /** Fee authorization state (for UI display) */\n get feeAuth(): FeeAuthState {\n return this._feeAuth;\n }\n\n async prepare(params: EvmRedeemPrepareParams): Promise<void> {\n this.assertStatus(EvmOperationStatus.IDLE, 'prepare');\n\n return this.act(async () => {\n const validated = validatePrepareParams(this.prepareSchema, params, {\n destChain: this.params.destChain,\n });\n this._amount = validated.amount as string;\n this._recipient = validated.recipient as string;\n\n const chainId = parseChainIdentifier(this.params.sourceChain) as ChainId;\n\n // Get EVM account for fee auth check\n const provider = await this.ctx.getProvider('evm');\n if (!provider) {\n throw LombardError.providerMissing(this.params.sourceChain, 'evm');\n }\n const accounts = await (provider as EIP1193Provider).request({\n method: 'eth_accounts',\n });\n const account = accounts[0] as `0x${string}`;\n\n // Check fee authorization status (BTC.b redeem uses Token.BTCb)\n const feeAuthResult = await checkFeeAuthorization(\n chainId,\n account,\n this.ctx.env,\n Token.BTCb,\n );\n\n // Update fee auth state\n this._feeAuth = {\n requiresAuth: feeAuthResult.requiresAuth,\n isAuthorized: feeAuthResult.hasValidSignature,\n feeInSatoshis: feeAuthResult.feeInSatoshis,\n feeFormatted: feeAuthResult.feeFormatted,\n expirationDate: feeAuthResult.expirationDate,\n };\n\n // Determine next status based on fee auth\n // Note: Status is set here (not via act's successStatus) because the\n // fee auth state is only known after the async check completes.\n if (feeAuthResult.requiresAuth && !feeAuthResult.hasValidSignature) {\n this.updateStatus(EvmOperationStatus.NEEDS_FEE_AUTHORIZATION);\n this.emitProgress({\n status: EvmOperationStatus.NEEDS_FEE_AUTHORIZATION,\n steps: { burning: StepStatus.IDLE, releasing: StepStatus.IDLE },\n });\n return;\n }\n\n // No fee auth required or already authorized\n this._needsApproval = false;\n this.updateStatus(EvmOperationStatus.READY);\n this.emitProgress({\n status: EvmOperationStatus.READY,\n steps: { burning: StepStatus.IDLE, releasing: StepStatus.IDLE },\n });\n });\n }\n\n /**\n * Authorize the network fee\n *\n * Must be called when status is NEEDS_FEE_AUTHORIZATION.\n * Signs the fee authorization and stores it on the server.\n */\n async authorizeFee(): Promise<void> {\n this.assertStatus(EvmOperationStatus.NEEDS_FEE_AUTHORIZATION, 'authorizeFee');\n\n if (!this._feeAuth.feeInSatoshis) {\n throw LombardError.missingParameter('feeInSatoshis');\n }\n\n return this.act(async () => {\n const chainId = parseChainIdentifier(this.params.sourceChain) as ChainId;\n\n const provider = await this.ctx.getProvider('evm');\n if (!provider) {\n throw LombardError.providerMissing(this.params.sourceChain, 'evm');\n }\n\n const accounts = await (provider as EIP1193Provider).request({\n method: 'eth_accounts',\n });\n const account = accounts[0] as `0x${string}`;\n\n // Sign and store fee authorization\n await authorizeFeeShared({\n chainId,\n account,\n feeInSatoshis: this._feeAuth.feeInSatoshis!,\n provider: provider as EIP1193Provider,\n env: this.ctx.env,\n token: Token.BTCb,\n });\n\n // Update state\n this._feeAuth.isAuthorized = true;\n\n this.emitProgress({\n status: EvmOperationStatus.READY,\n steps: { burning: StepStatus.IDLE, releasing: StepStatus.IDLE },\n });\n }, EvmOperationStatus.READY);\n }\n\n async approve(): Promise<void> {\n this.assertStatus(EvmOperationStatus.NEEDS_APPROVAL, 'approve');\n\n return this.act(async () => {\n this._needsApproval = false;\n this.emitProgress({\n status: EvmOperationStatus.READY,\n steps: { burning: StepStatus.IDLE, releasing: StepStatus.IDLE },\n });\n }, EvmOperationStatus.READY);\n }\n\n async execute(): Promise<{ txHash: string }> {\n this.assertStatus(EvmOperationStatus.READY, 'execute');\n\n return this.act(async () => {\n const provider = await this.ctx.getProvider('evm');\n if (!provider) {\n throw LombardError.providerMissing(this.params.sourceChain, 'evm');\n }\n\n // Get the connected EVM account address from the provider\n const accounts = await (provider as EIP1193Provider).request({\n method: 'eth_accounts',\n });\n const evmAccount = accounts[0] as `0x${string}`;\n if (!evmAccount) {\n throw LombardError.providerMissing(this.params.sourceChain, 'evm');\n }\n\n const chainId = parseChainIdentifier(this.params.sourceChain) as ChainId;\n\n this.emitProgress({\n status: EvmOperationStatus.READY,\n steps: { burning: StepStatus.PENDING, releasing: StepStatus.IDLE },\n });\n\n // Execute BTC.b → BTC redemption (burn BTC.b, release BTC to Bitcoin address)\n const txHash = await redeemToken({\n provider: provider as EIP1193Provider,\n account: evmAccount,\n amount: this._amount!,\n btcAddress: this._recipient!, // Bitcoin address to receive BTC\n chainId,\n env: this.ctx.env,\n tokenIn: Token.BTCb,\n tokenOut: undefined, // Native BTC output\n });\n\n this._txHash = txHash;\n\n this.emitProgress({\n status: EvmOperationStatus.COMPLETED,\n steps: { burning: StepStatus.COMPLETE, releasing: StepStatus.PENDING },\n });\n\n this.emitCompleted();\n\n return { txHash };\n }, EvmOperationStatus.COMPLETED);\n }\n\n private get prepareSchema() {\n return z.object({\n amount: evmAmountSchema,\n recipient: evmConfig.recipientSchema,\n });\n }\n}\n","/**\n * EVM Redeem Factory Functions\n *\n * @module chains/evm/actions/redeem/factory\n */\n\nimport type { LombardConfig } from '../../../../config/types';\nimport type { EvmCoreContext } from '../../../../shared/context';\nimport { createEvmCoreContext } from '../../../../shared/context';\nimport { EvmRedeem } from './EvmRedeem';\nimport type { EvmRedeemParams } from './types';\n\n/**\n * Create EvmRedeem action from config\n *\n * @internal This factory is for internal use. Use createLombardSDK() instead:\n *\n * @example\n * ```typescript\n * const sdk = await createLombardSDK({ env: Env.prod, providers: { evm: () => window.ethereum } });\n * const redeem = sdk.chain.evm.redeem({\n * sourceChain: Chain.ETHEREUM,\n * });\n * await redeem.prepare({ amount: '0.1' });\n * ```\n */\nexport function evmRedeem(\n config: LombardConfig,\n params: EvmRedeemParams,\n): EvmRedeem {\n const ctx = createEvmCoreContext(config);\n return new EvmRedeem(ctx, params);\n}\n\n/**\n * Create EvmRedeem action from context\n */\nexport function createEvmRedeem(\n ctx: EvmCoreContext,\n params: EvmRedeemParams,\n): EvmRedeem {\n return new EvmRedeem(ctx, params);\n}\n","/**\n * EVM Stake Action\n *\n * Stakes BTC.b to receive LBTC via the Asset Router.\n * This is the EVM equivalent of staking - converting wrapped BTC to LBTC.\n *\n * ## Approval (Avalanche only)\n *\n * On Avalanche, users must approve the Adapter contract to spend their BTC.b.\n *\n * ## Fee Authorization (Ethereum/Sepolia only)\n *\n * Fee authorization is required on unsubsidized chains (Ethereum, Sepolia).\n * On subsidized chains (Avalanche, Base, BSC), no fee auth is required.\n *\n * **Flow with approval (Avalanche):**\n * IDLE → NEEDS_APPROVAL → READY → COMPLETED\n *\n * **Flow with fee auth (Ethereum/Sepolia):**\n * IDLE → NEEDS_FEE_AUTHORIZATION → READY → COMPLETED\n *\n * **Flow without either (Base, BSC):**\n * IDLE → READY → COMPLETED\n *\n * @module chains/evm/actions/stake/EvmStake\n */\n\nimport BigNumber from 'bignumber.js';\nimport type { EIP1193Provider } from 'viem';\nimport { z } from 'zod';\n\nimport { makePublicClient } from '../../../../clients/public-client';\nimport { ChainId } from '../../../../common/chains';\nimport {\n approveToken,\n getTokenAllowance,\n} from '../../../../contract-functions/approveToken';\nimport { depositToken } from '../../../../contract-functions/deposit';\nimport { parseChainIdentifier, StepStatus } from '../../../../core';\nimport { BaseAction } from '../../../../shared/actions/BaseAction';\nimport { EvmOperationStatus } from '../../../../shared/constants/statusConstants';\nimport type { EvmCoreContext } from '../../../../shared/context';\nimport { LombardError } from '../../../../shared/errors';\nimport type { StakeEventMap } from '../../../../shared/events';\nimport {\n evmAmountSchema,\n validatePrepareParams,\n} from '../../../../shared/validation';\nimport { AddressKind, Token } from '../../../../tokens/token-addresses';\nimport { getTokenContractInfo } from '../../../../tokens/tokens';\nimport { waitForTransactionReceipt } from '../../../../utils/transaction-executor';\nimport {\n authorizeFee as authorizeFeeShared,\n checkFeeAuthorization,\n createInitialFeeAuthState,\n type FeeAuthState,\n} from '../../shared/feeAuth';\nimport type { EvmStakeParams, EvmStakePrepareParams, IEvmStake } from './types';\n\n/**\n * Chains that require ERC20 approval for BTC.b staking (to the Adapter)\n */\nconst APPROVAL_REQUIRED_CHAINS: readonly ChainId[] = [\n ChainId.avalanche,\n ChainId.avalancheFuji,\n] as const;\n\nfunction requiresApproval(chainId: ChainId): boolean {\n return APPROVAL_REQUIRED_CHAINS.includes(chainId);\n}\n\nexport class EvmStake\n extends BaseAction<StakeEventMap, EvmOperationStatus>\n implements IEvmStake\n{\n private _amount?: string;\n private _txHash?: string;\n private _feeAuth: FeeAuthState = createInitialFeeAuthState();\n private _account?: `0x${string}`;\n private _needsApproval = false;\n private _spenderAddress?: `0x${string}`;\n\n constructor(\n private readonly ctx: EvmCoreContext,\n private readonly params: EvmStakeParams,\n ) {\n super(EvmOperationStatus.IDLE);\n }\n\n get amount(): string | undefined {\n return this._amount;\n }\n\n get txHash(): string | undefined {\n return this._txHash;\n }\n\n /** Fee authorization state (for UI display) */\n get feeAuth(): FeeAuthState {\n return this._feeAuth;\n }\n\n /** Whether approval is needed */\n get needsApproval(): boolean {\n return this._needsApproval;\n }\n\n async prepare(params: EvmStakePrepareParams): Promise<void> {\n this.assertStatus(EvmOperationStatus.IDLE, 'prepare');\n\n return this.act(async () => {\n const validated = validatePrepareParams(this.prepareSchema, params);\n this._amount = validated.amount;\n\n const provider = await this.ctx.getProvider('evm');\n if (!provider) {\n throw LombardError.providerMissing(this.params.sourceChain, 'evm');\n }\n\n const accounts = await (provider as EIP1193Provider).request({\n method: 'eth_accounts',\n });\n const account = (accounts as string[])[0] as `0x${string}`;\n\n if (!account) {\n throw LombardError.providerMissing(this.params.sourceChain, 'evm');\n }\n this._account = account;\n\n const chainId = parseChainIdentifier(this.params.sourceChain) as ChainId;\n\n // Check if approval is required (Avalanche only)\n if (requiresApproval(chainId)) {\n // Get the Adapter address (spender for approval)\n const adapterInfo = await getTokenContractInfo(\n Token.BTCb,\n chainId,\n this.ctx.env,\n AddressKind.Adapter,\n );\n this._spenderAddress = adapterInfo.address;\n\n // Check current allowance\n const allowance = await getTokenAllowance({\n token: Token.BTCb,\n owner: account,\n spender: adapterInfo.address,\n chainId,\n env: this.ctx.env,\n });\n\n const requiredAmount = new BigNumber(validated.amount);\n this._needsApproval = allowance.isLessThan(requiredAmount);\n\n if (this._needsApproval) {\n this.emitProgress({\n status: EvmOperationStatus.NEEDS_APPROVAL,\n steps: { approval: StepStatus.PENDING, staking: StepStatus.IDLE },\n });\n this.updateStatus(EvmOperationStatus.NEEDS_APPROVAL);\n return;\n }\n }\n\n // Check fee authorization status (BTC.b → LBTC uses Token.LBTC for fee signature)\n const feeAuthResult = await checkFeeAuthorization(\n chainId,\n account,\n this.ctx.env,\n Token.LBTC,\n );\n\n // Update fee auth state\n this._feeAuth = {\n requiresAuth: feeAuthResult.requiresAuth,\n isAuthorized: feeAuthResult.hasValidSignature,\n feeInSatoshis: feeAuthResult.feeInSatoshis,\n feeFormatted: feeAuthResult.feeFormatted,\n expirationDate: feeAuthResult.expirationDate,\n };\n\n // Determine next status based on fee auth\n const needsFeeAuth =\n feeAuthResult.requiresAuth && !feeAuthResult.hasValidSignature;\n\n if (needsFeeAuth) {\n this.emitProgress({\n status: EvmOperationStatus.NEEDS_FEE_AUTHORIZATION,\n steps: { staking: StepStatus.IDLE },\n });\n this.updateStatus(EvmOperationStatus.NEEDS_FEE_AUTHORIZATION);\n } else {\n this.emitProgress({\n status: EvmOperationStatus.READY,\n steps: { staking: StepStatus.PENDING },\n });\n this.updateStatus(EvmOperationStatus.READY);\n }\n });\n }\n\n /**\n * Approve BTC.b spending (Avalanche only)\n *\n * Must be called when status is NEEDS_APPROVAL.\n */\n async approve(): Promise<void> {\n this.assertStatus(EvmOperationStatus.NEEDS_APPROVAL, 'approve');\n\n return this.act(async () => {\n if (!this._account || !this._spenderAddress || !this._amount) {\n throw LombardError.missingParameter(\n 'account, spenderAddress, or amount',\n );\n }\n\n const provider = await this.ctx.getProvider('evm');\n if (!provider) {\n throw LombardError.providerMissing(this.params.sourceChain, 'evm');\n }\n\n const chainId = parseChainIdentifier(this.params.sourceChain) as ChainId;\n\n // Execute approval transaction\n const txHash = await approveToken({\n account: this._account,\n token: Token.BTCb,\n spender: this._spenderAddress,\n amount: this._amount,\n chainId,\n provider: provider as EIP1193Provider,\n env: this.ctx.env,\n });\n\n // Wait for approval to be confirmed on-chain\n const publicClient = makePublicClient({ chainId, env: this.ctx.env });\n await waitForTransactionReceipt(publicClient, txHash, 'BTC.b approval');\n\n // Mark approval as done\n this._needsApproval = false;\n\n this.emitProgress({\n status: EvmOperationStatus.READY,\n steps: { approval: StepStatus.COMPLETE, staking: StepStatus.PENDING },\n });\n }, EvmOperationStatus.READY);\n }\n\n async authorizeFee(): Promise<void> {\n this.assertStatus(\n EvmOperationStatus.NEEDS_FEE_AUTHORIZATION,\n 'authorizeFee',\n );\n\n return this.act(async () => {\n if (!this._feeAuth.feeInSatoshis) {\n throw LombardError.missingParameter('feeInSatoshis');\n }\n\n const provider = await this.ctx.getProvider('evm');\n if (!provider) {\n throw LombardError.providerMissing(this.params.sourceChain, 'evm');\n }\n\n const chainId = parseChainIdentifier(this.params.sourceChain) as ChainId;\n\n // Sign and store the fee authorization\n await authorizeFeeShared({\n chainId,\n account: this._account!,\n feeInSatoshis: this._feeAuth.feeInSatoshis,\n provider: provider as EIP1193Provider,\n env: this.ctx.env,\n token: Token.LBTC, // BTC.b → LBTC uses LBTC token for fee signature\n });\n\n // Update fee auth state\n this._feeAuth = {\n ...this._feeAuth,\n isAuthorized: true,\n };\n\n this.emitProgress({\n status: EvmOperationStatus.READY,\n steps: { staking: StepStatus.PENDING },\n });\n }, EvmOperationStatus.READY);\n }\n\n async execute(): Promise<{ txHash: string }> {\n this.assertStatus(EvmOperationStatus.READY, 'execute');\n\n return this.act(async () => {\n const provider = await this.ctx.getProvider('evm');\n if (!provider) {\n throw LombardError.providerMissing(this.params.sourceChain, 'evm');\n }\n\n const chainId = parseChainIdentifier(this.params.sourceChain) as ChainId;\n\n // Get account from provider\n const accounts = await (provider as EIP1193Provider).request({\n method: 'eth_accounts',\n });\n const account = (accounts as string[])[0] as `0x${string}`;\n\n if (!account) {\n throw LombardError.providerMissing(this.params.sourceChain, 'evm');\n }\n\n this.emitProgress({\n status: EvmOperationStatus.READY,\n steps: { staking: StepStatus.PENDING },\n });\n\n // Execute BTC.b → LBTC via Asset Router\n const txHash = await depositToken({\n amount: this._amount!,\n tokenIn: Token.BTCb,\n tokenOut: Token.LBTC,\n account,\n chainId,\n provider: provider as EIP1193Provider,\n env: this.ctx.env,\n });\n\n this._txHash = txHash;\n\n this.emitProgress({\n status: EvmOperationStatus.COMPLETED,\n steps: { staking: StepStatus.COMPLETE },\n });\n\n this.emitCompleted();\n\n return { txHash };\n }, EvmOperationStatus.COMPLETED);\n }\n\n private get prepareSchema() {\n return z.object({\n amount: evmAmountSchema,\n });\n }\n}\n","/**\n * EVM Stake Factory Functions\n *\n * Provides factory functions for creating EvmStake instances.\n *\n * @module chains/evm/actions/stake/factory\n */\n\nimport type { LombardConfig } from '../../../../config/types';\nimport type { EvmCoreContext } from '../../../../shared/context';\nimport { createEvmCoreContext } from '../../../../shared/context';\nimport { EvmStake } from './EvmStake';\nimport type { EvmStakeParams } from './types';\n\n/**\n * Create EvmStake action from config\n *\n * @internal This factory is for internal use. Use createLombardSDK() instead:\n *\n * @example\n * ```typescript\n * const sdk = await createLombardSDK({ env: Env.prod, providers: { evm: () => window.ethereum } });\n * const stake = sdk.chain.evm.stake({\n * sourceChain: Chain.ETHEREUM,\n * destChain: Chain.ETHEREUM,\n * });\n * await stake.prepare({ amount: '0.1' });\n * ```\n */\nexport function evmStake(\n config: LombardConfig,\n params: EvmStakeParams,\n): EvmStake {\n const ctx = createEvmCoreContext(config);\n return new EvmStake(ctx, params);\n}\n\n/**\n * Create EvmStake action from context\n *\n * Use this when you already have an EvmCoreContext (e.g., in EvmActions).\n *\n * @param ctx - EvmCoreContext\n * @param params - Stake parameters\n * @returns EvmStake instance\n */\nexport function createEvmStake(\n ctx: EvmCoreContext,\n params: EvmStakeParams,\n): EvmStake {\n return new EvmStake(ctx, params);\n}\n","/**\n * EVM Chain Configuration for Unstake\n *\n * Handles unstaking LBTC to BTC (cross-chain) or BTC.b (same-chain).\n * Routes are derived from ASSET_CATALOG to ensure consistency.\n *\n * @module chains/evm/actions/unstake/config/evm\n */\n\nimport { Env } from '@lombard.finance/sdk-common';\n\nimport {\n AssetId,\n Chain,\n getEvmAssetChains,\n getEvmChainsWithAllAssets,\n} from '../../../../../core';\nimport {\n bitcoinAddressSchema,\n evmAddressSchema,\n} from '../../../../../shared/validation';\nimport type { ChainConfig } from './types';\n\n// ═══════════════════════════════════════════════════════════════════════════\n// Catalog-Derived Chain Lists\n// ═══════════════════════════════════════════════════════════════════════════\n\n/** EVM chains with LBTC deployed (can unstake to BTC) */\nconst LBTC_PROD_CHAINS = getEvmAssetChains(AssetId.LBTC, [Env.prod]);\nconst LBTC_TESTNET_CHAINS = getEvmAssetChains(AssetId.LBTC, [\n Env.testnet,\n Env.stage,\n Env.dev,\n Env.ibc,\n]);\n\n/** EVM chains with BOTH LBTC and BTCb deployed (can unstake to BTCb) */\nconst LBTC_BTCB_PROD_CHAINS = getEvmChainsWithAllAssets(\n [AssetId.LBTC, AssetId.BTCb],\n [Env.prod],\n);\nconst LBTC_BTCB_TESTNET_CHAINS = getEvmChainsWithAllAssets(\n [AssetId.LBTC, AssetId.BTCb],\n [Env.testnet, Env.stage, Env.dev, Env.ibc],\n);\n\n// ═══════════════════════════════════════════════════════════════════════════\n// Configuration Objects\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * EVM → BTC configuration (cross-chain unstake)\n *\n * Burns LBTC on EVM, releases BTC on Bitcoin network.\n * Source chains derived from ASSET_CATALOG LBTC deployments.\n */\nexport const evmToBtcConfig: ChainConfig = {\n chainType: 'evm',\n\n routes: [\n // Production: EVM chains with LBTC → Bitcoin Mainnet\n {\n sourceChains: LBTC_PROD_CHAINS,\n destChain: Chain.BITCOIN_MAINNET,\n envs: [Env.prod],\n },\n // Testnet: EVM chains with LBTC → Bitcoin Signet\n {\n sourceChains: LBTC_TESTNET_CHAINS,\n destChain: Chain.BITCOIN_SIGNET,\n envs: [Env.testnet, Env.stage, Env.dev, Env.ibc],\n },\n ],\n\n recipientSchema: bitcoinAddressSchema,\n};\n\n/**\n * EVM → BTC.b configuration (same-chain wrapped)\n *\n * Burns LBTC on EVM, mints BTC.b on same EVM chain.\n * Only available on chains with BOTH LBTC and BTCb deployed.\n * Routes are generated dynamically from catalog.\n */\nexport const evmToBtcbConfig: ChainConfig = {\n chainType: 'evm',\n\n routes: [\n // Production: Same-chain routes for chains with both LBTC and BTCb\n ...LBTC_BTCB_PROD_CHAINS.map(chain => ({\n sourceChains: [chain],\n destChain: chain,\n envs: [Env.prod] as Env[],\n })),\n // Testnet: Same-chain routes\n ...LBTC_BTCB_TESTNET_CHAINS.map(chain => ({\n sourceChains: [chain],\n destChain: chain,\n envs: [Env.testnet, Env.stage, Env.dev, Env.ibc] as Env[],\n })),\n ],\n\n recipientSchema: evmAddressSchema,\n};\n\n/**\n * Check if unstake to BTC is supported\n */\nexport function isBtcUnstakeSupported(sourceChain: Chain, env: Env): boolean {\n return evmToBtcConfig.routes.some(\n route =>\n route.sourceChains.includes(sourceChain) && route.envs.includes(env),\n );\n}\n\n/**\n * Check if unstake to BTC.b is supported\n */\nexport function isBtcbUnstakeSupported(sourceChain: Chain, env: Env): boolean {\n return evmToBtcbConfig.routes.some(\n route =>\n route.sourceChains.includes(sourceChain) && route.envs.includes(env),\n );\n}\n","/**\n * EVM Unstake Action\n *\n * Burns LBTC on EVM chains and releases BTC (cross-chain) or BTC.b (same-chain).\n *\n * ## Fee Authorization\n *\n * Fee authorization is required when:\n * - Output asset is BTC.b (LBTC → BTC.b conversion)\n * - Source chain is Ethereum/Sepolia (unsubsidized chains)\n *\n * **Flow with fee auth (LBTC → BTC.b on Ethereum/Sepolia):**\n * IDLE → NEEDS_FEE_AUTHORIZATION → READY → COMPLETED\n *\n * **Flow without fee auth (LBTC → BTC, or BTC.b on Base/BSC):**\n * IDLE → READY → COMPLETED\n *\n * @module chains/evm/actions/unstake/EvmUnstake\n */\n\nimport type { EIP1193Provider } from 'viem';\nimport { z } from 'zod';\n\nimport type { ChainId } from '../../../../common/chains';\nimport { redeemToken } from '../../../../contract-functions';\nimport { AssetId, parseChainIdentifier, StepStatus } from '../../../../core';\nimport { BaseAction } from '../../../../shared/actions/BaseAction';\nimport { EvmOperationStatus } from '../../../../shared/constants/statusConstants';\nimport type { EvmCoreContext } from '../../../../shared/context';\nimport { LombardError } from '../../../../shared/errors';\nimport type { UnstakeEventMap } from '../../../../shared/events';\nimport {\n evmAmountSchema,\n validatePrepareParams,\n} from '../../../../shared/validation';\nimport { Token } from '../../../../tokens/token-addresses';\nimport {\n authorizeFee as authorizeFeeShared,\n checkFeeAuthorization,\n createInitialFeeAuthState,\n type FeeAuthState,\n} from '../../shared/feeAuth';\nimport { evmToBtcbConfig, evmToBtcConfig } from './config';\nimport type {\n EvmUnstakeParams,\n EvmUnstakePrepareParams,\n IEvmUnstake,\n} from './types';\n\nexport class EvmUnstake\n extends BaseAction<UnstakeEventMap, EvmOperationStatus>\n implements IEvmUnstake\n{\n private _amount?: string;\n private _recipient?: string;\n private _txHash?: string;\n private _feeAuth: FeeAuthState = createInitialFeeAuthState();\n\n constructor(\n private readonly ctx: EvmCoreContext,\n private readonly params: EvmUnstakeParams,\n ) {\n super(EvmOperationStatus.IDLE);\n }\n\n get amount(): string | undefined {\n return this._amount;\n }\n\n get recipient(): string | undefined {\n return this._recipient;\n }\n\n get txHash(): string | undefined {\n return this._txHash;\n }\n\n /** Fee authorization state (for UI display) */\n get feeAuth(): FeeAuthState {\n return this._feeAuth;\n }\n\n /** Whether output is BTC.b (requires fee auth on unsubsidized chains) */\n private get isBtcbOutput(): boolean {\n return this.params.assetOut === AssetId.BTCb;\n }\n\n async prepare(params: EvmUnstakePrepareParams): Promise<void> {\n this.assertStatus(EvmOperationStatus.IDLE, 'prepare');\n\n return this.act(async () => {\n const validated = validatePrepareParams(this.prepareSchema, params, {\n destChain: this.params.destChain,\n });\n this._amount = validated.amount;\n this._recipient = validated.recipient;\n\n const chainId = parseChainIdentifier(this.params.sourceChain) as ChainId;\n\n // Fee auth is only required for BTC.b output on unsubsidized chains\n if (this.isBtcbOutput) {\n // Get EVM account for fee auth check\n const provider = await this.ctx.getProvider('evm');\n if (!provider) {\n throw LombardError.providerMissing(this.params.sourceChain, 'evm');\n }\n const accounts = await (provider as EIP1193Provider).request({\n method: 'eth_accounts',\n });\n const account = accounts[0] as `0x${string}`;\n\n // Check fee authorization status (use Token.BTCb for LBTC → BTC.b)\n const feeAuthResult = await checkFeeAuthorization(\n chainId,\n account,\n this.ctx.env,\n Token.BTCb,\n );\n\n // Update fee auth state\n this._feeAuth = {\n requiresAuth: feeAuthResult.requiresAuth,\n isAuthorized: feeAuthResult.hasValidSignature,\n feeInSatoshis: feeAuthResult.feeInSatoshis,\n feeFormatted: feeAuthResult.feeFormatted,\n expirationDate: feeAuthResult.expirationDate,\n };\n\n // If fee auth required and not authorized, transition to NEEDS_FEE_AUTHORIZATION\n // Note: Status is set here (not via act's successStatus) because the\n // fee auth state is only known after the async check completes.\n if (feeAuthResult.requiresAuth && !feeAuthResult.hasValidSignature) {\n this.updateStatus(EvmOperationStatus.NEEDS_FEE_AUTHORIZATION);\n this.emitProgress({\n status: EvmOperationStatus.NEEDS_FEE_AUTHORIZATION,\n steps: { burning: StepStatus.IDLE, releasing: StepStatus.IDLE },\n });\n return;\n }\n }\n\n // No fee auth required or already authorized\n this.updateStatus(EvmOperationStatus.READY);\n this.emitProgress({\n status: EvmOperationStatus.READY,\n steps: { burning: StepStatus.IDLE, releasing: StepStatus.IDLE },\n });\n });\n }\n\n /**\n * Authorize the network fee\n *\n * Must be called when status is NEEDS_FEE_AUTHORIZATION.\n * Signs the fee authorization and stores it on the server.\n */\n async authorizeFee(): Promise<void> {\n this.assertStatus(EvmOperationStatus.NEEDS_FEE_AUTHORIZATION, 'authorizeFee');\n\n if (!this._feeAuth.feeInSatoshis) {\n throw LombardError.missingParameter('feeInSatoshis');\n }\n\n return this.act(async () => {\n const chainId = parseChainIdentifier(this.params.sourceChain) as ChainId;\n\n const provider = await this.ctx.getProvider('evm');\n if (!provider) {\n throw LombardError.providerMissing(this.params.sourceChain, 'evm');\n }\n\n const accounts = await (provider as EIP1193Provider).request({\n method: 'eth_accounts',\n });\n const account = accounts[0] as `0x${string}`;\n\n // Sign and store fee authorization (use Token.BTCb for LBTC → BTC.b)\n await authorizeFeeShared({\n chainId,\n account,\n feeInSatoshis: this._feeAuth.feeInSatoshis!,\n provider: provider as EIP1193Provider,\n env: this.ctx.env,\n token: Token.BTCb,\n });\n\n // Update state\n this._feeAuth.isAuthorized = true;\n\n this.emitProgress({\n status: EvmOperationStatus.READY,\n steps: { burning: StepStatus.IDLE, releasing: StepStatus.IDLE },\n });\n }, EvmOperationStatus.READY);\n }\n\n async execute(): Promise<{ txHash: string }> {\n this.assertStatus(EvmOperationStatus.READY, 'execute');\n\n return this.act(async () => {\n const provider = await this.ctx.getProvider('evm');\n if (!provider) {\n throw LombardError.providerMissing(this.params.sourceChain, 'evm');\n }\n\n // Get the connected EVM account address from the provider\n const accounts = await (provider as EIP1193Provider).request({\n method: 'eth_accounts',\n });\n const evmAccount = accounts[0] as `0x${string}`;\n if (!evmAccount) {\n throw LombardError.providerMissing(this.params.sourceChain, 'evm');\n }\n\n const chainId = parseChainIdentifier(this.params.sourceChain) as ChainId;\n const isBtcbOutput = this.params.assetOut === AssetId.BTCb;\n\n this.emitProgress({\n status: EvmOperationStatus.READY,\n steps: { burning: StepStatus.PENDING, releasing: StepStatus.IDLE },\n });\n\n // For BTC output: account = EVM wallet (executing burn), btcAddress = recipient (Bitcoin)\n // For BTCb output: account = recipient (same EVM address receives BTCb)\n const txHash = await redeemToken({\n provider: provider as EIP1193Provider,\n account: isBtcbOutput ? (this._recipient! as `0x${string}`) : evmAccount,\n amount: this._amount!,\n btcAddress: isBtcbOutput ? undefined : this._recipient!,\n chainId,\n env: this.ctx.env,\n tokenIn: Token.LBTC,\n tokenOut: isBtcbOutput ? Token.BTCb : undefined,\n });\n\n this._txHash = txHash;\n\n this.emitProgress({\n status: EvmOperationStatus.COMPLETED,\n steps: {\n burning: StepStatus.COMPLETE,\n releasing: isBtcbOutput ? StepStatus.COMPLETE : StepStatus.PENDING,\n },\n });\n\n this.emitCompleted();\n\n return { txHash };\n }, EvmOperationStatus.COMPLETED);\n }\n\n private get prepareSchema() {\n const config =\n this.params.assetOut === AssetId.BTC ? evmToBtcConfig : evmToBtcbConfig;\n return z.object({\n amount: evmAmountSchema,\n recipient: config.recipientSchema,\n });\n }\n}\n","/**\n * EVM Unstake Factory Functions\n *\n * @module chains/evm/actions/unstake/factory\n */\n\nimport type { LombardConfig } from '../../../../config/types';\nimport type { EvmCoreContext } from '../../../../shared/context';\nimport { createEvmCoreContext } from '../../../../shared/context';\nimport { EvmUnstake } from './EvmUnstake';\nimport type { EvmUnstakeParams } from './types';\n\n/**\n * Create EvmUnstake action from config\n *\n * @internal This factory is for internal use. Use createLombardSDK() instead:\n *\n * @example\n * ```typescript\n * const sdk = await createLombardSDK({ env: Env.prod, providers: { evm: () => window.ethereum } });\n * const unstake = sdk.chain.evm.unstake({\n * sourceChain: Chain.ETHEREUM,\n * assetOut: AssetId.BTC,\n * });\n * await unstake.prepare({ amount: '0.1', recipient: 'bc1q...' });\n * ```\n */\nexport function evmUnstake(\n config: LombardConfig,\n params: EvmUnstakeParams,\n): EvmUnstake {\n const ctx = createEvmCoreContext(config);\n return new EvmUnstake(ctx, params);\n}\n\n/**\n * Create EvmUnstake action from context\n */\nexport function createEvmUnstake(\n ctx: EvmCoreContext,\n params: EvmUnstakeParams,\n): EvmUnstake {\n return new EvmUnstake(ctx, params);\n}\n","/**\n * EVM Chain Configuration for Withdraw\n *\n * Handles withdrawing vault shares from DeFi protocols.\n *\n * @module chains/evm/actions/withdraw/config/evm\n */\n\nimport { Env } from '@lombard.finance/sdk-common';\n\nimport { Chain, DeployProtocol } from '../../../../../core';\nimport { evmAddressSchema } from '../../../../../shared/validation';\nimport type { WithdrawChainConfig } from './types';\n\n/**\n * EVM withdraw configuration\n *\n * Withdraw support mirrors deploy support:\n * - Veda: Ethereum, Base, BSC, Corn (prod only)\n */\nexport const evmWithdrawConfig: WithdrawChainConfig = {\n chainType: 'evm',\n\n routes: [\n // Veda - Ethereum, Base, BSC, Corn\n {\n sourceChains: [Chain.ETHEREUM, Chain.BASE, Chain.BSC, Chain.CORN],\n protocols: [DeployProtocol.Veda],\n envs: [Env.prod],\n },\n ],\n\n addressSchema: evmAddressSchema,\n};\n\n/**\n * Check if a withdraw route is supported\n */\nexport function isWithdrawSupported(\n chain: Chain,\n protocol: DeployProtocol,\n env: Env,\n): boolean {\n return evmWithdrawConfig.routes.some(\n route =>\n route.sourceChains.includes(chain) &&\n route.protocols.includes(protocol) &&\n route.envs.includes(env),\n );\n}\n","/**\n * EVM Cancel Withdraw Action\n *\n * Cancels a pending vault withdrawal from DeFi protocols (Veda).\n *\n * @module chains/evm/actions/withdraw/EvmCancelWithdraw\n */\n\nimport type { EIP1193Provider } from 'viem';\n\nimport type { ChainId } from '../../../../common/chains';\nimport type { DeployProtocol } from '../../../../core';\nimport { parseChainIdentifier, StepStatus } from '../../../../core';\nimport { BaseAction } from '../../../../shared/actions/BaseAction';\nimport { EvmOperationStatus } from '../../../../shared/constants/statusConstants';\nimport type { EvmCoreContext } from '../../../../shared/context';\nimport { LombardError, WithdrawErrorCode } from '../../../../shared/errors';\nimport type { WithdrawEventMap } from '../../../../shared/events';\nimport { isVedaVaultChain, Vault } from '../../../../vaults/lib/config';\nimport { cancelWithdraw } from '../../../../vaults/lib/ops/withdraw';\nimport { evmWithdrawConfig } from './config';\nimport type {\n EvmCancelWithdrawParams,\n IEvmCancelWithdraw,\n} from './types';\n\nexport class EvmCancelWithdraw\n extends BaseAction<WithdrawEventMap, EvmOperationStatus>\n implements IEvmCancelWithdraw\n{\n private _txHash?: string;\n private _account?: `0x${string}`;\n private _chainId?: ChainId;\n\n constructor(\n private readonly ctx: EvmCoreContext,\n private readonly params: EvmCancelWithdrawParams,\n ) {\n super(EvmOperationStatus.IDLE);\n }\n\n get txHash(): string | undefined {\n return this._txHash;\n }\n\n async prepare(): Promise<void> {\n this.assertStatus(EvmOperationStatus.IDLE, 'prepare');\n\n return this.act(async () => {\n this.validateProtocol(this.params.protocol);\n\n // Get provider and account\n const provider = await this.ctx.getProvider('evm');\n if (!provider) {\n throw LombardError.providerMissing(this.params.chain, 'evm');\n }\n\n const accounts = await (provider as EIP1193Provider).request({\n method: 'eth_accounts',\n });\n const account = (accounts as string[])[0] as `0x${string}`;\n if (!account) {\n throw LombardError.providerMissing(this.params.chain, 'evm');\n }\n\n this._account = account;\n this._chainId = parseChainIdentifier(this.params.chain) as ChainId;\n\n // Validate chain supports Veda vault\n if (!isVedaVaultChain(this._chainId)) {\n throw new LombardError(\n WithdrawErrorCode.PROTOCOL_NOT_SUPPORTED,\n `Chain ${this.params.chain} does not support Veda vault withdrawals`,\n { chain: this.params.chain, protocol: this.params.protocol },\n );\n }\n\n this.emitProgress({\n status: EvmOperationStatus.READY,\n steps: { cancelling: StepStatus.PENDING },\n });\n this.updateStatus(EvmOperationStatus.READY);\n });\n }\n\n async execute(): Promise<{ txHash: string }> {\n this.assertStatus(EvmOperationStatus.READY, 'execute');\n\n return this.act(async () => {\n const provider = await this.ctx.getProvider('evm');\n if (!provider) {\n throw LombardError.providerMissing(this.params.chain, 'evm');\n }\n\n if (!this._account || !this._chainId) {\n throw LombardError.missingParameter('account or chainId');\n }\n\n this.emitProgress({\n status: EvmOperationStatus.READY,\n steps: { cancelling: StepStatus.PENDING },\n });\n\n // Execute vault cancel withdraw\n const txHash = await cancelWithdraw({\n vaultKey: Vault.Veda,\n account: this._account,\n chainId: this._chainId,\n provider: provider as EIP1193Provider,\n env: this.ctx.env,\n });\n\n this._txHash = txHash;\n\n this.emitProgress({\n status: EvmOperationStatus.COMPLETED,\n steps: { cancelling: StepStatus.COMPLETE },\n });\n\n this.emitCompleted();\n\n return { txHash };\n }, EvmOperationStatus.COMPLETED);\n }\n\n private validateProtocol(protocol: DeployProtocol): void {\n const isSupported = evmWithdrawConfig.routes.some(\n route =>\n route.protocols.includes(protocol) && route.envs.includes(this.ctx.env),\n );\n if (!isSupported) {\n throw LombardError.invalidParameter(\n 'protocol',\n `Protocol ${protocol} is not supported for withdrawals in ${this.ctx.env} environment`,\n );\n }\n }\n}\n","/**\n * EVM Withdraw Action\n *\n * Queues withdrawal of vault shares from DeFi protocols (Veda).\n *\n * Protocol availability:\n * - Veda: Ethereum, Base, BSC, Corn (prod only)\n *\n * @module chains/evm/actions/withdraw/EvmWithdraw\n */\n\nimport BigNumber from 'bignumber.js';\nimport type { EIP1193Provider } from 'viem';\nimport { z } from 'zod';\n\nimport { makePublicClient } from '../../../../clients/public-client';\nimport { makeWalletClient } from '../../../../clients/wallet-client';\nimport { CHAIN_ID_TO_VIEM_CHAIN_MAP, type ChainId } from '../../../../common/chains';\nimport type { DeployProtocol } from '../../../../core';\nimport { parseChainIdentifier, StepStatus } from '../../../../core';\nimport { BaseAction } from '../../../../shared/actions/BaseAction';\nimport { EvmOperationStatus } from '../../../../shared/constants/statusConstants';\nimport type { EvmCoreContext } from '../../../../shared/context';\nimport { LombardError, WithdrawErrorCode } from '../../../../shared/errors';\nimport type { WithdrawEventMap } from '../../../../shared/events';\nimport {\n evmAmountSchema,\n validatePrepareParams,\n} from '../../../../shared/validation';\nimport { fromBaseDenomination, toBaseDenomination } from '../../../../tokens/tokens';\nimport toBigInt from '../../../../utils/numbers';\nimport { waitForTransactionReceipt } from '../../../../utils/transaction-executor';\nimport { isVedaVaultChain, Vault, VAULTS, type VedaVaultChain } from '../../../../vaults/lib/config';\nimport { queueWithdraw } from '../../../../vaults/lib/ops/withdraw';\nimport { evmWithdrawConfig } from './config';\nimport type {\n EvmWithdrawParams,\n EvmWithdrawPrepareParams,\n IEvmWithdraw,\n} from './types';\n\nexport class EvmWithdraw\n extends BaseAction<WithdrawEventMap, EvmOperationStatus>\n implements IEvmWithdraw\n{\n private _amount?: string;\n private _protocol?: DeployProtocol;\n private _needsApproval = false;\n private _txHash?: string;\n private _account?: `0x${string}`;\n private _chainId?: ChainId;\n\n constructor(\n private readonly ctx: EvmCoreContext,\n private readonly params: EvmWithdrawParams,\n ) {\n super(EvmOperationStatus.IDLE);\n }\n\n get amount(): string | undefined {\n return this._amount;\n }\n\n get protocol(): DeployProtocol | undefined {\n return this._protocol;\n }\n\n get needsApproval(): boolean {\n return this._needsApproval;\n }\n\n get txHash(): string | undefined {\n return this._txHash;\n }\n\n async prepare(params: EvmWithdrawPrepareParams): Promise<void> {\n this.assertStatus(EvmOperationStatus.IDLE, 'prepare');\n\n return this.act(async () => {\n const validated = validatePrepareParams(this.prepareSchema, params);\n this._amount = validated.amount;\n this._protocol = this.params.protocol;\n\n this.validateProtocol(this.params.protocol);\n\n // Get provider and account\n const provider = await this.ctx.getProvider('evm');\n if (!provider) {\n throw LombardError.providerMissing(this.params.sourceChain, 'evm');\n }\n\n const accounts = await (provider as EIP1193Provider).request({\n method: 'eth_accounts',\n });\n const account = (accounts as string[])[0] as `0x${string}`;\n if (!account) {\n throw LombardError.providerMissing(this.params.sourceChain, 'evm');\n }\n\n this._account = account;\n this._chainId = parseChainIdentifier(this.params.sourceChain) as ChainId;\n\n // Validate chain supports Veda vault\n if (!isVedaVaultChain(this._chainId)) {\n throw new LombardError(\n WithdrawErrorCode.PROTOCOL_NOT_SUPPORTED,\n `Chain ${this.params.sourceChain} does not support Veda vault withdrawals`,\n { chain: this.params.sourceChain, protocol: this._protocol },\n );\n }\n\n const vault = VAULTS[Vault.Veda];\n const publicClient = makePublicClient({ chainId: this._chainId });\n\n // Check vault balance\n const balanceRaw = await publicClient.readContract({\n address: vault.lensContract.address,\n abi: vault.lensContract.abi,\n functionName: 'balanceOf',\n args: [account, vault.vaultContract.address],\n });\n const balance = fromBaseDenomination(String(balanceRaw), vault.decimals);\n\n const amount = new BigNumber(validated.amount);\n if (amount.isGreaterThan(balance)) {\n throw new LombardError(\n WithdrawErrorCode.INSUFFICIENT_SHARES,\n `Insufficient vault shares. Requested: ${amount.toFixed()}, Available: ${balance.toFixed()}`,\n { requested: amount.toFixed(), available: balance.toFixed() },\n );\n }\n\n // Check allowance for withdraw queue contract\n const allowanceRaw = await publicClient.readContract({\n address: vault.vaultContract.address,\n abi: vault.vaultContract.abi,\n functionName: 'allowance',\n args: [account, vault.withdrawQueueContracts[this._chainId].address],\n });\n const allowance = fromBaseDenomination(String(allowanceRaw), vault.decimals);\n\n // Check if approval is needed\n this._needsApproval = amount.isGreaterThan(allowance);\n\n if (this._needsApproval) {\n this.emitProgress({\n status: EvmOperationStatus.NEEDS_APPROVAL,\n steps: { approval: StepStatus.PENDING, queueing: StepStatus.IDLE },\n });\n this.updateStatus(EvmOperationStatus.NEEDS_APPROVAL);\n } else {\n this.emitProgress({\n status: EvmOperationStatus.READY,\n steps: { approval: StepStatus.COMPLETE, queueing: StepStatus.PENDING },\n });\n this.updateStatus(EvmOperationStatus.READY);\n }\n });\n }\n\n async approve(): Promise<void> {\n this.assertStatus(EvmOperationStatus.NEEDS_APPROVAL, 'approve');\n\n return this.act(async () => {\n if (!this._account || !this._chainId || !this._amount) {\n throw LombardError.missingParameter('account, chainId, or amount');\n }\n\n const provider = await this.ctx.getProvider('evm');\n if (!provider) {\n throw LombardError.providerMissing(this.params.sourceChain, 'evm');\n }\n\n const vault = VAULTS[Vault.Veda];\n const amount = new BigNumber(this._amount);\n const amountBase = toBigInt(toBaseDenomination(amount, vault.decimals));\n\n const publicClient = makePublicClient({ chainId: this._chainId });\n const walletClient = makeWalletClient({\n provider: provider as EIP1193Provider,\n chainId: this._chainId,\n });\n\n // Chain is validated as VedaVaultChain in prepare()\n const vedaChainId = this._chainId as VedaVaultChain;\n\n const { request } = await publicClient.simulateContract({\n account: this._account,\n chain: CHAIN_ID_TO_VIEM_CHAIN_MAP[this._chainId],\n address: vault.vaultContract.address,\n abi: vault.vaultContract.abi,\n functionName: 'approve',\n args: [vault.withdrawQueueContracts[vedaChainId].address, amountBase],\n });\n\n const txHash = await walletClient.writeContract(request);\n await waitForTransactionReceipt(publicClient, txHash, 'vault share approval');\n\n this._needsApproval = false;\n this.emitProgress({\n status: EvmOperationStatus.READY,\n steps: { approval: StepStatus.COMPLETE, queueing: StepStatus.PENDING },\n });\n }, EvmOperationStatus.READY);\n }\n\n async execute(): Promise<{ txHash: string }> {\n this.assertStatus(EvmOperationStatus.READY, 'execute');\n\n return this.act(async () => {\n const provider = await this.ctx.getProvider('evm');\n if (!provider) {\n throw LombardError.providerMissing(this.params.sourceChain, 'evm');\n }\n\n if (!this._account || !this._chainId || !this._amount) {\n throw LombardError.missingParameter('account, chainId, or amount');\n }\n\n this.emitProgress({\n status: EvmOperationStatus.READY,\n steps: { approval: StepStatus.COMPLETE, queueing: StepStatus.PENDING },\n });\n\n // Execute vault queue withdraw (approval already done)\n const txHash = await queueWithdraw({\n amount: this._amount,\n approve: false,\n vaultKey: Vault.Veda,\n account: this._account,\n chainId: this._chainId,\n provider: provider as EIP1193Provider,\n env: this.ctx.env,\n });\n\n this._txHash = txHash;\n\n this.emitProgress({\n status: EvmOperationStatus.COMPLETED,\n steps: { approval: StepStatus.COMPLETE, queueing: StepStatus.COMPLETE },\n });\n\n this.emitCompleted();\n\n return { txHash };\n }, EvmOperationStatus.COMPLETED);\n }\n\n private get prepareSchema() {\n return z.object({\n amount: evmAmountSchema,\n });\n }\n\n private validateProtocol(protocol: DeployProtocol): void {\n const isSupported = evmWithdrawConfig.routes.some(\n route =>\n route.protocols.includes(protocol) && route.envs.includes(this.ctx.env),\n );\n if (!isSupported) {\n throw LombardError.invalidParameter(\n 'protocol',\n `Protocol ${protocol} is not supported for withdrawals in ${this.ctx.env} environment`,\n );\n }\n }\n}\n","/**\n * EVM Withdraw Factory Functions\n *\n * @module chains/evm/actions/withdraw/factory\n */\n\nimport type { LombardConfig } from '../../../../config/types';\nimport type { EvmCoreContext } from '../../../../shared/context';\nimport { createEvmCoreContext } from '../../../../shared/context';\nimport { EvmCancelWithdraw } from './EvmCancelWithdraw';\nimport { EvmWithdraw } from './EvmWithdraw';\nimport type { EvmCancelWithdrawParams, EvmWithdrawParams } from './types';\n\n/**\n * Create EvmWithdraw action from config\n *\n * @internal This factory is for internal use. Use createLombardSDK() instead:\n *\n * @example\n * ```typescript\n * const sdk = await createLombardSDK({ env: Env.prod, providers: { evm: () => window.ethereum } });\n * const withdraw = sdk.chain.evm.withdraw({\n * sourceChain: Chain.ETHEREUM,\n * protocol: DeployProtocol.Veda,\n * recipient: '0x...',\n * });\n * await withdraw.prepare({ amount: '0.1' });\n * if (withdraw.needsApproval) await withdraw.approve();\n * await withdraw.execute();\n * ```\n */\nexport function evmWithdraw(\n config: LombardConfig,\n params: EvmWithdrawParams,\n): EvmWithdraw {\n const ctx = createEvmCoreContext(config);\n return new EvmWithdraw(ctx, params);\n}\n\n/**\n * Create EvmWithdraw action from context\n */\nexport function createEvmWithdraw(\n ctx: EvmCoreContext,\n params: EvmWithdrawParams,\n): EvmWithdraw {\n return new EvmWithdraw(ctx, params);\n}\n\n/**\n * Create EvmCancelWithdraw action from config\n *\n * @example\n * ```typescript\n * const sdk = await createLombardSDK({ env: Env.prod, providers: { evm: () => window.ethereum } });\n * const cancelWithdraw = sdk.chain.evm.cancelWithdraw({\n * chain: Chain.ETHEREUM,\n * protocol: DeployProtocol.Veda,\n * });\n * await cancelWithdraw.prepare();\n * await cancelWithdraw.execute();\n * ```\n */\nexport function evmCancelWithdraw(\n config: LombardConfig,\n params: EvmCancelWithdrawParams,\n): EvmCancelWithdraw {\n const ctx = createEvmCoreContext(config);\n return new EvmCancelWithdraw(ctx, params);\n}\n\n/**\n * Create EvmCancelWithdraw action from context\n */\nexport function createEvmCancelWithdraw(\n ctx: EvmCoreContext,\n params: EvmCancelWithdrawParams,\n): EvmCancelWithdraw {\n return new EvmCancelWithdraw(ctx, params);\n}\n","/**\n * EVM Actions\n *\n * Provides factory methods for EVM chain operations.\n *\n * Operations:\n * - stake: BTC.b → LBTC (stake wrapped BTC to get LBTC)\n * - unstake: LBTC → BTC (cross-chain) or LBTC → BTC.b (same-chain)\n * - deposit: BTCb → LBTC (deposit BTC.b to receive LBTC)\n * - deploy: LBTC/BTC.b → DeFi protocols (Veda, Silo)\n * - withdraw: Queue withdrawal from DeFi protocols\n * - cancelWithdraw: Cancel pending withdrawal from DeFi protocols\n * - redeem: LBTC → BTC.b (same-chain unwrap)\n *\n * @example\n * ```typescript\n * import { createLombardSDK, Chain, Env } from '@lombard.finance/sdk';\n *\n * const sdk = await createLombardSDK({\n * env: Env.prod,\n * providers: { evm: () => window.ethereum },\n * });\n *\n * const unstake = sdk.chain.evm.unstake({\n * sourceChain: Chain.ETHEREUM,\n * assetOut: AssetId.BTC,\n * });\n *\n * await unstake.prepare({ amount: '0.1', recipient: 'bc1q...' });\n * const { txHash } = await unstake.execute();\n * ```\n *\n * @module chains/evm/EvmActions\n */\n\nimport type { LombardConfig } from '../../config/types';\nimport type { EvmCoreContext } from '../../shared/context';\nimport { createEvmCoreContext } from '../../shared/context';\nimport {\n createEvmDeploy,\n type EvmDeployParams,\n type IEvmDeploy,\n} from './actions/deploy';\nimport {\n createEvmDeposit,\n type EvmDepositParams,\n type IEvmDeposit,\n} from './actions/deposit';\nimport {\n createEvmRedeem,\n type EvmRedeemParams,\n type IEvmRedeem,\n} from './actions/redeem';\n// Import action factories\nimport {\n createEvmStake,\n type EvmStakeParams,\n type IEvmStake,\n} from './actions/stake';\nimport {\n createEvmUnstake,\n type EvmUnstakeParams,\n type IEvmUnstake,\n} from './actions/unstake';\nimport {\n createEvmCancelWithdraw,\n createEvmWithdraw,\n type EvmCancelWithdrawParams,\n type EvmWithdrawParams,\n type IEvmCancelWithdraw,\n type IEvmWithdraw,\n} from './actions/withdraw';\n\n/**\n * EVM Actions\n *\n * User-facing class for EVM operations.\n * Created via evmActions(config) factory function.\n */\nexport class EvmActions {\n private readonly ctx: EvmCoreContext;\n\n constructor(config: LombardConfig) {\n this.ctx = createEvmCoreContext(config);\n }\n\n /**\n * Stake BTC.b to receive LBTC\n *\n * Converts wrapped BTC (BTC.b) to LBTC via the Asset Router.\n * Currently supported on Avalanche.\n *\n * @example\n * ```typescript\n * const stake = evm.stake({\n * assetIn: AssetId.BTCb,\n * assetOut: AssetId.LBTC,\n * sourceChain: Chain.AVALANCHE,\n * destChain: Chain.AVALANCHE,\n * });\n * ```\n */\n stake(params: EvmStakeParams): IEvmStake {\n return createEvmStake(this.ctx, params);\n }\n\n /**\n * Unstake LBTC to BTC or BTC.b\n *\n * - LBTC → BTC: Cross-chain to Bitcoin mainnet/signet\n * - LBTC → BTC.b: Same-chain wrapped BTC on EVM\n *\n * @example\n * ```typescript\n * const unstake = evm.unstake({\n * assetIn: AssetId.LBTC,\n * assetOut: AssetId.BTC,\n * sourceChain: Chain.ETHEREUM,\n * destChain: Chain.BITCOIN_MAINNET,\n * });\n * ```\n */\n unstake(params: EvmUnstakeParams): IEvmUnstake {\n return createEvmUnstake(this.ctx, params);\n }\n\n /**\n * Deposit BTCb to get LBTC\n *\n * Deposits BTC.b to receive LBTC via the claim flow.\n *\n * @example\n * ```typescript\n * const deposit = evm.deposit({\n * assetIn: AssetId.BTCb,\n * assetOut: AssetId.LBTC,\n * sourceChain: Chain.ETHEREUM,\n * destChain: Chain.ETHEREUM,\n * });\n * ```\n */\n deposit(params: EvmDepositParams): IEvmDeposit {\n return createEvmDeposit(this.ctx, params);\n }\n\n /**\n * Deploy L-Assets to DeFi protocols\n *\n * Currently supports Veda and Silo protocols.\n *\n * @example\n * ```typescript\n * const deploy = evm.deploy({\n * asset: AssetId.LBTC,\n * sourceChain: Chain.ETHEREUM,\n * protocol: DeployProtocol.Veda,\n * recipient: '0x...',\n * });\n * ```\n */\n deploy(params: EvmDeployParams): IEvmDeploy {\n return createEvmDeploy(this.ctx, params);\n }\n\n /**\n * Withdraw vault shares from DeFi protocols\n *\n * Queues a withdrawal request from DeFi protocols (e.g., Veda vault).\n * After the withdrawal is queued, it will be processed within the\n * protocol's withdrawal window.\n *\n * @example\n * ```typescript\n * const withdraw = evm.withdraw({\n * protocol: DeployProtocol.Veda,\n * sourceChain: Chain.ETHEREUM,\n * recipient: '0x...',\n * });\n * await withdraw.prepare({ amount: '0.1' });\n * if (withdraw.needsApproval) await withdraw.approve();\n * await withdraw.execute();\n * ```\n */\n withdraw(params: EvmWithdrawParams): IEvmWithdraw {\n return createEvmWithdraw(this.ctx, params);\n }\n\n /**\n * Cancel a pending withdrawal from DeFi protocols\n *\n * Cancels a previously queued withdrawal request.\n *\n * @example\n * ```typescript\n * const cancelWithdraw = evm.cancelWithdraw({\n * protocol: DeployProtocol.Veda,\n * chain: Chain.ETHEREUM,\n * });\n * await cancelWithdraw.prepare();\n * await cancelWithdraw.execute();\n * ```\n */\n cancelWithdraw(params: EvmCancelWithdrawParams): IEvmCancelWithdraw {\n return createEvmCancelWithdraw(this.ctx, params);\n }\n\n /**\n * Redeem LBTC to BTC.b (same-chain unwrap)\n *\n * Converts LBTC to BTC.b on the same EVM chain.\n * For cross-chain BTC redemption, use unstake() with destChain set to Bitcoin.\n *\n * @example\n * ```typescript\n * const redeem = evm.redeem({\n * assetIn: AssetId.LBTC,\n * assetOut: AssetId.BTCb,\n * sourceChain: Chain.AVALANCHE,\n * });\n * ```\n */\n redeem(params: EvmRedeemParams): IEvmRedeem {\n return createEvmRedeem(this.ctx, params);\n }\n}\n\n/**\n * Create EVM actions from config\n *\n * Factory function that creates EvmActions for EVM operations.\n *\n * @param config - LombardConfig instance\n * @returns EvmActions instance\n */\nexport function evmActions(config: LombardConfig): EvmActions {\n return new EvmActions(config);\n}\n"],"names":["EvmService","env","chainId","token","getMintingFee","Token","params","result","signNetworkFee","BigNumber","protocol","getStakeAndBakeFee","signStakeAndBake","signLbtcDestinationAddr","evmModule","ctx","evmConfig","AssetId","Chain","DeployProtocol","Env","EvmDeploy","BaseAction","EvmOperationStatus","__publicField","validated","validatePrepareParams","provider","LombardError","account","parseChainIdentifier","vault","VAULTS","Vault","depositToken","getTokenInfo","allowanceRaw","makePublicClient","amount","amountBase","toBaseDenomination","allowance","StepStatus","toBigInt","publicClient","walletClient","makeWalletClient","request","CHAIN_ID_TO_VIEM_CHAIN_MAP","txHash","waitForTransactionReceipt","vaultKey","deposit","z.object","evmAmountSchema","z.string","route","createEvmDeploy","DEPOSIT_PROD_SOURCE_CHAINS","getEvmAssetChains","DEPOSIT_TESTNET_SOURCE_CHAINS","LBTC_PROD_CHAINS","LBTC_TESTNET_CHAINS","evmAddressSchema","EvmDepositStatus","EvmDeposit","data","proofSignature","claimLBTC","createEvmDeposit","BTCB_PROD_CHAINS","BTCB_TESTNET_CHAINS","bitcoinAddressSchema","checkFeeAuthorization","requiresAutoMintFee","tokenInfo","getTokenContractInfo","existingSignature","getNetworkFeeSignature","isExpired","hasValidSignature","feeInSatoshis","feeFormatted","feeInBtc","authorizeFee","signResult","storeNetworkFeeSignature","createInitialFeeAuthState","EvmRedeem","feeAuthResult","authorizeFeeShared","evmAccount","redeemToken","createEvmRedeem","APPROVAL_REQUIRED_CHAINS","ChainId","requiresApproval","EvmStake","adapterInfo","AddressKind","getTokenAllowance","requiredAmount","approveToken","createEvmStake","LBTC_BTCB_PROD_CHAINS","getEvmChainsWithAllAssets","LBTC_BTCB_TESTNET_CHAINS","evmToBtcConfig","evmToBtcbConfig","chain","EvmUnstake","isBtcbOutput","config","createEvmUnstake","evmWithdrawConfig","EvmCancelWithdraw","isVedaVaultChain","WithdrawErrorCode","cancelWithdraw","EvmWithdraw","balanceRaw","balance","fromBaseDenomination","vedaChainId","queueWithdraw","createEvmWithdraw","createEvmCancelWithdraw","EvmActions","createEvmCoreContext","evmActions"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use strict";const g=require("viem"),p=require("./blockchain-identifier-BTPGxLio.cjs"),n=require("./token-addresses-nzvTOi24.cjs"),k=require("./tokens-BkvA0Gp1.cjs"),T=require("axios"),m=require("./api-config-DkXqqfCK.cjs"),b=require("./satoshi-CZEsHl5X.cjs"),A=require("./index-BKzxeh1Y.cjs"),U=require("bignumber.js"),L=require("bitcoinjs-lib");function R(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const o in e)if(o!=="default"){const s=Object.getOwnPropertyDescriptor(e,o);Object.defineProperty(t,o,s.get?s:{enumerable:!0,get:()=>e[o]})}}return t.default=e,Object.freeze(t)}const S=R(L);async function I({address:e,chainId:t,env:o,limit:s,offset:c,partnerId:r}){var u;const{baseApiUrl:i}=m.getApiConfig(o),d=p.getChainNameById(t);d===p.BlockchainIdentifier.starknet&&(e=g.pad(e,{size:32}));const f={asc:!1,limit:s,offset:c,referralId:r||"lombard"};for(const[l,h]of Object.entries(f))h===void 0&&delete f[l];const a=`api/v1/address/destination/${d}/${e}`;try{const{data:l}=await T.get(a,{baseURL:i,params:f});return l.addresses||[]}catch(l){if(T.isAxiosError(l)){const h=(u=l.response)==null?void 0:u.data.message;throw new Error(h)}}}async function $({address:e,chainId:t,env:o,partnerId:s,token:c=n.Token.LBTC}){const r=await I({address:e,chainId:t,env:o,partnerId:s});let i;if(![n.Token.LBTC,n.Token.BTCK,n.Token.BTCb].includes(c))throw new Error("Unsupported token");let d;try{if(n.isValidChain(t)&&(d={token_address:(await k.getTokenContractInfo(c,t,o,n.AddressKind.Adapter)).address.toLowerCase()}),n.isSuiChain(t)){const a=n.getSuiTokenAddress(t,o);a&&(d={token_address:a.toLowerCase()})}if(n.isSolanaChain(t)){const a=c===n.Token.BTCb?n.Token.BTCb:n.Token.LBTC,u=n.getSolanaTokenAddress(t,o,a);u&&(d={token_address:u.toLowerCase()})}if(n.isStarknetChainId(t)){const a=n.getStarknetTokenAddress(t,o,"assetRouter");a&&(d={token_address:a.toLowerCase()})}}catch{}n.isStarknetChainId(t)&&(e=g.pad(e,{size:32}).toLowerCase());const f=(r||[]).filter(a=>a.deposit_metadata.to_blockchain.toLowerCase()===p.getChainNameById(t).toLowerCase()&&a.deposit_metadata.to_address.toLowerCase()===e.toLowerCase()).filter(a=>{var l;if(!d)return!1;let u=((l=a.deposit_metadata.token_address)==null?void 0:l.toLowerCase())===d.token_address;return d.aux_version!=null&&(u=u&&a.deposit_metadata.aux_version===d.aux_version),c===n.Token.LBTC&&(u=u||!a.deposit_metadata.token_address),n.isSolanaChain(t)&&!u&&!a.deposit_metadata.token_address&&(c===n.Token.BTCb||c===n.Token.BTCK?u=a.deposit_metadata.aux_version!=null:c===n.Token.LBTC&&(u=a.deposit_metadata.aux_version==null)),u});if(f&&f.length>0){const a=f.reduce((u,l)=>l.created_at>u.created_at?l:u,f[0]);a.deprecated||(i=a.btc_address)}if(!i)throw new Error(`No deposit address found for ${e} on chain ${t}`);return i}async function H(e){return await I(e)}async function N({endpoint:e,extractItems:t,query:o={},pageSize:s=1e3,maxRecords:c}){let r=[],i=0,d=!0;for(;d;){const f=new URL(e);f.searchParams.set("limit",s.toString()),f.searchParams.set("offset",i.toString());for(const[l,h]of Object.entries(o))h!==void 0&&f.searchParams.set(l,String(h));const{data:a}=await T.get(f.toString()),u=t(a);if(r=r.concat(u),i+=u.length,c&&r.length>=c){r=r.slice(0,c);break}d=u.length>0&&(a.has_more??!1)}return r}const y=b.BTC_DECIMALS;var w=(e=>(e.NOTARIZATION_STATUS_UNSPECIFIED="NOTARIZATION_STATUS_UNSPECIFIED",e.NOTARIZATION_STATUS_PENDING="NOTARIZATION_STATUS_PENDING",e.NOTARIZATION_STATUS_SUBMITTED="NOTARIZATION_STATUS_SUBMITTED",e.NOTARIZATION_STATUS_SESSION_APPROVED="NOTARIZATION_STATUS_SESSION_APPROVED",e.NOTARIZATION_STATUS_FAILED="NOTARIZATION_STATUS_FAILED",e.NOTARIZATION_STATUS_GMP_HANDLED="NOTARIZATION_STATUS_GMP_HANDLED",e))(w||{}),E=(e=>(e.SESSION_STATE_UNSPECIFIED="SESSION_STATE_UNSPECIFIED",e.SESSION_STATE_PENDING="SESSION_STATE_PENDING",e.SESSION_STATE_COMPLETED="SESSION_STATE_COMPLETED",e.SESSION_STATE_EXPIRED="SESSION_STATE_EXPIRED",e))(E||{});async function B({address:e,env:t}){const{baseApiUrl:o}=m.getApiConfig(t);e.startsWith("0x")&&e.slice(2).length===63&&(e=`0x0${e.slice(2)}`);const s=new URL(`/api/v1/address/outputs-v2/${e}`,o);return(await N({endpoint:s,extractItems:r=>(r==null?void 0:r.outputs)??[]})).map(r=>M(r,t,e))}async function P({address:e,env:t}){const{baseApiUrl:o}=m.getApiConfig(t),s=new URL(`/api/v1/address/native-deposits/${e}`,o);return(await N({endpoint:s,extractItems:r=>(r==null?void 0:r.deposits)??[]})).map(r=>q(r,t))}function M(e,t,o){return{isNative:!1,txHash:e.txid,eventIndex:e.index?Number(e.index):0,amount:b.fromSatoshi(e.value),tokenAmount:e.token_amount?k.fromBaseDenomination(e.token_amount,y):void 0,depositAddress:e.address,toAddress:o,toChainId:p.getChainIdByName(e.to_chain,t),blockHeight:e.block_height?Number(e.block_height):void 0,blockTime:e.block_time?Number(e.block_time):void 0,payloadHash:e.payload_hash,rawPayload:e.raw_payload,proof:e.proof,sessionId:e.session_id,notarizationStatus:e.notarization_status,sessionState:e.session_state,claimTxHash:e.claim_tx,isClaimed:!!e.claim_tx,sanctioned:e.sanctioned,toTokenAddress:e.token_address,toToken:n.getTokenByAddress(e.token_address,p.getChainIdByName(e.to_chain,t),t,n.AddressKind.Adapter),auxVersion:e.aux_version,notarizationWaitDur:e.notarization_wait_dur?Number(e.notarization_wait_dur):void 0}}function q(e,t){return{isNative:!0,txHash:e.tx_hash,eventIndex:e.event_index,amount:k.fromBaseDenomination(e.amount,y),tokenAmount:void 0,fromAddress:e.from_address,toAddress:e.to_address,toTokenAddress:e.to_token_address,toToken:n.getTokenByAddress(e.to_token_address,p.getChainIdByName(e.to_blockchain,t),t,n.AddressKind.Adapter),toChainId:p.getChainIdByName(e.to_blockchain,t),fromChainId:p.getChainIdByName(e.from_blockchain,t),blockHeight:e.block_height?Number(e.block_height):void 0,blockTime:e.block_time?Math.floor(new Date(e.block_time).getTime()/1e3):void 0,payloadHash:e.payload_hash,rawPayload:e.raw_payload,proof:e.proof,sessionId:e.session_id,notarizationStatus:e.notarization_status,sessionState:e.session_state,claimTxHash:e.claim_tx,isClaimed:!!e.claim_tx,sanctioned:e.sanctioned}}async function Z({address:e,env:t}){const o=await Promise.allSettled([B({address:e,env:t}),P({address:e,env:t})]);let s=[],c=[];return o.forEach((i,d)=>{i.status==="fulfilled"?d===0?s=i.value:c=i.value:console.error(d===0?"Failed to fetch direct BTC deposits:":"Failed to fetch native deposits:",i.reason)}),[...s,...c].sort((i,d)=>{const f=i.blockTime??0;return(d.blockTime??0)-f})}const F=2;function _(e,t=0){return U(Number(e)||t)}function x(e){return Object.entries(e||{}).reduce((t,[o,s])=>(t[o]=_(s).toNumber(),t),{})}function D(e,t,o=A.p){const{baseApiUrl:s}=m.getApiConfig(o);if(!s)throw new Error(`Could not determine the API endpoint for the provided environment: ${o||A.p}`);switch(e){case 1:return`${s}/api/v1/referral-system/season-1/points/${t}`;case 2:return`${s}/api/v1/referral-system/season-2/points/${t}`;default:throw new Error(`Invalid Lux season: ${e}`)}}async function z({address:e,env:t}){const{data:o}=await T.get(D(1,e,t)),s=_(o.referee_points).plus(_(o.referrals_points));return{holdingPoints:_(o.holding_points).toNumber(),protocolPoints:_(o.protocol_points).toNumber(),referralPoints:s.toNumber(),okxPoints:_(o.okx_campaign).toNumber(),flashEvent1Points:_(o.flash_event).toNumber(),flashEvent2Points:_(o.flash_event2).toNumber(),totalPoints:_(o.total).toNumber(),protocolPointsBreakdown:x(o.protocol_points_map),badgesPoints:_(o.badges).toNumber(),totalWithoutBadgesPoints:_(o.total_without_badges).toNumber()}}async function j({address:e,env:t}){const{data:o}=await T.get(D(2,e,t));return{holdingPoints:_(o.holding_points).toNumber(),protocolPoints:_(o.protocol_points).toNumber(),referralPoints:_(o.referrals_points).toNumber(),refereePoints:_(o.referee_points).toNumber(),badgesPoints:_(o.badge_points).toNumber(),checkinPoints:_(o.checkin_points).toNumber(),totalPoints:_(o.total).toNumber(),protocolPointsBreakdown:x(o.protocol_points_map),totalWithoutBadgesPoints:_(o.total).toNumber()}}async function C({address:e,env:t,season:o=F}){return o===2?j({address:e,env:t}):z({address:e,env:t})}const G=e=>C({...e,season:1}),K=e=>C({...e,season:2});var O=(e=>(e.Completed="Completed",e.Pending="Pending",e))(O||{});async function v({address:e,env:t=A.p,options:o}){if(!e)throw new Error("No address specified.");const{baseApiUrl:s}=m.getApiConfig(t);e.startsWith("0x")&&e.slice(2).length===63&&(e=`0x0${e.slice(2)}`);const c=new URL(`/api/v1/address/unstakes/${e}`,s);return(await N({endpoint:c,extractItems:i=>(i==null?void 0:i.unstakes)??[],query:{show_redeems:o!=null&&o.show_redeems?"true":void 0,show_unstakes:o!=null&&o.show_unstakes?"true":void 0,to_native:o!=null&&o.to_native?"true":void 0}})).map(i=>W(i,t))}function W(e,t=A.p){var f,a,u;const o=!!(e.to_chain&&e.to_address);let s=e.to_address;if(!o&&e.output_script)try{s=S.address.fromOutputScript(Buffer.from(e.output_script.replace(/^0x/,""),"hex"),t==="prod"?S.networks.bitcoin:S.networks.testnet)}catch{s=void 0}else s!=null&&s.startsWith("0x")&&(s=g.trim(s));const c=e.payout_txid?"Completed":"Pending",r=o?n.Token.BTCb:void 0,i=e.to_chain?e.to_chain===p.BlockchainIdentifier.bitcoin||e.to_chain===p.BlockchainIdentifier.bitcoinOld?"bitcoin":p.getChainIdByName(e.to_chain,t):void 0;let d;if(r){if(n.isValidChain(i)){let l=(u=(a=(f=n.TOKEN_ADDRESSES)==null?void 0:f[r])==null?void 0:a[t])==null?void 0:u[i];l&&(l=typeof l=="string"?l:l[n.AddressKind.Adapter]),d=l}n.isSolanaChain(i)&&(d=n.getSolanaTokenAddress(i,t)),n.isSuiChain(i)&&(d=n.getSuiTokenAddress(i,t)),n.isStarknetChainId(i)&&(d=n.getStarknetTokenAddress(i,t))}return{isNative:o,txHash:e.tx_hash,fromChainId:p.getChainIdByName(e.blockchain,t),toChainId:i,blockHeight:Number(e.block_height),blockTime:Number(e.block_time),fromAddress:e.from_address,toAddress:s,amount:b.fromSatoshi(e.amount),payoutTxHash:e.payout_txid,payoutTxIndex:e.payout_index?Number(e.payout_index):void 0,payoutTxStatus:c,sanctioned:e.sanctioned,proof:e.proof,rawPayload:e.payload,toToken:r,toTokenAddress:d,notarizationStatus:e.notarization_status,sessionState:e.session_state,claimTxHash:e.claim_tx,fromTokenAddress:e.from_token_address}}async function V({address:e,env:t=A.p,options:o}){return v({address:e,env:t,options:o})}const X="0x00";async function Y({signature:e,typedData:t,env:o}){const{baseApiUrl:s}=m.getApiConfig(o);try{const{data:c}=await T.post(`${s}/api/v1/claimer/save-stake-and-bake-signature`,null,{params:{typed_data:t,signature:e||X}});return c.status}catch(c){const r=k.getErrorMessage(c);throw new Error(r)}}async function J({address:e,env:t}){const{baseApiUrl:o}=m.getApiConfig(t),{data:s}=await T.get(`${o}/api/v1/address/exists/${e}`);return{hasDepositAddress:!!s.exists,referrer:s.referrer}}class Q{constructor(t){this.sdk=t}async lookupReferrer({address:t}){return J({address:t,env:this.sdk.config.env})}}exports.ENotarizationStatus=w;exports.ESessionState=E;exports.PayoutTxStatus=O;exports.ReferralsClient=Q;exports.fetchBTCbDeposits=P;exports.fetchDirectDeposits=B;exports.fetchUnstakesByAddress=v;exports.getDepositBtcAddress=$;exports.getDepositBtcAddresses=H;exports.getDepositsByAddress=Z;exports.getLuxSeason1Points=G;exports.getLuxSeason2Points=K;exports.getPointsByAddress=C;exports.getUnstakesByAddress=V;exports.storeStakeAndBakeSignature=Y;
2
+ //# sourceMappingURL=ReferralsClient-Cmrjo9bN.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReferralsClient-Cmrjo9bN.cjs","sources":["../../src/api-functions/getDepositBtcAddress/make-request.ts","../../src/api-functions/getDepositBtcAddress/getDepositBtcAddress.ts","../../src/utils/pagination.ts","../../src/api-functions/getDepositsByAddress/getDepositsByAddress.ts","../../src/api-functions/getPointsByAddress/getPointsByAddress.ts","../../src/api-functions/getUnstakesByAddress/getUnstakesByAddress.ts","../../src/api-functions/storeStakeAndBakeSignature/storeStakeAndBakeSignature.ts","../../src/api-functions/getDepositAddressReferrer/getDepositAddressReferrer.ts","../../src/referrals/ReferralsClient.ts"],"sourcesContent":["import axios from 'axios';\nimport { Address, pad } from 'viem';\n\nimport { getApiConfig } from '../../common/api-config';\nimport {\n BlockchainIdentifier,\n getChainNameById,\n} from '../../common/blockchain-identifier';\nimport {\n IApiError,\n IDepositAddressesResponse,\n IGetDepositBtcAddressesParameters,\n} from './types';\n\nexport async function makeRequest({\n address,\n chainId,\n env,\n limit,\n offset,\n partnerId,\n}: IGetDepositBtcAddressesParameters) {\n const { baseApiUrl } = getApiConfig(env);\n\n // throws an error if `chainId` is unknown\n const destinationBlockchain = getChainNameById(chainId);\n if (destinationBlockchain === BlockchainIdentifier.starknet) {\n address = pad(address as Address, { size: 32 });\n }\n\n const params = {\n asc: false,\n limit,\n offset,\n referralId: partnerId || 'lombard',\n };\n\n // remove undefined fields, undefined limit and offset params cause error\n for (const [k, v] of Object.entries(params)) {\n if (v === undefined) {\n delete params[k as keyof typeof params];\n }\n }\n\n const url = `api/v1/address/destination/${destinationBlockchain}/${address}`;\n try {\n const { data } = await axios.get<IDepositAddressesResponse>(url, {\n baseURL: baseApiUrl,\n params,\n });\n\n return data.addresses || [];\n } catch (err) {\n if (axios.isAxiosError<IApiError>(err)) {\n const message = err.response?.data.message;\n throw new Error(message);\n }\n }\n}\n","import { Address, pad } from 'viem';\n\nimport { getChainNameById } from '../../common/blockchain-identifier';\nimport {\n isSolanaChain,\n isStarknetChainId,\n isSuiChain,\n isValidChain,\n} from '../../common/chains';\nimport {\n AddressKind,\n getSolanaTokenAddress,\n getStarknetTokenAddress,\n getSuiTokenAddress,\n Token,\n} from '../../tokens/token-addresses';\nimport { getTokenContractInfo } from '../../tokens/tokens';\nimport { makeRequest } from './make-request';\nimport type {\n IGetDepositBtcAddressesParameters,\n IGetDepositBtcAddressParameters,\n} from './types';\n\n/**\n * Returns the current address for depositing BTC by given parameters.\n *\n * @throws {Error} - Throws an error if no address found or the provided chain id is not supported.\n */\nexport async function getDepositBtcAddress({\n address,\n chainId,\n env,\n partnerId,\n token: tokenParam = Token.LBTC,\n}: IGetDepositBtcAddressParameters) {\n const _addresses = await makeRequest({\n address,\n chainId,\n env,\n partnerId,\n });\n\n let depositAddress: string | undefined = undefined;\n\n if (![Token.LBTC, Token.BTCK, Token.BTCb].includes(tokenParam)) {\n throw new Error('Unsupported token');\n }\n\n // Filter deposit addresses by the destination token\n let tokenAddressFilter:\n | { token_address: string; aux_version?: number }\n | undefined = undefined;\n try {\n if (isValidChain(chainId)) {\n const tokenContractInfo = await getTokenContractInfo(\n tokenParam,\n chainId,\n env,\n AddressKind.Adapter,\n );\n tokenAddressFilter = {\n token_address: tokenContractInfo.address.toLowerCase(),\n };\n }\n\n if (isSuiChain(chainId)) {\n const tokenAddress = getSuiTokenAddress(chainId, env);\n if (tokenAddress) {\n tokenAddressFilter = {\n token_address: tokenAddress.toLowerCase(),\n };\n }\n }\n\n if (isSolanaChain(chainId)) {\n const solanaToken =\n tokenParam === Token.BTCb ? Token.BTCb : Token.LBTC;\n const tokenAddress = getSolanaTokenAddress(chainId, env, solanaToken);\n if (tokenAddress) {\n tokenAddressFilter = {\n token_address: tokenAddress.toLowerCase(),\n };\n }\n }\n\n if (isStarknetChainId(chainId)) {\n // api returns the address of the asset router contract\n const tokenAddress = getStarknetTokenAddress(chainId, env, 'assetRouter');\n if (tokenAddress) {\n tokenAddressFilter = {\n token_address: tokenAddress.toLowerCase(),\n };\n }\n }\n } catch {\n // NOOP\n }\n\n if (isStarknetChainId(chainId)) {\n address = pad(address as Address, { size: 32 }).toLowerCase();\n }\n\n const addresses = (_addresses || [])\n .filter(\n a =>\n // filter by chain id\n a.deposit_metadata.to_blockchain.toLowerCase() ===\n getChainNameById(chainId).toLowerCase() &&\n // filter by address\n a.deposit_metadata.to_address.toLowerCase() === address.toLowerCase(),\n )\n .filter(a => {\n if (!tokenAddressFilter) {\n return false;\n }\n\n // check if token addresses are matched\n let isForToken =\n a.deposit_metadata.token_address?.toLowerCase() ===\n tokenAddressFilter.token_address;\n // check if aux version is matched (if provided)\n if (tokenAddressFilter.aux_version != null) {\n isForToken =\n isForToken &&\n a.deposit_metadata.aux_version === tokenAddressFilter.aux_version;\n }\n\n // token_address can also be empty (null) when the address is for LBTC.\n // nosemgrep: codacy.tools-configs.rules_lgpl_javascript_crypto_rule-node-timing-attack -- comparing Token enum values, not secrets\n if (tokenParam === Token.LBTC) {\n isForToken = isForToken || !a.deposit_metadata.token_address;\n }\n\n // Solana backend may omit token_address and use aux_version instead.\n if (\n isSolanaChain(chainId) &&\n !isForToken &&\n !a.deposit_metadata.token_address\n ) {\n if (tokenParam === Token.BTCb || tokenParam === Token.BTCK) {\n isForToken = a.deposit_metadata.aux_version != null;\n } else if (tokenParam === Token.LBTC) {\n isForToken = a.deposit_metadata.aux_version == null;\n }\n }\n\n // Get only the addresses for the specified token.\n return isForToken;\n });\n\n if (addresses && addresses.length > 0) {\n const mostRecentAddress = addresses.reduce((mostRecent, cur) => {\n if (cur.created_at > mostRecent.created_at) {\n return cur;\n }\n return mostRecent;\n }, addresses[0]);\n\n if (!mostRecentAddress.deprecated) {\n depositAddress = mostRecentAddress.btc_address;\n }\n }\n\n if (!depositAddress) {\n throw new Error(\n `No deposit address found for ${address} on chain ${chainId}`,\n );\n }\n\n return depositAddress;\n}\n\n/**\n * Returns the addresses for depositing BTC by given parameters.\n * @throws {Error} - Throws an error if chain id is not supported.\n */\nexport async function getDepositBtcAddresses(\n parameters: IGetDepositBtcAddressesParameters,\n) {\n const addresses = await makeRequest(parameters);\n return addresses;\n}\n","import axios from 'axios';\n\n/* -------------------------------------------------------------------------- */\n/* Types */\n/* -------------------------------------------------------------------------- */\n\ntype FetchAllPaginatedParameters<T> = {\n /** The API endpoint. */\n endpoint: string | URL;\n /** Function to extract items array from API response. */\n extractItems: (data: unknown) => T[];\n /** The additional query parameters. */\n query?: Record<string, string | undefined>;\n /** The page size, default: 1000 */\n pageSize?: number;\n /** The maximum amount of expected records. */\n maxRecords?: number;\n};\n\n/* -------------------------------------------------------------------------- */\n/* Helpers */\n/* -------------------------------------------------------------------------- */\n\n/**\n * Generic helper to fetch all paginated items from an API endpoint.\n * Automatically handles `limit`, `offset` and the `has_more` flag.\n * If `has_more` is missing, pagination stops.\n *\n * @template T - Type of individual item\n * @param {FetchAllPaginatedParameters<T>} params - Parameters for fetching all items\n\n *\n * @returns {Promise<T[]>} - All items fetched across pages\n */\nexport async function fetchAllPaginated<T>({\n endpoint,\n extractItems,\n query = {},\n pageSize = 1_000,\n maxRecords,\n}: FetchAllPaginatedParameters<T>): Promise<T[]> {\n let allItems: T[] = [];\n let offset = 0;\n let hasMore = true;\n\n while (hasMore) {\n const url = new URL(endpoint);\n\n url.searchParams.set('limit', pageSize.toString());\n url.searchParams.set('offset', offset.toString());\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined) url.searchParams.set(key, String(value));\n }\n\n const { data } = await axios.get(url.toString());\n const items = extractItems(data);\n\n allItems = allItems.concat(items);\n offset += items.length;\n\n if (maxRecords && allItems.length >= maxRecords) {\n allItems = allItems.slice(0, maxRecords);\n break;\n }\n\n hasMore = items.length > 0 && (data.has_more ?? false);\n }\n\n return allItems;\n}\n","import { Env } from '@lombard.finance/sdk-common';\nimport BigNumber from 'bignumber.js';\n\nimport { getApiConfig } from '../../common/api-config';\nimport { getChainIdByName } from '../../common/blockchain-identifier';\nimport {\n ChainId,\n SolanaChain,\n StarknetChainId,\n SuiChain,\n} from '../../common/chains';\nimport { IEnvParam } from '../../common/parameters';\nimport {\n AddressKind,\n getTokenByAddress,\n Token,\n} from '../../tokens/token-addresses';\nimport { fromBaseDenomination } from '../../tokens/tokens';\nimport { fetchAllPaginated } from '../../utils/pagination';\nimport { BTC_DECIMALS, fromSatoshi } from '../../utils/satoshi';\n\n/** The default number of decimals for the deposit amount (value). */\nconst DECIMALS = BTC_DECIMALS;\n\n/* -------------------------------------------------------------------------- */\n/* Types */\n/* -------------------------------------------------------------------------- */\n\ntype Address = string;\n\n/**\n * Enum representing the notarization status of a deposit transaction.\n */\nexport enum ENotarizationStatus {\n /** Status is unspecified or unknown */\n NOTARIZATION_STATUS_UNSPECIFIED = 'NOTARIZATION_STATUS_UNSPECIFIED',\n\n /** Initial status when a deposit transaction is created but not yet processed */\n NOTARIZATION_STATUS_PENDING = 'NOTARIZATION_STATUS_PENDING',\n\n /** The deposit has been submitted for notarization */\n NOTARIZATION_STATUS_SUBMITTED = 'NOTARIZATION_STATUS_SUBMITTED',\n\n /** The notarization session was approved successfully */\n NOTARIZATION_STATUS_SESSION_APPROVED = 'NOTARIZATION_STATUS_SESSION_APPROVED',\n\n /** The notarization session failed */\n NOTARIZATION_STATUS_FAILED = 'NOTARIZATION_STATUS_FAILED',\n\n /** The notarization session was handled by GMP */\n NOTARIZATION_STATUS_GMP_HANDLED = 'NOTARIZATION_STATUS_GMP_HANDLED',\n}\n\n/**\n * Enum representing the state of a notarization session.\n */\nexport enum ESessionState {\n /** Session state is unspecified or unknown */\n SESSION_STATE_UNSPECIFIED = 'SESSION_STATE_UNSPECIFIED',\n\n /** Session is currently pending */\n SESSION_STATE_PENDING = 'SESSION_STATE_PENDING',\n\n /** Session has completed successfully */\n SESSION_STATE_COMPLETED = 'SESSION_STATE_COMPLETED',\n\n /** Session has expired without completion */\n SESSION_STATE_EXPIRED = 'SESSION_STATE_EXPIRED',\n}\n\nexport interface NativeDeposit {\n /** Transaction hash on the source blockchain */\n tx_hash: string;\n\n /** Event index inside the transaction (for multi-event transactions) */\n event_index: number;\n\n /** Source blockchain identifier (e.g., BLOCKCHAIN_KATANA) */\n from_blockchain: string;\n\n /** Destination blockchain identifier */\n to_blockchain: string;\n\n /** Sender address on the source chain */\n from_address: string;\n\n /** Receiver address on the destination chain */\n to_address: string;\n\n /** Destination token contract address (if applicable) */\n to_token_address: string;\n\n /** Block height of the source chain confirmation */\n block_height: string;\n\n /** Block time of the source chain confirmation (ISO 8601) */\n block_time: string;\n\n /** Amount deposited (string to preserve precision) */\n amount: string;\n\n /** Hash of the payload that proves the deposit details */\n payload_hash: string;\n\n /** Raw payload bytes (hex-encoded) */\n raw_payload: string;\n\n /** Cryptographic proof (hex-encoded) */\n proof: string;\n\n /** ID of the notarization session linked to this deposit */\n session_id: string;\n\n /** Current notarization status of this deposit */\n notarization_status: ENotarizationStatus;\n\n /** Current session state of this deposit */\n session_state: ESessionState;\n\n /** Claim transaction hash on the destination chain, if claimed */\n claim_tx?: string;\n\n /** True if the deposit is sanctioned */\n sanctioned?: boolean;\n}\n\n/** Top-level response from the Native Deposits API */\nexport interface NativeDepositsResponse {\n /** List of native deposit records */\n deposits: NativeDeposit[];\n\n /** True if there are more deposits available */\n has_more: boolean;\n}\n\nexport interface DirectDeposit {\n /** Transaction ID on the source chain */\n txid: string;\n\n /** Event index inside the transaction (useful for multi-event transactions) */\n index: string;\n\n /** Block height of the source chain confirmation */\n block_height: string;\n\n /** Amount deposited (string to preserve precision) */\n value: string;\n\n /** Destination address (EVM or BTC) */\n address: string;\n\n /** Hash of the payload proving the deposit */\n payload_hash: string;\n\n /** Raw payload bytes (hex-encoded) */\n raw_payload: string;\n\n /** Cryptographic proof (hex-encoded) */\n proof: string;\n\n /** Notarization session ID */\n session_id: string;\n\n /** Current notarization status */\n notarization_status: ENotarizationStatus;\n\n /** Current session state */\n session_state: ESessionState;\n\n /** Destination blockchain identifier */\n to_chain: string;\n\n /** Claim transaction hash on the destination chain, if claimed */\n claim_tx?: string;\n\n /** True if the deposit is sanctioned */\n sanctioned?: boolean;\n\n /** Block time of the source chain confirmation (timestamp as string) */\n block_time: string;\n\n /** Notarization wait duration (optional) */\n notarization_wait_dur?: string;\n\n /** Token address for the deposit */\n token_address?: string;\n\n /** Auxiliary version (if applicable) */\n aux_version?: number;\n\n /** Amount minted */\n token_amount?: string;\n}\n\n/** Top-level response from the Direct BTC Deposits API */\nexport interface DirectDepositsResponse {\n /** List of direct deposit records */\n outputs: DirectDeposit[];\n\n /** True if there are more deposits available */\n has_more: boolean;\n}\n\n/**\n * A unified deposit record returned from either\n * Direct BTC Deposits or Native Deposits APIs.\n */\nexport interface Deposit {\n /**\n * Whether this deposit originates from the Native Deposits API (EVM/alt-chain source).\n *\n * - `false` — Bitcoin mainnet direct deposit: the user sent BTC directly to a\n * Lombard deposit address. This is the most common case for BTC stakers.\n * - `true` — Native deposit: the deposit originated on an EVM or alt-chain\n * (e.g. a chain using Lombard's native deposits flow).\n *\n * When polling for standard BTC deposit status, filter on `isNative === false`.\n *\n * @remarks A rename to a more descriptive field (e.g. `depositSource`) is\n * planned in a future major version to avoid confusion with \"native BTC\".\n */\n isNative: boolean;\n\n /** Transaction hash on the source blockchain. */\n txHash: string;\n\n /** Event index inside the transaction (Direct BTC uses output index). */\n eventIndex: number;\n\n /** Amount deposited (always normalized to satoshis/smallest unit). */\n amount: BigNumber;\n\n /** Amount minted (if applicable). */\n tokenAmount?: BigNumber;\n\n /** BTC address where the user deposited (direct BTC only). */\n depositAddress?: string;\n\n /** Sender address on the source chain (native only). */\n fromAddress?: string;\n\n /** Receiver address on the destination chain (if applicable). */\n toAddress?: string;\n\n /** Destination token contract (if applicable). */\n toTokenAddress?: string;\n\n /** Destination token (if applicable). */\n toToken?: Token;\n\n /** Destination chain identifier. */\n toChainId: ChainId | SuiChain | SolanaChain | StarknetChainId;\n\n /** Source chain identifier (native only). */\n fromChainId?: ChainId | SuiChain | SolanaChain | StarknetChainId;\n\n /** Block height where the deposit was confirmed (as a number). */\n blockHeight?: number;\n\n /**\n * Unix timestamp (seconds) of confirmation.\n * Converted from ISO8601 (native) or string epoch (direct BTC).\n */\n blockTime?: number;\n\n /** Hash of the payload proving the deposit details. */\n payloadHash?: string;\n\n /** Raw payload bytes (hex-encoded). */\n rawPayload?: string;\n\n /** Merkle/cryptographic proof (hex-encoded). */\n proof?: string;\n\n /** ID of the notarization session (string to preserve both APIs). */\n sessionId: string;\n\n /** Current notarization status. */\n notarizationStatus: ENotarizationStatus;\n\n /** Current session state. */\n sessionState: ESessionState;\n\n /** Claim transaction hash on the destination chain, if claimed. */\n claimTxHash?: string;\n\n /** True if the deposit was claimed (derived). */\n isClaimed: boolean;\n\n /** True if deposit is sanctioned (present in both APIs). */\n sanctioned?: boolean;\n\n /** Optional auxiliary version (direct BTC only). */\n auxVersion?: number;\n\n /** Optional wait duration for notarization (direct BTC only, in seconds). */\n notarizationWaitDur?: number;\n}\n\nexport interface IGetDepositsByAddressParams extends IEnvParam {\n /**\n * The EVM address to get deposits for\n */\n address: Address;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Fetchers */\n/* -------------------------------------------------------------------------- */\n\n/**\n * Fetches deposits from the Direct BTC Deposits API for a given address.\n *\n * Converts the API response into a unified `Deposit` format.\n *\n * @param {IGetDepositsByAddressParams} params - Parameters including address and environment\n * @param {string} params.address - The EVM/BTC address to fetch deposits for\n * @param {Env} params.env - The environment (e.g., 'mainnet', 'testnet')\n *\n * @returns {Promise<Deposit[]>} A list of direct BTC deposits in unified format\n *\n * @example\n * const directDeposits = await fetchDirectDeposits({ address: 'tb1q...', env: 'testnet' });\n */\nexport async function fetchDirectDeposits({\n address,\n env,\n}: IGetDepositsByAddressParams): Promise<Deposit[]> {\n const { baseApiUrl } = getApiConfig(env);\n\n // pad address to 64 characters if needed\n if (address.startsWith('0x') && address.slice(2).length === 63) {\n address = `0x0${address.slice(2)}`;\n }\n\n const endpoint = new URL(`/api/v1/address/outputs-v2/${address}`, baseApiUrl);\n\n const outputs = await fetchAllPaginated({\n endpoint,\n extractItems: data => (data as DirectDepositsResponse)?.outputs ?? [],\n });\n\n return outputs.map(d => mapDirectBtcDeposit(d, env, address));\n}\n\n/**\n * Fetches deposits from the Native Deposits API for a given address.\n *\n * Converts the API response into a unified `Deposit` format.\n *\n * @param {IGetDepositsByAddressParams} params - Parameters including address and environment\n * @param {string} params.address - The EVM/BTC address to fetch deposits for\n * @param {Env} params.env - The environment (e.g., 'mainnet', 'testnet')\n *\n * @returns {Promise<Deposit[]>} A list of native deposits in unified format\n *\n * @example\n * const nativeDeposits = await fetchNativeDeposits({ address: 'tb1q...', env: 'testnet' });\n */\nexport async function fetchBTCbDeposits({\n address,\n env,\n}: IGetDepositsByAddressParams): Promise<Deposit[]> {\n const { baseApiUrl } = getApiConfig(env);\n\n const endpoint = new URL(\n `/api/v1/address/native-deposits/${address}`,\n baseApiUrl,\n );\n\n const deposits = await fetchAllPaginated({\n endpoint,\n extractItems: data => (data as NativeDepositsResponse)?.deposits ?? [],\n });\n\n return deposits.map(d => mapBTCbDeposits(d, env));\n}\n\n/* -------------------------------------------------------------------------- */\n/* Helpers */\n/* -------------------------------------------------------------------------- */\n\nfunction mapDirectBtcDeposit(\n d: DirectDeposit,\n env?: Env,\n accountAddress?: string,\n): Deposit {\n return {\n isNative: false,\n txHash: d.txid,\n eventIndex: d.index ? Number(d.index) : 0,\n amount: fromSatoshi(d.value),\n tokenAmount: d.token_amount\n ? fromBaseDenomination(d.token_amount, DECIMALS)\n : undefined,\n depositAddress: d.address,\n toAddress: accountAddress,\n toChainId: getChainIdByName(d.to_chain, env),\n blockHeight: d.block_height ? Number(d.block_height) : undefined,\n blockTime: d.block_time ? Number(d.block_time) : undefined, // epoch seconds\n payloadHash: d.payload_hash,\n rawPayload: d.raw_payload,\n proof: d.proof,\n sessionId: d.session_id,\n notarizationStatus: d.notarization_status,\n sessionState: d.session_state,\n claimTxHash: d.claim_tx,\n isClaimed: !!d.claim_tx,\n sanctioned: d.sanctioned,\n toTokenAddress: d.token_address,\n toToken: getTokenByAddress(\n d.token_address,\n getChainIdByName(d.to_chain, env),\n env,\n AddressKind.Adapter,\n ),\n auxVersion: d.aux_version,\n notarizationWaitDur: d.notarization_wait_dur\n ? Number(d.notarization_wait_dur)\n : undefined,\n };\n}\n\nfunction mapBTCbDeposits(d: NativeDeposit, env?: Env): Deposit {\n return {\n isNative: true,\n txHash: d.tx_hash,\n eventIndex: d.event_index,\n amount: fromBaseDenomination(d.amount, DECIMALS),\n tokenAmount: undefined,\n fromAddress: d.from_address,\n toAddress: d.to_address,\n toTokenAddress: d.to_token_address,\n toToken: getTokenByAddress(\n d.to_token_address,\n getChainIdByName(d.to_blockchain, env),\n env,\n AddressKind.Adapter,\n ),\n toChainId: getChainIdByName(d.to_blockchain, env),\n fromChainId: getChainIdByName(d.from_blockchain, env),\n blockHeight: d.block_height ? Number(d.block_height) : undefined,\n blockTime: d.block_time\n ? Math.floor(new Date(d.block_time).getTime() / 1000) // seconds\n : undefined,\n payloadHash: d.payload_hash,\n rawPayload: d.raw_payload,\n proof: d.proof,\n sessionId: d.session_id,\n notarizationStatus: d.notarization_status,\n sessionState: d.session_state,\n claimTxHash: d.claim_tx,\n isClaimed: !!d.claim_tx,\n sanctioned: d.sanctioned,\n };\n}\n\n/* -------------------------------------------------------------------------- */\n/* Public API */\n/* -------------------------------------------------------------------------- */\n\n/**\n * Fetches all deposits for a given address from both Direct BTC Deposits\n * and Native Deposits APIs, unifying them into a single list.\n *\n * Both APIs are called concurrently. If one API fails, the other still returns results.\n *\n * Deposits are returned sorted by `blockTime` descending (newest first).\n *\n * @param {IGetDepositsByAddressParams} params - Parameters including the address and environment\n * @param {string} params.address - The EVM/BTC address to fetch deposits for\n * @param {Env} params.env - The environment (e.g., 'mainnet', 'testnet')\n *\n * @returns {Promise<Deposit[]>} A unified list of deposits from both APIs\n *\n * @example\n * const deposits = await getDepositsByAddress({ address: 'tb1q...', env: 'testnet' });\n * console.log(deposits);\n */\nexport async function getDepositsByAddress({\n address,\n env,\n}: IGetDepositsByAddressParams): Promise<Deposit[]> {\n const results = await Promise.allSettled([\n fetchDirectDeposits({ address, env }),\n fetchBTCbDeposits({ address, env }),\n ]);\n\n let directDeposits: Deposit[] = [];\n let nativeDeposits: Deposit[] = [];\n\n results.forEach((result, idx) => {\n if (result.status === 'fulfilled') {\n if (idx === 0)\n directDeposits = result.value; // Direct BTC deposits\n else nativeDeposits = result.value; // Native deposits\n } else {\n console.error(\n idx === 0\n ? 'Failed to fetch direct BTC deposits:'\n : 'Failed to fetch native deposits:',\n result.reason,\n );\n }\n });\n\n const allDeposits = [...directDeposits, ...nativeDeposits].sort((a, b) => {\n const aTime = a.blockTime ?? 0;\n const bTime = b.blockTime ?? 0;\n return bTime - aTime;\n });\n\n return allDeposits;\n}\n","import { DEFAULT_ENV, Env } from '@lombard.finance/sdk-common';\nimport axios from 'axios';\nimport BigNumber from 'bignumber.js';\n\nimport { getApiConfig } from '../../common/api-config';\nimport { IEnvParam } from '../../common/parameters';\n\nconst CURRENT_SEASON = 2;\n\n/* -------------------------------------------------------------------------- */\n/* Types */\n/* -------------------------------------------------------------------------- */\n\n/**\n * Parameters for fetching points by address.\n */\nexport interface IGetPointsByAddressParameters extends IEnvParam {\n /** The address of the points earner. */\n address: string;\n /** The season to fetch (defaults to CURRENT_SEASON). */\n season?: number;\n}\n\n/**\n * Breakdown of points earned from each supported DeFi protocol.\n */\nexport interface IProtocolPointsBreakdown {\n [protocolName: string]: number;\n}\n\n/**\n * Core points shared across all seasons.\n */\nexport interface IPointsBase {\n /** Points earned by holding LBTC. */\n holdingPoints: number;\n /** Points earned by taking positions in DeFi vaults. */\n protocolPoints: number;\n /** Points earned from referrals. */\n referralPoints: number;\n /** Total points earned. */\n totalPoints: number;\n /** Detailed breakdown of protocol-specific points. */\n protocolPointsBreakdown: IProtocolPointsBreakdown;\n /** Lux points earned from badges. */\n badgesPoints: number;\n /** Total Lux points excluding badges (only required in some seasons). */\n totalWithoutBadgesPoints?: number;\n}\n\n/**\n * Points specific to Season 1.\n */\nexport interface IPointsByAddressSeason1 extends IPointsBase {\n /** Points earned in the OKX campaign. */\n okxPoints: number;\n /** Points earned in the first flash event. */\n flashEvent1Points: number;\n /** Points earned in the second flash event. */\n flashEvent2Points: number;\n}\n\n/**\n * Points specific to Season 2.\n */\nexport interface IPointsByAddressSeason2 extends IPointsBase {\n /** Points earned from referees. */\n refereePoints: number;\n /** Points earned by checking in. */\n checkinPoints: number;\n}\n\n/**\n * Raw API response format for Season 1.\n */\ninterface IPointsResponseSeason1 {\n holding_points: number;\n protocol_points: number;\n referee_points: number;\n referrals_points: number;\n total: number;\n flash_event: number;\n badges: number;\n total_without_badges: number;\n okx_campaign: number;\n flash_event2: number;\n protocol_points_map?: IProtocolPointsBreakdown;\n}\n\n/**\n * Raw API response format for Season 2.\n */\ninterface IPointsResponseSeason2 {\n holding_points: number;\n protocol_points: number;\n referee_points: number;\n referrals_points: number;\n total: number;\n protocol_points_map?: IProtocolPointsBreakdown;\n badge_points: number;\n checkin_points: number;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Helpers */\n/* -------------------------------------------------------------------------- */\n\n/**\n * Parses a number-like input into a BigNumber.\n *\n * @param input - The value to parse.\n * @param defaultValue - Value to use if input is invalid or undefined.\n * @returns A BigNumber representing the parsed value.\n */\nfunction parse(\n input: string | number | null | undefined,\n defaultValue = 0,\n): BigNumber {\n return BigNumber(Number(input) || defaultValue);\n}\n\n/**\n * Converts a protocol points map to a strongly typed breakdown object.\n *\n * @param map - Optional protocol points map from the API.\n * @returns A normalized breakdown object with numeric values.\n */\nfunction toProtocolBreakdown(\n map: IProtocolPointsBreakdown | undefined,\n): IProtocolPointsBreakdown {\n return Object.entries(map || {}).reduce((acc, [k, v]) => {\n acc[k] = parse(v).toNumber();\n return acc;\n }, {} as IProtocolPointsBreakdown);\n}\n\n/**\n * Constructs the Lombard points API endpoint for the given season and address.\n *\n * @param season - The Lux points season (e.g., 1 or 2).\n * @param address - Wallet address to query.\n * @param env - Target environment (defaults to DEFAULT_ENV).\n * @throws If the API endpoint cannot be determined or the season is invalid.\n */\nfunction getLombardPointsUrl(\n season: number,\n address: string,\n env: Env = DEFAULT_ENV,\n): string {\n const { baseApiUrl } = getApiConfig(env);\n if (!baseApiUrl) {\n throw new Error(\n `Could not determine the API endpoint for the provided environment: ${\n env || DEFAULT_ENV\n }`,\n );\n }\n\n switch (season) {\n case 1:\n return `${baseApiUrl}/api/v1/referral-system/season-1/points/${address}`;\n case 2:\n return `${baseApiUrl}/api/v1/referral-system/season-2/points/${address}`;\n default:\n throw new Error(`Invalid Lux season: ${season}`);\n }\n}\n\n/* -------------------------------------------------------------------------- */\n/* Fetchers */\n/* -------------------------------------------------------------------------- */\n\n/**\n * Fetches and parses Season 1 points for a given address.\n *\n * @param params - Address and environment parameters.\n * @returns A typed object containing all Season 1 point metrics.\n */\nasync function fetchPointsSeason1({\n address,\n env,\n}: Omit<\n IGetPointsByAddressParameters,\n 'season'\n>): Promise<IPointsByAddressSeason1> {\n const { data } = await axios.get<IPointsResponseSeason1>(\n getLombardPointsUrl(1, address, env),\n );\n\n const referralPoints = parse(data.referee_points).plus(\n parse(data.referrals_points),\n );\n\n return {\n holdingPoints: parse(data.holding_points).toNumber(),\n protocolPoints: parse(data.protocol_points).toNumber(),\n referralPoints: referralPoints.toNumber(),\n okxPoints: parse(data.okx_campaign).toNumber(),\n flashEvent1Points: parse(data.flash_event).toNumber(),\n flashEvent2Points: parse(data.flash_event2).toNumber(),\n totalPoints: parse(data.total).toNumber(),\n protocolPointsBreakdown: toProtocolBreakdown(data.protocol_points_map),\n badgesPoints: parse(data.badges).toNumber(),\n totalWithoutBadgesPoints: parse(data.total_without_badges).toNumber(),\n };\n}\n\n/**\n * Fetches and parses Season 2 points for a given address.\n *\n * @param params - Address and environment parameters.\n * @returns A typed object containing all Season 2 point metrics.\n */\nasync function fetchPointsSeason2({\n address,\n env,\n}: Omit<\n IGetPointsByAddressParameters,\n 'season'\n>): Promise<IPointsByAddressSeason2> {\n const { data } = await axios.get<IPointsResponseSeason2>(\n getLombardPointsUrl(2, address, env),\n );\n\n return {\n holdingPoints: parse(data.holding_points).toNumber(),\n protocolPoints: parse(data.protocol_points).toNumber(),\n referralPoints: parse(data.referrals_points).toNumber(),\n refereePoints: parse(data.referee_points).toNumber(),\n badgesPoints: parse(data.badge_points).toNumber(),\n checkinPoints: parse(data.checkin_points).toNumber(),\n totalPoints: parse(data.total).toNumber(),\n protocolPointsBreakdown: toProtocolBreakdown(data.protocol_points_map),\n totalWithoutBadgesPoints: parse(data.total).toNumber(),\n };\n}\n\n/* -------------------------------------------------------------------------- */\n/* Public API */\n/* -------------------------------------------------------------------------- */\n\n/**\n * Retrieves Season 1 points for a given address.\n *\n * @param parameters - Address and environment parameters.\n * @returns A Season 1 points object.\n */\nexport async function getPointsByAddress(\n parameters: IGetPointsByAddressParameters & { season: 1 },\n): Promise<IPointsByAddressSeason1>;\n\n/**\n * Retrieves Season 2 points for a given address.\n *\n * @param parameters - Address and environment parameters.\n * @returns A Season 2 points object.\n */\nexport async function getPointsByAddress(\n parameters: IGetPointsByAddressParameters & { season: 2 },\n): Promise<IPointsByAddressSeason2>;\n\n/**\n * Retrieves points for the given address.\n * Defaults to the current season if none is specified.\n *\n * @param parameters - Address and optional environment/season parameters.\n * @returns A points object matching the requested or current season.\n */\nexport async function getPointsByAddress(\n parameters: IGetPointsByAddressParameters,\n): Promise<IPointsByAddressSeason1 | IPointsByAddressSeason2>;\n\n/**\n * Implementation of getPointsByAddress with overloads.\n */\nexport async function getPointsByAddress({\n address,\n env,\n season = CURRENT_SEASON,\n}: IGetPointsByAddressParameters): Promise<\n IPointsByAddressSeason1 | IPointsByAddressSeason2\n> {\n return season === 2\n ? fetchPointsSeason2({ address, env })\n : fetchPointsSeason1({ address, env });\n}\n\n/**\n * Convenience wrapper for fetching Season 1 points.\n *\n * @param params - Address and environment parameters.\n */\nexport const getLuxSeason1Points = (\n params: Omit<IGetPointsByAddressParameters, 'season'>,\n) => getPointsByAddress({ ...params, season: 1 });\n\n/**\n * Convenience wrapper for fetching Season 2 points.\n *\n * @param params - Address and environment parameters.\n */\nexport const getLuxSeason2Points = (\n params: Omit<IGetPointsByAddressParameters, 'season'>,\n) => getPointsByAddress({ ...params, season: 2 });\n","import { DEFAULT_ENV } from '@lombard.finance/sdk-common';\nimport BigNumber from 'bignumber.js';\nimport * as bitcoin from 'bitcoinjs-lib';\nimport { Hex, trim } from 'viem';\n\nimport { getApiConfig } from '../../common/api-config';\nimport {\n BlockchainIdentifier,\n getChainIdByName,\n} from '../../common/blockchain-identifier';\nimport {\n ChainId,\n isSolanaChain,\n isStarknetChainId,\n isSuiChain,\n isValidChain,\n SolanaChain,\n StarknetChainId,\n SuiChain,\n} from '../../common/chains';\nimport { IEnvParam } from '../../common/parameters';\nimport {\n AddressKind,\n getSolanaTokenAddress,\n getStarknetTokenAddress,\n getSuiTokenAddress,\n Token,\n TOKEN_ADDRESSES,\n} from '../../tokens/token-addresses';\nimport { fetchAllPaginated } from '../../utils/pagination';\nimport { fromSatoshi } from '../../utils/satoshi';\nimport {\n ENotarizationStatus,\n ESessionState,\n} from '../getDepositsByAddress/getDepositsByAddress';\n\n/* -------------------------------------------------------------------------- */\n/* Types */\n/* -------------------------------------------------------------------------- */\n\n/**\n * Status of a payout transaction corresponding to an unstake.\n */\nexport enum PayoutTxStatus {\n /** The payout transaction has been sent; unstake completed */\n Completed = 'Completed',\n\n /** The payout transaction has not been sent; unstake pending */\n Pending = 'Pending',\n}\n\n/**\n * Response object for a single unstake record from the API.\n */\ninterface UnstakeEntry {\n /** Transaction hash of the unstake on the source blockchain. */\n tx_hash: string;\n\n /** Source blockchain identifier (e.g., BLOCKCHAIN_BSC, BLOCKCHAIN_ETHEREUM). */\n blockchain: BlockchainIdentifier;\n\n /** Block height where the unstake was confirmed. */\n block_height: string;\n\n /** Block time of the unstake transaction (as a string timestamp). */\n block_time: string;\n\n /** Address of the initiator of the unstake. */\n from_address: string;\n\n /** Destination address for the payout. */\n to_address?: string;\n\n /** Destination blockchain identifier for the payout. */\n to_chain?: string;\n\n /** Output script used to derive BTC address, present for BTC unstakes. */\n output_script?: string;\n\n /** Amount unstaked (string to preserve precision). */\n amount: string;\n\n /** Payout transaction hash on the destination chain, if already completed. */\n payout_txid?: string;\n\n /** Index of the payout transaction, if applicable. */\n payout_index?: string;\n\n /** True if the unstake transaction has been sanctioned or flagged as suspicious. */\n sanctioned?: boolean;\n\n /** Cryptographic proof (hex-encoded) */\n proof?: string;\n\n /** Raw payload bytes (hex-encoded) */\n payload?: string;\n\n /** Current notarization status (for native chain redemptions) */\n notarization_status?: ENotarizationStatus;\n\n /** Current session state (for native chain redemptions) */\n session_state?: ESessionState;\n\n /** Claim transaction hash on the destination chain, if claimed (for native chain redemptions) */\n claim_tx?: string;\n\n /** Token address on the source chain */\n from_token_address?: string;\n}\n\n/**\n * Top-level API response for unstakes.\n */\ninterface UnstakesResponse {\n unstakes?: UnstakeEntry[];\n\n /** True if there are more unstakes available */\n has_more: boolean;\n}\n\n/**\n * Parameters for fetching unstakes by address.\n */\nexport interface IGetUnstakesByAddressParameters extends IEnvParam {\n /** Address of the unstake initiator */\n address: string;\n\n /** Optional filtering */\n options?: {\n /** Show only direct BTC unstakes */\n show_unstakes?: boolean;\n /** Show only native chain redemptions */\n show_redeems?: boolean;\n /** Show only redeems to native chain (LBTC -> BTC.b) */\n to_native?: boolean;\n };\n}\n\n/**\n * A unified unstake record returned from either\n * direct BTC unstakes or native blockchain redemptions.\n */\nexport interface Unstake {\n /** True if the record originates from the native blockchain redemption. */\n isNative: boolean;\n\n /** Transaction hash of the unstake. */\n txHash: string;\n\n /** Source chain identifier (where the unstake originated). */\n fromChainId: ChainId | SuiChain | SolanaChain | StarknetChainId;\n\n /** Destination chain identifier (undefined for BTC unstakes). */\n toChainId?: ChainId | SuiChain | SolanaChain | StarknetChainId | 'bitcoin';\n\n /** Block height where the unstake was confirmed. */\n blockHeight: number;\n\n /** Block time (as epoch seconds) of the unstake. */\n blockTime: number;\n\n /** Initiator of the unstake transaction. */\n fromAddress: string;\n\n /** Destination address (BTC, EVM, or Solana). */\n toAddress?: string;\n\n /** Amount unstaked (normalized to satoshis / smallest unit). */\n amount: BigNumber;\n\n /** Payout transaction hash on the destination chain, if claimed. */\n payoutTxHash?: string;\n\n /** Payout transaction index, if applicable. */\n payoutTxIndex?: number;\n\n /** Status of the payout transaction. */\n payoutTxStatus: PayoutTxStatus;\n\n /** True if the unstake transaction has been sanctioned. */\n sanctioned?: boolean;\n\n /** Raw payload bytes (hex-encoded). */\n rawPayload?: string;\n\n /** Merkle/cryptographic proof (hex-encoded). */\n proof?: string;\n\n /** The output token. */\n toToken?: Token;\n\n /** The output token address. */\n toTokenAddress?: string;\n\n /** Current notarization status (for native chain redemptions). */\n notarizationStatus?: ENotarizationStatus;\n\n /** Current session state (for native chain redemptions). */\n sessionState?: ESessionState;\n\n /** Claim transaction hash on the destination chain, if claimed (for native chain redemptions). */\n claimTxHash?: string;\n\n /** Token address on the source chain */\n fromTokenAddress?: string;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Fetchers */\n/* -------------------------------------------------------------------------- */\n\n/**\n * Fetches all unstakes initiated by a given address.\n *\n * @param {IGetUnstakesByAddressParameters} params - Parameters for fetching unstakes.\n * @param {string} params.address - Address of the unstake initiator.\n * @param {Env} [params.env='prod'] - Environment to use (prod/testnet).\n * @param {object} [params.options] - Optional pagination and filter options.\n *\n * @returns {Promise<Unstake[]>} - List of mapped unstakes.\n *\n * @throws {Error} - Throws if no address is specified.\n */\nexport async function fetchUnstakesByAddress({\n address,\n env = DEFAULT_ENV,\n options,\n}: IGetUnstakesByAddressParameters): Promise<Unstake[]> {\n if (!address) throw new Error('No address specified.');\n\n const { baseApiUrl } = getApiConfig(env);\n\n // pad address to 64 characters if needed\n if (address.startsWith('0x') && address.slice(2).length === 63) {\n address = `0x0${address.slice(2)}`;\n }\n\n const endpoint = new URL(`/api/v1/address/unstakes/${address}`, baseApiUrl);\n\n const unstakes = await fetchAllPaginated({\n endpoint,\n extractItems: data => (data as UnstakesResponse)?.unstakes ?? [],\n query: {\n show_redeems: options?.show_redeems ? 'true' : undefined,\n show_unstakes: options?.show_unstakes ? 'true' : undefined,\n to_native: options?.to_native ? 'true' : undefined,\n },\n });\n\n return unstakes.map(d => mapUnstakeEntry(d, env));\n}\n\n/* -------------------------------------------------------------------------- */\n/* Helpers */\n/* -------------------------------------------------------------------------- */\n\n/**\n * Maps a raw API unstake response to the unified `Unstake` object.\n *\n * @param {UnstakeEntry} d - Raw unstake data from API\n * @param {Env} env - Environment to use for chain/network resolution\n *\n * @returns {Unstake} - Unified unstake object\n */\nfunction mapUnstakeEntry(\n d: UnstakeEntry,\n env: IEnvParam['env'] = DEFAULT_ENV,\n): Unstake {\n const isNative = Boolean(d.to_chain && d.to_address);\n\n let toAddress: string | undefined = d.to_address;\n if (!isNative && d.output_script) {\n try {\n toAddress = bitcoin.address.fromOutputScript(\n Buffer.from(d.output_script.replace(/^0x/, ''), 'hex'),\n env === 'prod' ? bitcoin.networks.bitcoin : bitcoin.networks.testnet,\n );\n } catch {\n toAddress = undefined;\n }\n } else if (toAddress?.startsWith('0x')) {\n toAddress = trim(toAddress as Hex);\n }\n\n const payoutTxStatus = d.payout_txid\n ? PayoutTxStatus.Completed\n : PayoutTxStatus.Pending;\n\n const toToken = isNative ? Token.BTCb : undefined;\n const toChainId = d.to_chain\n ? d.to_chain === BlockchainIdentifier.bitcoin ||\n d.to_chain === BlockchainIdentifier.bitcoinOld\n ? 'bitcoin'\n : getChainIdByName(d.to_chain, env)\n : undefined;\n\n let toTokenAddress: string | undefined = undefined;\n if (toToken) {\n if (isValidChain(toChainId)) {\n let address = TOKEN_ADDRESSES?.[toToken]?.[env]?.[toChainId];\n if (address) {\n address =\n typeof address === 'string' ? address : address[AddressKind.Adapter];\n }\n toTokenAddress = address;\n }\n\n if (isSolanaChain(toChainId)) {\n toTokenAddress = getSolanaTokenAddress(toChainId, env);\n }\n\n if (isSuiChain(toChainId)) {\n toTokenAddress = getSuiTokenAddress(toChainId, env);\n }\n\n if (isStarknetChainId(toChainId)) {\n toTokenAddress = getStarknetTokenAddress(toChainId, env);\n }\n }\n\n return {\n isNative,\n txHash: d.tx_hash,\n fromChainId: getChainIdByName(d.blockchain, env),\n toChainId,\n blockHeight: Number(d.block_height),\n blockTime: Number(d.block_time),\n fromAddress: d.from_address,\n toAddress,\n amount: fromSatoshi(d.amount),\n payoutTxHash: d.payout_txid,\n payoutTxIndex: d.payout_index ? Number(d.payout_index) : undefined,\n payoutTxStatus,\n sanctioned: d.sanctioned,\n proof: d.proof,\n rawPayload: d.payload,\n toToken,\n toTokenAddress,\n notarizationStatus: d.notarization_status,\n sessionState: d.session_state,\n claimTxHash: d.claim_tx,\n fromTokenAddress: d.from_token_address,\n };\n}\n\n/* -------------------------------------------------------------------------- */\n/* Public API */\n/* -------------------------------------------------------------------------- */\n\n/**\n * Returns all unstakes (direct BTC or native chain redemptions) for a given address.\n *\n * @param {IGetUnstakesByAddressParameters} params - Parameters for fetching unstakes.\n * @param {string} params.address - Address of the unstake initiator.\n * @param {Env} [params.env=DEFAULT_ENV] - Environment to use.\n * @param {object} [params.options] - Optional pagination and filter options.\n *\n * @returns {Promise<Unstake[]>} - Array of unified unstake records.\n *\n * @throws {Error} - Throws if no address is specified.\n */\nexport async function getUnstakesByAddress({\n address,\n env = DEFAULT_ENV,\n options,\n}: IGetUnstakesByAddressParameters): Promise<Unstake[]> {\n return fetchUnstakesByAddress({ address, env, options });\n}\n","import axios from 'axios';\n\nimport { getApiConfig } from '../../common/api-config';\nimport { IEnvParam } from '../../common/parameters';\nimport { getErrorMessage } from '../../utils/err';\n\nexport type IStoreStakeAndBakeSignatureStatus = 'success';\n\ninterface IStoreStakeAndBakeSignatureResponse {\n status: IStoreStakeAndBakeSignatureStatus;\n}\n\nconst EMPTY_SIGNATURE = '0x00';\n\nexport interface IStoreStakeAndBakeSignatureParams extends IEnvParam {\n /**\n * signature\n */\n signature: string;\n /**\n * JSON typed data used for the signature\n */\n typedData: string;\n}\n\n/**\n * Store stake and bake signature\n *\n * @param {IStoreStakeAndBakeSignatureParams} parameters - The parameters for storing stake and bake signature\n * @param {string} parameters.signature - The signature.\n * @param {string} parameters.typedData - The serialized typed data.\n * @param {Env} parameters.env - The optional environment identifier.\n *\n * @returns {Promise<IStoreStakeAndBakeSignatureStatus>}\n */\nexport async function storeStakeAndBakeSignature({\n signature,\n typedData,\n env,\n}: IStoreStakeAndBakeSignatureParams): Promise<IStoreStakeAndBakeSignatureStatus> {\n const { baseApiUrl } = getApiConfig(env);\n\n try {\n const { data } = await axios.post<IStoreStakeAndBakeSignatureResponse>(\n `${baseApiUrl}/api/v1/claimer/save-stake-and-bake-signature`,\n null,\n {\n params: {\n typed_data: typedData,\n signature: signature || EMPTY_SIGNATURE,\n },\n },\n );\n\n return data.status;\n } catch (error) {\n const errorMsg = getErrorMessage(error);\n\n throw new Error(errorMsg);\n }\n}\n","import axios from 'axios';\n\nimport { getApiConfig } from '../../common/api-config';\nimport type { IEnvParam } from '../../common/parameters';\n\ninterface ApiResponse {\n exists?: boolean;\n referrer?: string;\n}\n\nexport interface GetDepositAddressReferrerParams extends IEnvParam {\n address: string;\n}\n\nexport interface DepositAddressReferrerResult {\n hasDepositAddress: boolean;\n referrer?: string;\n}\n\n/**\n * Fetch the referrer associated with a previously generated BTC deposit address.\n *\n * @param params - Address lookup parameters\n */\nexport async function getDepositAddressReferrer({\n address,\n env,\n}: GetDepositAddressReferrerParams): Promise<DepositAddressReferrerResult> {\n const { baseApiUrl } = getApiConfig(env);\n const { data } = await axios.get<ApiResponse>(\n `${baseApiUrl}/api/v1/address/exists/${address}`,\n );\n\n return {\n hasDepositAddress: Boolean(data.exists),\n referrer: data.referrer,\n };\n}\n","import { getDepositAddressReferrer } from '../api-functions/getDepositAddressReferrer';\nimport type { LombardSDK } from '../client/LombardSDK';\n\nexport interface ReferralLookupParams {\n /** Destination account that previously generated a BTC deposit address */\n address: string;\n}\n\nexport interface ReferralLookupResult {\n hasDepositAddress: boolean;\n referrer?: string;\n}\n\n/**\n * Referral helper namespace.\n *\n * Provides read APIs for referral metadata so partners do not need to query\n * Lombard REST endpoints directly.\n */\nexport class ReferralsClient {\n constructor(private readonly sdk: LombardSDK) {}\n\n /**\n * Fetch the referrer bound to a previously generated BTC deposit address.\n */\n async lookupReferrer({\n address,\n }: ReferralLookupParams): Promise<ReferralLookupResult> {\n return getDepositAddressReferrer({\n address,\n env: this.sdk.config.env,\n });\n }\n}\n"],"names":["makeRequest","address","chainId","env","limit","offset","partnerId","baseApiUrl","getApiConfig","destinationBlockchain","getChainNameById","BlockchainIdentifier","pad","params","k","v","url","data","axios","err","message","_a","getDepositBtcAddress","tokenParam","Token","_addresses","depositAddress","tokenAddressFilter","isValidChain","getTokenContractInfo","AddressKind","isSuiChain","tokenAddress","getSuiTokenAddress","isSolanaChain","solanaToken","getSolanaTokenAddress","isStarknetChainId","getStarknetTokenAddress","addresses","isForToken","mostRecentAddress","mostRecent","cur","getDepositBtcAddresses","parameters","fetchAllPaginated","endpoint","extractItems","query","pageSize","maxRecords","allItems","hasMore","key","value","items","DECIMALS","BTC_DECIMALS","ENotarizationStatus","ESessionState","fetchDirectDeposits","d","mapDirectBtcDeposit","fetchBTCbDeposits","mapBTCbDeposits","accountAddress","fromSatoshi","fromBaseDenomination","getChainIdByName","getTokenByAddress","getDepositsByAddress","results","directDeposits","nativeDeposits","result","idx","a","b","aTime","CURRENT_SEASON","parse","input","defaultValue","BigNumber","toProtocolBreakdown","map","acc","getLombardPointsUrl","season","DEFAULT_ENV","fetchPointsSeason1","referralPoints","fetchPointsSeason2","getPointsByAddress","getLuxSeason1Points","getLuxSeason2Points","PayoutTxStatus","fetchUnstakesByAddress","options","mapUnstakeEntry","isNative","toAddress","bitcoin","trim","payoutTxStatus","toToken","toChainId","toTokenAddress","TOKEN_ADDRESSES","getUnstakesByAddress","EMPTY_SIGNATURE","storeStakeAndBakeSignature","signature","typedData","error","errorMsg","getErrorMessage","getDepositAddressReferrer","ReferralsClient","sdk"],"mappings":"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"}