@lombard.finance/sdk 4.7.1 → 5.0.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.
- package/CHANGELOG.md +91 -2
- package/README.md +22 -21
- package/dist/api-functions/generateDepositBtcAddress/generateDepositBtcAddress.d.ts.map +1 -1
- package/dist/api-functions/getDepositBtcAddress/getDepositBtcAddress.d.ts.map +1 -1
- package/dist/api.cjs +1 -1
- package/dist/api.js +5 -5
- package/dist/bridge.cjs +1 -1
- package/dist/bridge.js +1 -1
- package/dist/btc.cjs +1 -1
- package/dist/btc.js +2 -2
- package/dist/chains/btc/actions/deposit/BtcDeposit.d.ts.map +1 -1
- package/dist/chains/btc/actions/deposit/config/evm.d.ts.map +1 -1
- package/dist/chains/btc/actions/deposit/config/solana.d.ts.map +1 -1
- package/dist/chains/btc/actions/depositAndDeploy/config/index.d.ts.map +1 -1
- package/dist/chains/btc/actions/depositAndDeploy/types.d.ts.map +1 -1
- package/dist/chains/btc/actions/stake/BtcStake.d.ts.map +1 -1
- package/dist/chains/btc/actions/stake/config/evm.d.ts.map +1 -1
- package/dist/chains/btc/actions/stake/config/solana.d.ts.map +1 -1
- package/dist/chains/btc/actions/stakeAndDeploy/config/index.d.ts.map +1 -1
- package/dist/chains/btc/actions/stakeAndDeploy/types.d.ts.map +1 -1
- package/dist/chains/btc/client/getCurrentBlockHeight.d.ts.map +1 -1
- package/dist/chains/evm/actions/deploy/EvmDeploy.d.ts +19 -4
- package/dist/chains/evm/actions/deploy/EvmDeploy.d.ts.map +1 -1
- package/dist/chains/evm/actions/deploy/index.d.ts.map +1 -1
- package/dist/chains/evm/actions/deploy/types.d.ts.map +1 -1
- package/dist/chains/evm/actions/deposit/config/evm.d.ts.map +1 -1
- package/dist/chains/evm/actions/deposit/index.d.ts.map +1 -1
- package/dist/chains/evm/actions/redeem/EvmRedeem.d.ts.map +1 -1
- package/dist/chains/evm/actions/redeem/config/evm.d.ts.map +1 -1
- package/dist/chains/evm/actions/redeem/index.d.ts.map +1 -1
- package/dist/chains/evm/actions/redeem/types.d.ts.map +1 -1
- package/dist/chains/evm/actions/stake/config/index.d.ts.map +1 -1
- package/dist/chains/evm/actions/stake/config/types.d.ts.map +1 -1
- package/dist/chains/evm/actions/stake/index.d.ts.map +1 -1
- package/dist/chains/evm/actions/stake/types.d.ts.map +1 -1
- package/dist/chains/evm/actions/unstake/EvmUnstake.d.ts.map +1 -1
- package/dist/chains/evm/actions/unstake/index.d.ts.map +1 -1
- package/dist/chains/evm/actions/unstake/types.d.ts.map +1 -1
- package/dist/chains/evm/actions/withdraw/EvmCancelWithdraw.d.ts.map +1 -1
- package/dist/chains/evm/actions/withdraw/EvmWithdraw.d.ts +6 -0
- package/dist/chains/evm/actions/withdraw/EvmWithdraw.d.ts.map +1 -1
- package/dist/chains/evm/actions/withdraw/config/types.d.ts.map +1 -1
- package/dist/chains/evm/actions/withdraw/types.d.ts.map +1 -1
- package/dist/chains/solana/SolanaActions.d.ts.map +1 -1
- package/dist/chains/solana/actions/redeem/SolanaRedeem.d.ts.map +1 -1
- package/dist/chains/solana/actions/redeem/types.d.ts.map +1 -1
- package/dist/chains/solana/actions/stake/SolanaStake.d.ts.map +1 -1
- package/dist/chains/solana/actions/stake/types.d.ts.map +1 -1
- package/dist/chains/solana/actions/unstake/SolanaUnstake.d.ts.map +1 -1
- package/dist/chains/solana/actions/unstake/factory.d.ts.map +1 -1
- package/dist/chains/solana/actions/unstake/types.d.ts.map +1 -1
- package/dist/chains/solana/utils.d.ts.map +1 -1
- package/dist/chains/starknet/actions/unstake/config/index.d.ts.map +1 -1
- package/dist/chains/starknet/actions/unstake/factory.d.ts.map +1 -1
- package/dist/chains/starknet/actions/unstake/types.d.ts.map +1 -1
- package/dist/chains/sui/actions/unstake/config/index.d.ts.map +1 -1
- package/dist/chains/sui/actions/unstake/factory.d.ts.map +1 -1
- package/dist/chains/sui/actions/unstake/types.d.ts.map +1 -1
- package/dist/chunks/{BtcActions-BczTnzRn.js → BtcActions-CFGiDxtv.js} +20 -22
- package/dist/chunks/BtcActions-CFGiDxtv.js.map +1 -0
- package/dist/chunks/BtcActions-DJJmmyzi.cjs +2 -0
- package/dist/chunks/BtcActions-DJJmmyzi.cjs.map +1 -0
- package/dist/chunks/EvmActions-CUKBeiUw.js +1508 -0
- package/dist/chunks/EvmActions-CUKBeiUw.js.map +1 -0
- package/dist/chunks/EvmActions-CxipDb7X.cjs +7 -0
- package/dist/chunks/EvmActions-CxipDb7X.cjs.map +1 -0
- package/dist/chunks/{ReferralsClient-W-0-383w.js → ReferralsClient-BRa26dYS.js} +4 -4
- package/dist/chunks/ReferralsClient-BRa26dYS.js.map +1 -0
- package/dist/chunks/{ReferralsClient-D8dHEk_X.cjs → ReferralsClient-o-3AUm7s.cjs} +2 -2
- package/dist/chunks/ReferralsClient-o-3AUm7s.cjs.map +1 -0
- package/dist/chunks/{approveLBTC-BMC4cZEk.cjs → approveLBTC-BBl3KcT2.cjs} +2 -2
- package/dist/chunks/{approveLBTC-BMC4cZEk.cjs.map → approveLBTC-BBl3KcT2.cjs.map} +1 -1
- package/dist/chunks/{approveLBTC-BkdT1N3V.js → approveLBTC-DnCt6ZZF.js} +3 -3
- package/dist/chunks/{approveLBTC-BkdT1N3V.js.map → approveLBTC-DnCt6ZZF.js.map} +1 -1
- package/dist/chunks/{blockchain-identifier-BLPnwbIN.js → blockchain-identifier-BkASqCgZ.js} +2 -2
- package/dist/chunks/blockchain-identifier-BkASqCgZ.js.map +1 -0
- package/dist/chunks/{blockchain-identifier-Bp-LTIdG.cjs → blockchain-identifier-DWfC3Es2.cjs} +2 -2
- package/dist/chunks/blockchain-identifier-DWfC3Es2.cjs.map +1 -0
- package/dist/chunks/{bridge-DbB23m2a.js → bridge-DV4fOcHe.js} +4 -4
- package/dist/chunks/bridge-DV4fOcHe.js.map +1 -0
- package/dist/chunks/{bridge-7Eq_Jmi2.cjs → bridge-DZp5x4Yb.cjs} +2 -2
- package/dist/chunks/bridge-DZp5x4Yb.cjs.map +1 -0
- package/dist/chunks/{config-ow9X5H0c.cjs → config-BfX8lrdO.cjs} +2 -2
- package/dist/chunks/config-BfX8lrdO.cjs.map +1 -0
- package/dist/chunks/{config-C8BfN_9P.js → config-wnjPtnjd.js} +46 -53
- package/dist/chunks/config-wnjPtnjd.js.map +1 -0
- package/dist/chunks/{defi-registry-B8V6dRVB.cjs → defi-registry-CyMKVT3z.cjs} +2 -2
- package/dist/chunks/defi-registry-CyMKVT3z.cjs.map +1 -0
- package/dist/chunks/{defi-registry-CD8EUcNu.js → defi-registry-DULXbu3D.js} +9 -9
- package/dist/chunks/defi-registry-DULXbu3D.js.map +1 -0
- package/dist/chunks/{depositStatus-BJA7tNqc.cjs → depositStatus-B9P1YXEU.cjs} +2 -2
- package/dist/chunks/depositStatus-B9P1YXEU.cjs.map +1 -0
- package/dist/chunks/{depositStatus-HosfExLl.js → depositStatus-Cgd_GDUt.js} +5 -5
- package/dist/chunks/depositStatus-Cgd_GDUt.js.map +1 -0
- package/dist/chunks/events-B9b3YdgM.cjs +2 -0
- package/dist/chunks/events-B9b3YdgM.cjs.map +1 -0
- package/dist/chunks/{events-BlzP_SCT.js → events-DU2wYlt_.js} +189 -191
- package/dist/chunks/events-DU2wYlt_.js.map +1 -0
- package/dist/chunks/{get-exchange-ratio-Bl6pt546.js → get-exchange-ratio-BvPUfcIQ.js} +2 -2
- package/dist/chunks/{get-exchange-ratio-Bl6pt546.js.map → get-exchange-ratio-BvPUfcIQ.js.map} +1 -1
- package/dist/chunks/{get-exchange-ratio-t1PW8I6_.cjs → get-exchange-ratio-DGztGO7i.cjs} +2 -2
- package/dist/chunks/{get-exchange-ratio-t1PW8I6_.cjs.map → get-exchange-ratio-DGztGO7i.cjs.map} +1 -1
- package/dist/chunks/{get-positions-summary-DdZvBmCN.cjs → get-positions-summary-CC7BDtlY.cjs} +2 -2
- package/dist/chunks/get-positions-summary-CC7BDtlY.cjs.map +1 -0
- package/dist/chunks/{get-positions-summary-CaX2BCHp.js → get-positions-summary-DxAgmaMl.js} +2 -2
- package/dist/chunks/get-positions-summary-DxAgmaMl.js.map +1 -0
- package/dist/chunks/get-vault-tvl-B6rSrGi_.js +203 -0
- package/dist/chunks/get-vault-tvl-B6rSrGi_.js.map +1 -0
- package/dist/chunks/get-vault-tvl-dvEPPxvT.cjs +2 -0
- package/dist/chunks/get-vault-tvl-dvEPPxvT.cjs.map +1 -0
- package/dist/chunks/get-vault-withdrawals-Cgx7VsM1.cjs +2 -0
- package/dist/chunks/get-vault-withdrawals-Cgx7VsM1.cjs.map +1 -0
- package/dist/chunks/get-vault-withdrawals-W5CgNbqE.js +154 -0
- package/dist/chunks/get-vault-withdrawals-W5CgNbqE.js.map +1 -0
- package/dist/chunks/{getUserStakeAndBakeSignature-CqlrwA0t.js → getUserStakeAndBakeSignature-BRhWFYyY.js} +4 -4
- package/dist/chunks/getUserStakeAndBakeSignature-BRhWFYyY.js.map +1 -0
- package/dist/chunks/{getUserStakeAndBakeSignature-BmY5j0OM.cjs → getUserStakeAndBakeSignature-VlC_GHmz.cjs} +2 -2
- package/dist/chunks/getUserStakeAndBakeSignature-VlC_GHmz.cjs.map +1 -0
- package/dist/chunks/hex-BiCL4CPh.js +11 -0
- package/dist/chunks/hex-BiCL4CPh.js.map +1 -0
- package/dist/chunks/hex-DeJtv8eu.cjs +2 -0
- package/dist/chunks/hex-DeJtv8eu.cjs.map +1 -0
- package/dist/chunks/{lbtc-addresses-BlyGFWnW.js → lbtc-addresses-ClXt-tuB.js} +2 -2
- package/dist/chunks/{lbtc-addresses-BlyGFWnW.js.map → lbtc-addresses-ClXt-tuB.js.map} +1 -1
- package/dist/chunks/{lbtc-addresses-DjsipX5Q.cjs → lbtc-addresses-D3jG1VUC.cjs} +2 -2
- package/dist/chunks/{lbtc-addresses-DjsipX5Q.cjs.map → lbtc-addresses-D3jG1VUC.cjs.map} +1 -1
- package/dist/chunks/parameters-CcpaKGU2.js +24 -0
- package/dist/chunks/parameters-CcpaKGU2.js.map +1 -0
- package/dist/chunks/parameters-YNWmaAho.cjs +2 -0
- package/dist/chunks/parameters-YNWmaAho.cjs.map +1 -0
- package/dist/chunks/{statusConstants-BJIXJNIC.cjs → statusConstants-B-7VEYgO.cjs} +2 -2
- package/dist/chunks/statusConstants-B-7VEYgO.cjs.map +1 -0
- package/dist/chunks/{statusConstants-BQna5LGH.js → statusConstants-C3JHNUTC.js} +15 -17
- package/dist/chunks/statusConstants-C3JHNUTC.js.map +1 -0
- package/dist/chunks/{storeNetworkFeeSignature-tprCigR1.js → storeNetworkFeeSignature-CY_Z-Wtn.js} +2 -2
- package/dist/chunks/{storeNetworkFeeSignature-tprCigR1.js.map → storeNetworkFeeSignature-CY_Z-Wtn.js.map} +1 -1
- package/dist/chunks/{storeNetworkFeeSignature-CLm8I2pf.cjs → storeNetworkFeeSignature-DJgBfZp7.cjs} +2 -2
- package/dist/chunks/{storeNetworkFeeSignature-CLm8I2pf.cjs.map → storeNetworkFeeSignature-DJgBfZp7.cjs.map} +1 -1
- package/dist/chunks/token-addresses-C7H9E4qz.cjs +2 -0
- package/dist/chunks/token-addresses-C7H9E4qz.cjs.map +1 -0
- package/dist/chunks/{token-addresses-Ddar0FyS.js → token-addresses-DVnRPyu4.js} +16 -14
- package/dist/chunks/token-addresses-DVnRPyu4.js.map +1 -0
- package/dist/chunks/{tokens-HhVpKe3K.js → tokens-Btl3GXbc.js} +3 -3
- package/dist/chunks/tokens-Btl3GXbc.js.map +1 -0
- package/dist/chunks/{tokens-CBsz6l_2.cjs → tokens-DEYY7W7O.cjs} +2 -2
- package/dist/chunks/tokens-DEYY7W7O.cjs.map +1 -0
- package/dist/chunks/unwrapBtceToLbtcv-C4OxoVVU.js +321 -0
- package/dist/chunks/unwrapBtceToLbtcv-C4OxoVVU.js.map +1 -0
- package/dist/chunks/unwrapBtceToLbtcv-Dg-yUGpg.cjs +2 -0
- package/dist/chunks/unwrapBtceToLbtcv-Dg-yUGpg.cjs.map +1 -0
- package/dist/chunks/withdrawEarn-CTtVruit.cjs +7 -0
- package/dist/chunks/withdrawEarn-CTtVruit.cjs.map +1 -0
- package/dist/chunks/{unstakeLBTC-Bg8OsAMV.js → withdrawEarn-QFaMhs0t.js} +965 -612
- package/dist/chunks/withdrawEarn-QFaMhs0t.js.map +1 -0
- package/dist/client/ApiNamespace.d.ts +3 -6
- package/dist/client/ApiNamespace.d.ts.map +1 -1
- package/dist/common/blockchain-identifier.d.ts.map +1 -1
- package/dist/common/chains.d.ts +1 -1
- package/dist/common/chains.d.ts.map +1 -1
- package/dist/common/feature-config.d.ts.map +1 -1
- package/dist/contract-functions/cancelEarnWithdrawal/cancelEarnWithdrawal.d.ts +19 -0
- package/dist/contract-functions/cancelEarnWithdrawal/cancelEarnWithdrawal.d.ts.map +1 -0
- package/dist/contract-functions/cancelEarnWithdrawal/index.d.ts +2 -0
- package/dist/contract-functions/cancelEarnWithdrawal/index.d.ts.map +1 -0
- package/dist/contract-functions/depositEarn/depositEarn.d.ts +36 -0
- package/dist/contract-functions/depositEarn/depositEarn.d.ts.map +1 -0
- package/dist/contract-functions/depositEarn/index.d.ts +2 -0
- package/dist/contract-functions/depositEarn/index.d.ts.map +1 -0
- package/dist/contract-functions/getBasculeDepositStatus/getBasculeDepositStatus.d.ts.map +1 -1
- package/dist/contract-functions/getEarnPosition/getEarnPosition.d.ts +17 -16
- package/dist/contract-functions/getEarnPosition/getEarnPosition.d.ts.map +1 -1
- package/dist/contract-functions/getShareValue/getShareValue.d.ts +5 -15
- package/dist/contract-functions/getShareValue/getShareValue.d.ts.map +1 -1
- package/dist/contract-functions/getSharesByAddress/getSharesByAddress.d.ts +5 -20
- package/dist/contract-functions/getSharesByAddress/getSharesByAddress.d.ts.map +1 -1
- package/dist/contract-functions/index.d.ts +4 -2
- package/dist/contract-functions/index.d.ts.map +1 -1
- package/dist/contract-functions/previewWithdrawEarn/index.d.ts +2 -0
- package/dist/contract-functions/previewWithdrawEarn/index.d.ts.map +1 -0
- package/dist/contract-functions/previewWithdrawEarn/previewWithdrawEarn.d.ts +38 -0
- package/dist/contract-functions/previewWithdrawEarn/previewWithdrawEarn.d.ts.map +1 -0
- package/dist/contract-functions/signStakeAndBake/validation.d.ts.map +1 -1
- package/dist/contract-functions/withdrawEarn/index.d.ts +2 -0
- package/dist/contract-functions/withdrawEarn/index.d.ts.map +1 -0
- package/dist/contract-functions/withdrawEarn/withdrawEarn.d.ts +46 -0
- package/dist/contract-functions/withdrawEarn/withdrawEarn.d.ts.map +1 -0
- package/dist/contract-functions/wrapToBtce/wrapToBtce.d.ts.map +1 -1
- package/dist/contracts.cjs +1 -1
- package/dist/contracts.js +32 -30
- package/dist/core/assets/catalog.d.ts.map +1 -1
- package/dist/core/assets/utils.d.ts.map +1 -1
- package/dist/core/chains/utils.d.ts.map +1 -1
- package/dist/core.cjs +1 -1
- package/dist/core.js +19 -19
- package/dist/defi/defi-registry.d.ts.map +1 -1
- package/dist/defi/index.d.ts +1 -1
- package/dist/defi/index.d.ts.map +1 -1
- package/dist/defi.cjs +1 -1
- package/dist/defi.js +4 -4
- package/dist/entries/api.d.ts +14 -14
- package/dist/entries/api.d.ts.map +1 -1
- package/dist/entries/contracts.d.ts +4 -2
- package/dist/entries/contracts.d.ts.map +1 -1
- package/dist/entries/defi.d.ts +1 -1
- package/dist/entries/defi.d.ts.map +1 -1
- package/dist/entries/evm.d.ts +7 -7
- package/dist/entries/evm.d.ts.map +1 -1
- package/dist/entries/utils.d.ts +9 -9
- package/dist/entries/utils.d.ts.map +1 -1
- package/dist/entries/vaults.d.ts +1 -1
- package/dist/entries/vaults.d.ts.map +1 -1
- package/dist/evm.cjs +1 -1
- package/dist/evm.js +4 -4
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +67 -65
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +171 -174
- package/dist/index.js.map +1 -1
- package/dist/metrics.cjs +1 -1
- package/dist/metrics.js +1 -1
- package/dist/services/EvmService.d.ts.map +1 -1
- package/dist/shared/actions/BaseAction.d.ts.map +1 -1
- package/dist/shared/deposits/depositStatus.d.ts.map +1 -1
- package/dist/shared/validation/index.d.ts.map +1 -1
- package/dist/tokens/tokens.d.ts.map +1 -1
- package/dist/utils/chain.d.ts.map +1 -1
- package/dist/utils/consoleLogger.d.ts.map +1 -1
- package/dist/utils.cjs +1 -1
- package/dist/utils.js +16 -16
- package/dist/vaults/index.d.ts +8 -10
- package/dist/vaults/index.d.ts.map +1 -1
- package/dist/vaults/lib/config.d.ts +148 -150
- package/dist/vaults/lib/config.d.ts.map +1 -1
- package/dist/vaults/lib/metrics/get-vault-apy.d.ts +2 -4
- package/dist/vaults/lib/metrics/get-vault-apy.d.ts.map +1 -1
- package/dist/vaults/lib/metrics/get-vault-points.d.ts +2 -5
- package/dist/vaults/lib/metrics/get-vault-points.d.ts.map +1 -1
- package/dist/vaults/lib/metrics/get-vault-tvl.d.ts +5 -8
- package/dist/vaults/lib/metrics/get-vault-tvl.d.ts.map +1 -1
- package/dist/vaults/lib/ops/deposit.d.ts +5 -14
- package/dist/vaults/lib/ops/deposit.d.ts.map +1 -1
- package/dist/vaults/lib/ops/get-vault-deposits.d.ts +9 -13
- package/dist/vaults/lib/ops/get-vault-deposits.d.ts.map +1 -1
- package/dist/vaults/lib/ops/get-vault-minimum-deposit.d.ts +4 -7
- package/dist/vaults/lib/ops/get-vault-minimum-deposit.d.ts.map +1 -1
- package/dist/vaults/lib/ops/get-vault-withdrawals.d.ts +14 -18
- package/dist/vaults/lib/ops/get-vault-withdrawals.d.ts.map +1 -1
- package/dist/vaults/lib/ops/preview-vault-deposit.d.ts +4 -8
- package/dist/vaults/lib/ops/preview-vault-deposit.d.ts.map +1 -1
- package/dist/vaults/lib/ops/withdraw.d.ts +11 -27
- package/dist/vaults/lib/ops/withdraw.d.ts.map +1 -1
- package/dist/vaults.cjs +1 -1
- package/dist/vaults.cjs.map +1 -1
- package/dist/vaults.js +91 -103
- package/dist/vaults.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunks/BtcActions-BczTnzRn.js.map +0 -1
- package/dist/chunks/BtcActions-PyJhuiZN.cjs +0 -2
- package/dist/chunks/BtcActions-PyJhuiZN.cjs.map +0 -1
- package/dist/chunks/EvmActions-D3RAK9_Z.cjs +0 -2
- package/dist/chunks/EvmActions-D3RAK9_Z.cjs.map +0 -1
- package/dist/chunks/EvmActions-DSKThOAy.js +0 -1341
- package/dist/chunks/EvmActions-DSKThOAy.js.map +0 -1
- package/dist/chunks/ReferralsClient-D8dHEk_X.cjs.map +0 -1
- package/dist/chunks/ReferralsClient-W-0-383w.js.map +0 -1
- package/dist/chunks/blockchain-identifier-BLPnwbIN.js.map +0 -1
- package/dist/chunks/blockchain-identifier-Bp-LTIdG.cjs.map +0 -1
- package/dist/chunks/bridge-7Eq_Jmi2.cjs.map +0 -1
- package/dist/chunks/bridge-DbB23m2a.js.map +0 -1
- package/dist/chunks/config-C8BfN_9P.js.map +0 -1
- package/dist/chunks/config-ow9X5H0c.cjs.map +0 -1
- package/dist/chunks/defi-registry-B8V6dRVB.cjs.map +0 -1
- package/dist/chunks/defi-registry-CD8EUcNu.js.map +0 -1
- package/dist/chunks/depositStatus-BJA7tNqc.cjs.map +0 -1
- package/dist/chunks/depositStatus-HosfExLl.js.map +0 -1
- package/dist/chunks/events-BlzP_SCT.js.map +0 -1
- package/dist/chunks/events-DNehj45M.cjs +0 -2
- package/dist/chunks/events-DNehj45M.cjs.map +0 -1
- package/dist/chunks/get-positions-summary-CaX2BCHp.js.map +0 -1
- package/dist/chunks/get-positions-summary-DdZvBmCN.cjs.map +0 -1
- package/dist/chunks/get-vault-tvl-CihHEkqK.js +0 -226
- package/dist/chunks/get-vault-tvl-CihHEkqK.js.map +0 -1
- package/dist/chunks/get-vault-tvl-DZ-xzehy.cjs +0 -2
- package/dist/chunks/get-vault-tvl-DZ-xzehy.cjs.map +0 -1
- package/dist/chunks/get-vault-withdrawals-DLwFMQEB.cjs +0 -2
- package/dist/chunks/get-vault-withdrawals-DLwFMQEB.cjs.map +0 -1
- package/dist/chunks/get-vault-withdrawals-QJOdxB5Z.js +0 -161
- package/dist/chunks/get-vault-withdrawals-QJOdxB5Z.js.map +0 -1
- package/dist/chunks/getUserStakeAndBakeSignature-BmY5j0OM.cjs.map +0 -1
- package/dist/chunks/getUserStakeAndBakeSignature-CqlrwA0t.js.map +0 -1
- package/dist/chunks/parameters-C_16L5ft.js +0 -11
- package/dist/chunks/parameters-C_16L5ft.js.map +0 -1
- package/dist/chunks/parameters-DK9cYCAH.cjs +0 -2
- package/dist/chunks/parameters-DK9cYCAH.cjs.map +0 -1
- package/dist/chunks/statusConstants-BJIXJNIC.cjs.map +0 -1
- package/dist/chunks/statusConstants-BQna5LGH.js.map +0 -1
- package/dist/chunks/time-I-BeyUkG.cjs +0 -2
- package/dist/chunks/time-I-BeyUkG.cjs.map +0 -1
- package/dist/chunks/time-Sa5gggPG.js +0 -24
- package/dist/chunks/time-Sa5gggPG.js.map +0 -1
- package/dist/chunks/token-addresses-Ddar0FyS.js.map +0 -1
- package/dist/chunks/token-addresses-DvY-Mw7b.cjs +0 -2
- package/dist/chunks/token-addresses-DvY-Mw7b.cjs.map +0 -1
- package/dist/chunks/tokens-CBsz6l_2.cjs.map +0 -1
- package/dist/chunks/tokens-HhVpKe3K.js.map +0 -1
- package/dist/chunks/unstakeLBTC-Bg8OsAMV.js.map +0 -1
- package/dist/chunks/unstakeLBTC-BmHvDxBN.cjs +0 -2
- package/dist/chunks/unstakeLBTC-BmHvDxBN.cjs.map +0 -1
- package/dist/chunks/withdraw-Bkp5-2dG.cjs +0 -12
- package/dist/chunks/withdraw-Bkp5-2dG.cjs.map +0 -1
- package/dist/chunks/withdraw-kf8mYbYH.js +0 -209
- package/dist/chunks/withdraw-kf8mYbYH.js.map +0 -1
- package/dist/chunks/wrapToBtce-By2mh503.js +0 -298
- package/dist/chunks/wrapToBtce-By2mh503.js.map +0 -1
- package/dist/chunks/wrapToBtce-DDeIlv3d.cjs +0 -2
- package/dist/chunks/wrapToBtce-DDeIlv3d.cjs.map +0 -1
- package/dist/contract-functions/getShareValue/index.d.ts +0 -2
- package/dist/contract-functions/getShareValue/index.d.ts.map +0 -1
- package/dist/contract-functions/getSharesByAddress/index.d.ts +0 -2
- package/dist/contract-functions/getSharesByAddress/index.d.ts.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EvmActions-CUKBeiUw.js","sources":["../../src/services/EvmService.ts","../../src/modules/evmModule.ts","../../src/chains/evm/actions/deploy/config/evm.ts","../../src/vaults/lib/ops/deposit.ts","../../src/chains/evm/actions/deploy/EvmDeploy.ts","../../src/chains/evm/actions/deploy/factory.ts","../../src/chains/evm/actions/deposit/config/evm.ts","../../src/chains/evm/actions/deposit/types.ts","../../src/chains/evm/actions/deposit/EvmDeposit.ts","../../src/chains/evm/actions/deposit/factory.ts","../../src/chains/evm/actions/redeem/config/evm.ts","../../src/chains/evm/shared/feeAuth.ts","../../src/chains/evm/actions/redeem/EvmRedeem.ts","../../src/chains/evm/actions/redeem/factory.ts","../../src/chains/evm/actions/stake/EvmStake.ts","../../src/chains/evm/actions/stake/factory.ts","../../src/chains/evm/actions/unstake/config/evm.ts","../../src/chains/evm/actions/unstake/EvmUnstake.ts","../../src/chains/evm/actions/unstake/factory.ts","../../src/chains/evm/actions/withdraw/config/evm.ts","../../src/chains/evm/actions/withdraw/EvmCancelWithdraw.ts","../../src/chains/evm/actions/withdraw/EvmWithdraw.ts","../../src/chains/evm/actions/withdraw/factory.ts","../../src/chains/evm/EvmActions.ts"],"sourcesContent":["/**\n * EVM Service\n *\n * Provides EVM-specific operations via contract functions.\n *\n * @module services/EvmService\n */\n\nimport type {\n Env,\n EvmChainId,\n EvmProvider,\n EvmService as IEvmService,\n SignNetworkFeeParams,\n SignNetworkFeeResult,\n SignStakeAndBakeParams,\n} from '@lombard.finance/sdk-common';\nimport BigNumber from 'bignumber.js';\nimport type { EIP1193Provider } from 'viem';\n\nimport type { ChainId } from '../common/chains';\nimport { getMintingFee } from '../contract-functions/getLBTCMintingFee/getLBTCMintingFee';\nimport { getStakeAndBakeFee } from '../contract-functions/getStakeAndBakeFee/getStakeAndBakeFee';\nimport { signLbtcDestinationAddr } from '../contract-functions/signLbtcDestionationAddr/signLbtcDestinationAddr';\nimport { signNetworkFee } from '../contract-functions/signNetworkFee/signNetworkFee';\nimport { signStakeAndBake } from '../contract-functions/signStakeAndBake/signStakeAndBake';\nimport type { DefiProtocol, StakeAndBakeToken } from '../defi/defi-registry';\nimport { Token } from '../tokens/token-addresses';\n\n/**\n * EVM Service\n *\n * Implementation of the EvmService interface from sdk-common.\n * Provides EVM contract interactions and fee authorization.\n */\nexport class EvmService implements IEvmService {\n constructor(private readonly env: Env) {}\n\n /**\n * Get minting fee for a chain\n * @param chainId - The chain ID\n * @param token - Optional token (defaults to LBTC). Use Token.BTCb for BTC.b deposits.\n */\n async getMintingFee(chainId: EvmChainId, token?: string): Promise<string> {\n const fee = await getMintingFee({\n token: (token as Token) || Token.LBTC,\n chainId: chainId as ChainId,\n env: this.env,\n });\n return fee.toString();\n }\n\n /**\n * Sign network fee authorization (EIP-712)\n */\n async signNetworkFee(\n params: SignNetworkFeeParams,\n ): Promise<SignNetworkFeeResult> {\n const result = await signNetworkFee({\n fee: new BigNumber(params.fee),\n account: params.account as `0x${string}`,\n chainId: params.chainId as ChainId,\n provider: params.provider as EIP1193Provider,\n env: this.env,\n // Pass token for signing - defaults to LBTC for backwards compatibility\n token: (params.token as Token) ?? Token.LBTC,\n });\n\n return {\n signature: result.signature,\n typedData: result.typedData,\n };\n }\n\n /**\n * Get stake and bake fee for a vault\n */\n async getStakeAndBakeFee(\n chainId: EvmChainId,\n protocol: DefiProtocol,\n ): Promise<string> {\n const fee = await getStakeAndBakeFee({\n chainId: chainId as ChainId,\n protocol,\n });\n return fee.toString();\n }\n\n /**\n * Sign stake and bake authorization\n */\n async signStakeAndBake(\n params: SignStakeAndBakeParams,\n ): Promise<SignNetworkFeeResult> {\n const result = await signStakeAndBake({\n value: new BigNumber(params.value),\n account: params.account as `0x${string}`,\n chainId: params.chainId as ChainId,\n provider: params.provider as EIP1193Provider,\n env: this.env,\n vaultKey: params.vaultKey as DefiProtocol,\n token: params.token as StakeAndBakeToken,\n });\n\n return {\n signature: result.signature,\n typedData: result.typedData,\n };\n }\n\n /**\n * Sign LBTC destination address (for non-Ethereum EVM chains)\n */\n async signLbtcDestination(params: {\n chainId: EvmChainId;\n address: string;\n provider: EvmProvider;\n }): Promise<{ signature: string }> {\n const signature = await signLbtcDestinationAddr({\n account: params.address as `0x${string}`,\n chainId: params.chainId as ChainId,\n provider: params.provider as EIP1193Provider,\n });\n\n return { signature };\n }\n}\n","/**\n * EVM Module\n *\n * Provides EVM chain service for contract interactions and fee authorization.\n * Uses Service-First pattern: module is a thin factory that instantiates the service.\n *\n * @module modules/evmModule\n */\n\nimport type {\n ChainModule,\n EvmService as IEvmService,\n} from '@lombard.finance/sdk-common';\n\nimport { EvmService } from '../services/EvmService';\n\n/**\n * Create EVM module\n *\n * Built-in module that provides EvmService. Automatically included by createLombardSDK().\n *\n * @example\n * ```ts\n * const sdk = await createLombardSDK({\n * env: Env.prod,\n * providers: { evm: () => window.ethereum },\n * });\n * const unstake = sdk.chain.evm.unstake({ ... });\n * ```\n */\nexport function evmModule(): ChainModule<'evm', IEvmService> {\n return {\n id: 'evm',\n chain: 'evm',\n register(ctx) {\n return new EvmService(ctx.env);\n },\n };\n}\n\n// Re-export service class and interface type\nexport { EvmService };\nexport type { IEvmService as EvmServiceInterface };\nexport type {\n EvmChainId,\n FeeAuthorizationResult,\n StoredFeeSignature,\n} from '@lombard.finance/sdk-common';\n","/**\n * EVM Chain Configuration for Deploy\n *\n * Handles deploying L-Assets to DeFi protocols.\n *\n * @module chains/evm/actions/deploy/config/evm\n */\n\nimport { Env } from '@lombard.finance/sdk-common';\n\nimport { AssetId, Chain, DeployProtocol } from '../../../../../core';\nimport { evmAddressSchema } from '../../../../../shared/validation';\nimport type { ChainConfig } from './types';\n\n/**\n * EVM deploy configuration\n *\n * Protocol availability:\n * - Veda: Ethereum, Base, BSC, Corn (prod only)\n * - Silo: Avalanche (prod only)\n */\nexport const evmConfig: ChainConfig = {\n chainType: 'evm',\n\n routes: [\n // Veda - Ethereum\n {\n asset: AssetId.LBTC,\n sourceChains: [Chain.ETHEREUM],\n protocols: [DeployProtocol.Veda],\n envs: [Env.prod],\n },\n // Veda - Base\n {\n asset: AssetId.LBTC,\n sourceChains: [Chain.BASE],\n protocols: [DeployProtocol.Veda],\n envs: [Env.prod],\n },\n // Veda - BSC\n {\n asset: AssetId.LBTC,\n sourceChains: [Chain.BSC],\n protocols: [DeployProtocol.Veda],\n envs: [Env.prod],\n },\n // Veda - Corn\n {\n asset: AssetId.LBTC,\n sourceChains: [Chain.CORN],\n protocols: [DeployProtocol.Veda],\n envs: [Env.prod],\n },\n // Silo - Avalanche\n {\n asset: AssetId.LBTC,\n sourceChains: [Chain.AVALANCHE],\n protocols: [DeployProtocol.Silo],\n envs: [Env.prod],\n },\n ],\n\n addressSchema: evmAddressSchema,\n};\n\n/**\n * Check if a deploy route is supported\n */\nexport function isDeploySupported(\n asset: AssetId,\n chain: Chain,\n protocol: DeployProtocol,\n env: Env,\n): boolean {\n return evmConfig.routes.some(\n (route) =>\n route.asset === asset &&\n route.sourceChains.includes(chain) &&\n route.protocols.includes(protocol) &&\n route.envs.includes(env),\n );\n}\n","import BigNumber from 'bignumber.js';\n\nimport { makePublicClient } from '../../../clients/public-client';\nimport { makeWalletClient } from '../../../clients/wallet-client';\nimport { CHAIN_ID_TO_VIEM_CHAIN_MAP } from '../../../common/chains';\nimport { CommonWriteParameters } from '../../../common/parameters';\nimport { Token } from '../../../tokens/token-addresses';\nimport {\n fromBaseDenomination,\n getTokenInfo,\n toBaseDenomination,\n} from '../../../tokens/tokens';\nimport { getErrorMessage } from '../../../utils/err';\nimport toBigInt from '../../../utils/numbers';\nimport { EARN_VAULT, isEarnChain } from '../config';\n\nexport type DepositParameters = {\n /** The amount to be deposited into the DeFi vault. */\n amount: BigNumber.Value;\n /**\n * A flag determining whether the amount should be approved within\n * the execution of this function. If set to `false` it will\n * throw an error when the deposit amount exceeds allowance.\n */\n approve?: boolean;\n /** The optional deposit asset. */\n token?: Token;\n} & CommonWriteParameters;\n\n/**\n * @internal Internal helper used by `EvmDeploy` and other action classes.\n * The public `deposit` function was removed in 5.0.0; consumers use\n * `depositEarn` instead. This implementation is kept because the EVM action\n * classes still need to deposit into the underlying vault directly.\n *\n * @returns {Promise<Hash>}\n */\nexport async function depositInternal({\n amount: amountRaw,\n approve = true,\n token = Token.LBTC,\n account,\n chainId,\n provider,\n rpcUrl,\n env,\n}: DepositParameters) {\n const vault = EARN_VAULT;\n if (!isEarnChain(chainId)) {\n throw new Error(\n `Unsupported chain id: ${chainId}. Please switch to one of the supported chains: ${vault.chains.join(', ')}`,\n );\n }\n\n const publicClient = makePublicClient({ chainId, rpcUrl });\n const walletClient = makeWalletClient({ provider, chainId });\n\n const depositToken = await getTokenInfo(token, chainId, env, rpcUrl);\n if (!depositToken) {\n throw new Error(`Unknown deposit token: ${token}`);\n }\n\n const amount = BigNumber(amountRaw);\n const amountBase = toBigInt(\n toBaseDenomination(amount, depositToken.decimals),\n );\n\n const allowanceRaw = await publicClient.readContract({\n address: depositToken.address,\n abi: depositToken.abi,\n functionName: 'allowance',\n args: [account, vault.vaultContract.address],\n });\n const allowance = fromBaseDenomination(\n String(allowanceRaw),\n depositToken.decimals,\n );\n\n const balanceRaw = await publicClient.readContract({\n address: depositToken.address,\n abi: depositToken.abi,\n functionName: 'balanceOf',\n args: [account],\n });\n const balance = fromBaseDenomination(\n String(balanceRaw),\n depositToken.decimals,\n );\n\n // check if amount exceeds balance\n if (amount.isGreaterThan(balance)) {\n throw new Error(\n `The deposit amount exceeds the account's balance. \\nDeposit amount: ${amount.toFixed()} \\nBalance: ${balance.toFixed()}`,\n );\n }\n\n // check if amount exceeds allowance\n if (amount.isGreaterThan(allowance)) {\n const exceededMessage = `The deposit amount exceeds allowance. \\nDeposit amount: ${amount.toFixed()} \\nAllowance: ${allowance.toFixed()}`;\n if (!approve) {\n throw new Error(exceededMessage);\n }\n\n // try to approve new amount\n console.info(exceededMessage);\n try {\n console.info(`Trying to approve ${amountBase}`);\n const { request } = await publicClient.simulateContract({\n account,\n chain: CHAIN_ID_TO_VIEM_CHAIN_MAP[chainId],\n address: depositToken.address,\n abi: depositToken.abi,\n functionName: 'approve',\n args: [vault.vaultContract.address, amountBase],\n });\n\n const txHash = await walletClient.writeContract(request);\n console.info(`Approve tx hash: ${txHash}`);\n console.info(`Approved ${amountBase} for ${vault.vaultContract.address}`);\n } catch (err) {\n const msg = getErrorMessage(err);\n throw new Error(\n `Could not approve ${amountBase} for ${vault.vaultContract.address}. \\nReason: ${msg}`,\n );\n }\n }\n\n // deposit funds via the teller contract\n const { request } = await publicClient.simulateContract({\n account,\n chain: CHAIN_ID_TO_VIEM_CHAIN_MAP[chainId],\n address: vault.tellerContracts[chainId].address,\n abi: vault.tellerContracts[chainId].abi,\n functionName: 'deposit',\n args: [depositToken.address, amountBase, 0n],\n });\n const txHash = await walletClient.writeContract(request);\n return txHash;\n}\n","/**\n * EVM Deploy Action\n *\n * Deploys L-Assets to DeFi protocols (Veda, Silo).\n *\n * Protocol routing:\n * - Veda on ETH/Base/BSC → deposits through the BTCe ERC-4626 wrapper\n * (`depositEarn`), giving the user BTCe shares. The `recipient` param\n * is forwarded as the BTCe share receiver.\n * - Veda on Corn → deposits directly into the LBTCv BoringVault teller\n * (BTCe wrapper is not deployed there).\n * - Silo → separate stake-and-bake mechanism; not handled by this class.\n *\n * @module chains/evm/actions/deploy/EvmDeploy\n */\n\nimport BigNumber from 'bignumber.js';\nimport type { Address, EIP1193Provider } from 'viem';\nimport { erc20Abi } from 'viem';\nimport { z } from 'zod';\n\nimport { makePublicClient } from '../../../../clients/public-client';\nimport { makeWalletClient } from '../../../../clients/wallet-client';\nimport {\n CHAIN_ID_TO_VIEM_CHAIN_MAP,\n type ChainId,\n} from '../../../../common/chains';\nimport { depositEarn } from '../../../../contract-functions/depositEarn';\nimport { DeployProtocol } from '../../../../core';\nimport { parseChainIdentifier, StepStatus } from '../../../../core';\nimport { BaseAction } from '../../../../shared/actions/BaseAction';\nimport { EvmOperationStatus } from '../../../../shared/constants/statusConstants';\nimport type { EvmCoreContext } from '../../../../shared/context';\nimport { LombardError } from '../../../../shared/errors';\nimport type { DeployEventMap } from '../../../../shared/events';\nimport {\n evmAmountSchema,\n validatePrepareParams,\n} from '../../../../shared/validation';\nimport { Token } from '../../../../tokens/token-addresses';\nimport { getTokenInfo, toBaseDenomination } from '../../../../tokens/tokens';\nimport toBigInt from '../../../../utils/numbers';\nimport { waitForTransactionReceipt } from '../../../../utils/transaction-executor';\nimport {\n BTCE_VAULT,\n EARN_VAULT,\n isBtceVaultChain,\n} from '../../../../vaults/lib/config';\nimport { depositInternal } from '../../../../vaults/lib/ops/deposit';\nimport { evmConfig } from './config';\nimport type {\n EvmDeployParams,\n EvmDeployPrepareParams,\n IEvmDeploy,\n} from './types';\n\nexport class EvmDeploy\n extends BaseAction<DeployEventMap, EvmOperationStatus>\n implements IEvmDeploy\n{\n private _amount?: string;\n private _protocol?: DeployProtocol;\n private _needsApproval = false;\n private _txHash?: string;\n private _account?: `0x${string}`;\n private _chainId?: ChainId;\n\n constructor(\n private readonly ctx: EvmCoreContext,\n private readonly params: EvmDeployParams,\n ) {\n super(EvmOperationStatus.IDLE);\n }\n\n get amount(): string | undefined {\n return this._amount;\n }\n\n get protocol(): DeployProtocol | undefined {\n return this._protocol;\n }\n\n get needsApproval(): boolean {\n return this._needsApproval;\n }\n\n get txHash(): string | undefined {\n return this._txHash;\n }\n\n /**\n * Returns true when the deposit should go through the BTCe ERC-4626 wrapper:\n * Veda protocol on a chain that has the BTCe contract deployed.\n */\n private isVedaBtcePath(): boolean {\n return (\n this._protocol === DeployProtocol.Veda &&\n this._chainId !== undefined &&\n isBtceVaultChain(this._chainId)\n );\n }\n\n /**\n * Returns the ERC-20 spender address for LBTC approval:\n * - BTCe wrapper address for Veda on BTCe-supported chains\n * - LBTCv BoringVault address for all other cases\n */\n private getSpenderAddress(): Address {\n if (this.isVedaBtcePath()) {\n return BTCE_VAULT.contracts[\n this._chainId as keyof typeof BTCE_VAULT.contracts\n ];\n }\n return EARN_VAULT.vaultContract.address;\n }\n\n async prepare(params: EvmDeployPrepareParams): Promise<void> {\n this.assertStatus(EvmOperationStatus.IDLE, 'prepare');\n\n return this.act(async () => {\n const validated = validatePrepareParams(this.prepareSchema, params);\n this._amount = validated.amount;\n this._protocol = params.protocol;\n\n this.validateProtocol(params.protocol);\n\n // Get provider and account\n const provider = await this.ctx.getProvider('evm');\n if (!provider) {\n throw LombardError.providerMissing(this.params.sourceChain, 'evm');\n }\n\n const accounts = await (provider as EIP1193Provider).request({\n method: 'eth_accounts',\n });\n const account = (accounts as string[])[0] as `0x${string}`;\n if (!account) {\n throw LombardError.providerMissing(this.params.sourceChain, 'evm');\n }\n\n this._account = account;\n this._chainId = parseChainIdentifier(this.params.sourceChain) as ChainId;\n\n const depositToken = await getTokenInfo(\n Token.LBTC,\n this._chainId,\n this.ctx.env,\n );\n if (!depositToken) {\n throw LombardError.invalidParameter(\n 'token',\n 'Could not get LBTC token info',\n );\n }\n\n const spender = this.getSpenderAddress();\n const publicClient = makePublicClient({ chainId: this._chainId });\n const allowanceRaw = await publicClient.readContract({\n address: depositToken.address,\n abi: erc20Abi,\n functionName: 'allowance',\n args: [account, spender],\n });\n\n const amount = new BigNumber(validated.amount);\n const amountBase = toBaseDenomination(amount, depositToken.decimals);\n const allowance = new BigNumber(String(allowanceRaw));\n\n this._needsApproval = amountBase.isGreaterThan(allowance);\n\n if (this._needsApproval) {\n this.emitProgress({\n status: EvmOperationStatus.NEEDS_APPROVAL,\n steps: { approval: StepStatus.PENDING, deploying: StepStatus.IDLE },\n });\n this.updateStatus(EvmOperationStatus.NEEDS_APPROVAL);\n } else {\n this.emitProgress({\n status: EvmOperationStatus.READY,\n steps: {\n approval: StepStatus.COMPLETE,\n deploying: StepStatus.PENDING,\n },\n });\n this.updateStatus(EvmOperationStatus.READY);\n }\n });\n }\n\n async approve(): Promise<void> {\n this.assertStatus(EvmOperationStatus.NEEDS_APPROVAL, 'approve');\n\n return this.act(async () => {\n if (!this._account || !this._chainId || !this._amount) {\n throw LombardError.missingParameter('account, chainId, or amount');\n }\n\n const provider = await this.ctx.getProvider('evm');\n if (!provider) {\n throw LombardError.providerMissing(this.params.sourceChain, 'evm');\n }\n\n const depositToken = await getTokenInfo(\n Token.LBTC,\n this._chainId,\n this.ctx.env,\n );\n if (!depositToken) {\n throw LombardError.invalidParameter(\n 'token',\n 'Could not get LBTC token info',\n );\n }\n\n const amount = new BigNumber(this._amount);\n const amountBase = toBigInt(\n toBaseDenomination(amount, depositToken.decimals),\n );\n const spender = this.getSpenderAddress();\n\n const publicClient = makePublicClient({ chainId: this._chainId });\n const walletClient = makeWalletClient({\n provider: provider as EIP1193Provider,\n chainId: this._chainId,\n });\n\n const { request } = await publicClient.simulateContract({\n account: this._account,\n chain: CHAIN_ID_TO_VIEM_CHAIN_MAP[this._chainId],\n address: depositToken.address,\n abi: erc20Abi,\n functionName: 'approve',\n args: [spender, amountBase],\n });\n\n const txHash = await walletClient.writeContract(request);\n await waitForTransactionReceipt(\n publicClient,\n txHash,\n 'LBTC deposit approval',\n );\n\n this._needsApproval = false;\n this.emitProgress({\n status: EvmOperationStatus.READY,\n steps: { approval: StepStatus.COMPLETE, deploying: StepStatus.PENDING },\n });\n }, EvmOperationStatus.READY);\n }\n\n async execute(): Promise<{ txHash: string }> {\n this.assertStatus(EvmOperationStatus.READY, 'execute');\n\n return this.act(async () => {\n const provider = await this.ctx.getProvider('evm');\n if (!provider) {\n throw LombardError.providerMissing(this.params.sourceChain, 'evm');\n }\n\n if (!this._account || !this._chainId) {\n throw LombardError.missingParameter('account or chainId');\n }\n\n this.emitProgress({\n status: EvmOperationStatus.READY,\n steps: { approval: StepStatus.COMPLETE, deploying: StepStatus.PENDING },\n });\n\n let txHash: string;\n\n if (this.isVedaBtcePath()) {\n // Route through BTCe ERC-4626 wrapper: user receives BTCe shares.\n // Approval was already done in approve(), so pass approve: false.\n txHash = await depositEarn({\n token: Token.LBTC,\n amount: this._amount!,\n receiver: this.params.recipient as Address,\n approve: false,\n account: this._account,\n chainId: this._chainId,\n provider: provider as EIP1193Provider,\n env: this.ctx.env,\n });\n } else {\n // Veda on Corn (no BTCe wrapper) or other protocols:\n // deposit directly into the LBTCv BoringVault teller.\n // Approval was already done in approve(), so pass approve: false.\n txHash = await depositInternal({\n amount: this._amount!,\n approve: false,\n token: Token.LBTC,\n account: this._account,\n chainId: this._chainId,\n provider: provider as EIP1193Provider,\n env: this.ctx.env,\n });\n }\n\n this._txHash = txHash;\n\n this.emitProgress({\n status: EvmOperationStatus.COMPLETED,\n steps: {\n approval: StepStatus.COMPLETE,\n deploying: StepStatus.COMPLETE,\n },\n });\n\n this.emitCompleted();\n\n return { txHash };\n }, EvmOperationStatus.COMPLETED);\n }\n\n private get prepareSchema() {\n return z.object({\n amount: evmAmountSchema,\n protocol: z.string().min(1, 'Protocol is required'),\n });\n }\n\n private validateProtocol(protocol: DeployProtocol): void {\n const isSupported = evmConfig.routes.some(\n (route) =>\n route.protocols.includes(protocol) && route.envs.includes(this.ctx.env),\n );\n if (!isSupported) {\n throw LombardError.invalidParameter(\n 'protocol',\n `Protocol ${protocol} is not supported in ${this.ctx.env} environment`,\n );\n }\n }\n}\n","/**\n * EVM Deploy Factory Functions\n *\n * @module chains/evm/actions/deploy/factory\n */\n\nimport type { LombardConfig } from '../../../../config/types';\nimport type { EvmCoreContext } from '../../../../shared/context';\nimport { createEvmCoreContext } from '../../../../shared/context';\nimport { EvmDeploy } from './EvmDeploy';\nimport type { EvmDeployParams } from './types';\n\n/**\n * Create EvmDeploy action from config\n *\n * @internal This factory is for internal use. Use createLombardSDK() instead:\n *\n * @example\n * ```typescript\n * const sdk = await createLombardSDK({ env: Env.prod, providers: { evm: () => window.ethereum } });\n * const deploy = sdk.chain.evm.deploy({\n * sourceChain: Chain.ETHEREUM,\n * protocol: DeployProtocol.Veda,\n * });\n * await deploy.prepare({ amount: '0.1' });\n * ```\n */\nexport function evmDeploy(\n config: LombardConfig,\n params: EvmDeployParams,\n): EvmDeploy {\n const ctx = createEvmCoreContext(config);\n return new EvmDeploy(ctx, params);\n}\n\n/**\n * Create EvmDeploy action from context\n */\nexport function createEvmDeploy(\n ctx: EvmCoreContext,\n params: EvmDeployParams,\n): EvmDeploy {\n return new EvmDeploy(ctx, params);\n}\n","/**\n * EVM Chain Configuration for Deposit\n *\n * Handles depositing BTCb to get LBTC.\n * Routes are derived from ASSET_CATALOG to ensure consistency.\n *\n * @module chains/evm/actions/deposit/config/evm\n */\n\nimport { Env } from '@lombard.finance/sdk-common';\n\nimport { AssetId, Chain, getEvmAssetChains } from '../../../../../core';\nimport { evmAddressSchema } from '../../../../../shared/validation';\nimport type { ChainConfig } from './types';\n\n// ═══════════════════════════════════════════════════════════════════════════\n// Catalog-Derived Chain Lists\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Source chains: EVM chains with BTCb deployed\n */\nconst DEPOSIT_PROD_SOURCE_CHAINS = getEvmAssetChains(AssetId.BTCb, [Env.prod]);\n\nconst DEPOSIT_TESTNET_SOURCE_CHAINS = getEvmAssetChains(AssetId.BTCb, [\n Env.testnet,\n Env.stage,\n Env.dev,\n Env.ibc,\n]);\n\n/** Dest chains: EVM chains with LBTC deployed */\nconst LBTC_PROD_CHAINS = getEvmAssetChains(AssetId.LBTC, [Env.prod]);\nconst LBTC_TESTNET_CHAINS = getEvmAssetChains(AssetId.LBTC, [\n Env.testnet,\n Env.stage,\n Env.dev,\n Env.ibc,\n]);\n\n// ═══════════════════════════════════════════════════════════════════════════\n// Configuration Objects\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * EVM deposit configuration\n *\n * Supports depositing BTCb to get LBTC on EVM chains.\n * Source chains derived from BTCb deployments.\n * Dest chains derived from LBTC deployments.\n */\nexport const evmConfig: ChainConfig = {\n chainType: 'evm',\n\n routes: [\n // Production: BTCb → LBTC\n {\n assetsIn: [AssetId.BTCb],\n assetOut: AssetId.LBTC,\n sourceChains: DEPOSIT_PROD_SOURCE_CHAINS,\n destChains: LBTC_PROD_CHAINS,\n envs: [Env.prod],\n },\n // Testnet\n {\n assetsIn: [AssetId.BTCb],\n assetOut: AssetId.LBTC,\n sourceChains: DEPOSIT_TESTNET_SOURCE_CHAINS,\n destChains: LBTC_TESTNET_CHAINS,\n envs: [Env.testnet, Env.stage, Env.dev, Env.ibc],\n },\n ],\n\n addressSchema: evmAddressSchema,\n};\n\n/**\n * Check if a deposit route is supported\n */\nexport function isDepositSupported(\n assetIn: AssetId,\n sourceChain: Chain,\n env: Env,\n): boolean {\n return evmConfig.routes.some(\n (route) =>\n route.assetsIn.includes(assetIn) &&\n route.sourceChains.includes(sourceChain) &&\n route.envs.includes(env),\n );\n}\n","/**\n * EVM Deposit Action Types\n *\n * @module chains/evm/actions/deposit/types\n */\n\nimport type {\n AssetId,\n Chain,\n StepStatus,\n StrategyProgress,\n} from '../../../../core';\nimport type { MonitorableAction } from '../../../../shared/actions/BaseAction';\nimport type { LombardError } from '../../../../shared/errors';\n\n/**\n * EVM Deposit status\n *\n * Note: There is NO 'failed' status. Error handling is separate from status:\n * - `status` = \"What step are you at?\" (flow position)\n * - `error` = \"Did something go wrong?\" (Error | null)\n * - `isFailed` = Derived from `error !== null`\n *\n * Use `isLoading` for operation-in-progress state (no transitional statuses).\n */\nexport enum EvmDepositStatus {\n IDLE = 'idle',\n NEEDS_APPROVAL = 'needs-approval',\n READY = 'ready',\n BRIDGING = 'bridging',\n COMPLETED = 'completed',\n}\n\n/**\n * EVM Deposit parameters\n */\nexport interface EvmDepositParams {\n /** Input asset (BTCb) */\n assetIn: AssetId;\n /** Output asset (LBTC) */\n assetOut: AssetId;\n /** Source chain */\n sourceChain: Chain;\n /** Destination chain */\n destChain: Chain;\n}\n\n/**\n * EVM Deposit prepare parameters\n */\nexport interface EvmDepositPrepareParams {\n /** Amount to deposit */\n amount: string;\n /** Recipient address */\n recipient: string;\n}\n\n/**\n * EVM Deposit progress\n */\nexport interface EvmDepositProgress extends StrategyProgress<EvmDepositStatus> {\n status: EvmDepositStatus;\n steps: {\n approval: StepStatus;\n execution: StepStatus;\n bridging?: StepStatus;\n };\n txHash?: string;\n}\n\n/**\n * EVM Deposit interface\n */\nexport interface IEvmDeposit extends MonitorableAction {\n readonly status: EvmDepositStatus;\n readonly error: LombardError | null;\n readonly amount?: string;\n readonly recipient?: string;\n readonly needsApproval: boolean;\n readonly txHash?: string;\n\n /** Set claim data from a notarized deposit (required before execute) */\n setClaimData(data: string, proofSignature: string): void;\n prepare(params: EvmDepositPrepareParams): Promise<void>;\n approve(): Promise<void>;\n execute(): Promise<{ txHash: string }>;\n}\n","/**\n * EVM Deposit Action\n *\n * Claims LBTC from a notarized BTC deposit.\n *\n * Flow:\n * 1. BTC is deposited to Lombard's BTC address (via BtcDeposit/BtcStake)\n * 2. Deposit is notarized by the consortium\n * 3. User claims LBTC using setClaimData() + execute()\n *\n * @module chains/evm/actions/deposit/EvmDeposit\n */\n\nimport type { EIP1193Provider } from 'viem';\nimport { z } from 'zod';\n\nimport type { ChainId } from '../../../../common/chains';\nimport { claimLBTC } from '../../../../contract-functions';\nimport { parseChainIdentifier, StepStatus } from '../../../../core';\nimport { BaseAction } from '../../../../shared/actions/BaseAction';\nimport type { EvmCoreContext } from '../../../../shared/context';\nimport { LombardError } from '../../../../shared/errors';\nimport type { DepositEventMap } from '../../../../shared/events';\nimport {\n evmAmountSchema,\n validatePrepareParams,\n} from '../../../../shared/validation';\nimport { evmConfig } from './config';\nimport {\n type EvmDepositParams,\n type EvmDepositPrepareParams,\n EvmDepositStatus,\n type IEvmDeposit,\n} from './types';\n\nexport class EvmDeposit\n extends BaseAction<DepositEventMap, EvmDepositStatus>\n implements IEvmDeposit\n{\n private _amount?: string;\n private _recipient?: string;\n private _needsApproval = false;\n private _txHash?: string;\n private _claimData?: { data: string; proofSignature: string };\n\n constructor(\n private readonly ctx: EvmCoreContext,\n private readonly params: EvmDepositParams,\n ) {\n super(EvmDepositStatus.IDLE);\n }\n\n get amount(): string | undefined {\n return this._amount;\n }\n\n get recipient(): string | undefined {\n return this._recipient;\n }\n\n get needsApproval(): boolean {\n return this._needsApproval;\n }\n\n get txHash(): string | undefined {\n return this._txHash;\n }\n\n setClaimData(data: string, proofSignature: string): void {\n this._claimData = { data, proofSignature };\n }\n\n async prepare(params: EvmDepositPrepareParams): Promise<void> {\n this.assertStatus(EvmDepositStatus.IDLE, 'prepare');\n\n return this.act(async () => {\n const validated = validatePrepareParams(this.prepareSchema, params, {\n destChain: this.params.destChain,\n });\n this._amount = validated.amount;\n this._recipient = validated.recipient;\n\n this._needsApproval = false;\n this.emitProgress({\n status: EvmDepositStatus.READY,\n steps: {\n approval: StepStatus.COMPLETE,\n execution: StepStatus.IDLE,\n bridging: StepStatus.IDLE,\n },\n });\n }, EvmDepositStatus.READY);\n }\n\n async approve(): Promise<void> {\n this.assertStatus(EvmDepositStatus.NEEDS_APPROVAL, 'approve');\n\n return this.act(async () => {\n this._needsApproval = false;\n }, EvmDepositStatus.READY);\n }\n\n async execute(): Promise<{ txHash: string }> {\n this.assertStatus(EvmDepositStatus.READY, 'execute');\n\n if (!this._claimData) {\n throw LombardError.missingParameter('claimData');\n }\n\n return this.act(async () => {\n const provider = await this.ctx.getProvider('evm');\n if (!provider) {\n throw LombardError.providerMissing(this.params.sourceChain, 'evm');\n }\n\n const chainId = parseChainIdentifier(this.params.destChain) as ChainId;\n\n this.emitProgress({\n status: EvmDepositStatus.READY,\n steps: {\n approval: StepStatus.COMPLETE,\n execution: StepStatus.PENDING,\n bridging: StepStatus.IDLE,\n },\n });\n\n const txHash = await claimLBTC({\n provider: provider as EIP1193Provider,\n account: this._recipient! as `0x${string}`,\n data: this._claimData!.data,\n proofSignature: this._claimData!.proofSignature,\n chainId,\n env: this.ctx.env,\n });\n\n this._txHash = txHash;\n\n this.emitProgress({\n status: EvmDepositStatus.COMPLETED,\n steps: {\n approval: StepStatus.COMPLETE,\n execution: StepStatus.COMPLETE,\n bridging: StepStatus.IDLE,\n },\n });\n\n this.emitCompleted();\n\n return { txHash };\n }, EvmDepositStatus.COMPLETED);\n }\n\n private get prepareSchema() {\n return z.object({\n amount: evmAmountSchema,\n recipient: evmConfig.addressSchema,\n });\n }\n}\n","/**\n * EVM Deposit Factory Functions\n *\n * @module chains/evm/actions/deposit/factory\n */\n\nimport type { LombardConfig } from '../../../../config/types';\nimport type { EvmCoreContext } from '../../../../shared/context';\nimport { createEvmCoreContext } from '../../../../shared/context';\nimport { EvmDeposit } from './EvmDeposit';\nimport type { EvmDepositParams } from './types';\n\n/**\n * Create EvmDeposit action from config\n *\n * @internal This factory is for internal use. Use createLombardSDK() instead:\n *\n * @example\n * ```typescript\n * const sdk = await createLombardSDK({ env: Env.prod, providers: { evm: () => window.ethereum } });\n * const deposit = sdk.chain.evm.deposit({\n * sourceChain: Chain.ETHEREUM,\n * assetIn: AssetId.BTCb,\n * });\n * await deposit.prepare({ amount: '0.1' });\n * ```\n */\nexport function evmDeposit(\n config: LombardConfig,\n params: EvmDepositParams,\n): EvmDeposit {\n const ctx = createEvmCoreContext(config);\n return new EvmDeposit(ctx, params);\n}\n\n/**\n * Create EvmDeposit action from context\n */\nexport function createEvmDeposit(\n ctx: EvmCoreContext,\n params: EvmDepositParams,\n): EvmDeposit {\n return new EvmDeposit(ctx, params);\n}\n","/**\n * EVM Chain Configuration for Redeem\n *\n * Handles redeeming BTC.b to native BTC (cross-chain).\n * This is the opposite operation to BTC Deposit.\n *\n * Future: Will also support L-Assets (L_ZEC, L_SOL, etc.) → native chains.\n *\n * @module chains/evm/actions/redeem/config/evm\n */\n\nimport { Env } from '@lombard.finance/sdk-common';\n\nimport { AssetId, Chain, getEvmAssetChains } from '../../../../../core';\nimport { bitcoinAddressSchema } from '../../../../../shared/validation';\nimport type { ChainConfig } from './types';\n\n// ═══════════════════════════════════════════════════════════════════════════\n// Catalog-Derived Chain Lists\n// ═══════════════════════════════════════════════════════════════════════════\n\n/** EVM chains with BTC.b deployed (can redeem to BTC) */\nconst BTCB_PROD_CHAINS = getEvmAssetChains(AssetId.BTCb, [Env.prod]);\nconst BTCB_TESTNET_CHAINS = getEvmAssetChains(AssetId.BTCb, [\n Env.testnet,\n Env.stage,\n Env.dev,\n Env.ibc,\n]);\n\n// ═══════════════════════════════════════════════════════════════════════════\n// Configuration Objects\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * EVM redeem configuration\n *\n * Currently supports BTC.b → BTC (cross-chain to Bitcoin).\n * Source chains derived from BTC.b deployments in ASSET_CATALOG.\n */\nexport const evmConfig: ChainConfig = {\n chainType: 'evm',\n\n routes: [\n // BTC.b → BTC (to Bitcoin Mainnet)\n {\n assetIn: AssetId.BTCb,\n assetOut: AssetId.BTC,\n sourceChains: BTCB_PROD_CHAINS,\n destChain: Chain.BITCOIN_MAINNET,\n envs: [Env.prod],\n },\n // BTC.b → BTC (to Bitcoin Signet - testnet)\n {\n assetIn: AssetId.BTCb,\n assetOut: AssetId.BTC,\n sourceChains: BTCB_TESTNET_CHAINS,\n destChain: Chain.BITCOIN_SIGNET,\n envs: [Env.testnet, Env.stage, Env.dev, Env.ibc],\n },\n // TODO: Add L-Asset routes when deployed\n // L-ZEC → ZEC, L-SOL → SOL, L-XRP → XRP, L-DOGE → DOGE\n ],\n\n recipientSchema: bitcoinAddressSchema,\n};\n\n/**\n * Check if a redeem route is supported\n */\nexport function isRedeemSupported(\n assetIn: AssetId,\n sourceChain: Chain,\n env: Env,\n): boolean {\n return evmConfig.routes.some(\n (route) =>\n route.assetIn === assetIn &&\n route.sourceChains.includes(sourceChain) &&\n route.envs.includes(env),\n );\n}\n","/**\n * Shared Fee Authorization Logic for EVM Actions\n *\n * Provides fee authorization support for EVM actions that require it:\n * - EvmStake (BTC.b → LBTC on Ethereum/Sepolia)\n * - EvmRedeem (BTC.b → BTC on Ethereum/Sepolia)\n * - EvmUnstake (LBTC → BTC.b on Ethereum/Sepolia)\n *\n * Fee authorization is only required on unsubsidized chains (Ethereum, Sepolia).\n * Other chains (Base, BSC, Avalanche) are subsidized by Lombard.\n *\n * @module chains/evm/shared/feeAuth\n */\n\nimport type { Env } from '@lombard.finance/sdk-common';\nimport type { EIP1193Provider } from 'viem';\n\nimport { getNetworkFeeSignature } from '../../../api-functions';\nimport { storeNetworkFeeSignature } from '../../../api-functions/storeNetworkFeeSignature/storeNetworkFeeSignature';\nimport type { ChainId } from '../../../common/chains';\nimport { requiresAutoMintFee } from '../../../common/fee-requirements';\nimport { getMintingFee } from '../../../contract-functions';\nimport { signNetworkFee } from '../../../contract-functions/signNetworkFee/signNetworkFee';\nimport { Token } from '../../../tokens/token-addresses';\nimport { getTokenContractInfo } from '../../../tokens/tokens';\n\n// ═══════════════════════════════════════════════════════════════════════════\n// Types\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Fee authorization state\n */\nexport interface FeeAuthState {\n /** Whether fee authorization is required for this chain */\n requiresAuth: boolean;\n /** Whether fee authorization is complete (valid signature exists) */\n isAuthorized: boolean;\n /** Minting fee in satoshis (for signing) */\n feeInSatoshis: bigint | null;\n /** Minting fee formatted in BTC (for display) */\n feeFormatted: string | null;\n /** Signature expiration date (Unix timestamp in seconds) */\n expirationDate: string | null;\n}\n\n/**\n * Fee authorization check result\n */\nexport interface FeeAuthCheckResult {\n /** Whether fee authorization is required */\n requiresAuth: boolean;\n /** Whether a valid (non-expired) signature exists */\n hasValidSignature: boolean;\n /** Minting fee in satoshis */\n feeInSatoshis: bigint | null;\n /** Minting fee formatted in BTC */\n feeFormatted: string | null;\n /** Expiration date if signature exists */\n expirationDate: string | null;\n}\n\n/**\n * Parameters for fee authorization\n */\nexport interface AuthorizeFeeParams {\n chainId: ChainId;\n account: `0x${string}`;\n feeInSatoshis: bigint;\n provider: EIP1193Provider;\n env: Env;\n token: Token;\n}\n\n// ═══════════════════════════════════════════════════════════════════════════\n// Fee Authorization Logic\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * Check if fee authorization is required and if a valid signature exists\n *\n * This should be called in the action's prepare() method to determine\n * whether to transition to NEEDS_FEE_AUTHORIZATION or READY status.\n *\n * @param chainId - The EVM chain ID\n * @param account - The user's EVM account address\n * @param env - The environment (prod, stage, testnet)\n * @param token - The token type (BTCb or LBTC)\n * @returns Fee authorization check result\n */\nexport async function checkFeeAuthorization(\n chainId: ChainId,\n account: `0x${string}`,\n env: Env,\n token: Token,\n): Promise<FeeAuthCheckResult> {\n // Check if this chain requires fee authorization\n if (!requiresAutoMintFee(chainId)) {\n return {\n requiresAuth: false,\n hasValidSignature: false,\n feeInSatoshis: null,\n feeFormatted: null,\n expirationDate: null,\n };\n }\n\n // Get token address for signature lookup\n const tokenInfo = await getTokenContractInfo(token, chainId, env);\n\n // Check for existing valid signature on server\n const existingSignature = await getNetworkFeeSignature({\n address: account,\n chainId,\n env,\n tokenAddress: tokenInfo.address,\n });\n\n // Check if signature exists and is not expired\n const isExpired = existingSignature.expirationDate\n ? new Date(Number(existingSignature.expirationDate) * 1000) < new Date()\n : false;\n\n const hasValidSignature = existingSignature.hasSignature && !isExpired;\n\n // If no valid signature, fetch the minting fee\n let feeInSatoshis: bigint | null = null;\n let feeFormatted: string | null = null;\n\n if (!hasValidSignature) {\n const feeInBtc = await getMintingFee({\n token,\n chainId,\n env,\n });\n feeInSatoshis = BigInt(feeInBtc.times(1e8).toFixed(0));\n feeFormatted = feeInBtc.toFixed(8);\n }\n\n return {\n requiresAuth: true,\n hasValidSignature,\n feeInSatoshis,\n feeFormatted,\n expirationDate: existingSignature.expirationDate ?? null,\n };\n}\n\n/**\n * Authorize fee by signing and storing the signature\n *\n * This should be called from the action's authorizeFee() method.\n *\n * @param params - Authorization parameters\n * @returns The signature\n */\nexport async function authorizeFee(\n params: AuthorizeFeeParams,\n): Promise<{ signature: `0x${string}`; typedData: string }> {\n const { chainId, account, feeInSatoshis, provider, env, token } = params;\n\n // Get token address for storing signature\n const tokenInfo = await getTokenContractInfo(token, chainId, env);\n\n // Sign the network fee\n const signResult = await signNetworkFee({\n fee: feeInSatoshis,\n account,\n chainId,\n provider,\n env,\n token,\n });\n\n // Store the signature on the server\n await storeNetworkFeeSignature({\n signature: signResult.signature,\n typedData: signResult.typedData,\n address: account,\n env,\n tokenAddress: tokenInfo.address,\n });\n\n return signResult;\n}\n\n/**\n * Create initial fee auth state\n */\nexport function createInitialFeeAuthState(): FeeAuthState {\n return {\n requiresAuth: false,\n isAuthorized: false,\n feeInSatoshis: null,\n feeFormatted: null,\n expirationDate: null,\n };\n}\n","/**\n * EVM Redeem Action\n *\n * Redeems BTC.b to native BTC (cross-chain).\n * This is the opposite operation to BTC Deposit.\n *\n * Flow: BTC.b (EVM) → BTC (Bitcoin)\n *\n * ## Fee Authorization\n *\n * On Ethereum/Sepolia, fee authorization is required before redemption.\n * This covers the gas cost of the auto-mint operation on the destination.\n *\n * **Flow with fee auth (Ethereum/Sepolia):**\n * IDLE → NEEDS_FEE_AUTHORIZATION → READY → COMPLETED\n *\n * **Flow without fee auth (Base, BSC - subsidized):**\n * IDLE → READY → COMPLETED\n *\n * @module chains/evm/actions/redeem/EvmRedeem\n */\n\nimport type { EIP1193Provider } from 'viem';\nimport { z } from 'zod';\n\nimport type { ChainId } from '../../../../common/chains';\nimport { redeemToken } from '../../../../contract-functions';\nimport { parseChainIdentifier, StepStatus } from '../../../../core';\nimport { BaseAction } from '../../../../shared/actions/BaseAction';\nimport { EvmOperationStatus } from '../../../../shared/constants/statusConstants';\nimport type { EvmCoreContext } from '../../../../shared/context';\nimport { LombardError } from '../../../../shared/errors';\nimport type { RedeemEventMap } from '../../../../shared/events';\nimport {\n evmAmountSchema,\n validatePrepareParams,\n} from '../../../../shared/validation';\nimport { Token } from '../../../../tokens/token-addresses';\nimport {\n authorizeFee as authorizeFeeShared,\n checkFeeAuthorization,\n createInitialFeeAuthState,\n type FeeAuthState,\n} from '../../shared/feeAuth';\nimport { evmConfig } from './config';\nimport type {\n EvmRedeemParams,\n EvmRedeemPrepareParams,\n IEvmRedeem,\n} from './types';\n\nexport class EvmRedeem\n extends BaseAction<RedeemEventMap, EvmOperationStatus>\n implements IEvmRedeem\n{\n private _amount?: string;\n private _recipient?: string;\n private _needsApproval = false;\n private _txHash?: string;\n private _feeAuth: FeeAuthState = createInitialFeeAuthState();\n\n constructor(\n private readonly ctx: EvmCoreContext,\n private readonly params: EvmRedeemParams,\n ) {\n super(EvmOperationStatus.IDLE);\n }\n\n get amount(): string | undefined {\n return this._amount;\n }\n\n get recipient(): string | undefined {\n return this._recipient;\n }\n\n get needsApproval(): boolean {\n return this._needsApproval;\n }\n\n get txHash(): string | undefined {\n return this._txHash;\n }\n\n /** Fee authorization state (for UI display) */\n get feeAuth(): FeeAuthState {\n return this._feeAuth;\n }\n\n async prepare(params: EvmRedeemPrepareParams): Promise<void> {\n this.assertStatus(EvmOperationStatus.IDLE, 'prepare');\n\n return this.act(async () => {\n const validated = validatePrepareParams(this.prepareSchema, params, {\n destChain: this.params.destChain,\n });\n this._amount = validated.amount as string;\n this._recipient = validated.recipient as string;\n\n const chainId = parseChainIdentifier(this.params.sourceChain) as ChainId;\n\n // Get EVM account for fee auth check\n const provider = await this.ctx.getProvider('evm');\n if (!provider) {\n throw LombardError.providerMissing(this.params.sourceChain, 'evm');\n }\n const accounts = await (provider as EIP1193Provider).request({\n method: 'eth_accounts',\n });\n const account = accounts[0] as `0x${string}`;\n\n // Check fee authorization status (BTC.b redeem uses Token.BTCb)\n const feeAuthResult = await checkFeeAuthorization(\n chainId,\n account,\n this.ctx.env,\n Token.BTCb,\n );\n\n // Update fee auth state\n this._feeAuth = {\n requiresAuth: feeAuthResult.requiresAuth,\n isAuthorized: feeAuthResult.hasValidSignature,\n feeInSatoshis: feeAuthResult.feeInSatoshis,\n feeFormatted: feeAuthResult.feeFormatted,\n expirationDate: feeAuthResult.expirationDate,\n };\n\n // Determine next status based on fee auth\n // Note: Status is set here (not via act's successStatus) because the\n // fee auth state is only known after the async check completes.\n if (feeAuthResult.requiresAuth && !feeAuthResult.hasValidSignature) {\n this.updateStatus(EvmOperationStatus.NEEDS_FEE_AUTHORIZATION);\n this.emitProgress({\n status: EvmOperationStatus.NEEDS_FEE_AUTHORIZATION,\n steps: { burning: StepStatus.IDLE, releasing: StepStatus.IDLE },\n });\n return;\n }\n\n // No fee auth required or already authorized\n this._needsApproval = false;\n this.updateStatus(EvmOperationStatus.READY);\n this.emitProgress({\n status: EvmOperationStatus.READY,\n steps: { burning: StepStatus.IDLE, releasing: StepStatus.IDLE },\n });\n });\n }\n\n /**\n * Authorize the network fee\n *\n * Must be called when status is NEEDS_FEE_AUTHORIZATION.\n * Signs the fee authorization and stores it on the server.\n */\n async authorizeFee(): Promise<void> {\n this.assertStatus(\n EvmOperationStatus.NEEDS_FEE_AUTHORIZATION,\n 'authorizeFee',\n );\n\n if (!this._feeAuth.feeInSatoshis) {\n throw LombardError.missingParameter('feeInSatoshis');\n }\n\n return this.act(async () => {\n const chainId = parseChainIdentifier(this.params.sourceChain) as ChainId;\n\n const provider = await this.ctx.getProvider('evm');\n if (!provider) {\n throw LombardError.providerMissing(this.params.sourceChain, 'evm');\n }\n\n const accounts = await (provider as EIP1193Provider).request({\n method: 'eth_accounts',\n });\n const account = accounts[0] as `0x${string}`;\n\n // Sign and store fee authorization\n await authorizeFeeShared({\n chainId,\n account,\n feeInSatoshis: this._feeAuth.feeInSatoshis!,\n provider: provider as EIP1193Provider,\n env: this.ctx.env,\n token: Token.BTCb,\n });\n\n // Update state\n this._feeAuth.isAuthorized = true;\n\n this.emitProgress({\n status: EvmOperationStatus.READY,\n steps: { burning: StepStatus.IDLE, releasing: StepStatus.IDLE },\n });\n }, EvmOperationStatus.READY);\n }\n\n async approve(): Promise<void> {\n this.assertStatus(EvmOperationStatus.NEEDS_APPROVAL, 'approve');\n\n return this.act(async () => {\n this._needsApproval = false;\n this.emitProgress({\n status: EvmOperationStatus.READY,\n steps: { burning: StepStatus.IDLE, releasing: StepStatus.IDLE },\n });\n }, EvmOperationStatus.READY);\n }\n\n async execute(): Promise<{ txHash: string }> {\n this.assertStatus(EvmOperationStatus.READY, 'execute');\n\n return this.act(async () => {\n const provider = await this.ctx.getProvider('evm');\n if (!provider) {\n throw LombardError.providerMissing(this.params.sourceChain, 'evm');\n }\n\n // Get the connected EVM account address from the provider\n const accounts = await (provider as EIP1193Provider).request({\n method: 'eth_accounts',\n });\n const evmAccount = accounts[0] as `0x${string}`;\n if (!evmAccount) {\n throw LombardError.providerMissing(this.params.sourceChain, 'evm');\n }\n\n const chainId = parseChainIdentifier(this.params.sourceChain) as ChainId;\n\n this.emitProgress({\n status: EvmOperationStatus.READY,\n steps: { burning: StepStatus.PENDING, releasing: StepStatus.IDLE },\n });\n\n // Execute BTC.b → BTC redemption (burn BTC.b, release BTC to Bitcoin address)\n const txHash = await redeemToken({\n provider: provider as EIP1193Provider,\n account: evmAccount,\n amount: this._amount!,\n btcAddress: this._recipient!, // Bitcoin address to receive BTC\n chainId,\n env: this.ctx.env,\n tokenIn: Token.BTCb,\n tokenOut: undefined, // Native BTC output\n });\n\n this._txHash = txHash;\n\n this.emitProgress({\n status: EvmOperationStatus.COMPLETED,\n steps: { burning: StepStatus.COMPLETE, releasing: StepStatus.PENDING },\n });\n\n this.emitCompleted();\n\n return { txHash };\n }, EvmOperationStatus.COMPLETED);\n }\n\n private get prepareSchema() {\n return z.object({\n amount: evmAmountSchema,\n recipient: evmConfig.recipientSchema,\n });\n }\n}\n","/**\n * EVM Redeem Factory Functions\n *\n * @module chains/evm/actions/redeem/factory\n */\n\nimport type { LombardConfig } from '../../../../config/types';\nimport type { EvmCoreContext } from '../../../../shared/context';\nimport { createEvmCoreContext } from '../../../../shared/context';\nimport { EvmRedeem } from './EvmRedeem';\nimport type { EvmRedeemParams } from './types';\n\n/**\n * Create EvmRedeem action from config\n *\n * @internal This factory is for internal use. Use createLombardSDK() instead:\n *\n * @example\n * ```typescript\n * const sdk = await createLombardSDK({ env: Env.prod, providers: { evm: () => window.ethereum } });\n * const redeem = sdk.chain.evm.redeem({\n * sourceChain: Chain.ETHEREUM,\n * });\n * await redeem.prepare({ amount: '0.1' });\n * ```\n */\nexport function evmRedeem(\n config: LombardConfig,\n params: EvmRedeemParams,\n): EvmRedeem {\n const ctx = createEvmCoreContext(config);\n return new EvmRedeem(ctx, params);\n}\n\n/**\n * Create EvmRedeem action from context\n */\nexport function createEvmRedeem(\n ctx: EvmCoreContext,\n params: EvmRedeemParams,\n): EvmRedeem {\n return new EvmRedeem(ctx, params);\n}\n","/**\n * EVM Stake Action\n *\n * Stakes BTC.b to receive LBTC via the Asset Router.\n * This is the EVM equivalent of staking - converting wrapped BTC to LBTC.\n *\n * ## Approval (Avalanche only)\n *\n * On Avalanche, users must approve the Adapter contract to spend their BTC.b.\n *\n * ## Fee Authorization (Ethereum/Sepolia only)\n *\n * Fee authorization is required on unsubsidized chains (Ethereum, Sepolia).\n * On subsidized chains (Avalanche, Base, BSC), no fee auth is required.\n *\n * **Flow with approval (Avalanche):**\n * IDLE → NEEDS_APPROVAL → READY → COMPLETED\n *\n * **Flow with fee auth (Ethereum/Sepolia):**\n * IDLE → NEEDS_FEE_AUTHORIZATION → READY → COMPLETED\n *\n * **Flow without either (Base, BSC):**\n * IDLE → READY → COMPLETED\n *\n * @module chains/evm/actions/stake/EvmStake\n */\n\nimport BigNumber from 'bignumber.js';\nimport type { EIP1193Provider } from 'viem';\nimport { z } from 'zod';\n\nimport { makePublicClient } from '../../../../clients/public-client';\nimport { ChainId } from '../../../../common/chains';\nimport {\n approveToken,\n getTokenAllowance,\n} from '../../../../contract-functions/approveToken';\nimport { depositToken } from '../../../../contract-functions/deposit';\nimport { parseChainIdentifier, StepStatus } from '../../../../core';\nimport { BaseAction } from '../../../../shared/actions/BaseAction';\nimport { EvmOperationStatus } from '../../../../shared/constants/statusConstants';\nimport type { EvmCoreContext } from '../../../../shared/context';\nimport { LombardError } from '../../../../shared/errors';\nimport type { StakeEventMap } from '../../../../shared/events';\nimport {\n evmAmountSchema,\n validatePrepareParams,\n} from '../../../../shared/validation';\nimport { AddressKind, Token } from '../../../../tokens/token-addresses';\nimport { getTokenContractInfo } from '../../../../tokens/tokens';\nimport { waitForTransactionReceipt } from '../../../../utils/transaction-executor';\nimport {\n authorizeFee as authorizeFeeShared,\n checkFeeAuthorization,\n createInitialFeeAuthState,\n type FeeAuthState,\n} from '../../shared/feeAuth';\nimport type { EvmStakeParams, EvmStakePrepareParams, IEvmStake } from './types';\n\n/**\n * Chains that require ERC20 approval for BTC.b staking (to the Adapter)\n */\nconst APPROVAL_REQUIRED_CHAINS: readonly ChainId[] = [\n ChainId.avalanche,\n ChainId.avalancheFuji,\n] as const;\n\nfunction requiresApproval(chainId: ChainId): boolean {\n return APPROVAL_REQUIRED_CHAINS.includes(chainId);\n}\n\nexport class EvmStake\n extends BaseAction<StakeEventMap, EvmOperationStatus>\n implements IEvmStake\n{\n private _amount?: string;\n private _txHash?: string;\n private _feeAuth: FeeAuthState = createInitialFeeAuthState();\n private _account?: `0x${string}`;\n private _needsApproval = false;\n private _spenderAddress?: `0x${string}`;\n\n constructor(\n private readonly ctx: EvmCoreContext,\n private readonly params: EvmStakeParams,\n ) {\n super(EvmOperationStatus.IDLE);\n }\n\n get amount(): string | undefined {\n return this._amount;\n }\n\n get txHash(): string | undefined {\n return this._txHash;\n }\n\n /** Fee authorization state (for UI display) */\n get feeAuth(): FeeAuthState {\n return this._feeAuth;\n }\n\n /** Whether approval is needed */\n get needsApproval(): boolean {\n return this._needsApproval;\n }\n\n async prepare(params: EvmStakePrepareParams): Promise<void> {\n this.assertStatus(EvmOperationStatus.IDLE, 'prepare');\n\n return this.act(async () => {\n const validated = validatePrepareParams(this.prepareSchema, params);\n this._amount = validated.amount;\n\n const provider = await this.ctx.getProvider('evm');\n if (!provider) {\n throw LombardError.providerMissing(this.params.sourceChain, 'evm');\n }\n\n const accounts = await (provider as EIP1193Provider).request({\n method: 'eth_accounts',\n });\n const account = (accounts as string[])[0] as `0x${string}`;\n\n if (!account) {\n throw LombardError.providerMissing(this.params.sourceChain, 'evm');\n }\n this._account = account;\n\n const chainId = parseChainIdentifier(this.params.sourceChain) as ChainId;\n\n // Check if approval is required (Avalanche only)\n if (requiresApproval(chainId)) {\n // Get the Adapter address (spender for approval)\n const adapterInfo = await getTokenContractInfo(\n Token.BTCb,\n chainId,\n this.ctx.env,\n AddressKind.Adapter,\n );\n this._spenderAddress = adapterInfo.address;\n\n // Check current allowance\n const allowance = await getTokenAllowance({\n token: Token.BTCb,\n owner: account,\n spender: adapterInfo.address,\n chainId,\n env: this.ctx.env,\n });\n\n const requiredAmount = new BigNumber(validated.amount);\n this._needsApproval = allowance.isLessThan(requiredAmount);\n\n if (this._needsApproval) {\n this.emitProgress({\n status: EvmOperationStatus.NEEDS_APPROVAL,\n steps: { approval: StepStatus.PENDING, staking: StepStatus.IDLE },\n });\n this.updateStatus(EvmOperationStatus.NEEDS_APPROVAL);\n return;\n }\n }\n\n // Check fee authorization status (BTC.b → LBTC uses Token.LBTC for fee signature)\n const feeAuthResult = await checkFeeAuthorization(\n chainId,\n account,\n this.ctx.env,\n Token.LBTC,\n );\n\n // Update fee auth state\n this._feeAuth = {\n requiresAuth: feeAuthResult.requiresAuth,\n isAuthorized: feeAuthResult.hasValidSignature,\n feeInSatoshis: feeAuthResult.feeInSatoshis,\n feeFormatted: feeAuthResult.feeFormatted,\n expirationDate: feeAuthResult.expirationDate,\n };\n\n // Determine next status based on fee auth\n const needsFeeAuth =\n feeAuthResult.requiresAuth && !feeAuthResult.hasValidSignature;\n\n if (needsFeeAuth) {\n this.emitProgress({\n status: EvmOperationStatus.NEEDS_FEE_AUTHORIZATION,\n steps: { staking: StepStatus.IDLE },\n });\n this.updateStatus(EvmOperationStatus.NEEDS_FEE_AUTHORIZATION);\n } else {\n this.emitProgress({\n status: EvmOperationStatus.READY,\n steps: { staking: StepStatus.PENDING },\n });\n this.updateStatus(EvmOperationStatus.READY);\n }\n });\n }\n\n /**\n * Approve BTC.b spending (Avalanche only)\n *\n * Must be called when status is NEEDS_APPROVAL.\n */\n async approve(): Promise<void> {\n this.assertStatus(EvmOperationStatus.NEEDS_APPROVAL, 'approve');\n\n return this.act(async () => {\n if (!this._account || !this._spenderAddress || !this._amount) {\n throw LombardError.missingParameter(\n 'account, spenderAddress, or amount',\n );\n }\n\n const provider = await this.ctx.getProvider('evm');\n if (!provider) {\n throw LombardError.providerMissing(this.params.sourceChain, 'evm');\n }\n\n const chainId = parseChainIdentifier(this.params.sourceChain) as ChainId;\n\n // Execute approval transaction\n const txHash = await approveToken({\n account: this._account,\n token: Token.BTCb,\n spender: this._spenderAddress,\n amount: this._amount,\n chainId,\n provider: provider as EIP1193Provider,\n env: this.ctx.env,\n });\n\n // Wait for approval to be confirmed on-chain\n const publicClient = makePublicClient({ chainId, env: this.ctx.env });\n await waitForTransactionReceipt(publicClient, txHash, 'BTC.b approval');\n\n // Mark approval as done\n this._needsApproval = false;\n\n this.emitProgress({\n status: EvmOperationStatus.READY,\n steps: { approval: StepStatus.COMPLETE, staking: StepStatus.PENDING },\n });\n }, EvmOperationStatus.READY);\n }\n\n async authorizeFee(): Promise<void> {\n this.assertStatus(\n EvmOperationStatus.NEEDS_FEE_AUTHORIZATION,\n 'authorizeFee',\n );\n\n return this.act(async () => {\n if (!this._feeAuth.feeInSatoshis) {\n throw LombardError.missingParameter('feeInSatoshis');\n }\n\n const provider = await this.ctx.getProvider('evm');\n if (!provider) {\n throw LombardError.providerMissing(this.params.sourceChain, 'evm');\n }\n\n const chainId = parseChainIdentifier(this.params.sourceChain) as ChainId;\n\n // Sign and store the fee authorization\n await authorizeFeeShared({\n chainId,\n account: this._account!,\n feeInSatoshis: this._feeAuth.feeInSatoshis,\n provider: provider as EIP1193Provider,\n env: this.ctx.env,\n token: Token.LBTC, // BTC.b → LBTC uses LBTC token for fee signature\n });\n\n // Update fee auth state\n this._feeAuth = {\n ...this._feeAuth,\n isAuthorized: true,\n };\n\n this.emitProgress({\n status: EvmOperationStatus.READY,\n steps: { staking: StepStatus.PENDING },\n });\n }, EvmOperationStatus.READY);\n }\n\n async execute(): Promise<{ txHash: string }> {\n this.assertStatus(EvmOperationStatus.READY, 'execute');\n\n return this.act(async () => {\n const provider = await this.ctx.getProvider('evm');\n if (!provider) {\n throw LombardError.providerMissing(this.params.sourceChain, 'evm');\n }\n\n const chainId = parseChainIdentifier(this.params.sourceChain) as ChainId;\n\n // Get account from provider\n const accounts = await (provider as EIP1193Provider).request({\n method: 'eth_accounts',\n });\n const account = (accounts as string[])[0] as `0x${string}`;\n\n if (!account) {\n throw LombardError.providerMissing(this.params.sourceChain, 'evm');\n }\n\n this.emitProgress({\n status: EvmOperationStatus.READY,\n steps: { staking: StepStatus.PENDING },\n });\n\n // Execute BTC.b → LBTC via Asset Router\n const txHash = await depositToken({\n amount: this._amount!,\n tokenIn: Token.BTCb,\n tokenOut: Token.LBTC,\n account,\n chainId,\n provider: provider as EIP1193Provider,\n env: this.ctx.env,\n });\n\n this._txHash = txHash;\n\n this.emitProgress({\n status: EvmOperationStatus.COMPLETED,\n steps: { staking: StepStatus.COMPLETE },\n });\n\n this.emitCompleted();\n\n return { txHash };\n }, EvmOperationStatus.COMPLETED);\n }\n\n private get prepareSchema() {\n return z.object({\n amount: evmAmountSchema,\n });\n }\n}\n","/**\n * EVM Stake Factory Functions\n *\n * Provides factory functions for creating EvmStake instances.\n *\n * @module chains/evm/actions/stake/factory\n */\n\nimport type { LombardConfig } from '../../../../config/types';\nimport type { EvmCoreContext } from '../../../../shared/context';\nimport { createEvmCoreContext } from '../../../../shared/context';\nimport { EvmStake } from './EvmStake';\nimport type { EvmStakeParams } from './types';\n\n/**\n * Create EvmStake action from config\n *\n * @internal This factory is for internal use. Use createLombardSDK() instead:\n *\n * @example\n * ```typescript\n * const sdk = await createLombardSDK({ env: Env.prod, providers: { evm: () => window.ethereum } });\n * const stake = sdk.chain.evm.stake({\n * sourceChain: Chain.ETHEREUM,\n * destChain: Chain.ETHEREUM,\n * });\n * await stake.prepare({ amount: '0.1' });\n * ```\n */\nexport function evmStake(\n config: LombardConfig,\n params: EvmStakeParams,\n): EvmStake {\n const ctx = createEvmCoreContext(config);\n return new EvmStake(ctx, params);\n}\n\n/**\n * Create EvmStake action from context\n *\n * Use this when you already have an EvmCoreContext (e.g., in EvmActions).\n *\n * @param ctx - EvmCoreContext\n * @param params - Stake parameters\n * @returns EvmStake instance\n */\nexport function createEvmStake(\n ctx: EvmCoreContext,\n params: EvmStakeParams,\n): EvmStake {\n return new EvmStake(ctx, params);\n}\n","/**\n * EVM Chain Configuration for Unstake\n *\n * Handles unstaking LBTC to BTC (cross-chain) or BTC.b (same-chain).\n * Routes are derived from ASSET_CATALOG to ensure consistency.\n *\n * @module chains/evm/actions/unstake/config/evm\n */\n\nimport { Env } from '@lombard.finance/sdk-common';\n\nimport {\n AssetId,\n Chain,\n getEvmAssetChains,\n getEvmChainsWithAllAssets,\n} from '../../../../../core';\nimport {\n bitcoinAddressSchema,\n evmAddressSchema,\n} from '../../../../../shared/validation';\nimport type { ChainConfig } from './types';\n\n// ═══════════════════════════════════════════════════════════════════════════\n// Catalog-Derived Chain Lists\n// ═══════════════════════════════════════════════════════════════════════════\n\n/** EVM chains with LBTC deployed (can unstake to BTC) */\nconst LBTC_PROD_CHAINS = getEvmAssetChains(AssetId.LBTC, [Env.prod]);\nconst LBTC_TESTNET_CHAINS = getEvmAssetChains(AssetId.LBTC, [\n Env.testnet,\n Env.stage,\n Env.dev,\n Env.ibc,\n]);\n\n/** EVM chains with BOTH LBTC and BTCb deployed (can unstake to BTCb) */\nconst LBTC_BTCB_PROD_CHAINS = getEvmChainsWithAllAssets(\n [AssetId.LBTC, AssetId.BTCb],\n [Env.prod],\n);\nconst LBTC_BTCB_TESTNET_CHAINS = getEvmChainsWithAllAssets(\n [AssetId.LBTC, AssetId.BTCb],\n [Env.testnet, Env.stage, Env.dev, Env.ibc],\n);\n\n// ═══════════════════════════════════════════════════════════════════════════\n// Configuration Objects\n// ═══════════════════════════════════════════════════════════════════════════\n\n/**\n * EVM → BTC configuration (cross-chain unstake)\n *\n * Burns LBTC on EVM, releases BTC on Bitcoin network.\n * Source chains derived from ASSET_CATALOG LBTC deployments.\n */\nexport const evmToBtcConfig: ChainConfig = {\n chainType: 'evm',\n\n routes: [\n // Production: EVM chains with LBTC → Bitcoin Mainnet\n {\n sourceChains: LBTC_PROD_CHAINS,\n destChain: Chain.BITCOIN_MAINNET,\n envs: [Env.prod],\n },\n // Testnet: EVM chains with LBTC → Bitcoin Signet\n {\n sourceChains: LBTC_TESTNET_CHAINS,\n destChain: Chain.BITCOIN_SIGNET,\n envs: [Env.testnet, Env.stage, Env.dev, Env.ibc],\n },\n ],\n\n recipientSchema: bitcoinAddressSchema,\n};\n\n/**\n * EVM → BTC.b configuration (same-chain wrapped)\n *\n * Burns LBTC on EVM, mints BTC.b on same EVM chain.\n * Only available on chains with BOTH LBTC and BTCb deployed.\n * Routes are generated dynamically from catalog.\n */\nexport const evmToBtcbConfig: ChainConfig = {\n chainType: 'evm',\n\n routes: [\n // Production: Same-chain routes for chains with both LBTC and BTCb\n ...LBTC_BTCB_PROD_CHAINS.map((chain) => ({\n sourceChains: [chain],\n destChain: chain,\n envs: [Env.prod] as Env[],\n })),\n // Testnet: Same-chain routes\n ...LBTC_BTCB_TESTNET_CHAINS.map((chain) => ({\n sourceChains: [chain],\n destChain: chain,\n envs: [Env.testnet, Env.stage, Env.dev, Env.ibc] as Env[],\n })),\n ],\n\n recipientSchema: evmAddressSchema,\n};\n\n/**\n * Check if unstake to BTC is supported\n */\nexport function isBtcUnstakeSupported(sourceChain: Chain, env: Env): boolean {\n return evmToBtcConfig.routes.some(\n (route) =>\n route.sourceChains.includes(sourceChain) && route.envs.includes(env),\n );\n}\n\n/**\n * Check if unstake to BTC.b is supported\n */\nexport function isBtcbUnstakeSupported(sourceChain: Chain, env: Env): boolean {\n return evmToBtcbConfig.routes.some(\n (route) =>\n route.sourceChains.includes(sourceChain) && route.envs.includes(env),\n );\n}\n","/**\n * EVM Unstake Action\n *\n * Burns LBTC on EVM chains and releases BTC (cross-chain) or BTC.b (same-chain).\n *\n * ## Fee Authorization\n *\n * Fee authorization is required when:\n * - Output asset is BTC.b (LBTC → BTC.b conversion)\n * - Source chain is Ethereum/Sepolia (unsubsidized chains)\n *\n * **Flow with fee auth (LBTC → BTC.b on Ethereum/Sepolia):**\n * IDLE → NEEDS_FEE_AUTHORIZATION → READY → COMPLETED\n *\n * **Flow without fee auth (LBTC → BTC, or BTC.b on Base/BSC):**\n * IDLE → READY → COMPLETED\n *\n * @module chains/evm/actions/unstake/EvmUnstake\n */\n\nimport type { EIP1193Provider } from 'viem';\nimport { z } from 'zod';\n\nimport type { ChainId } from '../../../../common/chains';\nimport { redeemToken } from '../../../../contract-functions';\nimport { AssetId, parseChainIdentifier, StepStatus } from '../../../../core';\nimport { BaseAction } from '../../../../shared/actions/BaseAction';\nimport { EvmOperationStatus } from '../../../../shared/constants/statusConstants';\nimport type { EvmCoreContext } from '../../../../shared/context';\nimport { LombardError } from '../../../../shared/errors';\nimport type { UnstakeEventMap } from '../../../../shared/events';\nimport {\n evmAmountSchema,\n validatePrepareParams,\n} from '../../../../shared/validation';\nimport { Token } from '../../../../tokens/token-addresses';\nimport {\n authorizeFee as authorizeFeeShared,\n checkFeeAuthorization,\n createInitialFeeAuthState,\n type FeeAuthState,\n} from '../../shared/feeAuth';\nimport { evmToBtcbConfig, evmToBtcConfig } from './config';\nimport type {\n EvmUnstakeParams,\n EvmUnstakePrepareParams,\n IEvmUnstake,\n} from './types';\n\nexport class EvmUnstake\n extends BaseAction<UnstakeEventMap, EvmOperationStatus>\n implements IEvmUnstake\n{\n private _amount?: string;\n private _recipient?: string;\n private _txHash?: string;\n private _feeAuth: FeeAuthState = createInitialFeeAuthState();\n\n constructor(\n private readonly ctx: EvmCoreContext,\n private readonly params: EvmUnstakeParams,\n ) {\n super(EvmOperationStatus.IDLE);\n }\n\n get amount(): string | undefined {\n return this._amount;\n }\n\n get recipient(): string | undefined {\n return this._recipient;\n }\n\n get txHash(): string | undefined {\n return this._txHash;\n }\n\n /** Fee authorization state (for UI display) */\n get feeAuth(): FeeAuthState {\n return this._feeAuth;\n }\n\n /** Whether output is BTC.b (requires fee auth on unsubsidized chains) */\n private get isBtcbOutput(): boolean {\n return this.params.assetOut === AssetId.BTCb;\n }\n\n async prepare(params: EvmUnstakePrepareParams): Promise<void> {\n this.assertStatus(EvmOperationStatus.IDLE, 'prepare');\n\n return this.act(async () => {\n const validated = validatePrepareParams(this.prepareSchema, params, {\n destChain: this.params.destChain,\n });\n this._amount = validated.amount;\n this._recipient = validated.recipient;\n\n const chainId = parseChainIdentifier(this.params.sourceChain) as ChainId;\n\n // Fee auth is only required for BTC.b output on unsubsidized chains\n if (this.isBtcbOutput) {\n // Get EVM account for fee auth check\n const provider = await this.ctx.getProvider('evm');\n if (!provider) {\n throw LombardError.providerMissing(this.params.sourceChain, 'evm');\n }\n const accounts = await (provider as EIP1193Provider).request({\n method: 'eth_accounts',\n });\n const account = accounts[0] as `0x${string}`;\n\n // Check fee authorization status (use Token.BTCb for LBTC → BTC.b)\n const feeAuthResult = await checkFeeAuthorization(\n chainId,\n account,\n this.ctx.env,\n Token.BTCb,\n );\n\n // Update fee auth state\n this._feeAuth = {\n requiresAuth: feeAuthResult.requiresAuth,\n isAuthorized: feeAuthResult.hasValidSignature,\n feeInSatoshis: feeAuthResult.feeInSatoshis,\n feeFormatted: feeAuthResult.feeFormatted,\n expirationDate: feeAuthResult.expirationDate,\n };\n\n // If fee auth required and not authorized, transition to NEEDS_FEE_AUTHORIZATION\n // Note: Status is set here (not via act's successStatus) because the\n // fee auth state is only known after the async check completes.\n if (feeAuthResult.requiresAuth && !feeAuthResult.hasValidSignature) {\n this.updateStatus(EvmOperationStatus.NEEDS_FEE_AUTHORIZATION);\n this.emitProgress({\n status: EvmOperationStatus.NEEDS_FEE_AUTHORIZATION,\n steps: { burning: StepStatus.IDLE, releasing: StepStatus.IDLE },\n });\n return;\n }\n }\n\n // No fee auth required or already authorized\n this.updateStatus(EvmOperationStatus.READY);\n this.emitProgress({\n status: EvmOperationStatus.READY,\n steps: { burning: StepStatus.IDLE, releasing: StepStatus.IDLE },\n });\n });\n }\n\n /**\n * Authorize the network fee\n *\n * Must be called when status is NEEDS_FEE_AUTHORIZATION.\n * Signs the fee authorization and stores it on the server.\n */\n async authorizeFee(): Promise<void> {\n this.assertStatus(\n EvmOperationStatus.NEEDS_FEE_AUTHORIZATION,\n 'authorizeFee',\n );\n\n if (!this._feeAuth.feeInSatoshis) {\n throw LombardError.missingParameter('feeInSatoshis');\n }\n\n return this.act(async () => {\n const chainId = parseChainIdentifier(this.params.sourceChain) as ChainId;\n\n const provider = await this.ctx.getProvider('evm');\n if (!provider) {\n throw LombardError.providerMissing(this.params.sourceChain, 'evm');\n }\n\n const accounts = await (provider as EIP1193Provider).request({\n method: 'eth_accounts',\n });\n const account = accounts[0] as `0x${string}`;\n\n // Sign and store fee authorization (use Token.BTCb for LBTC → BTC.b)\n await authorizeFeeShared({\n chainId,\n account,\n feeInSatoshis: this._feeAuth.feeInSatoshis!,\n provider: provider as EIP1193Provider,\n env: this.ctx.env,\n token: Token.BTCb,\n });\n\n // Update state\n this._feeAuth.isAuthorized = true;\n\n this.emitProgress({\n status: EvmOperationStatus.READY,\n steps: { burning: StepStatus.IDLE, releasing: StepStatus.IDLE },\n });\n }, EvmOperationStatus.READY);\n }\n\n async execute(): Promise<{ txHash: string }> {\n this.assertStatus(EvmOperationStatus.READY, 'execute');\n\n return this.act(async () => {\n const provider = await this.ctx.getProvider('evm');\n if (!provider) {\n throw LombardError.providerMissing(this.params.sourceChain, 'evm');\n }\n\n // Get the connected EVM account address from the provider\n const accounts = await (provider as EIP1193Provider).request({\n method: 'eth_accounts',\n });\n const evmAccount = accounts[0] as `0x${string}`;\n if (!evmAccount) {\n throw LombardError.providerMissing(this.params.sourceChain, 'evm');\n }\n\n const chainId = parseChainIdentifier(this.params.sourceChain) as ChainId;\n const isBtcbOutput = this.params.assetOut === AssetId.BTCb;\n\n this.emitProgress({\n status: EvmOperationStatus.READY,\n steps: { burning: StepStatus.PENDING, releasing: StepStatus.IDLE },\n });\n\n // For BTC output: account = EVM wallet (executing burn), btcAddress = recipient (Bitcoin)\n // For BTCb output: account = recipient (same EVM address receives BTCb)\n const txHash = await redeemToken({\n provider: provider as EIP1193Provider,\n account: isBtcbOutput\n ? (this._recipient! as `0x${string}`)\n : evmAccount,\n amount: this._amount!,\n btcAddress: isBtcbOutput ? undefined : this._recipient!,\n chainId,\n env: this.ctx.env,\n tokenIn: Token.LBTC,\n tokenOut: isBtcbOutput ? Token.BTCb : undefined,\n });\n\n this._txHash = txHash;\n\n this.emitProgress({\n status: EvmOperationStatus.COMPLETED,\n steps: {\n burning: StepStatus.COMPLETE,\n releasing: isBtcbOutput ? StepStatus.COMPLETE : StepStatus.PENDING,\n },\n });\n\n this.emitCompleted();\n\n return { txHash };\n }, EvmOperationStatus.COMPLETED);\n }\n\n private get prepareSchema() {\n const config =\n this.params.assetOut === AssetId.BTC ? evmToBtcConfig : evmToBtcbConfig;\n return z.object({\n amount: evmAmountSchema,\n recipient: config.recipientSchema,\n });\n }\n}\n","/**\n * EVM Unstake Factory Functions\n *\n * @module chains/evm/actions/unstake/factory\n */\n\nimport type { LombardConfig } from '../../../../config/types';\nimport type { EvmCoreContext } from '../../../../shared/context';\nimport { createEvmCoreContext } from '../../../../shared/context';\nimport { EvmUnstake } from './EvmUnstake';\nimport type { EvmUnstakeParams } from './types';\n\n/**\n * Create EvmUnstake action from config\n *\n * @internal This factory is for internal use. Use createLombardSDK() instead:\n *\n * @example\n * ```typescript\n * const sdk = await createLombardSDK({ env: Env.prod, providers: { evm: () => window.ethereum } });\n * const unstake = sdk.chain.evm.unstake({\n * sourceChain: Chain.ETHEREUM,\n * assetOut: AssetId.BTC,\n * });\n * await unstake.prepare({ amount: '0.1', recipient: 'bc1q...' });\n * ```\n */\nexport function evmUnstake(\n config: LombardConfig,\n params: EvmUnstakeParams,\n): EvmUnstake {\n const ctx = createEvmCoreContext(config);\n return new EvmUnstake(ctx, params);\n}\n\n/**\n * Create EvmUnstake action from context\n */\nexport function createEvmUnstake(\n ctx: EvmCoreContext,\n params: EvmUnstakeParams,\n): EvmUnstake {\n return new EvmUnstake(ctx, params);\n}\n","/**\n * EVM Chain Configuration for Withdraw\n *\n * Handles withdrawing vault shares from DeFi protocols.\n *\n * @module chains/evm/actions/withdraw/config/evm\n */\n\nimport { Env } from '@lombard.finance/sdk-common';\n\nimport { Chain, DeployProtocol } from '../../../../../core';\nimport { evmAddressSchema } from '../../../../../shared/validation';\nimport type { WithdrawChainConfig } from './types';\n\n/**\n * EVM withdraw configuration\n *\n * Withdraw support mirrors deploy support:\n * - Veda: Ethereum, Base, BSC, Corn (prod only)\n */\nexport const evmWithdrawConfig: WithdrawChainConfig = {\n chainType: 'evm',\n\n routes: [\n // Veda - Ethereum, Base, BSC, Corn\n {\n sourceChains: [Chain.ETHEREUM, Chain.BASE, Chain.BSC, Chain.CORN],\n protocols: [DeployProtocol.Veda],\n envs: [Env.prod],\n },\n ],\n\n addressSchema: evmAddressSchema,\n};\n\n/**\n * Check if a withdraw route is supported\n */\nexport function isWithdrawSupported(\n chain: Chain,\n protocol: DeployProtocol,\n env: Env,\n): boolean {\n return evmWithdrawConfig.routes.some(\n (route) =>\n route.sourceChains.includes(chain) &&\n route.protocols.includes(protocol) &&\n route.envs.includes(env),\n );\n}\n","/**\n * EVM Cancel Withdraw Action\n *\n * Cancels a pending vault withdrawal from DeFi protocols (Veda).\n *\n * @module chains/evm/actions/withdraw/EvmCancelWithdraw\n */\n\nimport type { EIP1193Provider } from 'viem';\n\nimport type { ChainId } from '../../../../common/chains';\nimport type { DeployProtocol } from '../../../../core';\nimport { parseChainIdentifier, StepStatus } from '../../../../core';\nimport { BaseAction } from '../../../../shared/actions/BaseAction';\nimport { EvmOperationStatus } from '../../../../shared/constants/statusConstants';\nimport type { EvmCoreContext } from '../../../../shared/context';\nimport { LombardError, WithdrawErrorCode } from '../../../../shared/errors';\nimport type { WithdrawEventMap } from '../../../../shared/events';\nimport { isEarnChain } from '../../../../vaults/lib/config';\nimport { cancelWithdrawInternal } from '../../../../vaults/lib/ops/withdraw';\nimport { evmWithdrawConfig } from './config';\nimport type { EvmCancelWithdrawParams, IEvmCancelWithdraw } from './types';\n\nexport class EvmCancelWithdraw\n extends BaseAction<WithdrawEventMap, EvmOperationStatus>\n implements IEvmCancelWithdraw\n{\n private _txHash?: string;\n private _account?: `0x${string}`;\n private _chainId?: ChainId;\n\n constructor(\n private readonly ctx: EvmCoreContext,\n private readonly params: EvmCancelWithdrawParams,\n ) {\n super(EvmOperationStatus.IDLE);\n }\n\n get txHash(): string | undefined {\n return this._txHash;\n }\n\n async prepare(): Promise<void> {\n this.assertStatus(EvmOperationStatus.IDLE, 'prepare');\n\n return this.act(async () => {\n this.validateProtocol(this.params.protocol);\n\n // Get provider and account\n const provider = await this.ctx.getProvider('evm');\n if (!provider) {\n throw LombardError.providerMissing(this.params.chain, 'evm');\n }\n\n const accounts = await (provider as EIP1193Provider).request({\n method: 'eth_accounts',\n });\n const account = (accounts as string[])[0] as `0x${string}`;\n if (!account) {\n throw LombardError.providerMissing(this.params.chain, 'evm');\n }\n\n this._account = account;\n this._chainId = parseChainIdentifier(this.params.chain) as ChainId;\n\n // Validate chain supports Veda vault\n if (!isEarnChain(this._chainId)) {\n throw new LombardError(\n WithdrawErrorCode.PROTOCOL_NOT_SUPPORTED,\n `Chain ${this.params.chain} does not support Veda vault withdrawals`,\n { chain: this.params.chain, protocol: this.params.protocol },\n );\n }\n\n this.emitProgress({\n status: EvmOperationStatus.READY,\n steps: { cancelling: StepStatus.PENDING },\n });\n this.updateStatus(EvmOperationStatus.READY);\n });\n }\n\n async execute(): Promise<{ txHash: string }> {\n this.assertStatus(EvmOperationStatus.READY, 'execute');\n\n return this.act(async () => {\n const provider = await this.ctx.getProvider('evm');\n if (!provider) {\n throw LombardError.providerMissing(this.params.chain, 'evm');\n }\n\n if (!this._account || !this._chainId) {\n throw LombardError.missingParameter('account or chainId');\n }\n\n this.emitProgress({\n status: EvmOperationStatus.READY,\n steps: { cancelling: StepStatus.PENDING },\n });\n\n // Execute vault cancel withdraw\n const txHash = await cancelWithdrawInternal({\n account: this._account,\n chainId: this._chainId,\n provider: provider as EIP1193Provider,\n env: this.ctx.env,\n });\n\n this._txHash = txHash;\n\n this.emitProgress({\n status: EvmOperationStatus.COMPLETED,\n steps: { cancelling: StepStatus.COMPLETE },\n });\n\n this.emitCompleted();\n\n return { txHash };\n }, EvmOperationStatus.COMPLETED);\n }\n\n private validateProtocol(protocol: DeployProtocol): void {\n const isSupported = evmWithdrawConfig.routes.some(\n (route) =>\n route.protocols.includes(protocol) && route.envs.includes(this.ctx.env),\n );\n if (!isSupported) {\n throw LombardError.invalidParameter(\n 'protocol',\n `Protocol ${protocol} is not supported for withdrawals in ${this.ctx.env} environment`,\n );\n }\n }\n}\n","/**\n * EVM Withdraw Action\n *\n * Queues withdrawal of vault shares from DeFi protocols (Veda).\n *\n * Protocol availability:\n * - Veda: Ethereum, Base, BSC, Corn (prod only)\n *\n * Protocol routing in execute():\n * - Veda on ETH/Base/BSC (BTCe chains): calls `withdrawEarn`, which handles\n * the BTCe → LBTCv unwrap automatically when the user's direct LBTCv\n * balance is insufficient to cover the requested amount.\n * - Veda on Corn (no BTCe): calls `queueWithdrawInternal` directly.\n *\n * @module chains/evm/actions/withdraw/EvmWithdraw\n */\n\nimport BigNumber from 'bignumber.js';\nimport type { EIP1193Provider } from 'viem';\nimport { z } from 'zod';\n\nimport { makePublicClient } from '../../../../clients/public-client';\nimport { makeWalletClient } from '../../../../clients/wallet-client';\nimport {\n CHAIN_ID_TO_VIEM_CHAIN_MAP,\n type ChainId,\n} from '../../../../common/chains';\nimport { withdrawEarn } from '../../../../contract-functions/withdrawEarn';\nimport type { DeployProtocol } from '../../../../core';\nimport { parseChainIdentifier, StepStatus } from '../../../../core';\nimport { BaseAction } from '../../../../shared/actions/BaseAction';\nimport { EvmOperationStatus } from '../../../../shared/constants/statusConstants';\nimport type { EvmCoreContext } from '../../../../shared/context';\nimport { LombardError, WithdrawErrorCode } from '../../../../shared/errors';\nimport type { WithdrawEventMap } from '../../../../shared/events';\nimport {\n evmAmountSchema,\n validatePrepareParams,\n} from '../../../../shared/validation';\nimport {\n fromBaseDenomination,\n toBaseDenomination,\n} from '../../../../tokens/tokens';\nimport toBigInt from '../../../../utils/numbers';\nimport { waitForTransactionReceipt } from '../../../../utils/transaction-executor';\nimport {\n BTCE_VAULT,\n EARN_VAULT,\n type EarnChain,\n isBtceVaultChain,\n isEarnChain,\n} from '../../../../vaults/lib/config';\nimport { queueWithdrawInternal } from '../../../../vaults/lib/ops/withdraw';\nimport { evmWithdrawConfig } from './config';\nimport type {\n EvmWithdrawParams,\n EvmWithdrawPrepareParams,\n IEvmWithdraw,\n} from './types';\n\nexport class EvmWithdraw\n extends BaseAction<WithdrawEventMap, EvmOperationStatus>\n implements IEvmWithdraw\n{\n private _amount?: string;\n private _protocol?: DeployProtocol;\n private _needsApproval = false;\n private _txHash?: string;\n private _account?: `0x${string}`;\n private _chainId?: ChainId;\n\n constructor(\n private readonly ctx: EvmCoreContext,\n private readonly params: EvmWithdrawParams,\n ) {\n super(EvmOperationStatus.IDLE);\n }\n\n get amount(): string | undefined {\n return this._amount;\n }\n\n get protocol(): DeployProtocol | undefined {\n return this._protocol;\n }\n\n get needsApproval(): boolean {\n return this._needsApproval;\n }\n\n get txHash(): string | undefined {\n return this._txHash;\n }\n\n async prepare(params: EvmWithdrawPrepareParams): Promise<void> {\n this.assertStatus(EvmOperationStatus.IDLE, 'prepare');\n\n return this.act(async () => {\n const validated = validatePrepareParams(this.prepareSchema, params);\n this._amount = validated.amount;\n this._protocol = this.params.protocol;\n\n this.validateProtocol(this.params.protocol);\n\n // Get provider and account\n const provider = await this.ctx.getProvider('evm');\n if (!provider) {\n throw LombardError.providerMissing(this.params.sourceChain, 'evm');\n }\n\n const accounts = await (provider as EIP1193Provider).request({\n method: 'eth_accounts',\n });\n const account = (accounts as string[])[0] as `0x${string}`;\n if (!account) {\n throw LombardError.providerMissing(this.params.sourceChain, 'evm');\n }\n\n this._account = account;\n this._chainId = parseChainIdentifier(this.params.sourceChain) as ChainId;\n\n // Validate chain supports Veda vault\n if (!isEarnChain(this._chainId)) {\n throw new LombardError(\n WithdrawErrorCode.PROTOCOL_NOT_SUPPORTED,\n `Chain ${this.params.sourceChain} does not support Veda vault withdrawals`,\n { chain: this.params.sourceChain, protocol: this._protocol },\n );\n }\n\n const vault = EARN_VAULT;\n const publicClient = makePublicClient({ chainId: this._chainId });\n const amount = new BigNumber(validated.amount);\n\n // Read direct LBTCv balance via the lens contract\n const lbtcvRaw = (await publicClient.readContract({\n address: vault.lensContract.address,\n abi: vault.lensContract.abi,\n functionName: 'balanceOf',\n args: [account, vault.vaultContract.address],\n })) as bigint;\n const lbtcvBalance = fromBaseDenomination(\n String(lbtcvRaw),\n vault.decimals,\n );\n\n // On BTCe-supported chains also include the BTCe wrapper position so\n // users who deposited via BTCe are not incorrectly rejected.\n let totalBalance = lbtcvBalance;\n if (isBtceVaultChain(this._chainId)) {\n const btceRaw = (await publicClient.readContract({\n address: BTCE_VAULT.contracts[this._chainId],\n abi: BTCE_VAULT.abi,\n functionName: 'balanceOf',\n args: [account],\n })) as bigint;\n const btceBalance = fromBaseDenomination(\n String(btceRaw),\n vault.decimals,\n );\n totalBalance = lbtcvBalance.plus(btceBalance);\n }\n\n if (amount.isGreaterThan(totalBalance)) {\n throw new LombardError(\n WithdrawErrorCode.INSUFFICIENT_SHARES,\n `Insufficient vault shares. Requested: ${amount.toFixed()}, Available: ${totalBalance.toFixed()}`,\n { requested: amount.toFixed(), available: totalBalance.toFixed() },\n );\n }\n\n // Check LBTCv allowance to withdraw queue contract\n const allowanceRaw = await publicClient.readContract({\n address: vault.vaultContract.address,\n abi: vault.vaultContract.abi,\n functionName: 'allowance',\n args: [account, vault.withdrawQueueContracts[this._chainId].address],\n });\n const allowance = fromBaseDenomination(\n String(allowanceRaw),\n vault.decimals,\n );\n\n this._needsApproval = amount.isGreaterThan(allowance);\n\n if (this._needsApproval) {\n this.emitProgress({\n status: EvmOperationStatus.NEEDS_APPROVAL,\n steps: { approval: StepStatus.PENDING, queueing: StepStatus.IDLE },\n });\n this.updateStatus(EvmOperationStatus.NEEDS_APPROVAL);\n } else {\n this.emitProgress({\n status: EvmOperationStatus.READY,\n steps: {\n approval: StepStatus.COMPLETE,\n queueing: StepStatus.PENDING,\n },\n });\n this.updateStatus(EvmOperationStatus.READY);\n }\n });\n }\n\n async approve(): Promise<void> {\n this.assertStatus(EvmOperationStatus.NEEDS_APPROVAL, 'approve');\n\n return this.act(async () => {\n if (!this._account || !this._chainId || !this._amount) {\n throw LombardError.missingParameter('account, chainId, or amount');\n }\n\n const provider = await this.ctx.getProvider('evm');\n if (!provider) {\n throw LombardError.providerMissing(this.params.sourceChain, 'evm');\n }\n\n const vault = EARN_VAULT;\n const amount = new BigNumber(this._amount);\n const amountBase = toBigInt(toBaseDenomination(amount, vault.decimals));\n\n const publicClient = makePublicClient({ chainId: this._chainId });\n const walletClient = makeWalletClient({\n provider: provider as EIP1193Provider,\n chainId: this._chainId,\n });\n\n // Chain is validated as EarnChain in prepare()\n const vedaChainId = this._chainId as EarnChain;\n\n const { request } = await publicClient.simulateContract({\n account: this._account,\n chain: CHAIN_ID_TO_VIEM_CHAIN_MAP[this._chainId],\n address: vault.vaultContract.address,\n abi: vault.vaultContract.abi,\n functionName: 'approve',\n args: [vault.withdrawQueueContracts[vedaChainId].address, amountBase],\n });\n\n const txHash = await walletClient.writeContract(request);\n await waitForTransactionReceipt(\n publicClient,\n txHash,\n 'vault share approval',\n );\n\n this._needsApproval = false;\n this.emitProgress({\n status: EvmOperationStatus.READY,\n steps: { approval: StepStatus.COMPLETE, queueing: StepStatus.PENDING },\n });\n }, EvmOperationStatus.READY);\n }\n\n async execute(): Promise<{ txHash: string }> {\n this.assertStatus(EvmOperationStatus.READY, 'execute');\n\n return this.act(async () => {\n const provider = await this.ctx.getProvider('evm');\n if (!provider) {\n throw LombardError.providerMissing(this.params.sourceChain, 'evm');\n }\n\n if (!this._account || !this._chainId || !this._amount) {\n throw LombardError.missingParameter('account, chainId, or amount');\n }\n\n this.emitProgress({\n status: EvmOperationStatus.READY,\n steps: { approval: StepStatus.COMPLETE, queueing: StepStatus.PENDING },\n });\n\n let txHash: string;\n\n if (isBtceVaultChain(this._chainId)) {\n // On BTCe chains (ETH/Base/BSC) use the Earn-native orchestrator.\n // It reads the user's combined LBTCv + BTCe position, automatically\n // unwraps just enough BTCe to cover any shortfall in direct LBTCv,\n // then queues the withdrawal. The LBTCv allowance was already set in\n // approve(), so withdrawEarn will skip re-approval.\n const result = await withdrawEarn({\n amount: this._amount,\n account: this._account,\n chainId: this._chainId,\n provider: provider as EIP1193Provider,\n env: this.ctx.env,\n });\n\n txHash = result.queueTxHash;\n } else {\n // On Corn (no BTCe wrapper), deposit directly into the LBTCv queue.\n // Approval was already done in approve(), so pass approve: false.\n txHash = await queueWithdrawInternal({\n amount: this._amount,\n approve: false,\n account: this._account,\n chainId: this._chainId,\n provider: provider as EIP1193Provider,\n env: this.ctx.env,\n });\n }\n\n this._txHash = txHash;\n\n this.emitProgress({\n status: EvmOperationStatus.COMPLETED,\n steps: { approval: StepStatus.COMPLETE, queueing: StepStatus.COMPLETE },\n });\n\n this.emitCompleted();\n\n return { txHash };\n }, EvmOperationStatus.COMPLETED);\n }\n\n private get prepareSchema() {\n return z.object({\n amount: evmAmountSchema,\n });\n }\n\n private validateProtocol(protocol: DeployProtocol): void {\n const isSupported = evmWithdrawConfig.routes.some(\n (route) =>\n route.protocols.includes(protocol) && route.envs.includes(this.ctx.env),\n );\n if (!isSupported) {\n throw LombardError.invalidParameter(\n 'protocol',\n `Protocol ${protocol} is not supported for withdrawals in ${this.ctx.env} environment`,\n );\n }\n }\n}\n","/**\n * EVM Withdraw Factory Functions\n *\n * @module chains/evm/actions/withdraw/factory\n */\n\nimport type { LombardConfig } from '../../../../config/types';\nimport type { EvmCoreContext } from '../../../../shared/context';\nimport { createEvmCoreContext } from '../../../../shared/context';\nimport { EvmCancelWithdraw } from './EvmCancelWithdraw';\nimport { EvmWithdraw } from './EvmWithdraw';\nimport type { EvmCancelWithdrawParams, EvmWithdrawParams } from './types';\n\n/**\n * Create EvmWithdraw action from config\n *\n * @internal This factory is for internal use. Use createLombardSDK() instead:\n *\n * @example\n * ```typescript\n * const sdk = await createLombardSDK({ env: Env.prod, providers: { evm: () => window.ethereum } });\n * const withdraw = sdk.chain.evm.withdraw({\n * sourceChain: Chain.ETHEREUM,\n * protocol: DeployProtocol.Veda,\n * recipient: '0x...',\n * });\n * await withdraw.prepare({ amount: '0.1' });\n * if (withdraw.needsApproval) await withdraw.approve();\n * await withdraw.execute();\n * ```\n */\nexport function evmWithdraw(\n config: LombardConfig,\n params: EvmWithdrawParams,\n): EvmWithdraw {\n const ctx = createEvmCoreContext(config);\n return new EvmWithdraw(ctx, params);\n}\n\n/**\n * Create EvmWithdraw action from context\n */\nexport function createEvmWithdraw(\n ctx: EvmCoreContext,\n params: EvmWithdrawParams,\n): EvmWithdraw {\n return new EvmWithdraw(ctx, params);\n}\n\n/**\n * Create EvmCancelWithdraw action from config\n *\n * @example\n * ```typescript\n * const sdk = await createLombardSDK({ env: Env.prod, providers: { evm: () => window.ethereum } });\n * const cancelWithdraw = sdk.chain.evm.cancelWithdraw({\n * chain: Chain.ETHEREUM,\n * protocol: DeployProtocol.Veda,\n * });\n * await cancelWithdraw.prepare();\n * await cancelWithdraw.execute();\n * ```\n */\nexport function evmCancelWithdraw(\n config: LombardConfig,\n params: EvmCancelWithdrawParams,\n): EvmCancelWithdraw {\n const ctx = createEvmCoreContext(config);\n return new EvmCancelWithdraw(ctx, params);\n}\n\n/**\n * Create EvmCancelWithdraw action from context\n */\nexport function createEvmCancelWithdraw(\n ctx: EvmCoreContext,\n params: EvmCancelWithdrawParams,\n): EvmCancelWithdraw {\n return new EvmCancelWithdraw(ctx, params);\n}\n","/**\n * EVM Actions\n *\n * Provides factory methods for EVM chain operations.\n *\n * Operations:\n * - stake: BTC.b → LBTC (stake wrapped BTC to get LBTC)\n * - unstake: LBTC → BTC (cross-chain) or LBTC → BTC.b (same-chain)\n * - deposit: BTCb → LBTC (deposit BTC.b to receive LBTC)\n * - deploy: LBTC/BTC.b → DeFi protocols (Veda, Silo)\n * - withdraw: Queue withdrawal from DeFi protocols\n * - cancelWithdraw: Cancel pending withdrawal from DeFi protocols\n * - redeem: LBTC → BTC.b (same-chain unwrap)\n *\n * @example\n * ```typescript\n * import { createLombardSDK, Chain, Env } from '@lombard.finance/sdk';\n *\n * const sdk = await createLombardSDK({\n * env: Env.prod,\n * providers: { evm: () => window.ethereum },\n * });\n *\n * const unstake = sdk.chain.evm.unstake({\n * sourceChain: Chain.ETHEREUM,\n * assetOut: AssetId.BTC,\n * });\n *\n * await unstake.prepare({ amount: '0.1', recipient: 'bc1q...' });\n * const { txHash } = await unstake.execute();\n * ```\n *\n * @module chains/evm/EvmActions\n */\n\nimport type { LombardConfig } from '../../config/types';\nimport type { EvmCoreContext } from '../../shared/context';\nimport { createEvmCoreContext } from '../../shared/context';\nimport {\n createEvmDeploy,\n type EvmDeployParams,\n type IEvmDeploy,\n} from './actions/deploy';\nimport {\n createEvmDeposit,\n type EvmDepositParams,\n type IEvmDeposit,\n} from './actions/deposit';\nimport {\n createEvmRedeem,\n type EvmRedeemParams,\n type IEvmRedeem,\n} from './actions/redeem';\n// Import action factories\nimport {\n createEvmStake,\n type EvmStakeParams,\n type IEvmStake,\n} from './actions/stake';\nimport {\n createEvmUnstake,\n type EvmUnstakeParams,\n type IEvmUnstake,\n} from './actions/unstake';\nimport {\n createEvmCancelWithdraw,\n createEvmWithdraw,\n type EvmCancelWithdrawParams,\n type EvmWithdrawParams,\n type IEvmCancelWithdraw,\n type IEvmWithdraw,\n} from './actions/withdraw';\n\n/**\n * EVM Actions\n *\n * User-facing class for EVM operations.\n * Created via evmActions(config) factory function.\n */\nexport class EvmActions {\n private readonly ctx: EvmCoreContext;\n\n constructor(config: LombardConfig) {\n this.ctx = createEvmCoreContext(config);\n }\n\n /**\n * Stake BTC.b to receive LBTC\n *\n * Converts wrapped BTC (BTC.b) to LBTC via the Asset Router.\n * Currently supported on Avalanche.\n *\n * @example\n * ```typescript\n * const stake = evm.stake({\n * assetIn: AssetId.BTCb,\n * assetOut: AssetId.LBTC,\n * sourceChain: Chain.AVALANCHE,\n * destChain: Chain.AVALANCHE,\n * });\n * ```\n */\n stake(params: EvmStakeParams): IEvmStake {\n return createEvmStake(this.ctx, params);\n }\n\n /**\n * Unstake LBTC to BTC or BTC.b\n *\n * - LBTC → BTC: Cross-chain to Bitcoin mainnet/signet\n * - LBTC → BTC.b: Same-chain wrapped BTC on EVM\n *\n * @example\n * ```typescript\n * const unstake = evm.unstake({\n * assetIn: AssetId.LBTC,\n * assetOut: AssetId.BTC,\n * sourceChain: Chain.ETHEREUM,\n * destChain: Chain.BITCOIN_MAINNET,\n * });\n * ```\n */\n unstake(params: EvmUnstakeParams): IEvmUnstake {\n return createEvmUnstake(this.ctx, params);\n }\n\n /**\n * Deposit BTCb to get LBTC\n *\n * Deposits BTC.b to receive LBTC via the claim flow.\n *\n * @example\n * ```typescript\n * const deposit = evm.deposit({\n * assetIn: AssetId.BTCb,\n * assetOut: AssetId.LBTC,\n * sourceChain: Chain.ETHEREUM,\n * destChain: Chain.ETHEREUM,\n * });\n * ```\n */\n deposit(params: EvmDepositParams): IEvmDeposit {\n return createEvmDeposit(this.ctx, params);\n }\n\n /**\n * Deploy L-Assets to DeFi protocols\n *\n * Currently supports Veda and Silo protocols.\n *\n * @example\n * ```typescript\n * const deploy = evm.deploy({\n * asset: AssetId.LBTC,\n * sourceChain: Chain.ETHEREUM,\n * protocol: DeployProtocol.Veda,\n * recipient: '0x...',\n * });\n * ```\n */\n deploy(params: EvmDeployParams): IEvmDeploy {\n return createEvmDeploy(this.ctx, params);\n }\n\n /**\n * Withdraw vault shares from DeFi protocols\n *\n * Queues a withdrawal request from DeFi protocols (e.g., Veda vault).\n * After the withdrawal is queued, it will be processed within the\n * protocol's withdrawal window.\n *\n * @example\n * ```typescript\n * const withdraw = evm.withdraw({\n * protocol: DeployProtocol.Veda,\n * sourceChain: Chain.ETHEREUM,\n * recipient: '0x...',\n * });\n * await withdraw.prepare({ amount: '0.1' });\n * if (withdraw.needsApproval) await withdraw.approve();\n * await withdraw.execute();\n * ```\n */\n withdraw(params: EvmWithdrawParams): IEvmWithdraw {\n return createEvmWithdraw(this.ctx, params);\n }\n\n /**\n * Cancel a pending withdrawal from DeFi protocols\n *\n * Cancels a previously queued withdrawal request.\n *\n * @example\n * ```typescript\n * const cancelWithdraw = evm.cancelWithdraw({\n * protocol: DeployProtocol.Veda,\n * chain: Chain.ETHEREUM,\n * });\n * await cancelWithdraw.prepare();\n * await cancelWithdraw.execute();\n * ```\n */\n cancelWithdraw(params: EvmCancelWithdrawParams): IEvmCancelWithdraw {\n return createEvmCancelWithdraw(this.ctx, params);\n }\n\n /**\n * Redeem LBTC to BTC.b (same-chain unwrap)\n *\n * Converts LBTC to BTC.b on the same EVM chain.\n * For cross-chain BTC redemption, use unstake() with destChain set to Bitcoin.\n *\n * @example\n * ```typescript\n * const redeem = evm.redeem({\n * assetIn: AssetId.LBTC,\n * assetOut: AssetId.BTCb,\n * sourceChain: Chain.AVALANCHE,\n * });\n * ```\n */\n redeem(params: EvmRedeemParams): IEvmRedeem {\n return createEvmRedeem(this.ctx, params);\n }\n}\n\n/**\n * Create EVM actions from config\n *\n * Factory function that creates EvmActions for EVM operations.\n *\n * @param config - LombardConfig instance\n * @returns EvmActions instance\n */\nexport function evmActions(config: LombardConfig): EvmActions {\n return new EvmActions(config);\n}\n"],"names":["EvmService","env","chainId","token","getMintingFee","Token","params","result","signNetworkFee","BigNumber","protocol","getStakeAndBakeFee","signStakeAndBake","signLbtcDestinationAddr","evmModule","ctx","evmConfig","AssetId","Chain","DeployProtocol","Env","depositInternal","amountRaw","approve","account","provider","rpcUrl","vault","EARN_VAULT","isEarnChain","publicClient","makePublicClient","walletClient","makeWalletClient","depositToken","getTokenInfo","amount","amountBase","toBigInt","toBaseDenomination","allowanceRaw","allowance","fromBaseDenomination","balanceRaw","balance","exceededMessage","request","CHAIN_ID_TO_VIEM_CHAIN_MAP","txHash","err","msg","getErrorMessage","EvmDeploy","BaseAction","EvmOperationStatus","__publicField","isBtceVaultChain","BTCE_VAULT","validated","validatePrepareParams","LombardError","parseChainIdentifier","spender","erc20Abi","StepStatus","waitForTransactionReceipt","depositEarn","z.object","evmAmountSchema","z.string","route","createEvmDeploy","DEPOSIT_PROD_SOURCE_CHAINS","getEvmAssetChains","DEPOSIT_TESTNET_SOURCE_CHAINS","LBTC_PROD_CHAINS","LBTC_TESTNET_CHAINS","evmAddressSchema","EvmDepositStatus","EvmDeposit","data","proofSignature","claimLBTC","createEvmDeposit","BTCB_PROD_CHAINS","BTCB_TESTNET_CHAINS","bitcoinAddressSchema","checkFeeAuthorization","requiresAutoMintFee","tokenInfo","getTokenContractInfo","existingSignature","getNetworkFeeSignature","isExpired","hasValidSignature","feeInSatoshis","feeFormatted","feeInBtc","authorizeFee","signResult","storeNetworkFeeSignature","createInitialFeeAuthState","EvmRedeem","feeAuthResult","authorizeFeeShared","evmAccount","redeemToken","createEvmRedeem","APPROVAL_REQUIRED_CHAINS","ChainId","requiresApproval","EvmStake","adapterInfo","AddressKind","getTokenAllowance","requiredAmount","approveToken","createEvmStake","LBTC_BTCB_PROD_CHAINS","getEvmChainsWithAllAssets","LBTC_BTCB_TESTNET_CHAINS","evmToBtcConfig","evmToBtcbConfig","chain","EvmUnstake","isBtcbOutput","config","createEvmUnstake","evmWithdrawConfig","EvmCancelWithdraw","WithdrawErrorCode","cancelWithdrawInternal","EvmWithdraw","lbtcvRaw","lbtcvBalance","totalBalance","btceRaw","btceBalance","vedaChainId","withdrawEarn","queueWithdrawInternal","createEvmWithdraw","createEvmCancelWithdraw","EvmActions","createEvmCoreContext","evmActions"],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";var q=Object.defineProperty;var V=(i,a,e)=>a in i?q(i,a,{enumerable:!0,configurable:!0,writable:!0,value:e}):i[a]=e;var h=(i,a,e)=>V(i,typeof a!="symbol"?a+"":a,e);const f=require("bignumber.js"),E=require("./withdrawEarn-CTtVruit.cjs"),m=require("./token-addresses-C7H9E4qz.cjs"),v=require("./tokens-DEYY7W7O.cjs"),t=require("./statusConstants-B-7VEYgO.cjs"),M=require("./storeNetworkFeeSignature-DJgBfZp7.cjs"),Y=require("./fee-requirements-CICSxYYL.cjs"),d=require("./defi-registry-CyMKVT3z.cjs"),n=require("./index-BKzxeh1Y.cjs"),k=require("viem"),L=require("./numbers-3LtmxfD8.cjs"),_=require("./config-BfX8lrdO.cjs");class G{constructor(a){this.env=a}async getMintingFee(a,e){return(await E.getMintingFee({token:e||m.Token.LBTC,chainId:a,env:this.env})).toString()}async signNetworkFee(a){const e=await E.signNetworkFee({fee:new f(a.fee),account:a.account,chainId:a.chainId,provider:a.provider,env:this.env,token:a.token??m.Token.LBTC});return{signature:e.signature,typedData:e.typedData}}async getStakeAndBakeFee(a,e){return(await E.getStakeAndBakeFee({chainId:a,protocol:e})).toString()}async signStakeAndBake(a){const e=await E.signStakeAndBake({value:new f(a.value),account:a.account,chainId:a.chainId,provider:a.provider,env:this.env,vaultKey:a.vaultKey,token:a.token});return{signature:e.signature,typedData:e.typedData}}async signLbtcDestination(a){return{signature:await E.signLbtcDestinationAddr({account:a.address,chainId:a.chainId,provider:a.provider})}}}function $(){return{id:"evm",chain:"evm",register(i){return new G(i.env)}}}const U={routes:[{asset:d.AssetId.LBTC,sourceChains:[t.Chain.ETHEREUM],protocols:[d.DefiProtocol.Veda],envs:[n.r.prod]},{asset:d.AssetId.LBTC,sourceChains:[t.Chain.BASE],protocols:[d.DefiProtocol.Veda],envs:[n.r.prod]},{asset:d.AssetId.LBTC,sourceChains:[t.Chain.BSC],protocols:[d.DefiProtocol.Veda],envs:[n.r.prod]},{asset:d.AssetId.LBTC,sourceChains:[t.Chain.CORN],protocols:[d.DefiProtocol.Veda],envs:[n.r.prod]},{asset:d.AssetId.LBTC,sourceChains:[t.Chain.AVALANCHE],protocols:[d.DefiProtocol.Silo],envs:[n.r.prod]}]};async function W({amount:i,approve:a=!0,token:e=m.Token.LBTC,account:s,chainId:r,provider:p,rpcUrl:c,env:u}){const o=_.EARN_VAULT;if(!_.isEarnChain(r))throw new Error(`Unsupported chain id: ${r}. Please switch to one of the supported chains: ${o.chains.join(", ")}`);const l=v.makePublicClient({chainId:r,rpcUrl:c}),C=m.makeWalletClient({provider:p,chainId:r}),S=await v.getTokenInfo(e,r,u,c);if(!S)throw new Error(`Unknown deposit token: ${e}`);const A=f(i),I=L.toBigInt(v.toBaseDenomination(A,S.decimals)),T=await l.readContract({address:S.address,abi:S.abi,functionName:"allowance",args:[s,o.vaultContract.address]}),w=v.fromBaseDenomination(String(T),S.decimals),P=await l.readContract({address:S.address,abi:S.abi,functionName:"balanceOf",args:[s]}),B=v.fromBaseDenomination(String(P),S.decimals);if(A.isGreaterThan(B))throw new Error(`The deposit amount exceeds the account's balance.
|
|
2
|
+
Deposit amount: ${A.toFixed()}
|
|
3
|
+
Balance: ${B.toFixed()}`);if(A.isGreaterThan(w)){const R=`The deposit amount exceeds allowance.
|
|
4
|
+
Deposit amount: ${A.toFixed()}
|
|
5
|
+
Allowance: ${w.toFixed()}`;if(!a)throw new Error(R);console.info(R);try{console.info(`Trying to approve ${I}`);const{request:D}=await l.simulateContract({account:s,chain:m.CHAIN_ID_TO_VIEM_CHAIN_MAP[r],address:S.address,abi:S.abi,functionName:"approve",args:[o.vaultContract.address,I]}),O=await C.writeContract(D);console.info(`Approve tx hash: ${O}`),console.info(`Approved ${I} for ${o.vaultContract.address}`)}catch(D){const O=v.getErrorMessage(D);throw new Error(`Could not approve ${I} for ${o.vaultContract.address}.
|
|
6
|
+
Reason: ${O}`)}}const{request:F}=await l.simulateContract({account:s,chain:m.CHAIN_ID_TO_VIEM_CHAIN_MAP[r],address:o.tellerContracts[r].address,abi:o.tellerContracts[r].abi,functionName:"deposit",args:[S.address,I,0n]});return await C.writeContract(F)}class z extends t.BaseAction{constructor(e,s){super(t.EvmOperationStatus.IDLE);h(this,"_amount");h(this,"_protocol");h(this,"_needsApproval",!1);h(this,"_txHash");h(this,"_account");h(this,"_chainId");this.ctx=e,this.params=s}get amount(){return this._amount}get protocol(){return this._protocol}get needsApproval(){return this._needsApproval}get txHash(){return this._txHash}isVedaBtcePath(){return this._protocol===d.DefiProtocol.Veda&&this._chainId!==void 0&&_.isBtceVaultChain(this._chainId)}getSpenderAddress(){return this.isVedaBtcePath()?_.BTCE_VAULT.contracts[this._chainId]:_.EARN_VAULT.vaultContract.address}async prepare(e){return this.assertStatus(t.EvmOperationStatus.IDLE,"prepare"),this.act(async()=>{const s=t.validatePrepareParams(this.prepareSchema,e);this._amount=s.amount,this._protocol=e.protocol,this.validateProtocol(e.protocol);const r=await this.ctx.getProvider("evm");if(!r)throw t.LombardError.providerMissing(this.params.sourceChain,"evm");const c=(await r.request({method:"eth_accounts"}))[0];if(!c)throw t.LombardError.providerMissing(this.params.sourceChain,"evm");this._account=c,this._chainId=t.parseChainIdentifier(this.params.sourceChain);const u=await v.getTokenInfo(m.Token.LBTC,this._chainId,this.ctx.env);if(!u)throw t.LombardError.invalidParameter("token","Could not get LBTC token info");const o=this.getSpenderAddress(),C=await v.makePublicClient({chainId:this._chainId}).readContract({address:u.address,abi:k.erc20Abi,functionName:"allowance",args:[c,o]}),S=new f(s.amount),A=v.toBaseDenomination(S,u.decimals),I=new f(String(C));this._needsApproval=A.isGreaterThan(I),this._needsApproval?(this.emitProgress({status:t.EvmOperationStatus.NEEDS_APPROVAL,steps:{approval:t.StepStatus.PENDING,deploying:t.StepStatus.IDLE}}),this.updateStatus(t.EvmOperationStatus.NEEDS_APPROVAL)):(this.emitProgress({status:t.EvmOperationStatus.READY,steps:{approval:t.StepStatus.COMPLETE,deploying:t.StepStatus.PENDING}}),this.updateStatus(t.EvmOperationStatus.READY))})}async approve(){return this.assertStatus(t.EvmOperationStatus.NEEDS_APPROVAL,"approve"),this.act(async()=>{if(!this._account||!this._chainId||!this._amount)throw t.LombardError.missingParameter("account, chainId, or amount");const e=await this.ctx.getProvider("evm");if(!e)throw t.LombardError.providerMissing(this.params.sourceChain,"evm");const s=await v.getTokenInfo(m.Token.LBTC,this._chainId,this.ctx.env);if(!s)throw t.LombardError.invalidParameter("token","Could not get LBTC token info");const r=new f(this._amount),p=L.toBigInt(v.toBaseDenomination(r,s.decimals)),c=this.getSpenderAddress(),u=v.makePublicClient({chainId:this._chainId}),o=m.makeWalletClient({provider:e,chainId:this._chainId}),{request:l}=await u.simulateContract({account:this._account,chain:m.CHAIN_ID_TO_VIEM_CHAIN_MAP[this._chainId],address:s.address,abi:k.erc20Abi,functionName:"approve",args:[c,p]}),C=await o.writeContract(l);await E.waitForTransactionReceipt(u,C,"LBTC deposit approval"),this._needsApproval=!1,this.emitProgress({status:t.EvmOperationStatus.READY,steps:{approval:t.StepStatus.COMPLETE,deploying:t.StepStatus.PENDING}})},t.EvmOperationStatus.READY)}async execute(){return this.assertStatus(t.EvmOperationStatus.READY,"execute"),this.act(async()=>{const e=await this.ctx.getProvider("evm");if(!e)throw t.LombardError.providerMissing(this.params.sourceChain,"evm");if(!this._account||!this._chainId)throw t.LombardError.missingParameter("account or chainId");this.emitProgress({status:t.EvmOperationStatus.READY,steps:{approval:t.StepStatus.COMPLETE,deploying:t.StepStatus.PENDING}});let s;return this.isVedaBtcePath()?s=await E.depositEarn({token:m.Token.LBTC,amount:this._amount,receiver:this.params.recipient,approve:!1,account:this._account,chainId:this._chainId,provider:e,env:this.ctx.env}):s=await W({amount:this._amount,approve:!1,token:m.Token.LBTC,account:this._account,chainId:this._chainId,provider:e,env:this.ctx.env}),this._txHash=s,this.emitProgress({status:t.EvmOperationStatus.COMPLETED,steps:{approval:t.StepStatus.COMPLETE,deploying:t.StepStatus.COMPLETE}}),this.emitCompleted(),{txHash:s}},t.EvmOperationStatus.COMPLETED)}get prepareSchema(){return t.objectType({amount:t.evmAmountSchema,protocol:t.stringType().min(1,"Protocol is required")})}validateProtocol(e){if(!U.routes.some(r=>r.protocols.includes(e)&&r.envs.includes(this.ctx.env)))throw t.LombardError.invalidParameter("protocol",`Protocol ${e} is not supported in ${this.ctx.env} environment`)}}function Z(i,a){return new z(i,a)}const j=t.getEvmAssetChains(d.AssetId.BTCb,[n.r.prod]),K=t.getEvmAssetChains(d.AssetId.BTCb,[n.r.testnet,n.r.stage,n.r.dev,n.r.ibc]),Q=t.getEvmAssetChains(d.AssetId.LBTC,[n.r.prod]),J=t.getEvmAssetChains(d.AssetId.LBTC,[n.r.testnet,n.r.stage,n.r.dev,n.r.ibc]),X={routes:[{assetsIn:[d.AssetId.BTCb],assetOut:d.AssetId.LBTC,sourceChains:j,destChains:Q,envs:[n.r.prod]},{assetsIn:[d.AssetId.BTCb],assetOut:d.AssetId.LBTC,sourceChains:K,destChains:J,envs:[n.r.testnet,n.r.stage,n.r.dev,n.r.ibc]}],addressSchema:t.evmAddressSchema};var g=(i=>(i.IDLE="idle",i.NEEDS_APPROVAL="needs-approval",i.READY="ready",i.BRIDGING="bridging",i.COMPLETED="completed",i))(g||{});class tt extends t.BaseAction{constructor(e,s){super(g.IDLE);h(this,"_amount");h(this,"_recipient");h(this,"_needsApproval",!1);h(this,"_txHash");h(this,"_claimData");this.ctx=e,this.params=s}get amount(){return this._amount}get recipient(){return this._recipient}get needsApproval(){return this._needsApproval}get txHash(){return this._txHash}setClaimData(e,s){this._claimData={data:e,proofSignature:s}}async prepare(e){return this.assertStatus(g.IDLE,"prepare"),this.act(async()=>{const s=t.validatePrepareParams(this.prepareSchema,e,{destChain:this.params.destChain});this._amount=s.amount,this._recipient=s.recipient,this._needsApproval=!1,this.emitProgress({status:g.READY,steps:{approval:t.StepStatus.COMPLETE,execution:t.StepStatus.IDLE,bridging:t.StepStatus.IDLE}})},g.READY)}async approve(){return this.assertStatus(g.NEEDS_APPROVAL,"approve"),this.act(async()=>{this._needsApproval=!1},g.READY)}async execute(){if(this.assertStatus(g.READY,"execute"),!this._claimData)throw t.LombardError.missingParameter("claimData");return this.act(async()=>{const e=await this.ctx.getProvider("evm");if(!e)throw t.LombardError.providerMissing(this.params.sourceChain,"evm");const s=t.parseChainIdentifier(this.params.destChain);this.emitProgress({status:g.READY,steps:{approval:t.StepStatus.COMPLETE,execution:t.StepStatus.PENDING,bridging:t.StepStatus.IDLE}});const r=await E.claimLBTC({provider:e,account:this._recipient,data:this._claimData.data,proofSignature:this._claimData.proofSignature,chainId:s,env:this.ctx.env});return this._txHash=r,this.emitProgress({status:g.COMPLETED,steps:{approval:t.StepStatus.COMPLETE,execution:t.StepStatus.COMPLETE,bridging:t.StepStatus.IDLE}}),this.emitCompleted(),{txHash:r}},g.COMPLETED)}get prepareSchema(){return t.objectType({amount:t.evmAmountSchema,recipient:X.addressSchema})}}function et(i,a){return new tt(i,a)}const st=t.getEvmAssetChains(d.AssetId.BTCb,[n.r.prod]),at=t.getEvmAssetChains(d.AssetId.BTCb,[n.r.testnet,n.r.stage,n.r.dev,n.r.ibc]),rt={routes:[{assetIn:d.AssetId.BTCb,assetOut:d.AssetId.BTC,sourceChains:st,destChain:t.Chain.BITCOIN_MAINNET,envs:[n.r.prod]},{assetIn:d.AssetId.BTCb,assetOut:d.AssetId.BTC,sourceChains:at,destChain:t.Chain.BITCOIN_SIGNET,envs:[n.r.testnet,n.r.stage,n.r.dev,n.r.ibc]}],recipientSchema:t.bitcoinAddressSchema};async function x(i,a,e,s){if(!Y.requiresAutoMintFee(i))return{requiresAuth:!1,hasValidSignature:!1,feeInSatoshis:null,feeFormatted:null,expirationDate:null};const r=await v.getTokenContractInfo(s,i,e),p=await M.getNetworkFeeSignature({address:a,chainId:i,env:e,tokenAddress:r.address}),c=p.expirationDate?new Date(Number(p.expirationDate)*1e3)<new Date:!1,u=p.hasSignature&&!c;let o=null,l=null;if(!u){const C=await E.getMintingFee({token:s,chainId:i,env:e});o=BigInt(C.times(1e8).toFixed(0)),l=C.toFixed(8)}return{requiresAuth:!0,hasValidSignature:u,feeInSatoshis:o,feeFormatted:l,expirationDate:p.expirationDate??null}}async function b(i){const{chainId:a,account:e,feeInSatoshis:s,provider:r,env:p,token:c}=i,u=await v.getTokenContractInfo(c,a,p),o=await E.signNetworkFee({fee:s,account:e,chainId:a,provider:r,env:p,token:c});return await M.storeNetworkFeeSignature({signature:o.signature,typedData:o.typedData,address:e,env:p,tokenAddress:u.address}),o}function N(){return{requiresAuth:!1,isAuthorized:!1,feeInSatoshis:null,feeFormatted:null,expirationDate:null}}class it extends t.BaseAction{constructor(e,s){super(t.EvmOperationStatus.IDLE);h(this,"_amount");h(this,"_recipient");h(this,"_needsApproval",!1);h(this,"_txHash");h(this,"_feeAuth",N());this.ctx=e,this.params=s}get amount(){return this._amount}get recipient(){return this._recipient}get needsApproval(){return this._needsApproval}get txHash(){return this._txHash}get feeAuth(){return this._feeAuth}async prepare(e){return this.assertStatus(t.EvmOperationStatus.IDLE,"prepare"),this.act(async()=>{const s=t.validatePrepareParams(this.prepareSchema,e,{destChain:this.params.destChain});this._amount=s.amount,this._recipient=s.recipient;const r=t.parseChainIdentifier(this.params.sourceChain),p=await this.ctx.getProvider("evm");if(!p)throw t.LombardError.providerMissing(this.params.sourceChain,"evm");const u=(await p.request({method:"eth_accounts"}))[0],o=await x(r,u,this.ctx.env,m.Token.BTCb);if(this._feeAuth={requiresAuth:o.requiresAuth,isAuthorized:o.hasValidSignature,feeInSatoshis:o.feeInSatoshis,feeFormatted:o.feeFormatted,expirationDate:o.expirationDate},o.requiresAuth&&!o.hasValidSignature){this.updateStatus(t.EvmOperationStatus.NEEDS_FEE_AUTHORIZATION),this.emitProgress({status:t.EvmOperationStatus.NEEDS_FEE_AUTHORIZATION,steps:{burning:t.StepStatus.IDLE,releasing:t.StepStatus.IDLE}});return}this._needsApproval=!1,this.updateStatus(t.EvmOperationStatus.READY),this.emitProgress({status:t.EvmOperationStatus.READY,steps:{burning:t.StepStatus.IDLE,releasing:t.StepStatus.IDLE}})})}async authorizeFee(){if(this.assertStatus(t.EvmOperationStatus.NEEDS_FEE_AUTHORIZATION,"authorizeFee"),!this._feeAuth.feeInSatoshis)throw t.LombardError.missingParameter("feeInSatoshis");return this.act(async()=>{const e=t.parseChainIdentifier(this.params.sourceChain),s=await this.ctx.getProvider("evm");if(!s)throw t.LombardError.providerMissing(this.params.sourceChain,"evm");const p=(await s.request({method:"eth_accounts"}))[0];await b({chainId:e,account:p,feeInSatoshis:this._feeAuth.feeInSatoshis,provider:s,env:this.ctx.env,token:m.Token.BTCb}),this._feeAuth.isAuthorized=!0,this.emitProgress({status:t.EvmOperationStatus.READY,steps:{burning:t.StepStatus.IDLE,releasing:t.StepStatus.IDLE}})},t.EvmOperationStatus.READY)}async approve(){return this.assertStatus(t.EvmOperationStatus.NEEDS_APPROVAL,"approve"),this.act(async()=>{this._needsApproval=!1,this.emitProgress({status:t.EvmOperationStatus.READY,steps:{burning:t.StepStatus.IDLE,releasing:t.StepStatus.IDLE}})},t.EvmOperationStatus.READY)}async execute(){return this.assertStatus(t.EvmOperationStatus.READY,"execute"),this.act(async()=>{const e=await this.ctx.getProvider("evm");if(!e)throw t.LombardError.providerMissing(this.params.sourceChain,"evm");const r=(await e.request({method:"eth_accounts"}))[0];if(!r)throw t.LombardError.providerMissing(this.params.sourceChain,"evm");const p=t.parseChainIdentifier(this.params.sourceChain);this.emitProgress({status:t.EvmOperationStatus.READY,steps:{burning:t.StepStatus.PENDING,releasing:t.StepStatus.IDLE}});const c=await E.redeemToken({provider:e,account:r,amount:this._amount,btcAddress:this._recipient,chainId:p,env:this.ctx.env,tokenIn:m.Token.BTCb,tokenOut:void 0});return this._txHash=c,this.emitProgress({status:t.EvmOperationStatus.COMPLETED,steps:{burning:t.StepStatus.COMPLETE,releasing:t.StepStatus.PENDING}}),this.emitCompleted(),{txHash:c}},t.EvmOperationStatus.COMPLETED)}get prepareSchema(){return t.objectType({amount:t.evmAmountSchema,recipient:rt.recipientSchema})}}function nt(i,a){return new it(i,a)}const ot=[m.ChainId.avalanche,m.ChainId.avalancheFuji];function ct(i){return ot.includes(i)}class ut extends t.BaseAction{constructor(e,s){super(t.EvmOperationStatus.IDLE);h(this,"_amount");h(this,"_txHash");h(this,"_feeAuth",N());h(this,"_account");h(this,"_needsApproval",!1);h(this,"_spenderAddress");this.ctx=e,this.params=s}get amount(){return this._amount}get txHash(){return this._txHash}get feeAuth(){return this._feeAuth}get needsApproval(){return this._needsApproval}async prepare(e){return this.assertStatus(t.EvmOperationStatus.IDLE,"prepare"),this.act(async()=>{const s=t.validatePrepareParams(this.prepareSchema,e);this._amount=s.amount;const r=await this.ctx.getProvider("evm");if(!r)throw t.LombardError.providerMissing(this.params.sourceChain,"evm");const c=(await r.request({method:"eth_accounts"}))[0];if(!c)throw t.LombardError.providerMissing(this.params.sourceChain,"evm");this._account=c;const u=t.parseChainIdentifier(this.params.sourceChain);if(ct(u)){const C=await v.getTokenContractInfo(m.Token.BTCb,u,this.ctx.env,m.AddressKind.Adapter);this._spenderAddress=C.address;const S=await E.getTokenAllowance({token:m.Token.BTCb,owner:c,spender:C.address,chainId:u,env:this.ctx.env}),A=new f(s.amount);if(this._needsApproval=S.isLessThan(A),this._needsApproval){this.emitProgress({status:t.EvmOperationStatus.NEEDS_APPROVAL,steps:{approval:t.StepStatus.PENDING,staking:t.StepStatus.IDLE}}),this.updateStatus(t.EvmOperationStatus.NEEDS_APPROVAL);return}}const o=await x(u,c,this.ctx.env,m.Token.LBTC);this._feeAuth={requiresAuth:o.requiresAuth,isAuthorized:o.hasValidSignature,feeInSatoshis:o.feeInSatoshis,feeFormatted:o.feeFormatted,expirationDate:o.expirationDate},o.requiresAuth&&!o.hasValidSignature?(this.emitProgress({status:t.EvmOperationStatus.NEEDS_FEE_AUTHORIZATION,steps:{staking:t.StepStatus.IDLE}}),this.updateStatus(t.EvmOperationStatus.NEEDS_FEE_AUTHORIZATION)):(this.emitProgress({status:t.EvmOperationStatus.READY,steps:{staking:t.StepStatus.PENDING}}),this.updateStatus(t.EvmOperationStatus.READY))})}async approve(){return this.assertStatus(t.EvmOperationStatus.NEEDS_APPROVAL,"approve"),this.act(async()=>{if(!this._account||!this._spenderAddress||!this._amount)throw t.LombardError.missingParameter("account, spenderAddress, or amount");const e=await this.ctx.getProvider("evm");if(!e)throw t.LombardError.providerMissing(this.params.sourceChain,"evm");const s=t.parseChainIdentifier(this.params.sourceChain),r=await E.approveToken({account:this._account,token:m.Token.BTCb,spender:this._spenderAddress,amount:this._amount,chainId:s,provider:e,env:this.ctx.env}),p=v.makePublicClient({chainId:s,env:this.ctx.env});await E.waitForTransactionReceipt(p,r,"BTC.b approval"),this._needsApproval=!1,this.emitProgress({status:t.EvmOperationStatus.READY,steps:{approval:t.StepStatus.COMPLETE,staking:t.StepStatus.PENDING}})},t.EvmOperationStatus.READY)}async authorizeFee(){return this.assertStatus(t.EvmOperationStatus.NEEDS_FEE_AUTHORIZATION,"authorizeFee"),this.act(async()=>{if(!this._feeAuth.feeInSatoshis)throw t.LombardError.missingParameter("feeInSatoshis");const e=await this.ctx.getProvider("evm");if(!e)throw t.LombardError.providerMissing(this.params.sourceChain,"evm");const s=t.parseChainIdentifier(this.params.sourceChain);await b({chainId:s,account:this._account,feeInSatoshis:this._feeAuth.feeInSatoshis,provider:e,env:this.ctx.env,token:m.Token.LBTC}),this._feeAuth={...this._feeAuth,isAuthorized:!0},this.emitProgress({status:t.EvmOperationStatus.READY,steps:{staking:t.StepStatus.PENDING}})},t.EvmOperationStatus.READY)}async execute(){return this.assertStatus(t.EvmOperationStatus.READY,"execute"),this.act(async()=>{const e=await this.ctx.getProvider("evm");if(!e)throw t.LombardError.providerMissing(this.params.sourceChain,"evm");const s=t.parseChainIdentifier(this.params.sourceChain),p=(await e.request({method:"eth_accounts"}))[0];if(!p)throw t.LombardError.providerMissing(this.params.sourceChain,"evm");this.emitProgress({status:t.EvmOperationStatus.READY,steps:{staking:t.StepStatus.PENDING}});const c=await E.depositToken({amount:this._amount,tokenIn:m.Token.BTCb,tokenOut:m.Token.LBTC,account:p,chainId:s,provider:e,env:this.ctx.env});return this._txHash=c,this.emitProgress({status:t.EvmOperationStatus.COMPLETED,steps:{staking:t.StepStatus.COMPLETE}}),this.emitCompleted(),{txHash:c}},t.EvmOperationStatus.COMPLETED)}get prepareSchema(){return t.objectType({amount:t.evmAmountSchema})}}function ht(i,a){return new ut(i,a)}const pt=t.getEvmAssetChains(d.AssetId.LBTC,[n.r.prod]),dt=t.getEvmAssetChains(d.AssetId.LBTC,[n.r.testnet,n.r.stage,n.r.dev,n.r.ibc]),mt=t.getEvmChainsWithAllAssets([d.AssetId.LBTC,d.AssetId.BTCb],[n.r.prod]),vt=t.getEvmChainsWithAllAssets([d.AssetId.LBTC,d.AssetId.BTCb],[n.r.testnet,n.r.stage,n.r.dev,n.r.ibc]),Et={routes:[{sourceChains:pt,destChain:t.Chain.BITCOIN_MAINNET,envs:[n.r.prod]},{sourceChains:dt,destChain:t.Chain.BITCOIN_SIGNET,envs:[n.r.testnet,n.r.stage,n.r.dev,n.r.ibc]}],recipientSchema:t.bitcoinAddressSchema},lt={routes:[...mt.map(i=>({sourceChains:[i],destChain:i,envs:[n.r.prod]})),...vt.map(i=>({sourceChains:[i],destChain:i,envs:[n.r.testnet,n.r.stage,n.r.dev,n.r.ibc]}))],recipientSchema:t.evmAddressSchema};class St extends t.BaseAction{constructor(e,s){super(t.EvmOperationStatus.IDLE);h(this,"_amount");h(this,"_recipient");h(this,"_txHash");h(this,"_feeAuth",N());this.ctx=e,this.params=s}get amount(){return this._amount}get recipient(){return this._recipient}get txHash(){return this._txHash}get feeAuth(){return this._feeAuth}get isBtcbOutput(){return this.params.assetOut===d.AssetId.BTCb}async prepare(e){return this.assertStatus(t.EvmOperationStatus.IDLE,"prepare"),this.act(async()=>{const s=t.validatePrepareParams(this.prepareSchema,e,{destChain:this.params.destChain});this._amount=s.amount,this._recipient=s.recipient;const r=t.parseChainIdentifier(this.params.sourceChain);if(this.isBtcbOutput){const p=await this.ctx.getProvider("evm");if(!p)throw t.LombardError.providerMissing(this.params.sourceChain,"evm");const u=(await p.request({method:"eth_accounts"}))[0],o=await x(r,u,this.ctx.env,m.Token.BTCb);if(this._feeAuth={requiresAuth:o.requiresAuth,isAuthorized:o.hasValidSignature,feeInSatoshis:o.feeInSatoshis,feeFormatted:o.feeFormatted,expirationDate:o.expirationDate},o.requiresAuth&&!o.hasValidSignature){this.updateStatus(t.EvmOperationStatus.NEEDS_FEE_AUTHORIZATION),this.emitProgress({status:t.EvmOperationStatus.NEEDS_FEE_AUTHORIZATION,steps:{burning:t.StepStatus.IDLE,releasing:t.StepStatus.IDLE}});return}}this.updateStatus(t.EvmOperationStatus.READY),this.emitProgress({status:t.EvmOperationStatus.READY,steps:{burning:t.StepStatus.IDLE,releasing:t.StepStatus.IDLE}})})}async authorizeFee(){if(this.assertStatus(t.EvmOperationStatus.NEEDS_FEE_AUTHORIZATION,"authorizeFee"),!this._feeAuth.feeInSatoshis)throw t.LombardError.missingParameter("feeInSatoshis");return this.act(async()=>{const e=t.parseChainIdentifier(this.params.sourceChain),s=await this.ctx.getProvider("evm");if(!s)throw t.LombardError.providerMissing(this.params.sourceChain,"evm");const p=(await s.request({method:"eth_accounts"}))[0];await b({chainId:e,account:p,feeInSatoshis:this._feeAuth.feeInSatoshis,provider:s,env:this.ctx.env,token:m.Token.BTCb}),this._feeAuth.isAuthorized=!0,this.emitProgress({status:t.EvmOperationStatus.READY,steps:{burning:t.StepStatus.IDLE,releasing:t.StepStatus.IDLE}})},t.EvmOperationStatus.READY)}async execute(){return this.assertStatus(t.EvmOperationStatus.READY,"execute"),this.act(async()=>{const e=await this.ctx.getProvider("evm");if(!e)throw t.LombardError.providerMissing(this.params.sourceChain,"evm");const r=(await e.request({method:"eth_accounts"}))[0];if(!r)throw t.LombardError.providerMissing(this.params.sourceChain,"evm");const p=t.parseChainIdentifier(this.params.sourceChain),c=this.params.assetOut===d.AssetId.BTCb;this.emitProgress({status:t.EvmOperationStatus.READY,steps:{burning:t.StepStatus.PENDING,releasing:t.StepStatus.IDLE}});const u=await E.redeemToken({provider:e,account:c?this._recipient:r,amount:this._amount,btcAddress:c?void 0:this._recipient,chainId:p,env:this.ctx.env,tokenIn:m.Token.LBTC,tokenOut:c?m.Token.BTCb:void 0});return this._txHash=u,this.emitProgress({status:t.EvmOperationStatus.COMPLETED,steps:{burning:t.StepStatus.COMPLETE,releasing:c?t.StepStatus.COMPLETE:t.StepStatus.PENDING}}),this.emitCompleted(),{txHash:u}},t.EvmOperationStatus.COMPLETED)}get prepareSchema(){const e=this.params.assetOut===d.AssetId.BTC?Et:lt;return t.objectType({amount:t.evmAmountSchema,recipient:e.recipientSchema})}}function Ct(i,a){return new St(i,a)}const y={routes:[{sourceChains:[t.Chain.ETHEREUM,t.Chain.BASE,t.Chain.BSC,t.Chain.CORN],protocols:[d.DefiProtocol.Veda],envs:[n.r.prod]}]};class At extends t.BaseAction{constructor(e,s){super(t.EvmOperationStatus.IDLE);h(this,"_txHash");h(this,"_account");h(this,"_chainId");this.ctx=e,this.params=s}get txHash(){return this._txHash}async prepare(){return this.assertStatus(t.EvmOperationStatus.IDLE,"prepare"),this.act(async()=>{this.validateProtocol(this.params.protocol);const e=await this.ctx.getProvider("evm");if(!e)throw t.LombardError.providerMissing(this.params.chain,"evm");const r=(await e.request({method:"eth_accounts"}))[0];if(!r)throw t.LombardError.providerMissing(this.params.chain,"evm");if(this._account=r,this._chainId=t.parseChainIdentifier(this.params.chain),!_.isEarnChain(this._chainId))throw new t.LombardError(t.WithdrawErrorCode.PROTOCOL_NOT_SUPPORTED,`Chain ${this.params.chain} does not support Veda vault withdrawals`,{chain:this.params.chain,protocol:this.params.protocol});this.emitProgress({status:t.EvmOperationStatus.READY,steps:{cancelling:t.StepStatus.PENDING}}),this.updateStatus(t.EvmOperationStatus.READY)})}async execute(){return this.assertStatus(t.EvmOperationStatus.READY,"execute"),this.act(async()=>{const e=await this.ctx.getProvider("evm");if(!e)throw t.LombardError.providerMissing(this.params.chain,"evm");if(!this._account||!this._chainId)throw t.LombardError.missingParameter("account or chainId");this.emitProgress({status:t.EvmOperationStatus.READY,steps:{cancelling:t.StepStatus.PENDING}});const s=await E.cancelWithdrawInternal({account:this._account,chainId:this._chainId,provider:e,env:this.ctx.env});return this._txHash=s,this.emitProgress({status:t.EvmOperationStatus.COMPLETED,steps:{cancelling:t.StepStatus.COMPLETE}}),this.emitCompleted(),{txHash:s}},t.EvmOperationStatus.COMPLETED)}validateProtocol(e){if(!y.routes.some(r=>r.protocols.includes(e)&&r.envs.includes(this.ctx.env)))throw t.LombardError.invalidParameter("protocol",`Protocol ${e} is not supported for withdrawals in ${this.ctx.env} environment`)}}class _t extends t.BaseAction{constructor(e,s){super(t.EvmOperationStatus.IDLE);h(this,"_amount");h(this,"_protocol");h(this,"_needsApproval",!1);h(this,"_txHash");h(this,"_account");h(this,"_chainId");this.ctx=e,this.params=s}get amount(){return this._amount}get protocol(){return this._protocol}get needsApproval(){return this._needsApproval}get txHash(){return this._txHash}async prepare(e){return this.assertStatus(t.EvmOperationStatus.IDLE,"prepare"),this.act(async()=>{const s=t.validatePrepareParams(this.prepareSchema,e);this._amount=s.amount,this._protocol=this.params.protocol,this.validateProtocol(this.params.protocol);const r=await this.ctx.getProvider("evm");if(!r)throw t.LombardError.providerMissing(this.params.sourceChain,"evm");const c=(await r.request({method:"eth_accounts"}))[0];if(!c)throw t.LombardError.providerMissing(this.params.sourceChain,"evm");if(this._account=c,this._chainId=t.parseChainIdentifier(this.params.sourceChain),!_.isEarnChain(this._chainId))throw new t.LombardError(t.WithdrawErrorCode.PROTOCOL_NOT_SUPPORTED,`Chain ${this.params.sourceChain} does not support Veda vault withdrawals`,{chain:this.params.sourceChain,protocol:this._protocol});const u=_.EARN_VAULT,o=v.makePublicClient({chainId:this._chainId}),l=new f(s.amount),C=await o.readContract({address:u.lensContract.address,abi:u.lensContract.abi,functionName:"balanceOf",args:[c,u.vaultContract.address]}),S=v.fromBaseDenomination(String(C),u.decimals);let A=S;if(_.isBtceVaultChain(this._chainId)){const w=await o.readContract({address:_.BTCE_VAULT.contracts[this._chainId],abi:_.BTCE_VAULT.abi,functionName:"balanceOf",args:[c]}),P=v.fromBaseDenomination(String(w),u.decimals);A=S.plus(P)}if(l.isGreaterThan(A))throw new t.LombardError(t.WithdrawErrorCode.INSUFFICIENT_SHARES,`Insufficient vault shares. Requested: ${l.toFixed()}, Available: ${A.toFixed()}`,{requested:l.toFixed(),available:A.toFixed()});const I=await o.readContract({address:u.vaultContract.address,abi:u.vaultContract.abi,functionName:"allowance",args:[c,u.withdrawQueueContracts[this._chainId].address]}),T=v.fromBaseDenomination(String(I),u.decimals);this._needsApproval=l.isGreaterThan(T),this._needsApproval?(this.emitProgress({status:t.EvmOperationStatus.NEEDS_APPROVAL,steps:{approval:t.StepStatus.PENDING,queueing:t.StepStatus.IDLE}}),this.updateStatus(t.EvmOperationStatus.NEEDS_APPROVAL)):(this.emitProgress({status:t.EvmOperationStatus.READY,steps:{approval:t.StepStatus.COMPLETE,queueing:t.StepStatus.PENDING}}),this.updateStatus(t.EvmOperationStatus.READY))})}async approve(){return this.assertStatus(t.EvmOperationStatus.NEEDS_APPROVAL,"approve"),this.act(async()=>{if(!this._account||!this._chainId||!this._amount)throw t.LombardError.missingParameter("account, chainId, or amount");const e=await this.ctx.getProvider("evm");if(!e)throw t.LombardError.providerMissing(this.params.sourceChain,"evm");const s=_.EARN_VAULT,r=new f(this._amount),p=L.toBigInt(v.toBaseDenomination(r,s.decimals)),c=v.makePublicClient({chainId:this._chainId}),u=m.makeWalletClient({provider:e,chainId:this._chainId}),o=this._chainId,{request:l}=await c.simulateContract({account:this._account,chain:m.CHAIN_ID_TO_VIEM_CHAIN_MAP[this._chainId],address:s.vaultContract.address,abi:s.vaultContract.abi,functionName:"approve",args:[s.withdrawQueueContracts[o].address,p]}),C=await u.writeContract(l);await E.waitForTransactionReceipt(c,C,"vault share approval"),this._needsApproval=!1,this.emitProgress({status:t.EvmOperationStatus.READY,steps:{approval:t.StepStatus.COMPLETE,queueing:t.StepStatus.PENDING}})},t.EvmOperationStatus.READY)}async execute(){return this.assertStatus(t.EvmOperationStatus.READY,"execute"),this.act(async()=>{const e=await this.ctx.getProvider("evm");if(!e)throw t.LombardError.providerMissing(this.params.sourceChain,"evm");if(!this._account||!this._chainId||!this._amount)throw t.LombardError.missingParameter("account, chainId, or amount");this.emitProgress({status:t.EvmOperationStatus.READY,steps:{approval:t.StepStatus.COMPLETE,queueing:t.StepStatus.PENDING}});let s;return _.isBtceVaultChain(this._chainId)?s=(await E.withdrawEarn({amount:this._amount,account:this._account,chainId:this._chainId,provider:e,env:this.ctx.env})).queueTxHash:s=await E.queueWithdrawInternal({amount:this._amount,approve:!1,account:this._account,chainId:this._chainId,provider:e,env:this.ctx.env}),this._txHash=s,this.emitProgress({status:t.EvmOperationStatus.COMPLETED,steps:{approval:t.StepStatus.COMPLETE,queueing:t.StepStatus.COMPLETE}}),this.emitCompleted(),{txHash:s}},t.EvmOperationStatus.COMPLETED)}get prepareSchema(){return t.objectType({amount:t.evmAmountSchema})}validateProtocol(e){if(!y.routes.some(r=>r.protocols.includes(e)&&r.envs.includes(this.ctx.env)))throw t.LombardError.invalidParameter("protocol",`Protocol ${e} is not supported for withdrawals in ${this.ctx.env} environment`)}}function gt(i,a){return new _t(i,a)}function It(i,a){return new At(i,a)}class H{constructor(a){h(this,"ctx");this.ctx=t.createEvmCoreContext(a)}stake(a){return ht(this.ctx,a)}unstake(a){return Ct(this.ctx,a)}deposit(a){return et(this.ctx,a)}deploy(a){return Z(this.ctx,a)}withdraw(a){return gt(this.ctx,a)}cancelWithdraw(a){return It(this.ctx,a)}redeem(a){return nt(this.ctx,a)}}function ft(i){return new H(i)}exports.EvmActions=H;exports.EvmDepositStatus=g;exports.evmActions=ft;exports.evmModule=$;
|
|
7
|
+
//# sourceMappingURL=EvmActions-CxipDb7X.cjs.map
|