@lombard.finance/sdk 4.3.2 → 4.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (224) hide show
  1. package/CHANGELOG.md +16 -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.cjs +1 -1
  7. package/dist/api.js +29 -29
  8. package/dist/bridge.cjs +1 -1
  9. package/dist/bridge.js +7 -7
  10. package/dist/btc.cjs +1 -1
  11. package/dist/btc.js +10 -10
  12. package/dist/chains/btc/actions/deposit/BtcDeposit.d.ts +7 -4
  13. package/dist/chains/btc/actions/deposit/BtcDeposit.d.ts.map +1 -1
  14. package/dist/chains/btc/actions/deposit/config/index.d.ts +16 -8
  15. package/dist/chains/btc/actions/deposit/config/index.d.ts.map +1 -1
  16. package/dist/chains/btc/actions/deposit/config/solana.d.ts +20 -0
  17. package/dist/chains/btc/actions/deposit/config/solana.d.ts.map +1 -0
  18. package/dist/chains/btc/actions/deposit/config/types.d.ts +4 -3
  19. package/dist/chains/btc/actions/deposit/config/types.d.ts.map +1 -1
  20. package/dist/chains/evm/EvmActions.d.ts +4 -4
  21. package/dist/chains/evm/actions/deposit/config/evm.d.ts +3 -3
  22. package/dist/chains/evm/actions/deposit/config/evm.d.ts.map +1 -1
  23. package/dist/chains/evm/actions/deposit/config/types.d.ts +1 -1
  24. package/dist/chains/evm/actions/deposit/config/types.d.ts.map +1 -1
  25. package/dist/chains/evm/actions/deposit/factory.d.ts +1 -1
  26. package/dist/chains/evm/actions/deposit/types.d.ts +1 -1
  27. package/dist/chains/evm/actions/deposit/types.d.ts.map +1 -1
  28. package/dist/chains/evm/actions/redeem/EvmRedeem.d.ts.map +1 -1
  29. package/dist/chains/evm/actions/unstake/EvmUnstake.d.ts.map +1 -1
  30. package/dist/chains/solana/SolanaActions.d.ts +10 -0
  31. package/dist/chains/solana/SolanaActions.d.ts.map +1 -1
  32. package/dist/chains/solana/actions/index.d.ts +1 -0
  33. package/dist/chains/solana/actions/index.d.ts.map +1 -1
  34. package/dist/chains/solana/actions/redeem/SolanaRedeem.d.ts +37 -0
  35. package/dist/chains/solana/actions/redeem/SolanaRedeem.d.ts.map +1 -0
  36. package/dist/chains/solana/actions/redeem/config/index.d.ts +8 -0
  37. package/dist/chains/solana/actions/redeem/config/index.d.ts.map +1 -0
  38. package/dist/chains/solana/actions/redeem/config/solana.d.ts +22 -0
  39. package/dist/chains/solana/actions/redeem/config/solana.d.ts.map +1 -0
  40. package/dist/chains/solana/actions/redeem/config/types.d.ts +35 -0
  41. package/dist/chains/solana/actions/redeem/config/types.d.ts.map +1 -0
  42. package/dist/chains/solana/actions/redeem/factory.d.ts +12 -0
  43. package/dist/chains/solana/actions/redeem/factory.d.ts.map +1 -0
  44. package/dist/chains/solana/actions/redeem/index.d.ts +9 -0
  45. package/dist/chains/solana/actions/redeem/index.d.ts.map +1 -0
  46. package/dist/chains/solana/actions/redeem/types.d.ts +52 -0
  47. package/dist/chains/solana/actions/redeem/types.d.ts.map +1 -0
  48. package/dist/chains/solana/utils.d.ts +15 -0
  49. package/dist/chains/solana/utils.d.ts.map +1 -0
  50. package/dist/chunks/BtcActions-BOVJrdTI.cjs +2 -0
  51. package/dist/chunks/BtcActions-BOVJrdTI.cjs.map +1 -0
  52. package/dist/chunks/{BtcActions-k-qs1uO0.js → BtcActions-_a8r3Q7c.js} +457 -414
  53. package/dist/chunks/BtcActions-_a8r3Q7c.js.map +1 -0
  54. package/dist/chunks/{EvmActions-B_dF42So.js → EvmActions-D4vFpbYk.js} +163 -173
  55. package/dist/chunks/EvmActions-D4vFpbYk.js.map +1 -0
  56. package/dist/chunks/EvmActions-VrDbgMDy.cjs +2 -0
  57. package/dist/chunks/EvmActions-VrDbgMDy.cjs.map +1 -0
  58. package/dist/chunks/ReferralsClient-Cmrjo9bN.cjs +2 -0
  59. package/dist/chunks/ReferralsClient-Cmrjo9bN.cjs.map +1 -0
  60. package/dist/chunks/{ReferralsClient-DbFWWtVi.js → ReferralsClient-DvEsA3II.js} +160 -160
  61. package/dist/chunks/ReferralsClient-DvEsA3II.js.map +1 -0
  62. package/dist/chunks/{api-config-CtcP3TVl.js → api-config-Dm6dR85f.js} +6 -6
  63. package/dist/chunks/{api-config-CtcP3TVl.js.map → api-config-Dm6dR85f.js.map} +1 -1
  64. package/dist/chunks/{approveLBTC-CZiZmdcX.cjs → approveLBTC-CUXEC3kw.cjs} +2 -2
  65. package/dist/chunks/{approveLBTC-CZiZmdcX.cjs.map → approveLBTC-CUXEC3kw.cjs.map} +1 -1
  66. package/dist/chunks/approveLBTC-Du2El1tW.js +26 -0
  67. package/dist/chunks/{approveLBTC-B5-ZWqct.js.map → approveLBTC-Du2El1tW.js.map} +1 -1
  68. package/dist/chunks/{array-Cev6kyLJ.js → array-DYttUPf5.js} +7 -7
  69. package/dist/chunks/{array-Cev6kyLJ.js.map → array-DYttUPf5.js.map} +1 -1
  70. package/dist/chunks/{blockchain-identifier-BzMQWh-C.cjs → blockchain-identifier-BTPGxLio.cjs} +2 -2
  71. package/dist/chunks/{blockchain-identifier-BzMQWh-C.cjs.map → blockchain-identifier-BTPGxLio.cjs.map} +1 -1
  72. package/dist/chunks/{blockchain-identifier-BmadkNtK.js → blockchain-identifier-CTVaEPpY.js} +24 -24
  73. package/dist/chunks/{blockchain-identifier-BmadkNtK.js.map → blockchain-identifier-CTVaEPpY.js.map} +1 -1
  74. package/dist/chunks/{bridge-CTsiodO1.js → bridge-DqGabhIY.js} +13 -13
  75. package/dist/chunks/{bridge-CTsiodO1.js.map → bridge-DqGabhIY.js.map} +1 -1
  76. package/dist/chunks/{bridge-BzRlY9pP.cjs → bridge-dWaKrMKm.cjs} +2 -2
  77. package/dist/chunks/{bridge-BzRlY9pP.cjs.map → bridge-dWaKrMKm.cjs.map} +1 -1
  78. package/dist/chunks/{config-hFKqUyg3.js → config-DghboRx0.js} +10 -10
  79. package/dist/chunks/{config-hFKqUyg3.js.map → config-DghboRx0.js.map} +1 -1
  80. package/dist/chunks/{config-l4ZaZw_g.cjs → config-DmCmanM_.cjs} +2 -2
  81. package/dist/chunks/{config-l4ZaZw_g.cjs.map → config-DmCmanM_.cjs.map} +1 -1
  82. package/dist/chunks/constants-D1FnS2Z8.js +6 -0
  83. package/dist/chunks/constants-D1FnS2Z8.js.map +1 -0
  84. package/dist/chunks/constants-ueShGH9R.cjs +2 -0
  85. package/dist/chunks/constants-ueShGH9R.cjs.map +1 -0
  86. package/dist/chunks/{defi-registry-BIRv_zkp.cjs → defi-registry-DDNavtO1.cjs} +2 -2
  87. package/dist/chunks/{defi-registry-BIRv_zkp.cjs.map → defi-registry-DDNavtO1.cjs.map} +1 -1
  88. package/dist/chunks/{defi-registry-wNFN3qyB.js → defi-registry-DxjjBQTV.js} +13 -13
  89. package/dist/chunks/{defi-registry-wNFN3qyB.js.map → defi-registry-DxjjBQTV.js.map} +1 -1
  90. package/dist/chunks/{depositStatus-DM7fRmbN.js → depositStatus-05_X7FVs.js} +42 -42
  91. package/dist/chunks/{depositStatus-DM7fRmbN.js.map → depositStatus-05_X7FVs.js.map} +1 -1
  92. package/dist/chunks/{depositStatus-C3-EgT2a.cjs → depositStatus-CUjHpXFJ.cjs} +2 -2
  93. package/dist/chunks/{depositStatus-C3-EgT2a.cjs.map → depositStatus-CUjHpXFJ.cjs.map} +1 -1
  94. package/dist/chunks/events-5c8IHjEF.cjs +2 -0
  95. package/dist/chunks/events-5c8IHjEF.cjs.map +1 -0
  96. package/dist/chunks/{events-DdV_xi-2.js → events-rgJZNpHd.js} +414 -303
  97. package/dist/chunks/events-rgJZNpHd.js.map +1 -0
  98. package/dist/chunks/evm-by-btc-address-CZvE15lx.js +39 -0
  99. package/dist/chunks/{evm-by-btc-address-CwLiENtM.js.map → evm-by-btc-address-CZvE15lx.js.map} +1 -1
  100. package/dist/chunks/fee-requirements-CCNsxAvJ.js +14 -0
  101. package/dist/chunks/{fee-requirements-x8-8mpJ7.js.map → fee-requirements-CCNsxAvJ.js.map} +1 -1
  102. package/dist/chunks/get-exchange-ratio-B-xzYND1.js +20 -0
  103. package/dist/chunks/{get-exchange-ratio-NtnkG1kZ.js.map → get-exchange-ratio-B-xzYND1.js.map} +1 -1
  104. package/dist/chunks/{get-exchange-ratio-C-7DadfD.cjs → get-exchange-ratio-BEhD4gLB.cjs} +2 -2
  105. package/dist/chunks/{get-exchange-ratio-C-7DadfD.cjs.map → get-exchange-ratio-BEhD4gLB.cjs.map} +1 -1
  106. package/dist/chunks/{get-positions-summary-DkZZYbGP.cjs → get-positions-summary-Dh1QPLYO.cjs} +2 -2
  107. package/dist/chunks/{get-positions-summary-DkZZYbGP.cjs.map → get-positions-summary-Dh1QPLYO.cjs.map} +1 -1
  108. package/dist/chunks/{get-positions-summary-B_MmGHLv.js → get-positions-summary-iYshN1RQ.js} +28 -28
  109. package/dist/chunks/{get-positions-summary-B_MmGHLv.js.map → get-positions-summary-iYshN1RQ.js.map} +1 -1
  110. package/dist/chunks/{get-vault-tvl-YAXePAW3.js → get-vault-tvl-Ct_Zkg7C.js} +41 -41
  111. package/dist/chunks/{get-vault-tvl-YAXePAW3.js.map → get-vault-tvl-Ct_Zkg7C.js.map} +1 -1
  112. package/dist/chunks/{get-vault-tvl-DmTUbOY7.cjs → get-vault-tvl-D_tQIDAs.cjs} +2 -2
  113. package/dist/chunks/{get-vault-tvl-DmTUbOY7.cjs.map → get-vault-tvl-D_tQIDAs.cjs.map} +1 -1
  114. package/dist/chunks/{get-vault-withdrawals-CWcYy_sH.cjs → get-vault-withdrawals-8ALlEiAC.cjs} +2 -2
  115. package/dist/chunks/{get-vault-withdrawals-CWcYy_sH.cjs.map → get-vault-withdrawals-8ALlEiAC.cjs.map} +1 -1
  116. package/dist/chunks/get-vault-withdrawals-jk7Sv4S4.js +161 -0
  117. package/dist/chunks/{get-vault-withdrawals-BrpZlt6s.js.map → get-vault-withdrawals-jk7Sv4S4.js.map} +1 -1
  118. package/dist/chunks/{getSharesByAddress-BEgOf1C0.cjs → getSharesByAddress-D8hehnP1.cjs} +2 -2
  119. package/dist/chunks/{getSharesByAddress-BEgOf1C0.cjs.map → getSharesByAddress-D8hehnP1.cjs.map} +1 -1
  120. package/dist/chunks/{getSharesByAddress-BiruCDp6.js → getSharesByAddress-_tBaIBsw.js} +38 -38
  121. package/dist/chunks/{getSharesByAddress-BiruCDp6.js.map → getSharesByAddress-_tBaIBsw.js.map} +1 -1
  122. package/dist/chunks/getUserStakeAndBakeSignature-CSEyzgMc.cjs +2 -0
  123. package/dist/chunks/getUserStakeAndBakeSignature-CSEyzgMc.cjs.map +1 -0
  124. package/dist/chunks/getUserStakeAndBakeSignature-Su-k10ap.js +125 -0
  125. package/dist/chunks/getUserStakeAndBakeSignature-Su-k10ap.js.map +1 -0
  126. package/dist/chunks/lbtc-addresses-D8MYCdsx.js +10 -0
  127. package/dist/chunks/{lbtc-addresses-BLRmtR3c.js.map → lbtc-addresses-D8MYCdsx.js.map} +1 -1
  128. package/dist/chunks/{lbtc-addresses-xyTYV7hx.cjs → lbtc-addresses-Kil252DX.cjs} +2 -2
  129. package/dist/chunks/{lbtc-addresses-xyTYV7hx.cjs.map → lbtc-addresses-Kil252DX.cjs.map} +1 -1
  130. package/dist/chunks/numbers-CclN2Ohk.js +15 -0
  131. package/dist/chunks/{numbers-CM-lcmt4.js.map → numbers-CclN2Ohk.js.map} +1 -1
  132. package/dist/chunks/parameters-C_16L5ft.js +11 -0
  133. package/dist/chunks/{parameters-CDV-6Hk5.js.map → parameters-C_16L5ft.js.map} +1 -1
  134. package/dist/chunks/satoshi-CSoJBXc6.js +19 -0
  135. package/dist/chunks/{satoshi-Ch6y8aYG.js.map → satoshi-CSoJBXc6.js.map} +1 -1
  136. package/dist/chunks/statusConstants-Cri7yswV.cjs +2 -0
  137. package/dist/chunks/statusConstants-Cri7yswV.cjs.map +1 -0
  138. package/dist/chunks/{statusConstants-DFxMrVob.js → statusConstants-Zii1786K.js} +1134 -1113
  139. package/dist/chunks/statusConstants-Zii1786K.js.map +1 -0
  140. package/dist/chunks/{storeNetworkFeeSignature-BZGL2Zn_.js → storeNetworkFeeSignature-BODIpq3Y.js} +26 -26
  141. package/dist/chunks/{storeNetworkFeeSignature-BZGL2Zn_.js.map → storeNetworkFeeSignature-BODIpq3Y.js.map} +1 -1
  142. package/dist/chunks/{storeNetworkFeeSignature-D7yo6lDV.cjs → storeNetworkFeeSignature-Buk4091C.cjs} +2 -2
  143. package/dist/chunks/{storeNetworkFeeSignature-D7yo6lDV.cjs.map → storeNetworkFeeSignature-Buk4091C.cjs.map} +1 -1
  144. package/dist/chunks/time-Sa5gggPG.js +24 -0
  145. package/dist/chunks/{time-QPeEEEnQ.js.map → time-Sa5gggPG.js.map} +1 -1
  146. package/dist/chunks/{token-addresses-FKpA3uc4.js → token-addresses-D0v5cR1j.js} +174 -163
  147. package/dist/chunks/{token-addresses-FKpA3uc4.js.map → token-addresses-D0v5cR1j.js.map} +1 -1
  148. package/dist/chunks/{token-addresses-DRBecUa7.cjs → token-addresses-nzvTOi24.cjs} +2 -2
  149. package/dist/chunks/{token-addresses-DRBecUa7.cjs.map → token-addresses-nzvTOi24.cjs.map} +1 -1
  150. package/dist/chunks/{tokens-D_HeVB5p.cjs → tokens-BkvA0Gp1.cjs} +2 -2
  151. package/dist/chunks/{tokens-D_HeVB5p.cjs.map → tokens-BkvA0Gp1.cjs.map} +1 -1
  152. package/dist/chunks/{tokens-C6qZHzph.js → tokens-DgC1hfkm.js} +18 -18
  153. package/dist/chunks/{tokens-C6qZHzph.js.map → tokens-DgC1hfkm.js.map} +1 -1
  154. package/dist/chunks/{unstakeLBTC-H0zdYQa6.cjs → unstakeLBTC-CmoCaGX9.cjs} +2 -2
  155. package/dist/chunks/{unstakeLBTC-H0zdYQa6.cjs.map → unstakeLBTC-CmoCaGX9.cjs.map} +1 -1
  156. package/dist/chunks/{unstakeLBTC-DAIR9NO_.js → unstakeLBTC-DtvVbpbU.js} +50 -50
  157. package/dist/chunks/{unstakeLBTC-DAIR9NO_.js.map → unstakeLBTC-DtvVbpbU.js.map} +1 -1
  158. package/dist/chunks/{withdraw-hHueI2p7.js → withdraw-DgjuaUN3.js} +45 -45
  159. package/dist/chunks/{withdraw-hHueI2p7.js.map → withdraw-DgjuaUN3.js.map} +1 -1
  160. package/dist/chunks/{withdraw-C1fMFSwy.cjs → withdraw-i0AueZ_C.cjs} +2 -2
  161. package/dist/chunks/{withdraw-C1fMFSwy.cjs.map → withdraw-i0AueZ_C.cjs.map} +1 -1
  162. package/dist/common/constants.d.ts +1 -0
  163. package/dist/common/constants.d.ts.map +1 -1
  164. package/dist/contracts.cjs +1 -1
  165. package/dist/contracts.js +16 -16
  166. package/dist/core/assets/catalog.d.ts.map +1 -1
  167. package/dist/core.cjs +1 -1
  168. package/dist/core.js +85 -85
  169. package/dist/debug.js +4 -4
  170. package/dist/defi.cjs +1 -1
  171. package/dist/defi.js +10 -10
  172. package/dist/evm.cjs +1 -1
  173. package/dist/evm.js +34 -34
  174. package/dist/index.cjs +1 -1
  175. package/dist/index.d.ts +2 -1
  176. package/dist/index.d.ts.map +1 -1
  177. package/dist/index.js +287 -283
  178. package/dist/index.js.map +1 -1
  179. package/dist/metrics.cjs +1 -1
  180. package/dist/metrics.js +6 -6
  181. package/dist/stories/arg-types.d.ts +1 -0
  182. package/dist/stories/arg-types.d.ts.map +1 -1
  183. package/dist/tokens/token-addresses.d.ts +2 -2
  184. package/dist/tokens/token-addresses.d.ts.map +1 -1
  185. package/dist/utils/chain.d.ts +7 -0
  186. package/dist/utils/chain.d.ts.map +1 -1
  187. package/dist/utils.cjs +1 -1
  188. package/dist/utils.js +76 -76
  189. package/dist/vaults.cjs +1 -1
  190. package/dist/vaults.js +14 -14
  191. package/package.json +19 -6
  192. package/dist/chunks/BtcActions-XbVRQEcM.cjs +0 -2
  193. package/dist/chunks/BtcActions-XbVRQEcM.cjs.map +0 -1
  194. package/dist/chunks/BtcActions-k-qs1uO0.js.map +0 -1
  195. package/dist/chunks/EvmActions-BVzQ3fLK.cjs +0 -2
  196. package/dist/chunks/EvmActions-BVzQ3fLK.cjs.map +0 -1
  197. package/dist/chunks/EvmActions-B_dF42So.js.map +0 -1
  198. package/dist/chunks/ReferralsClient-BC-1wT1q.cjs +0 -2
  199. package/dist/chunks/ReferralsClient-BC-1wT1q.cjs.map +0 -1
  200. package/dist/chunks/ReferralsClient-DbFWWtVi.js.map +0 -1
  201. package/dist/chunks/approveLBTC-B5-ZWqct.js +0 -26
  202. package/dist/chunks/constants-BBK-JNcY.cjs +0 -2
  203. package/dist/chunks/constants-BBK-JNcY.cjs.map +0 -1
  204. package/dist/chunks/constants-CuT4axsy.js +0 -5
  205. package/dist/chunks/constants-CuT4axsy.js.map +0 -1
  206. package/dist/chunks/events-DdV_xi-2.js.map +0 -1
  207. package/dist/chunks/events-DqIJRzJo.cjs +0 -2
  208. package/dist/chunks/events-DqIJRzJo.cjs.map +0 -1
  209. package/dist/chunks/evm-by-btc-address-CwLiENtM.js +0 -39
  210. package/dist/chunks/fee-requirements-x8-8mpJ7.js +0 -14
  211. package/dist/chunks/get-exchange-ratio-NtnkG1kZ.js +0 -20
  212. package/dist/chunks/get-vault-withdrawals-BrpZlt6s.js +0 -161
  213. package/dist/chunks/getUserStakeAndBakeSignature-BxRq2cI1.cjs +0 -2
  214. package/dist/chunks/getUserStakeAndBakeSignature-BxRq2cI1.cjs.map +0 -1
  215. package/dist/chunks/getUserStakeAndBakeSignature-NGGblnJl.js +0 -120
  216. package/dist/chunks/getUserStakeAndBakeSignature-NGGblnJl.js.map +0 -1
  217. package/dist/chunks/lbtc-addresses-BLRmtR3c.js +0 -10
  218. package/dist/chunks/numbers-CM-lcmt4.js +0 -15
  219. package/dist/chunks/parameters-CDV-6Hk5.js +0 -11
  220. package/dist/chunks/satoshi-Ch6y8aYG.js +0 -19
  221. package/dist/chunks/statusConstants-BLiNBT6s.cjs +0 -2
  222. package/dist/chunks/statusConstants-BLiNBT6s.cjs.map +0 -1
  223. package/dist/chunks/statusConstants-DFxMrVob.js.map +0 -1
  224. package/dist/chunks/time-QPeEEEnQ.js +0 -24
@@ -1 +0,0 @@
1
- {"version":3,"file":"ReferralsClient-DbFWWtVi.js","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 tokenAddress = getSolanaTokenAddress(chainId, env);\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 // 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 /** True if the record originates from the Native Deposits API. */\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","getSolanaTokenAddress","isStarknetChainId","getStarknetTokenAddress","addresses","a","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","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","_c","_b","TOKEN_ADDRESSES","getUnstakesByAddress","EMPTY_SIGNATURE","storeStakeAndBakeSignature","signature","typedData","error","errorMsg","getErrorMessage","getDepositAddressReferrer","ReferralsClient","sdk"],"mappings":"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"}
@@ -1,26 +0,0 @@
1
- import { m as p, b as u } from "./tokens-C6qZHzph.js";
2
- import { U as b, o as f, a as w } from "./token-addresses-FKpA3uc4.js";
3
- import { t as T } from "./satoshi-Ch6y8aYG.js";
4
- async function g({
5
- account: o,
6
- spender: s,
7
- amount: e,
8
- chainId: t,
9
- provider: n,
10
- rpcUrl: r,
11
- env: i
12
- }) {
13
- const c = p({ chainId: t, rpcUrl: r }), m = b({ chainId: t, provider: n }), a = await u(f.LBTC, t, i), l = T(e).toNumber(), { request: C } = await c.simulateContract({
14
- address: a.address,
15
- account: o,
16
- chain: w[t],
17
- abi: a.abi,
18
- functionName: "approve",
19
- args: [s, BigInt(l)]
20
- });
21
- return await m.writeContract(C);
22
- }
23
- export {
24
- g as a
25
- };
26
- //# sourceMappingURL=approveLBTC-B5-ZWqct.js.map
@@ -1,2 +0,0 @@
1
- "use strict";exports.MIN_STAKE_AMOUNT_BTC=2e-4;
2
- //# sourceMappingURL=constants-BBK-JNcY.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"constants-BBK-JNcY.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -1,5 +0,0 @@
1
- const M = 2e-4;
2
- export {
3
- M
4
- };
5
- //# sourceMappingURL=constants-CuT4axsy.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"constants-CuT4axsy.js","sources":["../../src/common/constants.ts"],"sourcesContent":["export const MIN_STAKE_AMOUNT_BTC = 0.0002;\n"],"names":["MIN_STAKE_AMOUNT_BTC"],"mappings":"AAAO,MAAMA,IAAuB;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"events-DdV_xi-2.js","sources":["../../src/utils/consoleLogger.ts","../../src/utils/http.ts","../../src/client/ApiNamespace.ts","../../src/config/validation.ts","../../src/services/ApiService.ts","../../src/modules/apiModule.ts","../../src/client/createConfig.ts","../../src/chains/solana/actions/unstake/config/btc.ts","../../src/chains/solana/actions/unstake/SolanaUnstake.ts","../../src/chains/solana/SolanaActions.ts","../../src/chains/starknet/actions/unstake/config/btc.ts","../../src/chains/starknet/actions/unstake/StarknetUnstake.ts","../../src/chains/starknet/StarknetActions.ts","../../src/chains/sui/actions/unstake/config/btc.ts","../../src/chains/sui/actions/unstake/SuiUnstake.ts","../../src/chains/sui/SuiActions.ts","../../src/client/AssetNamespace.ts","../../src/client/LombardSDK.ts","../../src/client/createLombardSDK.ts","../../src/config/providers.ts","../../src/shared/events.ts"],"sourcesContent":["/**\n * Console Logger Factory\n *\n * Creates a logger that outputs to the console with configurable log levels.\n * Used when `debug: true` is set in SDK configuration.\n *\n * @module utils/consoleLogger\n */\n\nimport type { Logger } from '../shared/context/types';\n\n/**\n * Log level hierarchy (from most to least verbose)\n */\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'none';\n\n/**\n * Options for creating a console logger\n */\nexport interface ConsoleLoggerOptions {\n /**\n * Minimum log level to output\n *\n * - 'debug': All logs (most verbose)\n * - 'info': Info, warnings, and errors\n * - 'warn': Warnings and errors only\n * - 'error': Errors only\n * - 'none': No logs (silent)\n *\n * @default 'debug'\n */\n level?: LogLevel;\n\n /**\n * Prefix for all log messages\n *\n * @default '[Lombard SDK]'\n */\n prefix?: string;\n\n /**\n * Include timestamp in log messages\n *\n * @default false\n */\n timestamp?: boolean;\n}\n\nconst LOG_LEVELS: LogLevel[] = ['debug', 'info', 'warn', 'error', 'none'];\n\n/**\n * Create a console logger with configurable options\n *\n * @param options - Logger configuration options\n * @returns Logger instance that outputs to console\n *\n * @example\n * ```typescript\n * // Basic usage - log everything\n * const logger = createConsoleLogger();\n *\n * // Only warnings and errors\n * const logger = createConsoleLogger({ level: 'warn' });\n *\n * // Custom prefix with timestamp\n * const logger = createConsoleLogger({\n * prefix: '[MyApp SDK]',\n * timestamp: true,\n * });\n * ```\n */\nexport function createConsoleLogger(\n options: ConsoleLoggerOptions = {},\n): Logger {\n const { level = 'debug', prefix = '[Lombard SDK]', timestamp = false } = options;\n\n const minLevelIndex = LOG_LEVELS.indexOf(level);\n\n const shouldLog = (logLevel: LogLevel): boolean => {\n const levelIndex = LOG_LEVELS.indexOf(logLevel);\n return levelIndex >= minLevelIndex && level !== 'none';\n };\n\n const formatMessage = (msg: string): string => {\n if (timestamp) {\n const ts = new Date().toISOString();\n return `${prefix} ${ts} ${msg}`;\n }\n return `${prefix} ${msg}`;\n };\n\n const formatMeta = (meta?: Record<string, unknown>): unknown[] => {\n if (!meta || Object.keys(meta).length === 0) {\n return [];\n }\n return [meta];\n };\n\n return {\n debug(message: string, meta?: Record<string, unknown>): void {\n if (shouldLog('debug')) {\n console.debug(formatMessage(message), ...formatMeta(meta));\n }\n },\n\n info(message: string, meta?: Record<string, unknown>): void {\n if (shouldLog('info')) {\n console.info(formatMessage(message), ...formatMeta(meta));\n }\n },\n\n warn(message: string, meta?: Record<string, unknown>): void {\n if (shouldLog('warn')) {\n console.warn(formatMessage(message), ...formatMeta(meta));\n }\n },\n\n error(message: string, meta?: Record<string, unknown>): void {\n if (shouldLog('error')) {\n console.error(formatMessage(message), ...formatMeta(meta));\n }\n },\n };\n}\n\n/**\n * Create a silent logger (no-op)\n *\n * Useful for testing or when you want to suppress all logs.\n */\nexport function createSilentLogger(): Logger {\n return {\n debug: () => {},\n info: () => {},\n warn: () => {},\n error: () => {},\n };\n}\n\n\n","/**\n * HTTP Request Utilities\n *\n * Centralized HTTP request wrapper that:\n * - Adds SDK version headers to all requests\n * - Supports optional logging via Logger interface\n * - Tracks request duration for performance monitoring\n * - Provides consistent error handling\n *\n * @module utils/http\n */\n\nimport axios, { type AxiosRequestConfig, type AxiosResponse } from 'axios';\n\nimport type { Logger } from '../shared/context/types';\nimport { SDK_RUNTIME, SDK_VERSION } from '../version';\n\n/**\n * HTTP request options\n */\nexport interface HttpRequestOptions {\n /** Request URL (full URL or path if baseURL provided) */\n url: string;\n\n /** HTTP method (defaults to GET) */\n method?: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\n\n /** Base URL for the request */\n baseURL?: string;\n\n /** Query parameters */\n params?: Record<string, unknown>;\n\n /** Request body (for POST/PUT/PATCH) */\n body?: unknown;\n\n /** Additional headers */\n headers?: Record<string, string>;\n\n /** Optional logger for request/response logging */\n logger?: Logger;\n\n /** Request timeout in milliseconds (default: 30000) */\n timeout?: number;\n}\n\n/**\n * HTTP response with timing information\n */\nexport interface HttpResponse<T> {\n /** Response data */\n data: T;\n\n /** HTTP status code */\n status: number;\n\n /** Request duration in milliseconds */\n duration: number;\n\n /** Response headers */\n headers: Record<string, string>;\n}\n\n/**\n * SDK headers added to all requests\n *\n * These headers help with:\n * - Backend analytics (tracking SDK version usage)\n * - Debugging (correlating errors with SDK version)\n * - Support (identifying client environment)\n */\nexport function getSdkHeaders(): Record<string, string> {\n return {\n 'X-SDK-Version': SDK_VERSION,\n 'X-SDK-Runtime': SDK_RUNTIME,\n };\n}\n\n/**\n * Make an HTTP request with SDK headers and optional logging\n *\n * @param options - Request options\n * @returns Promise resolving to response with timing data\n *\n * @example\n * ```typescript\n * // Simple GET request\n * const { data, duration } = await httpRequest({\n * url: 'https://api.lombard.finance/deposits',\n * params: { address: '0x...' },\n * });\n *\n * // With logging\n * const { data } = await httpRequest({\n * url: '/api/v1/points',\n * baseURL: 'https://mainnet.prod.lombard.finance',\n * logger: myLogger,\n * });\n * ```\n */\nexport async function httpRequest<T = unknown>(\n options: HttpRequestOptions,\n): Promise<HttpResponse<T>> {\n const {\n url,\n method = 'GET',\n baseURL,\n params,\n body,\n headers = {},\n logger,\n timeout = 30000,\n } = options;\n\n const startTime = performance.now();\n\n // Merge SDK headers with custom headers\n const mergedHeaders = {\n ...getSdkHeaders(),\n 'Content-Type': 'application/json',\n ...headers,\n };\n\n const config: AxiosRequestConfig = {\n url,\n method,\n baseURL,\n params,\n data: body,\n headers: mergedHeaders,\n timeout,\n };\n\n // Log request if logger provided\n if (logger) {\n logger.debug('HTTP Request', {\n method,\n url: baseURL ? `${baseURL}${url}` : url,\n params,\n hasBody: !!body,\n });\n }\n\n try {\n const response: AxiosResponse<T> = await axios(config);\n const duration = performance.now() - startTime;\n\n // Log successful response\n if (logger) {\n logger.debug('HTTP Response', {\n method,\n url: baseURL ? `${baseURL}${url}` : url,\n status: response.status,\n duration: Math.round(duration),\n });\n }\n\n return {\n data: response.data,\n status: response.status,\n duration,\n headers: response.headers as Record<string, string>,\n };\n } catch (error) {\n const duration = performance.now() - startTime;\n\n // Log error\n if (logger) {\n const axiosError = axios.isAxiosError(error) ? error : null;\n logger.error('HTTP Error', {\n method,\n url: baseURL ? `${baseURL}${url}` : url,\n status: axiosError?.response?.status,\n duration: Math.round(duration),\n message: axiosError?.message || String(error),\n });\n }\n\n throw error;\n }\n}\n\n/**\n * Convenience method for GET requests\n */\nexport async function httpGet<T = unknown>(\n url: string,\n options: Omit<HttpRequestOptions, 'url' | 'method' | 'body'> = {},\n): Promise<HttpResponse<T>> {\n return httpRequest<T>({ ...options, url, method: 'GET' });\n}\n\n/**\n * Convenience method for POST requests\n */\nexport async function httpPost<T = unknown>(\n url: string,\n body?: unknown,\n options: Omit<HttpRequestOptions, 'url' | 'method' | 'body'> = {},\n): Promise<HttpResponse<T>> {\n return httpRequest<T>({ ...options, url, method: 'POST', body });\n}\n\n/**\n * Convenience method for PUT requests\n */\nexport async function httpPut<T = unknown>(\n url: string,\n body?: unknown,\n options: Omit<HttpRequestOptions, 'url' | 'method' | 'body'> = {},\n): Promise<HttpResponse<T>> {\n return httpRequest<T>({ ...options, url, method: 'PUT', body });\n}\n\n/**\n * Convenience method for DELETE requests\n */\nexport async function httpDelete<T = unknown>(\n url: string,\n options: Omit<HttpRequestOptions, 'url' | 'method' | 'body'> = {},\n): Promise<HttpResponse<T>> {\n return httpRequest<T>({ ...options, url, method: 'DELETE' });\n}\n\n","/**\n * API Namespace\n *\n * Provides convenient access to Lombard API data-fetching operations,\n * with environment pre-configured from SDK initialization.\n *\n * All API-related read operations are namespaced under `sdk.api.*`\n *\n * @example\n * ```ts\n * const sdk = new LombardSDK({ env: Env.prod, providers: {...} });\n *\n * // Fetch deposits for an address\n * const deposits = await sdk.api.deposits('0x...');\n *\n * // Fetch unstakes with options\n * const unstakes = await sdk.api.unstakes('0x...', { show_redeems: true });\n *\n * // Fetch points (defaults to current season)\n * const points = await sdk.api.points('0x...');\n *\n * // Fetch LBTC exchange rate\n * const rate = await sdk.api.exchangeRatio();\n *\n * // Get existing BTC deposit address\n * const depositAddr = await sdk.api.depositAddress('0x...', ChainId.ethereum);\n * ```\n *\n * @module client/ApiNamespace\n */\n\nimport { DEFAULT_ENV, Env } from '@lombard.finance/sdk-common';\nimport type BigNumber from 'bignumber.js';\n\nimport { getDepositBtcAddress } from '../api-functions/getDepositBtcAddress/getDepositBtcAddress';\nimport {\n type Deposit,\n getDepositsByAddress,\n} from '../api-functions/getDepositsByAddress/getDepositsByAddress';\nimport { getExchangeRatio } from '../api-functions/getLBTCExchangeRate/get-exchange-ratio';\nimport {\n getPointsByAddress,\n type IPointsByAddressSeason1,\n type IPointsByAddressSeason2,\n} from '../api-functions/getPointsByAddress/getPointsByAddress';\nimport {\n getUnstakesByAddress,\n type Unstake,\n} from '../api-functions/getUnstakesByAddress/getUnstakesByAddress';\nimport type { ChainId, SolanaChain, StarknetChainId, SuiChain } from '../common/chains';\nimport type { Token } from '../tokens/token-addresses';\nimport { Vault } from '../vaults/lib/config';\nimport {\n getVaultWithdrawals,\n getVaultWithdrawalsAllChains,\n type VaultWithdrawals\n} from '../vaults/lib/ops/get-vault-withdrawals';\n\n/* -------------------------------------------------------------------------- */\n/* Types */\n/* -------------------------------------------------------------------------- */\n\n/** Supported API versions (for future v2 migration) */\nexport type ApiVersion = 'v1' | 'v2';\n\n/** Options for fetching unstakes */\nexport interface UnstakeOptions {\n /** Include redeem operations */\n show_redeems?: boolean;\n /** Include unstake operations */\n show_unstakes?: boolean;\n /** Filter for native chain redemptions */\n to_native?: boolean;\n}\n\n/** Options for fetching exchange rate */\nexport interface ExchangeRateOptions {\n /** Chain ID (exchange rate is same for all chains, defaults to Ethereum) */\n chainId?: ChainId;\n /** Amount in satoshis to calculate exchange for */\n amount?: BigNumber.Value;\n}\n\n/** Options for fetching deposit address */\nexport interface DepositAddressOptions {\n /** Partner ID for the deposit address */\n partnerId?: string;\n /** Token type (LBTC, BTCK, BTCb) */\n token?: Token;\n}\n\n/** Destination chain types for deposit address */\nexport type DestinationChain = ChainId | SuiChain | SolanaChain | StarknetChainId;\n\n/** Options for fetching vault withdrawals */\nexport interface VaultWithdrawalsOptions {\n /** Filter by chain ID (if not provided, fetches from all chains) */\n chainId?: ChainId;\n /** Vault key (defaults to Veda) */\n vault?: Vault;\n /** Optional RPC URL override */\n rpcUrl?: string;\n}\n\n/* -------------------------------------------------------------------------- */\n/* ApiNamespace */\n/* -------------------------------------------------------------------------- */\n\n/**\n * API Namespace Class\n *\n * Provides convenient wrappers around Lombard API functions with\n * environment pre-bound from SDK configuration.\n *\n * Designed for easy migration to API v2 when available (January 2025).\n */\nexport class ApiNamespace {\n /**\n * Internal API version flag for future v2 migration.\n * When v2 is ready, we can switch implementations transparently.\n */\n private readonly apiVersion: ApiVersion = 'v1';\n\n constructor(private readonly env: Env = DEFAULT_ENV) {}\n\n /* -------------------------------------------------------------------------- */\n /* Deposits */\n /* -------------------------------------------------------------------------- */\n\n /**\n * Fetch all deposits for an address.\n *\n * Returns deposits from both Direct BTC Deposits and Native Deposits APIs,\n * unified into a single list sorted by block time (newest first).\n *\n * @param address - The EVM/BTC address to fetch deposits for\n * @returns Promise resolving to array of Deposit objects\n *\n * @example\n * ```ts\n * const deposits = await sdk.api.deposits('0x1234...');\n * deposits.forEach(d => {\n * console.log(`${d.amount} BTC deposited at block ${d.blockHeight}`);\n * });\n * ```\n */\n async deposits(address: string): Promise<Deposit[]> {\n // Future: if (this.apiVersion === 'v2') return this.depositsV2(address);\n return getDepositsByAddress({ address, env: this.env });\n }\n\n /* -------------------------------------------------------------------------- */\n /* Unstakes */\n /* -------------------------------------------------------------------------- */\n\n /**\n * Fetch all unstakes/redemptions for an address.\n *\n * Returns unstake records for both direct BTC unstakes and\n * native blockchain redemptions.\n *\n * @param address - The address that initiated the unstakes\n * @param options - Optional filters (show_redeems, show_unstakes, to_native)\n * @returns Promise resolving to array of Unstake objects\n *\n * @example\n * ```ts\n * // Get all unstakes\n * const unstakes = await sdk.api.unstakes('0x1234...');\n *\n * // Get only native chain redemptions\n * const redeems = await sdk.api.unstakes('0x1234...', { to_native: true });\n * ```\n */\n async unstakes(address: string, options?: UnstakeOptions): Promise<Unstake[]> {\n // Future: if (this.apiVersion === 'v2') return this.unstakesV2(address, options);\n return getUnstakesByAddress({ address, env: this.env, options });\n }\n\n /* -------------------------------------------------------------------------- */\n /* Points */\n /* -------------------------------------------------------------------------- */\n\n /**\n * Fetch Lux points for an address (Season 1).\n *\n * @param address - The wallet address\n * @param season - Season number (1)\n * @returns Promise resolving to Season 1 points breakdown\n */\n async points(\n address: string,\n season: 1,\n ): Promise<IPointsByAddressSeason1>;\n\n /**\n * Fetch Lux points for an address (Season 2).\n *\n * @param address - The wallet address\n * @param season - Season number (2)\n * @returns Promise resolving to Season 2 points breakdown\n */\n async points(\n address: string,\n season: 2,\n ): Promise<IPointsByAddressSeason2>;\n\n /**\n * Fetch Lux points for an address (defaults to current season).\n *\n * @param address - The wallet address\n * @param season - Optional season number (defaults to current)\n * @returns Promise resolving to points breakdown\n *\n * @example\n * ```ts\n * // Get current season points\n * const points = await sdk.api.points('0x1234...');\n * console.log(`Total: ${points.totalPoints}, Holding: ${points.holdingPoints}`);\n *\n * // Get Season 1 points\n * const s1 = await sdk.api.points('0x1234...', 1);\n * ```\n */\n async points(\n address: string,\n season?: number,\n ): Promise<IPointsByAddressSeason1 | IPointsByAddressSeason2>;\n\n async points(\n address: string,\n season?: number,\n ): Promise<IPointsByAddressSeason1 | IPointsByAddressSeason2> {\n // Future: if (this.apiVersion === 'v2') return this.pointsV2(address, season);\n return getPointsByAddress({ address, env: this.env, season });\n }\n\n /* -------------------------------------------------------------------------- */\n /* Token Exchange Ratios */\n /* -------------------------------------------------------------------------- */\n\n /**\n * Fetch the current exchange ratios for all supported tokens.\n *\n * Returns Token:BTC and BTC:Token ratios for LBTC and other supported tokens.\n * This is the recommended method for getting exchange rate information.\n *\n * @returns Promise resolving to exchange ratio info for each token\n *\n * @example\n * ```ts\n * const ratios = await sdk.api.exchangeRatio();\n *\n * // Access LBTC ratios\n * const lbtcRatio = ratios.LBTC;\n * console.log(`LBTC:BTC = ${lbtcRatio.tokenBTCRatio}`); // How many LBTC per 1 BTC\n * console.log(`BTC:LBTC = ${lbtcRatio.BTCTokenRatio}`); // How many BTC per 1 LBTC\n * ```\n */\n async exchangeRatio() {\n return getExchangeRatio({ env: this.env });\n }\n\n /* -------------------------------------------------------------------------- */\n /* Deposit Address */\n /* -------------------------------------------------------------------------- */\n\n /**\n * Get an existing BTC deposit address for a recipient.\n *\n * Returns the most recent non-deprecated deposit address for the\n * given recipient address and destination chain.\n *\n * @param address - The destination address where LBTC will be claimed\n * @param chainId - The destination chain\n * @param options - Optional partner ID and token type\n * @returns Promise resolving to the BTC deposit address\n * @throws Error if no deposit address found\n *\n * @example\n * ```ts\n * try {\n * const btcAddr = await sdk.api.depositAddress('0x1234...', ChainId.ethereum);\n * console.log(`Send BTC to: ${btcAddr}`);\n * } catch (e) {\n * console.log('No deposit address found - need to generate one');\n * }\n * ```\n */\n async depositAddress(\n address: string,\n chainId: DestinationChain,\n options?: DepositAddressOptions,\n ): Promise<string> {\n // Future: if (this.apiVersion === 'v2') return this.depositAddressV2(address, chainId, options);\n return getDepositBtcAddress({\n address,\n chainId,\n env: this.env,\n partnerId: options?.partnerId,\n token: options?.token,\n });\n }\n\n /* -------------------------------------------------------------------------- */\n /* Vault Withdrawals */\n /* -------------------------------------------------------------------------- */\n\n /**\n * Fetch all vault withdrawals for an address.\n *\n * Returns withdrawal objects categorized by status (cancelled, expired,\n * fulfilled, open). If chainId is not provided, fetches from all supported chains.\n *\n * @param address - The address to fetch withdrawals for\n * @param options - Optional filters (chainId, vault, rpcUrl)\n * @returns Promise resolving to categorized vault withdrawals\n *\n * @example\n * ```ts\n * // Get all withdrawals from all chains\n * const result = await sdk.api.vaultWithdrawals('0x1234...');\n * console.log(`Open: ${result.open.length}, Fulfilled: ${result.fulfilled.length}`);\n *\n * // Filter by specific chain\n * const ethereumOnly = await sdk.api.vaultWithdrawals('0x1234...', {\n * chainId: ChainId.ethereum,\n * });\n *\n * // Display withdrawal info\n * result.open.forEach(w => {\n * console.log(`Amount: ${w.shareAmount.toFixed()}, Deadline: ${new Date(w.deadline * 1000)}`);\n * });\n * ```\n */\n async vaultWithdrawals(\n address: string,\n options?: VaultWithdrawalsOptions,\n ): Promise<VaultWithdrawals> {\n const account = address as `0x${string}`;\n const vaultKey = options?.vault ?? Vault.Veda;\n\n if (options?.chainId) {\n // Fetch from specific chain\n return getVaultWithdrawals({\n account,\n chainId: options.chainId,\n vaultKey,\n rpcUrl: options.rpcUrl,\n env: this.env,\n });\n }\n\n // Fetch from all chains\n return getVaultWithdrawalsAllChains({\n account,\n vaultKey,\n rpcUrl: options?.rpcUrl,\n });\n }\n\n /* -------------------------------------------------------------------------- */\n /* Utility Methods */\n /* -------------------------------------------------------------------------- */\n\n /**\n * Get the current API version being used.\n *\n * @returns The API version string ('v1' or 'v2')\n */\n getApiVersion(): ApiVersion {\n return this.apiVersion;\n }\n}\n\n","/**\n * Configuration validation and defaults\n *\n * This module provides validation and default application for SDK configuration.\n */\n\nimport { LombardError } from '../shared/errors';\nimport type { CreateConfigOptions, LombardConfig } from './types';\n\n/**\n * Normalized options after validation (before modules/logger are added)\n * @internal\n */\nexport type NormalizedOptions = Omit<LombardConfig, 'modules' | 'logger'>;\n\n/**\n * Validate and apply defaults to SDK options\n *\n * @param options - User-provided SDK options\n * @returns Validated and normalized options (catalog added separately)\n * @throws LombardError if configuration is invalid\n * @internal\n */\nexport function validateAndApplyDefaults(\n options: CreateConfigOptions,\n): NormalizedOptions {\n // Validate environment\n if (!options.env) {\n throw LombardError.missingParameter('env');\n }\n\n // Build normalized options with defaults\n const normalized: NormalizedOptions = {\n env: options.env,\n providers: options.providers || {},\n };\n\n // Add partner config if provided\n if (options.partner) {\n validatePartnerConfig(options.partner);\n normalized.partner = options.partner;\n }\n\n return normalized;\n}\n\n/**\n * Validate partner configuration\n *\n * @param partner - Partner configuration to validate\n * @throws LombardError if configuration is invalid\n */\nfunction validatePartnerConfig(partner: unknown): void {\n if (typeof partner !== 'object' || partner === null) {\n throw LombardError.invalidConfiguration(\n 'Partner configuration must be an object',\n );\n }\n\n const config = partner as { partnerId?: string };\n\n if (!config.partnerId || typeof config.partnerId !== 'string') {\n throw LombardError.missingParameter('partner.partnerId');\n }\n\n if (config.partnerId.trim().length === 0) {\n throw LombardError.invalidConfiguration('Partner ID cannot be empty');\n }\n}\n","/**\n * API Service\n *\n * Provides Lombard backend API operations for internal use by actions.\n * Returns minimal types defined in sdk-common.\n *\n * For public APIs with full types, use the exported functions in api-functions/\n * or the SDK namespace methods.\n *\n * @module services/ApiService\n */\n\nimport type { Env } from '@lombard.finance/sdk-common';\nimport type {\n ApiService as IApiService,\n DepositInfo,\n FeeSignatureResult,\n GenerateDepositAddressParams,\n GetDepositAddressParams,\n GetFeeSignatureParams,\n StoreFeeSignatureParams,\n StoreStakeAndBakeParams,\n} from '@lombard.finance/sdk-common';\n\nimport { generateDepositBtcAddress } from '../api-functions/generateDepositBtcAddress/generateDepositBtcAddress';\nimport { getDepositBtcAddress } from '../api-functions/getDepositBtcAddress/getDepositBtcAddress';\nimport { getDepositsByAddress } from '../api-functions/getDepositsByAddress/getDepositsByAddress';\nimport { getNetworkFeeSignature } from '../api-functions/getNetworkFeeSignature/getNetworkFeeSignature';\nimport { storeNetworkFeeSignature } from '../api-functions/storeNetworkFeeSignature/storeNetworkFeeSignature';\nimport { storeStakeAndBakeSignature } from '../api-functions/storeStakeAndBakeSignature/storeStakeAndBakeSignature';\nimport type {\n ChainId,\n SolanaChain,\n StarknetChainId,\n SuiChain,\n} from '../common/chains';\nimport { Token } from '../tokens/token-addresses';\n\ntype DestChainId = ChainId | SolanaChain | SuiChain | StarknetChainId;\n\n/**\n * API Service\n *\n * Implementation of the ApiService interface from sdk-common.\n * Wraps low-level API functions for use by actions.\n *\n * @remarks\n * This service returns minimal types (DepositInfo) suitable for internal use.\n * For full deposit details, use getDepositsByAddress() directly.\n */\nexport class ApiService implements IApiService {\n constructor(private readonly env: Env) {}\n\n /**\n * Generate a new BTC deposit address\n */\n async generateDepositAddress(\n params: GenerateDepositAddressParams,\n ): Promise<string> {\n return generateDepositBtcAddress({\n address: params.address,\n chainId: params.chainId as DestChainId,\n signature: params.signature,\n token: params.token as Token,\n eip712Data: params.eip712Data,\n signatureData: params.signatureData,\n pubKey: params.pubKey,\n env: this.env,\n partnerId: params.partnerId,\n referrerCode: params.referrerCode,\n captchaToken: params.captchaToken,\n });\n }\n\n /**\n * Get existing deposit address for a recipient\n */\n async getDepositAddress(\n params: GetDepositAddressParams,\n ): Promise<string | undefined> {\n try {\n const address = await getDepositBtcAddress({\n address: params.address,\n chainId: params.chainId as DestChainId,\n token: params.token as Token,\n env: this.env,\n partnerId: params.partnerId,\n });\n return address || undefined;\n } catch {\n // No address found\n return undefined;\n }\n }\n\n /**\n * Get deposits for an address\n */\n async getDeposits(address: string): Promise<DepositInfo[]> {\n const deposits = await getDepositsByAddress({\n address,\n env: this.env,\n });\n\n return deposits.map(d => ({\n depositAddress: d.depositAddress ?? '',\n blockHeight: d.blockHeight,\n isClaimed: d.isClaimed,\n txid: d.txHash,\n amount: d.amount?.toString(),\n }));\n }\n\n /**\n * Store network fee signature\n */\n async storeFeeSignature(params: StoreFeeSignatureParams): Promise<void> {\n await storeNetworkFeeSignature({\n address: params.address,\n signature: params.signature,\n typedData: params.typedData,\n env: this.env,\n tokenAddress: params.tokenAddress,\n });\n }\n\n /**\n * Get stored network fee signature\n */\n async getFeeSignature(\n params: GetFeeSignatureParams,\n ): Promise<FeeSignatureResult> {\n return getNetworkFeeSignature({\n address: params.address,\n chainId: params.chainId as ChainId,\n env: this.env,\n tokenAddress: params.tokenAddress,\n });\n }\n\n /**\n * Store stake and bake signature\n */\n async storeStakeAndBakeSignature(\n params: StoreStakeAndBakeParams,\n ): Promise<void> {\n await storeStakeAndBakeSignature({\n signature: params.signature,\n typedData: params.typedData,\n env: this.env,\n });\n }\n}\n","/**\n * API Module\n *\n * Provides Lombard backend API service for internal use by actions.\n * Uses Service-First pattern: module is a thin factory that instantiates the service.\n *\n * Note: This is an internal service for dependency injection into actions.\n * For public APIs, use the SDK namespace methods (e.g., sdk.deposits.getByAddress())\n * which call the underlying functions directly and return rich types.\n *\n * @module modules/apiModule\n */\n\nimport type {\n ApiService as IApiService,\n SdkModule,\n} from '@lombard.finance/sdk-common';\n\nimport { ApiService } from '../services/ApiService';\n\n/**\n * Create API module\n *\n * Internal module that provides ApiService. 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 deposits = await sdk.api.deposits('0x...');\n * ```\n */\nexport function apiModule(): SdkModule<'api', IApiService> {\n return {\n id: 'api',\n register(ctx) {\n return new ApiService(ctx.env);\n },\n };\n}\n\n// Re-export service class and interface type\nexport { ApiService };\nexport type { IApiService as ApiServiceInterface };\nexport type {\n DepositInfo,\n GenerateDepositAddressParams,\n GetDepositAddressParams,\n} from '@lombard.finance/sdk-common';\n","import type { AnyModule, ProviderKey } from '@lombard.finance/sdk-common';\n\nimport type { CreateConfigOptions, LombardConfig } from '../config/types';\nimport { validateAndApplyDefaults } from '../config/validation';\nimport { apiModule } from '../modules/apiModule';\nimport { btcModule } from '../modules/btcModule';\nimport { evmModule } from '../modules/evmModule';\nimport { LombardError } from '../shared/errors';\nimport { createConsoleLogger } from '../utils/consoleLogger';\n\nfunction mergeModules(provided: readonly AnyModule[] | undefined): AnyModule[] {\n const modules = new Map<string, AnyModule>();\n const builtIns: AnyModule[] = [btcModule(), evmModule(), apiModule()];\n for (const mod of builtIns) {\n modules.set(mod.id, mod);\n }\n if (provided) {\n for (const mod of provided) {\n modules.set(mod.id, mod);\n }\n }\n return Array.from(modules.values());\n}\n\nfunction ensureProviders(\n modules: readonly AnyModule[],\n config: Pick<LombardConfig, 'providers'>,\n): void {\n for (const mod of modules) {\n for (const key of mod.requiresProviders ?? []) {\n if (!hasProvider(config, key)) {\n throw LombardError.providerMissing(key, key);\n }\n }\n }\n}\n\nfunction hasProvider(\n config: Pick<LombardConfig, 'providers'>,\n key: ProviderKey,\n): boolean {\n return Boolean(config.providers?.[key]);\n}\n\n/**\n * Create SDK configuration\n *\n * This is a **synchronous** function that validates options and returns\n * a configuration object. The config can be exported from a module and\n * passed around as a plain object.\n *\n * The asset catalog is NOT fetched here - it's fetched asynchronously\n * when createLombardSDK() is called. This keeps config creation simple\n * and predictable.\n *\n * @param options - Configuration options\n * @returns Validated SDK configuration\n *\n * @example\n * ```typescript\n * // lib/lombard.ts - Config is sync, can be exported directly\n * export const config = createConfig({\n * env: Env.prod,\n * providers: { evm: () => window.ethereum },\n * });\n *\n * // Usage - SDK creation is async\n * import { config } from './lib/lombard';\n * const sdk = await createLombardSDK(config);\n * ```\n */\nexport function createConfig(options: CreateConfigOptions): LombardConfig {\n const normalized = validateAndApplyDefaults(options);\n const modules = mergeModules(\n options.modules as readonly AnyModule[] | undefined,\n );\n ensureProviders(modules, normalized);\n\n // Resolve logger: explicit logger > debug mode > undefined\n let logger = options.logger;\n if (!logger && options.debug) {\n logger = createConsoleLogger({ level: 'debug' });\n }\n\n return {\n ...normalized,\n modules,\n logger,\n };\n}\n","/**\n * BTC Destination Configuration for Solana Unstake\n *\n * Handles unstaking LBTC from Solana to BTC on Bitcoin.\n *\n * @module chains/solana/actions/unstake/config/btc\n */\n\nimport { Env } from '@lombard.finance/sdk-common';\n\nimport { Chain } from '../../../../../core';\nimport { bitcoinAddressSchema } from '../../../../../shared/validation';\nimport type { ChainConfig } from './types';\n\n/**\n * Solana → BTC configuration\n *\n * Burns LBTC on Solana, releases BTC on Bitcoin network.\n */\nexport const solanaToBtcConfig: ChainConfig = {\n chainType: 'solana',\n\n routes: [\n // Production: Solana Mainnet → Bitcoin Mainnet\n {\n sourceChains: [Chain.SOLANA_MAINNET],\n destChain: Chain.BITCOIN_MAINNET,\n envs: [Env.prod],\n },\n // Testnet: Solana Devnet → Bitcoin Signet\n {\n sourceChains: [Chain.SOLANA_DEVNET],\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 * Check if unstake to BTC is supported from this Solana chain\n */\nexport function isBtcUnstakeSupported(sourceChain: Chain, env: Env): boolean {\n return solanaToBtcConfig.routes.some(\n route =>\n route.sourceChains.includes(sourceChain) && route.envs.includes(env),\n );\n}\n","/**\n * Solana Unstake Action\n *\n * Burns LBTC on Solana and releases BTC on Bitcoin.\n *\n * @module chains/solana/actions/unstake/SolanaUnstake\n */\n\nimport type { Env } from '@lombard.finance/sdk-common';\nimport { z } from 'zod';\n\nimport { StepStatus } from '../../../../core';\nimport { BaseAction } from '../../../../shared/actions/BaseAction';\nimport { NonEvmUnstakeStatus } from '../../../../shared/constants/statusConstants';\nimport type { SolanaCoreContext } from '../../../../shared/context';\nimport { LombardError } from '../../../../shared/errors';\nimport type { UnstakeEventMap } from '../../../../shared/events';\nimport {\n amountSchema,\n validatePrepareParams,\n} from '../../../../shared/validation';\nimport { toSatoshi } from '../../../../utils/satoshi';\nimport { isBtcUnstakeSupported,solanaToBtcConfig } from './config';\nimport type {\n ISolanaUnstake,\n SolanaUnstakeParams,\n SolanaUnstakePrepareParams,\n} from './types';\n\n/**\n * Map environment to Solana network\n */\nfunction envToSolanaNetwork(env: Env): string {\n switch (env) {\n case 'prod':\n return 'mainnet-beta';\n case 'testnet':\n return 'testnet';\n case 'stage':\n case 'dev':\n case 'ibc':\n default:\n return 'devnet';\n }\n}\n\nexport class SolanaUnstake\n extends BaseAction<UnstakeEventMap, NonEvmUnstakeStatus>\n implements ISolanaUnstake\n{\n private _amount?: string;\n private _recipient?: string;\n private _txHash?: string;\n private readonly env: Env;\n\n constructor(\n private readonly ctx: SolanaCoreContext,\n private readonly params: SolanaUnstakeParams,\n ) {\n super(NonEvmUnstakeStatus.IDLE);\n this.env = ctx.env;\n\n // Validate route is supported\n if (!isBtcUnstakeSupported(params.sourceChain, this.env)) {\n throw LombardError.routeNotFound({\n assetOut: params.assetOut,\n sourceChain: params.sourceChain,\n destChain: params.destChain,\n env: this.env,\n });\n }\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 async prepare(params: SolanaUnstakePrepareParams): Promise<void> {\n this.assertStatus(NonEvmUnstakeStatus.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.emitProgress({\n status: NonEvmUnstakeStatus.READY,\n steps: { burning: StepStatus.IDLE, releasing: StepStatus.IDLE },\n });\n }, NonEvmUnstakeStatus.READY);\n }\n\n async execute(): Promise<{ txHash: string }> {\n this.assertStatus(NonEvmUnstakeStatus.READY, 'execute');\n\n return this.act(async () => {\n const amount = this._amount;\n const recipient = this._recipient;\n\n if (!amount || !recipient) {\n throw LombardError.missingParameter('amount or recipient');\n }\n\n // Emit burning step\n this.emitProgress({\n status: NonEvmUnstakeStatus.READY,\n steps: { burning: StepStatus.PENDING, releasing: StepStatus.IDLE },\n });\n\n // Convert amount to base units (satoshis)\n const amountInSatoshis = toSatoshi(amount).toString();\n const network = envToSolanaNetwork(this.env);\n\n // Call the Solana service to execute unstake\n const { txHash } = await this.ctx.solana.unstake({\n amount: amountInSatoshis,\n btcAddress: recipient,\n network,\n });\n\n this._txHash = txHash;\n\n // Emit completed steps\n this.emitProgress({\n status: NonEvmUnstakeStatus.COMPLETED,\n steps: { burning: StepStatus.COMPLETE, releasing: StepStatus.PENDING },\n });\n\n this.emitCompleted();\n\n return { txHash };\n }, NonEvmUnstakeStatus.COMPLETED);\n }\n\n private get prepareSchema() {\n return z.object({\n amount: amountSchema,\n recipient: solanaToBtcConfig.recipientSchema,\n });\n }\n}\n","/**\n * Solana Actions\n *\n * Provides factory methods for Solana operations (unstake).\n *\n * Note: Solana module must be registered before using these actions.\n *\n * @example\n * ```typescript\n * import { solanaActions } from '@lombard.finance/sdk';\n *\n * const solana = solanaActions(config);\n * const unstake = solana.unstake({ ... });\n * ```\n */\n\nimport type { SolanaService } from '@lombard.finance/sdk-common';\n\nimport { PartnerConfiguration } from '../../client/PartnerConfiguration';\nimport type { LombardConfig } from '../../config/types';\nimport { getProviderGetter } from '../../config/types';\nimport { CapabilityRegistry } from '../../modules/CapabilityRegistry';\nimport type { SolanaCoreContext } from '../../shared/context';\nimport { SolanaUnstake } from './actions/unstake/SolanaUnstake';\nimport type {\n ISolanaUnstake,\n SolanaUnstakeParams,\n} from './actions/unstake/types';\n\n/**\n * Create Solana core context from config\n * Only called when an action is invoked (lazy initialization)\n */\nfunction createSolanaCoreContext(config: LombardConfig): SolanaCoreContext {\n const registry = new CapabilityRegistry(config.modules, config);\n const solana = registry.require('solana') as SolanaService;\n\n return {\n env: config.env,\n partner: new PartnerConfiguration(config.partner),\n getProvider: async key => {\n const getter = getProviderGetter(config.providers, key);\n if (!getter) return undefined;\n return getter();\n },\n solana,\n };\n}\n\n/**\n * Solana Actions\n *\n * Actions are lazy-loaded - the solana module is only required when\n * an action is actually called.\n */\nexport class SolanaActions {\n private _ctx: SolanaCoreContext | null = null;\n\n constructor(private readonly config: LombardConfig) {}\n\n private get ctx(): SolanaCoreContext {\n if (!this._ctx) {\n this._ctx = createSolanaCoreContext(this.config);\n }\n return this._ctx;\n }\n\n /**\n * Unstake LBTC → BTC\n *\n * Burns LBTC on Solana and releases BTC on Bitcoin.\n *\n * @throws LombardError if solana module is not registered\n */\n unstake(params: SolanaUnstakeParams): ISolanaUnstake {\n return new SolanaUnstake(this.ctx, params);\n }\n}\n\n/**\n * Create Solana actions from config\n */\nexport function solanaActions(config: LombardConfig): SolanaActions {\n return new SolanaActions(config);\n}\n","/**\n * BTC Destination Configuration for Starknet Unstake\n *\n * Handles unstaking LBTC from Starknet to BTC on Bitcoin.\n *\n * @module chains/starknet/actions/unstake/config/btc\n */\n\nimport { Env } from '@lombard.finance/sdk-common';\n\nimport { Chain } from '../../../../../core';\nimport { bitcoinAddressSchema } from '../../../../../shared/validation';\nimport type { ChainConfig } from './types';\n\n/**\n * Starknet → BTC configuration\n */\nexport const starknetToBtcConfig: ChainConfig = {\n chainType: 'starknet',\n\n routes: [\n {\n sourceChains: [Chain.STARKNET_MAINNET],\n destChain: Chain.BITCOIN_MAINNET,\n envs: [Env.prod],\n },\n {\n sourceChains: [Chain.STARKNET_SEPOLIA],\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 * Check if unstake to BTC is supported from this Starknet chain\n */\nexport function isBtcUnstakeSupported(sourceChain: Chain, env: Env): boolean {\n return starknetToBtcConfig.routes.some(\n route =>\n route.sourceChains.includes(sourceChain) && route.envs.includes(env),\n );\n}\n","/**\n * Starknet Unstake Action\n *\n * Burns LBTC on Starknet and releases BTC on Bitcoin.\n *\n * @module chains/starknet/actions/unstake/StarknetUnstake\n */\n\nimport type { Env } from '@lombard.finance/sdk-common';\nimport { z } from 'zod';\n\nimport { StepStatus } from '../../../../core';\nimport { BaseAction } from '../../../../shared/actions/BaseAction';\nimport { NonEvmUnstakeStatus } from '../../../../shared/constants/statusConstants';\nimport type { StarknetCoreContext } from '../../../../shared/context';\nimport { LombardError } from '../../../../shared/errors';\nimport type { UnstakeEventMap } from '../../../../shared/events';\nimport {\n amountSchema,\n validatePrepareParams,\n} from '../../../../shared/validation';\nimport { isBtcUnstakeSupported,starknetToBtcConfig } from './config';\nimport type {\n IStarknetUnstake,\n StarknetUnstakeParams,\n StarknetUnstakePrepareParams,\n} from './types';\n\nexport class StarknetUnstake\n extends BaseAction<UnstakeEventMap, NonEvmUnstakeStatus>\n implements IStarknetUnstake\n{\n private _amount?: string;\n private _recipient?: string;\n private _txHash?: string;\n private readonly env: Env;\n\n constructor(\n private readonly ctx: StarknetCoreContext,\n private readonly params: StarknetUnstakeParams,\n ) {\n super(NonEvmUnstakeStatus.IDLE);\n this.env = ctx.env;\n\n if (!isBtcUnstakeSupported(params.sourceChain, this.env)) {\n throw LombardError.routeNotFound({\n assetOut: params.assetOut,\n sourceChain: params.sourceChain,\n destChain: params.destChain,\n env: this.env,\n });\n }\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 async prepare(params: StarknetUnstakePrepareParams): Promise<void> {\n this.assertStatus(NonEvmUnstakeStatus.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.emitProgress({\n status: NonEvmUnstakeStatus.READY,\n steps: { burning: StepStatus.IDLE, releasing: StepStatus.IDLE },\n });\n }, NonEvmUnstakeStatus.READY);\n }\n\n async execute(): Promise<{ txHash: string }> {\n this.assertStatus(NonEvmUnstakeStatus.READY, 'execute');\n\n return this.act(async () => {\n const amount = this._amount;\n const recipient = this._recipient;\n\n if (!amount || !recipient) {\n throw LombardError.missingParameter('amount or recipient');\n }\n\n // Emit burning step\n this.emitProgress({\n status: NonEvmUnstakeStatus.READY,\n steps: { burning: StepStatus.PENDING, releasing: StepStatus.IDLE },\n });\n\n // Call the Starknet service to execute unstake\n const { txHash } = await this.ctx.starknet.unstake({\n amount,\n btcAddress: recipient,\n env: this.env,\n });\n\n this._txHash = txHash;\n\n // Emit completed steps\n this.emitProgress({\n status: NonEvmUnstakeStatus.COMPLETED,\n steps: { burning: StepStatus.COMPLETE, releasing: StepStatus.PENDING },\n });\n\n this.emitCompleted();\n\n return { txHash };\n }, NonEvmUnstakeStatus.COMPLETED);\n }\n\n private get prepareSchema() {\n return z.object({\n amount: amountSchema,\n recipient: starknetToBtcConfig.recipientSchema,\n });\n }\n}\n","/**\n * Starknet Actions\n *\n * Provides factory methods for Starknet operations (unstake).\n *\n * Note: Starknet module must be registered before using these actions.\n *\n * @example\n * ```typescript\n * import { starknetActions } from '@lombard.finance/sdk';\n *\n * const starknet = starknetActions(config);\n * const unstake = starknet.unstake({ ... });\n * ```\n */\n\nimport type { StarknetService } from '@lombard.finance/sdk-common';\n\nimport { PartnerConfiguration } from '../../client/PartnerConfiguration';\nimport type { LombardConfig } from '../../config/types';\nimport { getProviderGetter } from '../../config/types';\nimport { CapabilityRegistry } from '../../modules/CapabilityRegistry';\nimport type { StarknetCoreContext } from '../../shared/context';\nimport { StarknetUnstake } from './actions/unstake/StarknetUnstake';\nimport type {\n IStarknetUnstake,\n StarknetUnstakeParams,\n} from './actions/unstake/types';\n\n/**\n * Create Starknet core context from config\n * Only called when an action is invoked (lazy initialization)\n */\nfunction createStarknetCoreContext(config: LombardConfig): StarknetCoreContext {\n const registry = new CapabilityRegistry(config.modules, config);\n const starknet = registry.require('starknet') as StarknetService;\n\n return {\n env: config.env,\n partner: new PartnerConfiguration(config.partner),\n getProvider: async key => {\n const getter = getProviderGetter(config.providers, key);\n if (!getter) return undefined;\n return getter();\n },\n starknet,\n };\n}\n\n/**\n * Starknet Actions\n *\n * Actions are lazy-loaded - the starknet module is only required when\n * an action is actually called.\n */\nexport class StarknetActions {\n private _ctx: StarknetCoreContext | null = null;\n\n constructor(private readonly config: LombardConfig) {}\n\n private get ctx(): StarknetCoreContext {\n if (!this._ctx) {\n this._ctx = createStarknetCoreContext(this.config);\n }\n return this._ctx;\n }\n\n /**\n * Unstake LBTC → BTC\n *\n * Burns LBTC on Starknet and releases BTC on Bitcoin.\n *\n * @throws LombardError if starknet module is not registered\n */\n unstake(params: StarknetUnstakeParams): IStarknetUnstake {\n return new StarknetUnstake(this.ctx, params);\n }\n}\n\n/**\n * Create Starknet actions from config\n */\nexport function starknetActions(config: LombardConfig): StarknetActions {\n return new StarknetActions(config);\n}\n","/**\n * BTC Destination Configuration for Sui Unstake\n *\n * Handles unstaking LBTC from Sui to BTC on Bitcoin.\n *\n * @module chains/sui/actions/unstake/config/btc\n */\n\nimport { Env } from '@lombard.finance/sdk-common';\n\nimport { Chain } from '../../../../../core';\nimport { bitcoinAddressSchema } from '../../../../../shared/validation';\nimport type { ChainConfig } from './types';\n\n/**\n * Sui → BTC configuration\n */\nexport const suiToBtcConfig: ChainConfig = {\n chainType: 'sui',\n\n routes: [\n {\n sourceChains: [Chain.SUI_MAINNET],\n destChain: Chain.BITCOIN_MAINNET,\n envs: [Env.prod],\n },\n {\n sourceChains: [Chain.SUI_TESTNET],\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 * Check if unstake to BTC is supported from this Sui chain\n */\nexport function isBtcUnstakeSupported(sourceChain: Chain, env: Env): boolean {\n return suiToBtcConfig.routes.some(\n route =>\n route.sourceChains.includes(sourceChain) && route.envs.includes(env),\n );\n}\n","/**\n * Sui Unstake Action\n *\n * Burns LBTC on Sui and releases BTC on Bitcoin.\n *\n * @module chains/sui/actions/unstake/SuiUnstake\n */\n\nimport type { Env } from '@lombard.finance/sdk-common';\nimport { z } from 'zod';\n\nimport { Chain, StepStatus } from '../../../../core';\nimport { BaseAction } from '../../../../shared/actions/BaseAction';\nimport { NonEvmUnstakeStatus } from '../../../../shared/constants/statusConstants';\nimport type { SuiCoreContext } from '../../../../shared/context';\nimport { LombardError } from '../../../../shared/errors';\nimport type { UnstakeEventMap } from '../../../../shared/events';\nimport {\n amountSchema,\n validatePrepareParams,\n} from '../../../../shared/validation';\nimport { isBtcUnstakeSupported,suiToBtcConfig } from './config';\nimport type {\n ISuiUnstake,\n SuiUnstakeParams,\n SuiUnstakePrepareParams,\n} from './types';\n\n/**\n * Get Sui chain ID from Chain constant\n */\nfunction getSuiChainId(chain: Chain): string {\n switch (chain) {\n case Chain.SUI_MAINNET:\n return 'sui:mainnet';\n case Chain.SUI_TESTNET:\n return 'sui:testnet';\n default:\n return 'sui:testnet';\n }\n}\n\nexport class SuiUnstake\n extends BaseAction<UnstakeEventMap, NonEvmUnstakeStatus>\n implements ISuiUnstake\n{\n private _amount?: string;\n private _recipient?: string;\n private _txHash?: string;\n private readonly env: Env;\n\n constructor(\n private readonly ctx: SuiCoreContext,\n private readonly params: SuiUnstakeParams,\n ) {\n super(NonEvmUnstakeStatus.IDLE);\n this.env = ctx.env;\n\n if (!isBtcUnstakeSupported(params.sourceChain, this.env)) {\n throw LombardError.routeNotFound({\n assetOut: params.assetOut,\n sourceChain: params.sourceChain,\n destChain: params.destChain,\n env: this.env,\n });\n }\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 async prepare(params: SuiUnstakePrepareParams): Promise<void> {\n this.assertStatus(NonEvmUnstakeStatus.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.emitProgress({\n status: NonEvmUnstakeStatus.READY,\n steps: { burning: StepStatus.IDLE, releasing: StepStatus.IDLE },\n });\n }, NonEvmUnstakeStatus.READY);\n }\n\n async execute(): Promise<{ txHash: string }> {\n this.assertStatus(NonEvmUnstakeStatus.READY, 'execute');\n\n return this.act(async () => {\n const amount = this._amount;\n const recipient = this._recipient;\n\n if (!amount || !recipient) {\n throw LombardError.missingParameter('amount or recipient');\n }\n\n // Emit burning step\n this.emitProgress({\n status: NonEvmUnstakeStatus.READY,\n steps: { burning: StepStatus.PENDING, releasing: StepStatus.IDLE },\n });\n\n // Get Sui chain ID from source chain\n const chainId = getSuiChainId(this.params.sourceChain);\n\n // Call the Sui service to execute unstake\n const { txHash } = await this.ctx.sui.unstake({\n amount,\n btcAddress: recipient,\n chainId,\n env: this.env,\n });\n\n this._txHash = txHash;\n\n // Emit completed steps\n this.emitProgress({\n status: NonEvmUnstakeStatus.COMPLETED,\n steps: { burning: StepStatus.COMPLETE, releasing: StepStatus.PENDING },\n });\n\n this.emitCompleted();\n\n return { txHash };\n }, NonEvmUnstakeStatus.COMPLETED);\n }\n\n private get prepareSchema() {\n return z.object({\n amount: amountSchema,\n recipient: suiToBtcConfig.recipientSchema,\n });\n }\n}\n","/**\n * Sui Actions\n *\n * Provides factory methods for Sui operations (unstake).\n *\n * Note: Sui module must be registered before using these actions.\n *\n * @example\n * ```typescript\n * import { suiActions } from '@lombard.finance/sdk';\n *\n * const sui = suiActions(config);\n * const unstake = sui.unstake({ ... });\n * ```\n */\n\nimport type { SuiService } from '@lombard.finance/sdk-common';\n\nimport { PartnerConfiguration } from '../../client/PartnerConfiguration';\nimport type { LombardConfig } from '../../config/types';\nimport { getProviderGetter } from '../../config/types';\nimport { CapabilityRegistry } from '../../modules/CapabilityRegistry';\nimport type { SuiCoreContext } from '../../shared/context';\nimport { SuiUnstake } from './actions/unstake/SuiUnstake';\nimport type { ISuiUnstake, SuiUnstakeParams } from './actions/unstake/types';\n\n/**\n * Create Sui core context from config\n * Only called when an action is invoked (lazy initialization)\n */\nfunction createSuiCoreContext(config: LombardConfig): SuiCoreContext {\n const registry = new CapabilityRegistry(config.modules, config);\n const sui = registry.require('sui') as SuiService;\n\n return {\n env: config.env,\n partner: new PartnerConfiguration(config.partner),\n getProvider: async key => {\n const getter = getProviderGetter(config.providers, key);\n if (!getter) return undefined;\n return getter();\n },\n sui,\n };\n}\n\n/**\n * Sui Actions\n *\n * Actions are lazy-loaded - the sui module is only required when\n * an action is actually called.\n */\nexport class SuiActions {\n private _ctx: SuiCoreContext | null = null;\n\n constructor(private readonly config: LombardConfig) {}\n\n private get ctx(): SuiCoreContext {\n if (!this._ctx) {\n this._ctx = createSuiCoreContext(this.config);\n }\n return this._ctx;\n }\n\n /**\n * Unstake LBTC → BTC\n *\n * Burns LBTC on Sui and releases BTC on Bitcoin.\n *\n * @throws LombardError if sui module is not registered\n */\n unstake(params: SuiUnstakeParams): ISuiUnstake {\n return new SuiUnstake(this.ctx, params);\n }\n}\n\n/**\n * Create Sui actions from config\n */\nexport function suiActions(config: LombardConfig): SuiActions {\n return new SuiActions(config);\n}\n","/**\n * Asset Namespace\n *\n * Provides type-safe access to the asset catalog bound to an environment.\n * All asset-related operations are namespaced under `sdk.assets.*`\n *\n * @example\n * ```ts\n * const sdk = createLombardSDK({ env: Env.prod });\n *\n * const address = sdk.assets.getAddress(AssetId.LBTC, Chain.ETHEREUM);\n * const decimals = sdk.assets.getDecimals(AssetId.LBTC);\n * const chains = sdk.assets.getChains(AssetId.LBTC);\n * ```\n */\n\nimport { DEFAULT_ENV, Env } from '@lombard.finance/sdk-common';\n\nimport {\n ASSET_CATALOG,\n type AssetCatalog,\n type AssetId,\n type Chain,\n getAssetAddress,\n getAssetByAddress,\n getAssetChains,\n getAssetDecimals,\n getAssetEnvironments,\n getAssetMetadata,\n getAssetRouter,\n getBridgeAdapter,\n getPublicMarketMaker,\n getSupportedAssets,\n isAssetDeployed,\n usesAssetRouter,\n} from '../core';\n\nexport class AssetNamespace {\n private readonly catalog: AssetCatalog;\n\n constructor(\n private readonly env: Env = DEFAULT_ENV,\n catalog?: AssetCatalog,\n ) {\n this.catalog = catalog ?? ASSET_CATALOG;\n }\n\n /** Get token contract address */\n getAddress(asset: AssetId, chain: Chain): string | undefined {\n return getAssetAddress(asset, this.env, chain, this.catalog);\n }\n\n /** Get token decimals */\n getDecimals(asset: AssetId): number {\n return getAssetDecimals(asset, this.catalog);\n }\n\n /** Get asset metadata (decimals, symbol, name) */\n getMetadata(asset: AssetId) {\n return getAssetMetadata(asset, this.catalog);\n }\n\n /** Check if asset uses an asset router contract */\n usesAssetRouter(asset: AssetId, chain: Chain): boolean {\n return usesAssetRouter(asset, this.env, chain, this.catalog);\n }\n\n /** Get asset router contract address */\n getAssetRouter(asset: AssetId, chain: Chain): string | undefined {\n return getAssetRouter(asset, this.env, chain, this.catalog);\n }\n\n /** Get bridge adapter address */\n getBridgeAdapter(asset: AssetId, chain: Chain): string | undefined {\n return getBridgeAdapter(asset, this.env, chain, this.catalog);\n }\n\n /** Get public market maker address */\n getPublicMarketMaker(asset: AssetId, chain: Chain): string | undefined {\n return getPublicMarketMaker(asset, this.env, chain, this.catalog);\n }\n\n /** Find asset by contract address (reverse lookup) */\n getByAddress(address: string, chain: Chain): AssetId | undefined {\n return getAssetByAddress(address, this.env, chain, this.catalog);\n }\n\n /** Check if asset is deployed on a chain */\n isDeployed(asset: AssetId, chain: Chain): boolean {\n return isAssetDeployed(asset, this.env, chain, this.catalog);\n }\n\n /** Get all chains where asset is deployed */\n getChains(asset: AssetId): Chain[] {\n return getAssetChains(asset, this.env, this.catalog);\n }\n\n /** Get all environments where asset is deployed on a chain */\n getEnvironments(asset: AssetId, chain: Chain): Env[] {\n return getAssetEnvironments(asset, chain, this.catalog);\n }\n\n /** Get all supported assets */\n getSupportedAssets(): AssetId[] {\n return getSupportedAssets(this.catalog);\n }\n\n /** Direct access to the asset catalog */\n getCatalog(): AssetCatalog {\n return this.catalog;\n }\n}\n","/**\n * Main Lombard SDK Class\n *\n * Entry point for all Lombard operations.\n *\n * @module client/LombardSDK\n */\n\nimport type { Env } from '@lombard.finance/sdk-common';\n\nimport { BtcActions } from '../chains/btc/BtcActions';\nimport { EvmActions } from '../chains/evm/EvmActions';\nimport { SolanaActions } from '../chains/solana/SolanaActions';\nimport { StarknetActions } from '../chains/starknet/StarknetActions';\nimport { SuiActions } from '../chains/sui/SuiActions';\nimport type {\n AnyProvider,\n BtcProvider,\n EvmProvider,\n SolanaProvider,\n StarknetProvider,\n SuiProvider,\n} from '../config/providers';\nimport type { ProviderGetters, ResolvedLombardConfig } from '../config/types';\nimport { getProviderGetter } from '../config/types';\nimport { CapabilityRegistry } from '../modules/CapabilityRegistry';\nimport { ReferralsClient } from '../referrals/ReferralsClient';\nimport { LombardError, ProviderErrorCode } from '../shared/errors';\nimport { ApiNamespace } from './ApiNamespace';\nimport { AssetNamespace } from './AssetNamespace';\nimport { PartnerConfiguration } from './PartnerConfiguration';\n\ntype ProviderType = keyof ProviderGetters;\ntype ProviderCache = Map<ProviderType, AnyProvider>;\n\n/**\n * Main Lombard SDK\n *\n * Provides access to all chain actions and features.\n *\n * **Important**: Use `createLombardSDK()` to create instances.\n * Direct instantiation is not recommended.\n *\n * @example\n * ```typescript\n * // Recommended: Use the async factory\n * const sdk = await createLombardSDK({\n * env: Env.prod,\n * providers: {\n * evm: (chain) => window.ethereum,\n * },\n * });\n *\n * // Access chain actions\n * const btcStake = sdk.chain.btc.stake({\n * assetOut: AssetId.LBTC,\n * destChain: Chain.ETHEREUM,\n * });\n * ```\n */\nexport class LombardSDK<E extends Env = Env> {\n readonly config: ResolvedLombardConfig;\n readonly env: Env;\n\n /** Partner configuration manager */\n private partnerConfig: PartnerConfiguration;\n\n /** Provider cache */\n private providerCache: ProviderCache = new Map();\n\n /**\n * Chain actions (user-facing API)\n *\n * Access operations for each supported chain:\n * - btc: Bitcoin operations (stake, stakeAndDeploy, deposit)\n * - evm: EVM operations (deposit, stake, unstake, deploy, redeem)\n * - solana: Solana operations (unstake)\n * - sui: Sui operations (unstake)\n * - starknet: Starknet operations (unstake)\n */\n public readonly chain: {\n btc: BtcActions;\n evm: EvmActions;\n solana: SolanaActions;\n sui: SuiActions;\n starknet: StarknetActions;\n };\n\n public readonly assets: AssetNamespace;\n\n /**\n * API namespace for data-fetching operations\n *\n * Provides convenient access to Lombard API read operations:\n * - deposits: Fetch deposit history\n * - unstakes: Fetch unstake/redemption history\n * - points: Fetch Lux points\n * - exchangeRatio: Get exchange ratios for all supported tokens\n * - depositAddress: Get existing BTC deposit address\n */\n public readonly api: ApiNamespace;\n\n /** Feature clients */\n public readonly referrals: ReferralsClient;\n\n /** Capability registry (manages optional module services) */\n public readonly capabilities: CapabilityRegistry;\n\n constructor(config: ResolvedLombardConfig) {\n this.config = config;\n this.env = config.env as E;\n\n // Initialize partner configuration\n this.partnerConfig = new PartnerConfiguration(config.partner);\n\n // Initialize capability registry (config-only, no SDK reference needed)\n this.capabilities = new CapabilityRegistry(\n this.config.modules,\n this.config,\n );\n\n // Initialize chain actions with config (not SDK)\n this.chain = {\n btc: new BtcActions(this.config),\n evm: new EvmActions(this.config),\n solana: new SolanaActions(this.config),\n sui: new SuiActions(this.config),\n starknet: new StarknetActions(this.config),\n };\n\n // Initialize feature clients\n this.referrals = new ReferralsClient(this);\n\n // Initialize asset namespace\n this.assets = new AssetNamespace(this.env);\n\n // Initialize API namespace\n this.api = new ApiNamespace(this.env);\n }\n\n /**\n * Get a provider for a specific chain type\n *\n * Providers are lazily loaded and cached.\n *\n * @param type - Provider type ('evm', 'bitcoin', etc.)\n * @returns Provider instance\n * @throws LombardError if provider not configured\n */\n async getProvider(type: 'evm'): Promise<EvmProvider>;\n async getProvider(type: 'bitcoin'): Promise<BtcProvider>;\n async getProvider(type: 'solana'): Promise<SolanaProvider>;\n async getProvider(type: 'sui'): Promise<SuiProvider>;\n async getProvider(type: 'starknet'): Promise<StarknetProvider>;\n async getProvider(type: ProviderType): Promise<AnyProvider>;\n async getProvider(type: ProviderType): Promise<AnyProvider> {\n const cacheKey = type;\n\n // Check cache first\n if (this.providerCache.has(cacheKey)) {\n return this.providerCache.get(cacheKey) as AnyProvider;\n }\n\n // Get provider getter from config using safe accessor\n const getter = getProviderGetter<AnyProvider>(this.config.providers, type);\n if (!getter) {\n throw LombardError.providerMissing(type, type);\n }\n\n // Call getter to get provider\n const provider = await getter();\n if (!provider) {\n throw new LombardError(\n ProviderErrorCode.PROVIDER_INITIALIZATION_FAILED,\n `Failed to initialize ${type} provider`,\n );\n }\n\n // Cache and return\n this.providerCache.set(cacheKey, provider);\n return provider;\n }\n\n /**\n * Configure partner settings\n *\n * @param config - Partner configuration\n */\n configure(config: Parameters<PartnerConfiguration['update']>[0]): void {\n this.partnerConfig.update(config);\n }\n\n /**\n * Register a custom asset\n *\n * TODO: Implement asset registration\n */\n registerAsset(_asset: unknown): void {\n throw new Error('Not implemented yet');\n }\n\n /**\n * Get partner configuration\n */\n getPartnerConfig(): PartnerConfiguration {\n return this.partnerConfig;\n }\n\n getPartnerId(): string | undefined {\n return this.partnerConfig.getPartnerId();\n }\n}\n","/**\n * Async factory for creating LombardSDK instances\n *\n * This is the primary entry point for the Lombard SDK.\n * It fetches the asset catalog asynchronously and initializes the SDK.\n */\n\nimport type { Env } from '@lombard.finance/sdk-common';\n\nimport type {\n CreateConfigOptions,\n LombardConfig,\n ResolvedLombardConfig,\n} from '../config/types';\nimport { ASSET_CATALOG } from '../core/assets/catalog';\nimport type { AssetCatalog } from '../core/assets/types';\nimport { createConfig } from './createConfig';\nimport { LombardSDK } from './LombardSDK';\n\n/**\n * Module-level catalog cache\n *\n * Caches the catalog promise per environment to avoid redundant fetches.\n * Multiple calls to createLombardSDK() with the same env will share\n * the same catalog fetch.\n *\n * @internal\n */\nconst catalogCache = new Map<Env, Promise<AssetCatalog>>();\n\n/**\n * Fetch asset catalog with caching\n *\n * Currently returns bundled catalog immediately.\n * Future: Will fetch from remote S3/CDN with bundled fallback.\n *\n * The catalog is cached per environment - subsequent calls with the\n * same env return the same promise, avoiding duplicate fetches.\n *\n * @internal\n */\nfunction fetchCatalogCached(env: Env): Promise<AssetCatalog> {\n if (!catalogCache.has(env)) {\n // TODO: Implement remote catalog fetching\n // When backend is ready:\n // 1. Fetch from CDN: https://cdn.lombard.finance/catalog/{env}.json\n // 2. Fallback to ASSET_CATALOG on network failure\n // 3. Cache-Control headers will define CDN TTL\n //\n // For now, return bundled catalog immediately (wrapped in Promise)\n catalogCache.set(env, Promise.resolve(ASSET_CATALOG));\n }\n return catalogCache.get(env)!;\n}\n\n/**\n * Create a LombardSDK instance\n *\n * This is an async factory that:\n * 1. Validates configuration (sync)\n * 2. Fetches the asset catalog (async, cached per env)\n * 3. Initializes the SDK with all chain actions\n *\n * The catalog is cached at the module level - multiple SDK instances\n * with the same environment share the same catalog fetch.\n *\n * @param options - SDK configuration options or pre-made LombardConfig\n * @returns Promise resolving to LombardSDK instance\n *\n * @example\n * ```typescript\n * // Option 1: Direct creation (recommended for simple cases)\n * const sdk = await createLombardSDK({\n * env: Env.prod,\n * providers: {\n * evm: () => window.ethereum,\n * bitcoin: () => bitcoinProvider,\n * },\n * });\n *\n * // Option 2: Separate config (recommended for shared config)\n * // lib/lombard.ts\n * export const config = createConfig({\n * env: Env.prod,\n * providers: { evm: () => window.ethereum },\n * });\n *\n * // app.ts\n * import { config } from './lib/lombard';\n * const sdk = await createLombardSDK(config);\n *\n * // Use the SDK\n * const stake = sdk.chain.btc.stake({\n * destChain: Chain.ETHEREUM,\n * assetOut: AssetId.LBTC,\n * });\n * ```\n */\nexport async function createLombardSDK<E extends Env = Env>(\n options: (CreateConfigOptions & { env: E }) | LombardConfig,\n): Promise<LombardSDK<E>> {\n // If already a LombardConfig (validated), use it\n // Otherwise, create config (sync validation)\n const config: LombardConfig =\n 'modules' in options && Array.isArray(options.modules)\n ? (options as LombardConfig)\n : createConfig(options as CreateConfigOptions & { env: E });\n\n // Fetch catalog (async, cached per env)\n const catalog = await fetchCatalogCached(config.env);\n\n // Create resolved config with catalog\n const resolvedConfig: ResolvedLombardConfig = {\n ...config,\n catalog,\n };\n\n return new LombardSDK<E>(resolvedConfig);\n}\n\n/**\n * Clear the catalog cache\n *\n * Useful for testing or forcing a fresh catalog fetch.\n *\n * @internal\n */\nexport function clearCatalogCache(): void {\n catalogCache.clear();\n}\n","export type {\n AnyProvider,\n BtcProvider,\n EvmProvider,\n ProviderKey,\n ProviderMap,\n SolanaProvider,\n StarknetProvider,\n SuiProvider,\n} from '@lombard.finance/sdk-common';\nimport type {\n BtcProvider,\n EvmProvider,\n SolanaProvider,\n StarknetProvider,\n SuiProvider,\n} from '@lombard.finance/sdk-common';\n\n/**\n * Type guard to check if a provider is an EVM provider\n */\nexport function isEvmProvider(provider: unknown): provider is EvmProvider {\n return (\n typeof provider === 'object' &&\n provider !== null &&\n 'request' in provider &&\n typeof (provider as EvmProvider).request === 'function'\n );\n}\n\n/**\n * Type guard to check if a provider is a Bitcoin provider\n */\nexport function isBtcProvider(provider: unknown): provider is BtcProvider {\n return (\n typeof provider === 'object' &&\n provider !== null &&\n 'getAddresses' in provider &&\n typeof (provider as BtcProvider).getAddresses === 'function'\n );\n}\n\n/**\n * Type guard to check if a provider is a Solana provider\n */\nexport function isSolanaProvider(\n provider: unknown,\n): provider is SolanaProvider {\n return (\n typeof provider === 'object' &&\n provider !== null &&\n 'publicKey' in provider &&\n 'signAndSendTransaction' in provider\n );\n}\n\n/**\n * Type guard to check if a provider is a Sui provider\n */\nexport function isSuiProvider(provider: unknown): provider is SuiProvider {\n return (\n typeof provider === 'object' &&\n provider !== null &&\n 'getAddress' in provider &&\n 'signAndExecuteTransactionBlock' in provider\n );\n}\n\n/**\n * Type guard to check if a provider is a Starknet provider\n */\nexport function isStarknetProvider(\n provider: unknown,\n): provider is StarknetProvider {\n return (\n typeof provider === 'object' &&\n provider !== null &&\n 'address' in provider &&\n 'execute' in provider\n );\n}\n","/**\n * Event definitions for all strategy types\n *\n * This module defines strongly-typed events that strategies emit\n * during their execution lifecycle.\n */\n\nimport type { StrategyProgress } from '../core/types';\nimport type { LombardError } from './errors';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Event emitter requires bivariant `any` for type-safe event handler signatures\ntype StrategyEventHandlerMap = Record<string, (...args: any[]) => void>;\n\n/**\n * Stake operation events\n *\n * Emitted by all stake strategies (BTC → LBTC, etc.)\n */\nexport const StakeEvent = {\n /** Progress update with detailed step information */\n Progress: 'progress',\n\n /** Status change (e.g., 'idle' → 'preparing' → 'ready') */\n StatusChange: 'status-change',\n\n /** Operation completed successfully */\n Completed: 'completed',\n\n /** Operation failed */\n Failed: 'failed',\n\n /** Error occurred */\n Error: 'error',\n} as const;\n\nexport type StakeEvent = (typeof StakeEvent)[keyof typeof StakeEvent];\n\n/**\n * Deposit operation events\n *\n * Emitted by all deposit strategies (EVM, etc.)\n */\nexport const DepositEvent = {\n Progress: 'progress',\n StatusChange: 'status-change',\n Completed: 'completed',\n Failed: 'failed',\n Error: 'error',\n} as const;\n\nexport type DepositEvent = (typeof DepositEvent)[keyof typeof DepositEvent];\n\n/**\n * Redeem operation events\n *\n * Emitted by all redeem strategies (cross-chain asset redemptions)\n */\nexport const RedeemEvent = {\n Progress: 'progress',\n StatusChange: 'status-change',\n Completed: 'completed',\n Failed: 'failed',\n Error: 'error',\n} as const;\n\nexport type RedeemEvent = (typeof RedeemEvent)[keyof typeof RedeemEvent];\n\n/**\n * Unstake operation events\n *\n * Emitted by all unstake strategies (LBTC → BTC or BTC.b)\n */\nexport const UnstakeEvent = {\n Progress: 'progress',\n StatusChange: 'status-change',\n Completed: 'completed',\n Failed: 'failed',\n Error: 'error',\n} as const;\n\nexport type UnstakeEvent = (typeof UnstakeEvent)[keyof typeof UnstakeEvent];\n\n/**\n * Deploy operation events\n *\n * Emitted by deploy strategies (deploying L-Assets to DeFi protocols)\n */\nexport const DeployEvent = {\n Progress: 'progress',\n StatusChange: 'status-change',\n Completed: 'completed',\n Failed: 'failed',\n Error: 'error',\n} as const;\n\nexport type DeployEvent = (typeof DeployEvent)[keyof typeof DeployEvent];\n\n/**\n * Withdraw operation events\n *\n * Emitted by withdraw strategies (withdrawing vault shares from DeFi protocols)\n */\nexport const WithdrawEvent = {\n Progress: 'progress',\n StatusChange: 'status-change',\n Completed: 'completed',\n Failed: 'failed',\n Error: 'error',\n} as const;\n\nexport type WithdrawEvent = (typeof WithdrawEvent)[keyof typeof WithdrawEvent];\n\n/**\n * Bridge operation events\n *\n * Emitted by bridge strategies (cross-chain L-Asset transfers)\n */\nexport const BridgeEvent = {\n Progress: 'progress',\n StatusChange: 'status-change',\n Completed: 'completed',\n Failed: 'failed',\n Error: 'error',\n} as const;\n\nexport type BridgeEvent = (typeof BridgeEvent)[keyof typeof BridgeEvent];\n\n/**\n * StakeAndDeploy operation events (\"Stake and Bake\")\n *\n * Emitted by stake-and-deploy strategies (BTC → LBTC → Vault in one operation)\n */\nexport const StakeAndDeployEvent = {\n Progress: 'progress',\n StatusChange: 'status-change',\n Completed: 'completed',\n Failed: 'failed',\n Error: 'error',\n} as const;\n\nexport type StakeAndDeployEvent =\n (typeof StakeAndDeployEvent)[keyof typeof StakeAndDeployEvent];\n\n/**\n * DepositAndDeploy operation events\n *\n * Emitted by deposit-and-deploy strategies (BTC → BTC.b → Vault in one operation)\n * Similar to StakeAndDeploy but produces BTC.b instead of LBTC.\n */\nexport const DepositAndDeployEvent = {\n Progress: 'progress',\n StatusChange: 'status-change',\n Completed: 'completed',\n Failed: 'failed',\n Error: 'error',\n} as const;\n\nexport type DepositAndDeployEvent =\n (typeof DepositAndDeployEvent)[keyof typeof DepositAndDeployEvent];\n\n/**\n * Event handler type mapping for stake operations\n */\nexport interface StakeEventMap extends StrategyEventHandlerMap {\n [StakeEvent.Progress]: (progress: StrategyProgress<string>) => void;\n [StakeEvent.StatusChange]: (status: string) => void;\n [StakeEvent.Completed]: () => void;\n [StakeEvent.Failed]: () => void;\n [StakeEvent.Error]: (error: LombardError) => void;\n}\n\n/**\n * Event handler type mapping for deposit operations\n */\nexport interface DepositEventMap extends StrategyEventHandlerMap {\n [DepositEvent.Progress]: (progress: StrategyProgress<string>) => void;\n [DepositEvent.StatusChange]: (status: string) => void;\n [DepositEvent.Completed]: () => void;\n [DepositEvent.Failed]: () => void;\n [DepositEvent.Error]: (error: LombardError) => void;\n}\n\n/**\n * Event handler type mapping for redeem operations\n */\nexport interface RedeemEventMap extends StrategyEventHandlerMap {\n [RedeemEvent.Progress]: (progress: StrategyProgress<string>) => void;\n [RedeemEvent.StatusChange]: (status: string) => void;\n [RedeemEvent.Completed]: () => void;\n [RedeemEvent.Failed]: () => void;\n [RedeemEvent.Error]: (error: LombardError) => void;\n}\n\n/**\n * Event handler type mapping for unstake operations\n */\nexport interface UnstakeEventMap extends StrategyEventHandlerMap {\n [UnstakeEvent.Progress]: (progress: StrategyProgress<string>) => void;\n [UnstakeEvent.StatusChange]: (status: string) => void;\n [UnstakeEvent.Completed]: () => void;\n [UnstakeEvent.Failed]: () => void;\n [UnstakeEvent.Error]: (error: LombardError) => void;\n}\n\n/**\n * Event handler type mapping for deploy operations\n */\nexport interface DeployEventMap extends StrategyEventHandlerMap {\n [DeployEvent.Progress]: (progress: StrategyProgress<string>) => void;\n [DeployEvent.StatusChange]: (status: string) => void;\n [DeployEvent.Completed]: () => void;\n [DeployEvent.Failed]: () => void;\n [DeployEvent.Error]: (error: LombardError) => void;\n}\n\n/**\n * Event handler type mapping for withdraw operations\n */\nexport interface WithdrawEventMap extends StrategyEventHandlerMap {\n [WithdrawEvent.Progress]: (progress: StrategyProgress<string>) => void;\n [WithdrawEvent.StatusChange]: (status: string) => void;\n [WithdrawEvent.Completed]: () => void;\n [WithdrawEvent.Failed]: () => void;\n [WithdrawEvent.Error]: (error: LombardError) => void;\n}\n\n/**\n * Event handler type mapping for bridge operations\n */\nexport interface BridgeEventMap extends StrategyEventHandlerMap {\n [BridgeEvent.Progress]: (progress: StrategyProgress<string>) => void;\n [BridgeEvent.StatusChange]: (status: string) => void;\n [BridgeEvent.Completed]: () => void;\n [BridgeEvent.Failed]: () => void;\n [BridgeEvent.Error]: (error: LombardError) => void;\n}\n\n/**\n * Event handler type mapping for stake-and-deploy operations\n */\nexport interface StakeAndDeployEventMap extends StrategyEventHandlerMap {\n [StakeAndDeployEvent.Progress]: (progress: StrategyProgress<string>) => void;\n [StakeAndDeployEvent.StatusChange]: (status: string) => void;\n [StakeAndDeployEvent.Completed]: () => void;\n [StakeAndDeployEvent.Failed]: () => void;\n [StakeAndDeployEvent.Error]: (error: LombardError) => void;\n}\n\n/**\n * Event handler type mapping for deposit-and-deploy operations\n */\nexport interface DepositAndDeployEventMap extends StrategyEventHandlerMap {\n [DepositAndDeployEvent.Progress]: (\n progress: StrategyProgress<string>,\n ) => void;\n [DepositAndDeployEvent.StatusChange]: (status: string) => void;\n [DepositAndDeployEvent.Completed]: () => void;\n [DepositAndDeployEvent.Failed]: () => void;\n [DepositAndDeployEvent.Error]: (error: LombardError) => void;\n}\n\n/**\n * Generic event map type for any strategy\n */\nexport type StrategyEventMap =\n | StakeEventMap\n | DepositEventMap\n | RedeemEventMap\n | UnstakeEventMap\n | DeployEventMap\n | WithdrawEventMap\n | BridgeEventMap\n | StakeAndDeployEventMap\n | DepositAndDeployEventMap;\n\n/**\n * Generic event type for any strategy\n */\nexport type StrategyEvent =\n | StakeEvent\n | DepositEvent\n | RedeemEvent\n | UnstakeEvent\n | DeployEvent\n | WithdrawEvent\n | BridgeEvent\n | StakeAndDeployEvent\n | DepositAndDeployEvent;\n"],"names":["LOG_LEVELS","createConsoleLogger","options","level","prefix","timestamp","minLevelIndex","shouldLog","logLevel","formatMessage","msg","ts","formatMeta","meta","message","createSilentLogger","getSdkHeaders","SDK_VERSION","SDK_RUNTIME","ApiNamespace","env","DEFAULT_ENV","__publicField","address","getDepositsByAddress","getUnstakesByAddress","season","getPointsByAddress","getExchangeRatio","chainId","getDepositBtcAddress","account","vaultKey","Vault","getVaultWithdrawals","getVaultWithdrawalsAllChains","validateAndApplyDefaults","LombardError","normalized","validatePartnerConfig","partner","config","ApiService","params","generateDepositBtcAddress","d","_a","storeNetworkFeeSignature","getNetworkFeeSignature","storeStakeAndBakeSignature","apiModule","ctx","mergeModules","provided","modules","builtIns","btcModule","evmModule","mod","ensureProviders","key","hasProvider","createConfig","logger","solanaToBtcConfig","Chain","Env","bitcoinAddressSchema","isBtcUnstakeSupported","sourceChain","route","envToSolanaNetwork","SolanaUnstake","BaseAction","NonEvmUnstakeStatus","validated","validatePrepareParams","StepStatus","amount","recipient","amountInSatoshis","toSatoshi","network","txHash","z.object","amountSchema","createSolanaCoreContext","solana","CapabilityRegistry","PartnerConfiguration","getter","getProviderGetter","SolanaActions","solanaActions","starknetToBtcConfig","StarknetUnstake","createStarknetCoreContext","starknet","StarknetActions","starknetActions","suiToBtcConfig","getSuiChainId","chain","SuiUnstake","createSuiCoreContext","sui","SuiActions","suiActions","AssetNamespace","catalog","ASSET_CATALOG","asset","getAssetAddress","getAssetDecimals","getAssetMetadata","usesAssetRouter","getAssetRouter","getBridgeAdapter","getPublicMarketMaker","getAssetByAddress","isAssetDeployed","getAssetChains","getAssetEnvironments","getSupportedAssets","LombardSDK","BtcActions","EvmActions","ReferralsClient","type","cacheKey","provider","ProviderErrorCode","_asset","catalogCache","fetchCatalogCached","createLombardSDK","resolvedConfig","isEvmProvider","isBtcProvider","isSolanaProvider","isSuiProvider","isStarknetProvider","StakeEvent","DepositEvent","RedeemEvent","UnstakeEvent","DeployEvent","BridgeEvent"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- "use strict";var _=Object.defineProperty;var x=(s,t,r)=>t in s?_(s,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):s[t]=r;var i=(s,t,r)=>x(s,typeof t!="symbol"?t+"":t,r);require("axios");const e=require("./statusConstants-BLiNBT6s.cjs"),L=require("./getUserStakeAndBakeSignature-BxRq2cI1.cjs"),d=require("./ReferralsClient-BC-1wT1q.cjs"),E=require("./storeNetworkFeeSignature-D7yo6lDV.cjs"),A=require("./BtcActions-XbVRQEcM.cjs"),k=require("./EvmActions-BVzQ3fLK.cjs"),T=require("./satoshi-CZEsHl5X.cjs"),o=require("./index-BKzxeh1Y.cjs"),U=require("./get-exchange-ratio-C-7DadfD.cjs"),B=require("./config-l4ZaZw_g.cjs"),C=require("./get-vault-withdrawals-CWcYy_sH.cjs"),f=["debug","info","warn","error","none"];function I(s={}){const{level:t="debug",prefix:r="[Lombard SDK]",timestamp:n=!1}=s,a=f.indexOf(t),h=c=>f.indexOf(c)>=a&&t!=="none",g=c=>{if(n){const u=new Date().toISOString();return`${r} ${u} ${c}`}return`${r} ${c}`},l=c=>!c||Object.keys(c).length===0?[]:[c];return{debug(c,u){h("debug")&&console.debug(g(c),...l(u))},info(c,u){h("info")&&console.info(g(c),...l(u))},warn(c,u){h("warn")&&console.warn(g(c),...l(u))},error(c,u){h("error")&&console.error(g(c),...l(u))}}}function M(){return{debug:()=>{},info:()=>{},warn:()=>{},error:()=>{}}}function O(){return{"X-SDK-Version":e.SDK_VERSION,"X-SDK-Runtime":e.SDK_RUNTIME}}class N{constructor(t=o.p){i(this,"apiVersion","v1");this.env=t}async deposits(t){return d.getDepositsByAddress({address:t,env:this.env})}async unstakes(t,r){return d.getUnstakesByAddress({address:t,env:this.env,options:r})}async points(t,r){return d.getPointsByAddress({address:t,env:this.env,season:r})}async exchangeRatio(){return U.getExchangeRatio({env:this.env})}async depositAddress(t,r,n){return d.getDepositBtcAddress({address:t,chainId:r,env:this.env,partnerId:n==null?void 0:n.partnerId,token:n==null?void 0:n.token})}async vaultWithdrawals(t,r){const n=t,a=(r==null?void 0:r.vault)??B.Vault.Veda;return r!=null&&r.chainId?C.getVaultWithdrawals({account:n,chainId:r.chainId,vaultKey:a,rpcUrl:r.rpcUrl,env:this.env}):C.getVaultWithdrawalsAllChains({account:n,vaultKey:a,rpcUrl:r==null?void 0:r.rpcUrl})}getApiVersion(){return this.apiVersion}}function R(s){if(!s.env)throw e.LombardError.missingParameter("env");const t={env:s.env,providers:s.providers||{}};return s.partner&&(H(s.partner),t.partner=s.partner),t}function H(s){if(typeof s!="object"||s===null)throw e.LombardError.invalidConfiguration("Partner configuration must be an object");const t=s;if(!t.partnerId||typeof t.partnerId!="string")throw e.LombardError.missingParameter("partner.partnerId");if(t.partnerId.trim().length===0)throw e.LombardError.invalidConfiguration("Partner ID cannot be empty")}class q{constructor(t){this.env=t}async generateDepositAddress(t){return L.generateDepositBtcAddress({address:t.address,chainId:t.chainId,signature:t.signature,token:t.token,eip712Data:t.eip712Data,signatureData:t.signatureData,pubKey:t.pubKey,env:this.env,partnerId:t.partnerId,referrerCode:t.referrerCode,captchaToken:t.captchaToken})}async getDepositAddress(t){try{return await d.getDepositBtcAddress({address:t.address,chainId:t.chainId,token:t.token,env:this.env,partnerId:t.partnerId})||void 0}catch{return}}async getDeposits(t){return(await d.getDepositsByAddress({address:t,env:this.env})).map(n=>{var a;return{depositAddress:n.depositAddress??"",blockHeight:n.blockHeight,isClaimed:n.isClaimed,txid:n.txHash,amount:(a=n.amount)==null?void 0:a.toString()}})}async storeFeeSignature(t){await E.storeNetworkFeeSignature({address:t.address,signature:t.signature,typedData:t.typedData,env:this.env,tokenAddress:t.tokenAddress})}async getFeeSignature(t){return E.getNetworkFeeSignature({address:t.address,chainId:t.chainId,env:this.env,tokenAddress:t.tokenAddress})}async storeStakeAndBakeSignature(t){await d.storeStakeAndBakeSignature({signature:t.signature,typedData:t.typedData,env:this.env})}}function F(){return{id:"api",register(s){return new q(s.env)}}}function G(s){const t=new Map,r=[A.btcModule(),k.evmModule(),F()];for(const n of r)t.set(n.id,n);if(s)for(const n of s)t.set(n.id,n);return Array.from(t.values())}function K(s,t){for(const r of s)for(const n of r.requiresProviders??[])if(!V(t,n))throw e.LombardError.providerMissing(n,n)}function V(s,t){var r;return!!((r=s.providers)!=null&&r[t])}function y(s){const t=R(s),r=G(s.modules);K(r,t);let n=s.logger;return!n&&s.debug&&(n=I({level:"debug"})),{...t,modules:r,logger:n}}const P={routes:[{sourceChains:[e.Chain.SOLANA_MAINNET],destChain:e.Chain.BITCOIN_MAINNET,envs:[o.r.prod]},{sourceChains:[e.Chain.SOLANA_DEVNET],destChain:e.Chain.BITCOIN_SIGNET,envs:[o.r.testnet,o.r.stage,o.r.dev,o.r.ibc]}],recipientSchema:e.bitcoinAddressSchema};function Y(s,t){return P.routes.some(r=>r.sourceChains.includes(s)&&r.envs.includes(t))}function j(s){switch(s){case"prod":return"mainnet-beta";case"testnet":return"testnet";case"stage":case"dev":case"ibc":default:return"devnet"}}class $ extends e.BaseAction{constructor(r,n){super(e.NonEvmUnstakeStatus.IDLE);i(this,"_amount");i(this,"_recipient");i(this,"_txHash");i(this,"env");if(this.ctx=r,this.params=n,this.env=r.env,!Y(n.sourceChain,this.env))throw e.LombardError.routeNotFound({assetOut:n.assetOut,sourceChain:n.sourceChain,destChain:n.destChain,env:this.env})}get amount(){return this._amount}get recipient(){return this._recipient}get txHash(){return this._txHash}async prepare(r){return this.assertStatus(e.NonEvmUnstakeStatus.IDLE,"prepare"),this.act(async()=>{const n=e.validatePrepareParams(this.prepareSchema,r,{destChain:this.params.destChain});this._amount=n.amount,this._recipient=n.recipient,this.emitProgress({status:e.NonEvmUnstakeStatus.READY,steps:{burning:e.StepStatus.IDLE,releasing:e.StepStatus.IDLE}})},e.NonEvmUnstakeStatus.READY)}async execute(){return this.assertStatus(e.NonEvmUnstakeStatus.READY,"execute"),this.act(async()=>{const r=this._amount,n=this._recipient;if(!r||!n)throw e.LombardError.missingParameter("amount or recipient");this.emitProgress({status:e.NonEvmUnstakeStatus.READY,steps:{burning:e.StepStatus.PENDING,releasing:e.StepStatus.IDLE}});const a=T.toSatoshi(r).toString(),h=j(this.env),{txHash:g}=await this.ctx.solana.unstake({amount:a,btcAddress:n,network:h});return this._txHash=g,this.emitProgress({status:e.NonEvmUnstakeStatus.COMPLETED,steps:{burning:e.StepStatus.COMPLETE,releasing:e.StepStatus.PENDING}}),this.emitCompleted(),{txHash:g}},e.NonEvmUnstakeStatus.COMPLETED)}get prepareSchema(){return e.objectType({amount:e.amountSchema,recipient:P.recipientSchema})}}function W(s){const r=new e.CapabilityRegistry(s.modules,s).require("solana");return{env:s.env,partner:new e.PartnerConfiguration(s.partner),getProvider:async n=>{const a=e.getProviderGetter(s.providers,n);if(a)return a()},solana:r}}class S{constructor(t){i(this,"_ctx",null);this.config=t}get ctx(){return this._ctx||(this._ctx=W(this.config)),this._ctx}unstake(t){return new $(this.ctx,t)}}function z(s){return new S(s)}const D={routes:[{sourceChains:[e.Chain.STARKNET_MAINNET],destChain:e.Chain.BITCOIN_MAINNET,envs:[o.r.prod]},{sourceChains:[e.Chain.STARKNET_SEPOLIA],destChain:e.Chain.BITCOIN_SIGNET,envs:[o.r.testnet,o.r.stage,o.r.dev,o.r.ibc]}],recipientSchema:e.bitcoinAddressSchema};function X(s,t){return D.routes.some(r=>r.sourceChains.includes(s)&&r.envs.includes(t))}class Z extends e.BaseAction{constructor(r,n){super(e.NonEvmUnstakeStatus.IDLE);i(this,"_amount");i(this,"_recipient");i(this,"_txHash");i(this,"env");if(this.ctx=r,this.params=n,this.env=r.env,!X(n.sourceChain,this.env))throw e.LombardError.routeNotFound({assetOut:n.assetOut,sourceChain:n.sourceChain,destChain:n.destChain,env:this.env})}get amount(){return this._amount}get recipient(){return this._recipient}get txHash(){return this._txHash}async prepare(r){return this.assertStatus(e.NonEvmUnstakeStatus.IDLE,"prepare"),this.act(async()=>{const n=e.validatePrepareParams(this.prepareSchema,r,{destChain:this.params.destChain});this._amount=n.amount,this._recipient=n.recipient,this.emitProgress({status:e.NonEvmUnstakeStatus.READY,steps:{burning:e.StepStatus.IDLE,releasing:e.StepStatus.IDLE}})},e.NonEvmUnstakeStatus.READY)}async execute(){return this.assertStatus(e.NonEvmUnstakeStatus.READY,"execute"),this.act(async()=>{const r=this._amount,n=this._recipient;if(!r||!n)throw e.LombardError.missingParameter("amount or recipient");this.emitProgress({status:e.NonEvmUnstakeStatus.READY,steps:{burning:e.StepStatus.PENDING,releasing:e.StepStatus.IDLE}});const{txHash:a}=await this.ctx.starknet.unstake({amount:r,btcAddress:n,env:this.env});return this._txHash=a,this.emitProgress({status:e.NonEvmUnstakeStatus.COMPLETED,steps:{burning:e.StepStatus.COMPLETE,releasing:e.StepStatus.PENDING}}),this.emitCompleted(),{txHash:a}},e.NonEvmUnstakeStatus.COMPLETED)}get prepareSchema(){return e.objectType({amount:e.amountSchema,recipient:D.recipientSchema})}}function J(s){const r=new e.CapabilityRegistry(s.modules,s).require("starknet");return{env:s.env,partner:new e.PartnerConfiguration(s.partner),getProvider:async n=>{const a=e.getProviderGetter(s.providers,n);if(a)return a()},starknet:r}}class p{constructor(t){i(this,"_ctx",null);this.config=t}get ctx(){return this._ctx||(this._ctx=J(this.config)),this._ctx}unstake(t){return new Z(this.ctx,t)}}function Q(s){return new p(s)}const b={routes:[{sourceChains:[e.Chain.SUI_MAINNET],destChain:e.Chain.BITCOIN_MAINNET,envs:[o.r.prod]},{sourceChains:[e.Chain.SUI_TESTNET],destChain:e.Chain.BITCOIN_SIGNET,envs:[o.r.testnet,o.r.stage,o.r.dev,o.r.ibc]}],recipientSchema:e.bitcoinAddressSchema};function tt(s,t){return b.routes.some(r=>r.sourceChains.includes(s)&&r.envs.includes(t))}function et(s){switch(s){case e.Chain.SUI_MAINNET:return"sui:mainnet";case e.Chain.SUI_TESTNET:return"sui:testnet";default:return"sui:testnet"}}class st extends e.BaseAction{constructor(r,n){super(e.NonEvmUnstakeStatus.IDLE);i(this,"_amount");i(this,"_recipient");i(this,"_txHash");i(this,"env");if(this.ctx=r,this.params=n,this.env=r.env,!tt(n.sourceChain,this.env))throw e.LombardError.routeNotFound({assetOut:n.assetOut,sourceChain:n.sourceChain,destChain:n.destChain,env:this.env})}get amount(){return this._amount}get recipient(){return this._recipient}get txHash(){return this._txHash}async prepare(r){return this.assertStatus(e.NonEvmUnstakeStatus.IDLE,"prepare"),this.act(async()=>{const n=e.validatePrepareParams(this.prepareSchema,r,{destChain:this.params.destChain});this._amount=n.amount,this._recipient=n.recipient,this.emitProgress({status:e.NonEvmUnstakeStatus.READY,steps:{burning:e.StepStatus.IDLE,releasing:e.StepStatus.IDLE}})},e.NonEvmUnstakeStatus.READY)}async execute(){return this.assertStatus(e.NonEvmUnstakeStatus.READY,"execute"),this.act(async()=>{const r=this._amount,n=this._recipient;if(!r||!n)throw e.LombardError.missingParameter("amount or recipient");this.emitProgress({status:e.NonEvmUnstakeStatus.READY,steps:{burning:e.StepStatus.PENDING,releasing:e.StepStatus.IDLE}});const a=et(this.params.sourceChain),{txHash:h}=await this.ctx.sui.unstake({amount:r,btcAddress:n,chainId:a,env:this.env});return this._txHash=h,this.emitProgress({status:e.NonEvmUnstakeStatus.COMPLETED,steps:{burning:e.StepStatus.COMPLETE,releasing:e.StepStatus.PENDING}}),this.emitCompleted(),{txHash:h}},e.NonEvmUnstakeStatus.COMPLETED)}get prepareSchema(){return e.objectType({amount:e.amountSchema,recipient:b.recipientSchema})}}function rt(s){const r=new e.CapabilityRegistry(s.modules,s).require("sui");return{env:s.env,partner:new e.PartnerConfiguration(s.partner),getProvider:async n=>{const a=e.getProviderGetter(s.providers,n);if(a)return a()},sui:r}}class m{constructor(t){i(this,"_ctx",null);this.config=t}get ctx(){return this._ctx||(this._ctx=rt(this.config)),this._ctx}unstake(t){return new st(this.ctx,t)}}function nt(s){return new m(s)}class at{constructor(t=o.p,r){i(this,"catalog");this.env=t,this.catalog=r??e.ASSET_CATALOG}getAddress(t,r){return e.getAssetAddress(t,this.env,r,this.catalog)}getDecimals(t){return e.getAssetDecimals(t,this.catalog)}getMetadata(t){return e.getAssetMetadata(t,this.catalog)}usesAssetRouter(t,r){return e.usesAssetRouter(t,this.env,r,this.catalog)}getAssetRouter(t,r){return e.getAssetRouter(t,this.env,r,this.catalog)}getBridgeAdapter(t,r){return e.getBridgeAdapter(t,this.env,r,this.catalog)}getPublicMarketMaker(t,r){return e.getPublicMarketMaker(t,this.env,r,this.catalog)}getByAddress(t,r){return e.getAssetByAddress(t,this.env,r,this.catalog)}isDeployed(t,r){return e.isAssetDeployed(t,this.env,r,this.catalog)}getChains(t){return e.getAssetChains(t,this.env,this.catalog)}getEnvironments(t,r){return e.getAssetEnvironments(t,r,this.catalog)}getSupportedAssets(){return e.getSupportedAssets(this.catalog)}getCatalog(){return this.catalog}}class w{constructor(t){i(this,"config");i(this,"env");i(this,"partnerConfig");i(this,"providerCache",new Map);i(this,"chain");i(this,"assets");i(this,"api");i(this,"referrals");i(this,"capabilities");this.config=t,this.env=t.env,this.partnerConfig=new e.PartnerConfiguration(t.partner),this.capabilities=new e.CapabilityRegistry(this.config.modules,this.config),this.chain={btc:new A.BtcActions(this.config),evm:new k.EvmActions(this.config),solana:new S(this.config),sui:new m(this.config),starknet:new p(this.config)},this.referrals=new d.ReferralsClient(this),this.assets=new at(this.env),this.api=new N(this.env)}async getProvider(t){const r=t;if(this.providerCache.has(r))return this.providerCache.get(r);const n=e.getProviderGetter(this.config.providers,t);if(!n)throw e.LombardError.providerMissing(t,t);const a=await n();if(!a)throw new e.LombardError(e.ProviderErrorCode.PROVIDER_INITIALIZATION_FAILED,`Failed to initialize ${t} provider`);return this.providerCache.set(r,a),a}configure(t){this.partnerConfig.update(t)}registerAsset(t){throw new Error("Not implemented yet")}getPartnerConfig(){return this.partnerConfig}getPartnerId(){return this.partnerConfig.getPartnerId()}}const v=new Map;function it(s){return v.has(s)||v.set(s,Promise.resolve(e.ASSET_CATALOG)),v.get(s)}async function ot(s){const t="modules"in s&&Array.isArray(s.modules)?s:y(s),r=await it(t.env),n={...t,catalog:r};return new w(n)}function ct(s){return typeof s=="object"&&s!==null&&"request"in s&&typeof s.request=="function"}function ut(s){return typeof s=="object"&&s!==null&&"getAddresses"in s&&typeof s.getAddresses=="function"}function ht(s){return typeof s=="object"&&s!==null&&"publicKey"in s&&"signAndSendTransaction"in s}function dt(s){return typeof s=="object"&&s!==null&&"getAddress"in s&&"signAndExecuteTransactionBlock"in s}function gt(s){return typeof s=="object"&&s!==null&&"address"in s&&"execute"in s}const lt={Progress:"progress",StatusChange:"status-change",Completed:"completed",Failed:"failed",Error:"error"},vt={Progress:"progress",StatusChange:"status-change",Completed:"completed",Failed:"failed",Error:"error"},St={Progress:"progress",StatusChange:"status-change",Completed:"completed",Failed:"failed",Error:"error"},pt={Progress:"progress",StatusChange:"status-change",Completed:"completed",Failed:"failed",Error:"error"},mt={Progress:"progress",StatusChange:"status-change",Completed:"completed",Failed:"failed",Error:"error"},Et={Progress:"progress",StatusChange:"status-change",Completed:"completed",Failed:"failed",Error:"error"};exports.ApiNamespace=N;exports.BridgeEvent=Et;exports.DeployEvent=mt;exports.DepositEvent=vt;exports.LombardSDK=w;exports.RedeemEvent=St;exports.SolanaActions=S;exports.StakeEvent=lt;exports.StarknetActions=p;exports.SuiActions=m;exports.UnstakeEvent=pt;exports.createConfig=y;exports.createConsoleLogger=I;exports.createLombardSDK=ot;exports.createSilentLogger=M;exports.getSdkHeaders=O;exports.isBtcProvider=ut;exports.isEvmProvider=ct;exports.isSolanaProvider=ht;exports.isStarknetProvider=gt;exports.isSuiProvider=dt;exports.solanaActions=z;exports.starknetActions=Q;exports.suiActions=nt;
2
- //# sourceMappingURL=events-DqIJRzJo.cjs.map