@lombard.finance/sdk 4.3.2 → 4.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +16 -0
- package/LICENSE +21 -0
- package/README.md +6 -6
- 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 +29 -29
- package/dist/bridge.cjs +1 -1
- package/dist/bridge.js +7 -7
- package/dist/btc.cjs +1 -1
- package/dist/btc.js +10 -10
- package/dist/chains/btc/actions/deposit/BtcDeposit.d.ts +7 -4
- package/dist/chains/btc/actions/deposit/BtcDeposit.d.ts.map +1 -1
- package/dist/chains/btc/actions/deposit/config/index.d.ts +16 -8
- package/dist/chains/btc/actions/deposit/config/index.d.ts.map +1 -1
- package/dist/chains/btc/actions/deposit/config/solana.d.ts +20 -0
- package/dist/chains/btc/actions/deposit/config/solana.d.ts.map +1 -0
- package/dist/chains/btc/actions/deposit/config/types.d.ts +4 -3
- package/dist/chains/btc/actions/deposit/config/types.d.ts.map +1 -1
- package/dist/chains/evm/EvmActions.d.ts +4 -4
- package/dist/chains/evm/actions/deposit/config/evm.d.ts +3 -3
- package/dist/chains/evm/actions/deposit/config/evm.d.ts.map +1 -1
- package/dist/chains/evm/actions/deposit/config/types.d.ts +1 -1
- package/dist/chains/evm/actions/deposit/config/types.d.ts.map +1 -1
- package/dist/chains/evm/actions/deposit/factory.d.ts +1 -1
- package/dist/chains/evm/actions/deposit/types.d.ts +1 -1
- package/dist/chains/evm/actions/deposit/types.d.ts.map +1 -1
- package/dist/chains/evm/actions/redeem/EvmRedeem.d.ts.map +1 -1
- package/dist/chains/evm/actions/unstake/EvmUnstake.d.ts.map +1 -1
- package/dist/chains/solana/SolanaActions.d.ts +10 -0
- package/dist/chains/solana/SolanaActions.d.ts.map +1 -1
- package/dist/chains/solana/actions/index.d.ts +1 -0
- package/dist/chains/solana/actions/index.d.ts.map +1 -1
- package/dist/chains/solana/actions/redeem/SolanaRedeem.d.ts +37 -0
- package/dist/chains/solana/actions/redeem/SolanaRedeem.d.ts.map +1 -0
- package/dist/chains/solana/actions/redeem/config/index.d.ts +8 -0
- package/dist/chains/solana/actions/redeem/config/index.d.ts.map +1 -0
- package/dist/chains/solana/actions/redeem/config/solana.d.ts +22 -0
- package/dist/chains/solana/actions/redeem/config/solana.d.ts.map +1 -0
- package/dist/chains/solana/actions/redeem/config/types.d.ts +35 -0
- package/dist/chains/solana/actions/redeem/config/types.d.ts.map +1 -0
- package/dist/chains/solana/actions/redeem/factory.d.ts +12 -0
- package/dist/chains/solana/actions/redeem/factory.d.ts.map +1 -0
- package/dist/chains/solana/actions/redeem/index.d.ts +9 -0
- package/dist/chains/solana/actions/redeem/index.d.ts.map +1 -0
- package/dist/chains/solana/actions/redeem/types.d.ts +52 -0
- package/dist/chains/solana/actions/redeem/types.d.ts.map +1 -0
- package/dist/chains/solana/utils.d.ts +15 -0
- package/dist/chains/solana/utils.d.ts.map +1 -0
- package/dist/chunks/BtcActions-BOVJrdTI.cjs +2 -0
- package/dist/chunks/BtcActions-BOVJrdTI.cjs.map +1 -0
- package/dist/chunks/{BtcActions-k-qs1uO0.js → BtcActions-_a8r3Q7c.js} +457 -414
- package/dist/chunks/BtcActions-_a8r3Q7c.js.map +1 -0
- package/dist/chunks/{EvmActions-B_dF42So.js → EvmActions-D4vFpbYk.js} +163 -173
- package/dist/chunks/EvmActions-D4vFpbYk.js.map +1 -0
- package/dist/chunks/EvmActions-VrDbgMDy.cjs +2 -0
- package/dist/chunks/EvmActions-VrDbgMDy.cjs.map +1 -0
- package/dist/chunks/ReferralsClient-Cmrjo9bN.cjs +2 -0
- package/dist/chunks/ReferralsClient-Cmrjo9bN.cjs.map +1 -0
- package/dist/chunks/{ReferralsClient-DbFWWtVi.js → ReferralsClient-DvEsA3II.js} +160 -160
- package/dist/chunks/ReferralsClient-DvEsA3II.js.map +1 -0
- package/dist/chunks/{api-config-CtcP3TVl.js → api-config-Dm6dR85f.js} +6 -6
- package/dist/chunks/{api-config-CtcP3TVl.js.map → api-config-Dm6dR85f.js.map} +1 -1
- package/dist/chunks/{approveLBTC-CZiZmdcX.cjs → approveLBTC-CUXEC3kw.cjs} +2 -2
- package/dist/chunks/{approveLBTC-CZiZmdcX.cjs.map → approveLBTC-CUXEC3kw.cjs.map} +1 -1
- package/dist/chunks/approveLBTC-Du2El1tW.js +26 -0
- package/dist/chunks/{approveLBTC-B5-ZWqct.js.map → approveLBTC-Du2El1tW.js.map} +1 -1
- package/dist/chunks/{array-Cev6kyLJ.js → array-DYttUPf5.js} +7 -7
- package/dist/chunks/{array-Cev6kyLJ.js.map → array-DYttUPf5.js.map} +1 -1
- package/dist/chunks/{blockchain-identifier-BzMQWh-C.cjs → blockchain-identifier-BTPGxLio.cjs} +2 -2
- package/dist/chunks/{blockchain-identifier-BzMQWh-C.cjs.map → blockchain-identifier-BTPGxLio.cjs.map} +1 -1
- package/dist/chunks/{blockchain-identifier-BmadkNtK.js → blockchain-identifier-CTVaEPpY.js} +24 -24
- package/dist/chunks/{blockchain-identifier-BmadkNtK.js.map → blockchain-identifier-CTVaEPpY.js.map} +1 -1
- package/dist/chunks/{bridge-CTsiodO1.js → bridge-DqGabhIY.js} +13 -13
- package/dist/chunks/{bridge-CTsiodO1.js.map → bridge-DqGabhIY.js.map} +1 -1
- package/dist/chunks/{bridge-BzRlY9pP.cjs → bridge-dWaKrMKm.cjs} +2 -2
- package/dist/chunks/{bridge-BzRlY9pP.cjs.map → bridge-dWaKrMKm.cjs.map} +1 -1
- package/dist/chunks/{config-hFKqUyg3.js → config-DghboRx0.js} +10 -10
- package/dist/chunks/{config-hFKqUyg3.js.map → config-DghboRx0.js.map} +1 -1
- package/dist/chunks/{config-l4ZaZw_g.cjs → config-DmCmanM_.cjs} +2 -2
- package/dist/chunks/{config-l4ZaZw_g.cjs.map → config-DmCmanM_.cjs.map} +1 -1
- package/dist/chunks/constants-D1FnS2Z8.js +6 -0
- package/dist/chunks/constants-D1FnS2Z8.js.map +1 -0
- package/dist/chunks/constants-ueShGH9R.cjs +2 -0
- package/dist/chunks/constants-ueShGH9R.cjs.map +1 -0
- package/dist/chunks/{defi-registry-BIRv_zkp.cjs → defi-registry-DDNavtO1.cjs} +2 -2
- package/dist/chunks/{defi-registry-BIRv_zkp.cjs.map → defi-registry-DDNavtO1.cjs.map} +1 -1
- package/dist/chunks/{defi-registry-wNFN3qyB.js → defi-registry-DxjjBQTV.js} +13 -13
- package/dist/chunks/{defi-registry-wNFN3qyB.js.map → defi-registry-DxjjBQTV.js.map} +1 -1
- package/dist/chunks/{depositStatus-DM7fRmbN.js → depositStatus-05_X7FVs.js} +42 -42
- package/dist/chunks/{depositStatus-DM7fRmbN.js.map → depositStatus-05_X7FVs.js.map} +1 -1
- package/dist/chunks/{depositStatus-C3-EgT2a.cjs → depositStatus-CUjHpXFJ.cjs} +2 -2
- package/dist/chunks/{depositStatus-C3-EgT2a.cjs.map → depositStatus-CUjHpXFJ.cjs.map} +1 -1
- package/dist/chunks/events-5c8IHjEF.cjs +2 -0
- package/dist/chunks/events-5c8IHjEF.cjs.map +1 -0
- package/dist/chunks/{events-DdV_xi-2.js → events-rgJZNpHd.js} +414 -303
- package/dist/chunks/events-rgJZNpHd.js.map +1 -0
- package/dist/chunks/evm-by-btc-address-CZvE15lx.js +39 -0
- package/dist/chunks/{evm-by-btc-address-CwLiENtM.js.map → evm-by-btc-address-CZvE15lx.js.map} +1 -1
- package/dist/chunks/fee-requirements-CCNsxAvJ.js +14 -0
- package/dist/chunks/{fee-requirements-x8-8mpJ7.js.map → fee-requirements-CCNsxAvJ.js.map} +1 -1
- package/dist/chunks/get-exchange-ratio-B-xzYND1.js +20 -0
- package/dist/chunks/{get-exchange-ratio-NtnkG1kZ.js.map → get-exchange-ratio-B-xzYND1.js.map} +1 -1
- package/dist/chunks/{get-exchange-ratio-C-7DadfD.cjs → get-exchange-ratio-BEhD4gLB.cjs} +2 -2
- package/dist/chunks/{get-exchange-ratio-C-7DadfD.cjs.map → get-exchange-ratio-BEhD4gLB.cjs.map} +1 -1
- package/dist/chunks/{get-positions-summary-DkZZYbGP.cjs → get-positions-summary-Dh1QPLYO.cjs} +2 -2
- package/dist/chunks/{get-positions-summary-DkZZYbGP.cjs.map → get-positions-summary-Dh1QPLYO.cjs.map} +1 -1
- package/dist/chunks/{get-positions-summary-B_MmGHLv.js → get-positions-summary-iYshN1RQ.js} +28 -28
- package/dist/chunks/{get-positions-summary-B_MmGHLv.js.map → get-positions-summary-iYshN1RQ.js.map} +1 -1
- package/dist/chunks/{get-vault-tvl-YAXePAW3.js → get-vault-tvl-Ct_Zkg7C.js} +41 -41
- package/dist/chunks/{get-vault-tvl-YAXePAW3.js.map → get-vault-tvl-Ct_Zkg7C.js.map} +1 -1
- package/dist/chunks/{get-vault-tvl-DmTUbOY7.cjs → get-vault-tvl-D_tQIDAs.cjs} +2 -2
- package/dist/chunks/{get-vault-tvl-DmTUbOY7.cjs.map → get-vault-tvl-D_tQIDAs.cjs.map} +1 -1
- package/dist/chunks/{get-vault-withdrawals-CWcYy_sH.cjs → get-vault-withdrawals-8ALlEiAC.cjs} +2 -2
- package/dist/chunks/{get-vault-withdrawals-CWcYy_sH.cjs.map → get-vault-withdrawals-8ALlEiAC.cjs.map} +1 -1
- package/dist/chunks/get-vault-withdrawals-jk7Sv4S4.js +161 -0
- package/dist/chunks/{get-vault-withdrawals-BrpZlt6s.js.map → get-vault-withdrawals-jk7Sv4S4.js.map} +1 -1
- package/dist/chunks/{getSharesByAddress-BEgOf1C0.cjs → getSharesByAddress-D8hehnP1.cjs} +2 -2
- package/dist/chunks/{getSharesByAddress-BEgOf1C0.cjs.map → getSharesByAddress-D8hehnP1.cjs.map} +1 -1
- package/dist/chunks/{getSharesByAddress-BiruCDp6.js → getSharesByAddress-_tBaIBsw.js} +38 -38
- package/dist/chunks/{getSharesByAddress-BiruCDp6.js.map → getSharesByAddress-_tBaIBsw.js.map} +1 -1
- package/dist/chunks/getUserStakeAndBakeSignature-CSEyzgMc.cjs +2 -0
- package/dist/chunks/getUserStakeAndBakeSignature-CSEyzgMc.cjs.map +1 -0
- package/dist/chunks/getUserStakeAndBakeSignature-Su-k10ap.js +125 -0
- package/dist/chunks/getUserStakeAndBakeSignature-Su-k10ap.js.map +1 -0
- package/dist/chunks/lbtc-addresses-D8MYCdsx.js +10 -0
- package/dist/chunks/{lbtc-addresses-BLRmtR3c.js.map → lbtc-addresses-D8MYCdsx.js.map} +1 -1
- package/dist/chunks/{lbtc-addresses-xyTYV7hx.cjs → lbtc-addresses-Kil252DX.cjs} +2 -2
- package/dist/chunks/{lbtc-addresses-xyTYV7hx.cjs.map → lbtc-addresses-Kil252DX.cjs.map} +1 -1
- package/dist/chunks/numbers-CclN2Ohk.js +15 -0
- package/dist/chunks/{numbers-CM-lcmt4.js.map → numbers-CclN2Ohk.js.map} +1 -1
- package/dist/chunks/parameters-C_16L5ft.js +11 -0
- package/dist/chunks/{parameters-CDV-6Hk5.js.map → parameters-C_16L5ft.js.map} +1 -1
- package/dist/chunks/satoshi-CSoJBXc6.js +19 -0
- package/dist/chunks/{satoshi-Ch6y8aYG.js.map → satoshi-CSoJBXc6.js.map} +1 -1
- package/dist/chunks/statusConstants-Cri7yswV.cjs +2 -0
- package/dist/chunks/statusConstants-Cri7yswV.cjs.map +1 -0
- package/dist/chunks/{statusConstants-DFxMrVob.js → statusConstants-Zii1786K.js} +1134 -1113
- package/dist/chunks/statusConstants-Zii1786K.js.map +1 -0
- package/dist/chunks/{storeNetworkFeeSignature-BZGL2Zn_.js → storeNetworkFeeSignature-BODIpq3Y.js} +26 -26
- package/dist/chunks/{storeNetworkFeeSignature-BZGL2Zn_.js.map → storeNetworkFeeSignature-BODIpq3Y.js.map} +1 -1
- package/dist/chunks/{storeNetworkFeeSignature-D7yo6lDV.cjs → storeNetworkFeeSignature-Buk4091C.cjs} +2 -2
- package/dist/chunks/{storeNetworkFeeSignature-D7yo6lDV.cjs.map → storeNetworkFeeSignature-Buk4091C.cjs.map} +1 -1
- package/dist/chunks/time-Sa5gggPG.js +24 -0
- package/dist/chunks/{time-QPeEEEnQ.js.map → time-Sa5gggPG.js.map} +1 -1
- package/dist/chunks/{token-addresses-FKpA3uc4.js → token-addresses-D0v5cR1j.js} +174 -163
- package/dist/chunks/{token-addresses-FKpA3uc4.js.map → token-addresses-D0v5cR1j.js.map} +1 -1
- package/dist/chunks/{token-addresses-DRBecUa7.cjs → token-addresses-nzvTOi24.cjs} +2 -2
- package/dist/chunks/{token-addresses-DRBecUa7.cjs.map → token-addresses-nzvTOi24.cjs.map} +1 -1
- package/dist/chunks/{tokens-D_HeVB5p.cjs → tokens-BkvA0Gp1.cjs} +2 -2
- package/dist/chunks/{tokens-D_HeVB5p.cjs.map → tokens-BkvA0Gp1.cjs.map} +1 -1
- package/dist/chunks/{tokens-C6qZHzph.js → tokens-DgC1hfkm.js} +18 -18
- package/dist/chunks/{tokens-C6qZHzph.js.map → tokens-DgC1hfkm.js.map} +1 -1
- package/dist/chunks/{unstakeLBTC-H0zdYQa6.cjs → unstakeLBTC-CmoCaGX9.cjs} +2 -2
- package/dist/chunks/{unstakeLBTC-H0zdYQa6.cjs.map → unstakeLBTC-CmoCaGX9.cjs.map} +1 -1
- package/dist/chunks/{unstakeLBTC-DAIR9NO_.js → unstakeLBTC-DtvVbpbU.js} +50 -50
- package/dist/chunks/{unstakeLBTC-DAIR9NO_.js.map → unstakeLBTC-DtvVbpbU.js.map} +1 -1
- package/dist/chunks/{withdraw-hHueI2p7.js → withdraw-DgjuaUN3.js} +45 -45
- package/dist/chunks/{withdraw-hHueI2p7.js.map → withdraw-DgjuaUN3.js.map} +1 -1
- package/dist/chunks/{withdraw-C1fMFSwy.cjs → withdraw-i0AueZ_C.cjs} +2 -2
- package/dist/chunks/{withdraw-C1fMFSwy.cjs.map → withdraw-i0AueZ_C.cjs.map} +1 -1
- package/dist/common/constants.d.ts +1 -0
- package/dist/common/constants.d.ts.map +1 -1
- package/dist/contracts.cjs +1 -1
- package/dist/contracts.js +16 -16
- package/dist/core/assets/catalog.d.ts.map +1 -1
- package/dist/core.cjs +1 -1
- package/dist/core.js +85 -85
- package/dist/debug.js +4 -4
- package/dist/defi.cjs +1 -1
- package/dist/defi.js +10 -10
- package/dist/evm.cjs +1 -1
- package/dist/evm.js +34 -34
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +287 -283
- package/dist/index.js.map +1 -1
- package/dist/metrics.cjs +1 -1
- package/dist/metrics.js +6 -6
- package/dist/stories/arg-types.d.ts +1 -0
- package/dist/stories/arg-types.d.ts.map +1 -1
- package/dist/tokens/token-addresses.d.ts +2 -2
- package/dist/tokens/token-addresses.d.ts.map +1 -1
- package/dist/utils/chain.d.ts +7 -0
- package/dist/utils/chain.d.ts.map +1 -1
- package/dist/utils.cjs +1 -1
- package/dist/utils.js +76 -76
- package/dist/vaults.cjs +1 -1
- package/dist/vaults.js +14 -14
- package/package.json +19 -6
- package/dist/chunks/BtcActions-XbVRQEcM.cjs +0 -2
- package/dist/chunks/BtcActions-XbVRQEcM.cjs.map +0 -1
- package/dist/chunks/BtcActions-k-qs1uO0.js.map +0 -1
- package/dist/chunks/EvmActions-BVzQ3fLK.cjs +0 -2
- package/dist/chunks/EvmActions-BVzQ3fLK.cjs.map +0 -1
- package/dist/chunks/EvmActions-B_dF42So.js.map +0 -1
- package/dist/chunks/ReferralsClient-BC-1wT1q.cjs +0 -2
- package/dist/chunks/ReferralsClient-BC-1wT1q.cjs.map +0 -1
- package/dist/chunks/ReferralsClient-DbFWWtVi.js.map +0 -1
- package/dist/chunks/approveLBTC-B5-ZWqct.js +0 -26
- package/dist/chunks/constants-BBK-JNcY.cjs +0 -2
- package/dist/chunks/constants-BBK-JNcY.cjs.map +0 -1
- package/dist/chunks/constants-CuT4axsy.js +0 -5
- package/dist/chunks/constants-CuT4axsy.js.map +0 -1
- package/dist/chunks/events-DdV_xi-2.js.map +0 -1
- package/dist/chunks/events-DqIJRzJo.cjs +0 -2
- package/dist/chunks/events-DqIJRzJo.cjs.map +0 -1
- package/dist/chunks/evm-by-btc-address-CwLiENtM.js +0 -39
- package/dist/chunks/fee-requirements-x8-8mpJ7.js +0 -14
- package/dist/chunks/get-exchange-ratio-NtnkG1kZ.js +0 -20
- package/dist/chunks/get-vault-withdrawals-BrpZlt6s.js +0 -161
- package/dist/chunks/getUserStakeAndBakeSignature-BxRq2cI1.cjs +0 -2
- package/dist/chunks/getUserStakeAndBakeSignature-BxRq2cI1.cjs.map +0 -1
- package/dist/chunks/getUserStakeAndBakeSignature-NGGblnJl.js +0 -120
- package/dist/chunks/getUserStakeAndBakeSignature-NGGblnJl.js.map +0 -1
- package/dist/chunks/lbtc-addresses-BLRmtR3c.js +0 -10
- package/dist/chunks/numbers-CM-lcmt4.js +0 -15
- package/dist/chunks/parameters-CDV-6Hk5.js +0 -11
- package/dist/chunks/satoshi-Ch6y8aYG.js +0 -19
- package/dist/chunks/statusConstants-BLiNBT6s.cjs +0 -2
- package/dist/chunks/statusConstants-BLiNBT6s.cjs.map +0 -1
- package/dist/chunks/statusConstants-DFxMrVob.js.map +0 -1
- package/dist/chunks/time-QPeEEEnQ.js +0 -24
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unstakeLBTC-DAIR9NO_.js","sources":["../../src/tokens/abi/ASSET_ROUTER_ABI.ts","../../src/contract-functions/getLBTCMintingFee/getLBTCMintingFee.ts","../../src/contract-functions/signStakeAndBake/validation.ts","../../src/contract-functions/getStakeAndBakeFee/getStakeAndBakeFee.tsx","../../src/contract-functions/signLbtcDestionationAddr/signLbtcDestinationAddr.ts","../../src/contract-functions/signNetworkFee/signNetworkFee.ts","../../src/contract-functions/getPermitNonce/getPermitNonce.ts","../../src/contract-functions/signStakeAndBake/typed-data-builder.ts","../../src/contract-functions/signStakeAndBake/handleApprove.ts","../../src/contract-functions/signStakeAndBake/handlePermit.ts","../../src/contract-functions/signStakeAndBake/utils.ts","../../src/contract-functions/signStakeAndBake/signStakeAndBake.ts","../../src/clients/evm-signer-adapter.ts","../../src/utils/transaction-executor.ts","../../src/contract-functions/getBasculeDepositStatus/decodeBasculeDepositStatus.ts","../../src/tokens/abi/KATANA_BASCULE_ABI.ts","../../src/contract-functions/getBasculeDepositStatus/getBasculeDepositStatus.ts","../../src/contract-functions/approveToken/approveToken.ts","../../src/utils/gas.ts","../../src/contract-functions/claimLBTC/claimLBTC.ts","../../src/contract-functions/deposit/depositToken.ts","../../src/contract-functions/unstakeLBTC/unstakeLBTC.ts"],"sourcesContent":["export default [\n {\n inputs: [],\n stateMutability: 'nonpayable',\n type: 'constructor',\n },\n {\n inputs: [],\n name: 'AccessControlBadConfirmation',\n type: 'error',\n },\n {\n inputs: [\n {\n internalType: 'uint48',\n name: 'schedule',\n type: 'uint48',\n },\n ],\n name: 'AccessControlEnforcedDefaultAdminDelay',\n type: 'error',\n },\n {\n inputs: [],\n name: 'AccessControlEnforcedDefaultAdminRules',\n type: 'error',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'defaultAdmin',\n type: 'address',\n },\n ],\n name: 'AccessControlInvalidDefaultAdmin',\n type: 'error',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'account',\n type: 'address',\n },\n {\n internalType: 'bytes32',\n name: 'neededRole',\n type: 'bytes32',\n },\n ],\n name: 'AccessControlUnauthorizedAccount',\n type: 'error',\n },\n {\n inputs: [\n {\n internalType: 'uint256',\n name: 'dustLimit',\n type: 'uint256',\n },\n ],\n name: 'AmountBelowMinLimit',\n type: 'error',\n },\n {\n inputs: [\n {\n internalType: 'uint256',\n name: 'fee',\n type: 'uint256',\n },\n ],\n name: 'AmountLessThanCommission',\n type: 'error',\n },\n {\n inputs: [],\n name: 'AssertRouter_UnauthorizedAccount',\n type: 'error',\n },\n {\n inputs: [],\n name: 'AssertRouter_WrongRedeemDestinationChain',\n type: 'error',\n },\n {\n inputs: [],\n name: 'AssertRouter_WrongRouteType',\n type: 'error',\n },\n {\n inputs: [],\n name: 'AssertRouter_WrongToken',\n type: 'error',\n },\n {\n inputs: [],\n name: 'AssetOperation_DepositNotAllowed',\n type: 'error',\n },\n {\n inputs: [],\n name: 'AssetOperation_RedeemNotAllowed',\n type: 'error',\n },\n {\n inputs: [],\n name: 'AssetRouter_FeeGreaterThanAmount',\n type: 'error',\n },\n {\n inputs: [],\n name: 'AssetRouter_MailboxExpected',\n type: 'error',\n },\n {\n inputs: [],\n name: 'AssetRouter_MintProcessingError',\n type: 'error',\n },\n {\n inputs: [],\n name: 'AssetRouter_PayloadAlreadyUsed',\n type: 'error',\n },\n {\n inputs: [],\n name: 'AssetRouter_Unauthorized',\n type: 'error',\n },\n {\n inputs: [],\n name: 'AssetRouter_WrongNativeToken',\n type: 'error',\n },\n {\n inputs: [],\n name: 'AssetRouter_WrongOperation',\n type: 'error',\n },\n {\n inputs: [],\n name: 'AssetRouter_WrongSender',\n type: 'error',\n },\n {\n inputs: [],\n name: 'AssetRouter_ZeroAddress',\n type: 'error',\n },\n {\n inputs: [],\n name: 'AssetRouter_ZeroMailbox',\n type: 'error',\n },\n {\n inputs: [\n {\n internalType: 'uint256',\n name: 'expected',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'actual',\n type: 'uint256',\n },\n ],\n name: 'Assets_InvalidPayloadSize',\n type: 'error',\n },\n {\n inputs: [\n {\n internalType: 'bytes4',\n name: 'expected',\n type: 'bytes4',\n },\n {\n internalType: 'bytes4',\n name: 'actual',\n type: 'bytes4',\n },\n ],\n name: 'Assets_InvalidSelector',\n type: 'error',\n },\n {\n inputs: [],\n name: 'Assets_ZeroAmount',\n type: 'error',\n },\n {\n inputs: [],\n name: 'Assets_ZeroRecipient',\n type: 'error',\n },\n {\n inputs: [],\n name: 'Assets_ZeroToToken',\n type: 'error',\n },\n {\n inputs: [],\n name: 'ECDSAInvalidSignature',\n type: 'error',\n },\n {\n inputs: [\n {\n internalType: 'uint256',\n name: 'length',\n type: 'uint256',\n },\n ],\n name: 'ECDSAInvalidSignatureLength',\n type: 'error',\n },\n {\n inputs: [\n {\n internalType: 'bytes32',\n name: 's',\n type: 'bytes32',\n },\n ],\n name: 'ECDSAInvalidSignatureS',\n type: 'error',\n },\n {\n inputs: [],\n name: 'GMP_InvalidAddess',\n type: 'error',\n },\n {\n inputs: [\n {\n internalType: 'bytes4',\n name: 'expected',\n type: 'bytes4',\n },\n {\n internalType: 'bytes4',\n name: 'actual',\n type: 'bytes4',\n },\n ],\n name: 'InvalidAction',\n type: 'error',\n },\n {\n inputs: [],\n name: 'InvalidFeeApprovalSignature',\n type: 'error',\n },\n {\n inputs: [],\n name: 'InvalidInitialization',\n type: 'error',\n },\n {\n inputs: [\n {\n internalType: 'uint256',\n name: 'expected',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'actual',\n type: 'uint256',\n },\n ],\n name: 'InvalidPayloadSize',\n type: 'error',\n },\n {\n inputs: [\n {\n internalType: 'uint256',\n name: 'a',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'b',\n type: 'uint256',\n },\n ],\n name: 'NonEqualLength',\n type: 'error',\n },\n {\n inputs: [],\n name: 'NotInitializing',\n type: 'error',\n },\n {\n inputs: [],\n name: 'NotStakingToken',\n type: 'error',\n },\n {\n inputs: [],\n name: 'ReentrancyGuardReentrantCall',\n type: 'error',\n },\n {\n inputs: [\n {\n internalType: 'uint8',\n name: 'bits',\n type: 'uint8',\n },\n {\n internalType: 'uint256',\n name: 'value',\n type: 'uint256',\n },\n ],\n name: 'SafeCastOverflowedUintDowncast',\n type: 'error',\n },\n {\n inputs: [],\n name: 'ScriptPubkeyUnsupported',\n type: 'error',\n },\n {\n inputs: [\n {\n internalType: 'uint256',\n name: 'expiry',\n type: 'uint256',\n },\n ],\n name: 'UserSignatureExpired',\n type: 'error',\n },\n {\n inputs: [],\n name: 'ZeroFee',\n type: 'error',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'address',\n name: 'prevVal',\n type: 'address',\n },\n {\n indexed: true,\n internalType: 'address',\n name: 'newVal',\n type: 'address',\n },\n ],\n name: 'AssetRouter_BasculeChanged',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'bytes32',\n name: 'payloadHash',\n type: 'bytes32',\n },\n {\n indexed: false,\n internalType: 'string',\n name: 'reason',\n type: 'string',\n },\n {\n indexed: false,\n internalType: 'bytes',\n name: 'customError',\n type: 'bytes',\n },\n ],\n name: 'AssetRouter_BatchMintError',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'uint256',\n name: 'oldRate',\n type: 'uint256',\n },\n {\n indexed: true,\n internalType: 'uint256',\n name: 'newRate',\n type: 'uint256',\n },\n ],\n name: 'AssetRouter_DustFeeRateChanged',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'uint256',\n name: 'fee',\n type: 'uint256',\n },\n {\n indexed: false,\n internalType: 'bytes',\n name: 'userSignature',\n type: 'bytes',\n },\n ],\n name: 'AssetRouter_FeeCharged',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'address',\n name: 'prevVal',\n type: 'address',\n },\n {\n indexed: true,\n internalType: 'address',\n name: 'newVal',\n type: 'address',\n },\n ],\n name: 'AssetRouter_MailboxChanged',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'uint256',\n name: 'oldFee',\n type: 'uint256',\n },\n {\n indexed: true,\n internalType: 'uint256',\n name: 'newFee',\n type: 'uint256',\n },\n ],\n name: 'AssetRouter_MintFeeChanged',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'address',\n name: 'oldAddress',\n type: 'address',\n },\n {\n indexed: true,\n internalType: 'address',\n name: 'newAddress',\n type: 'address',\n },\n ],\n name: 'AssetRouter_NativeTokenChanged',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'address',\n name: 'prevVal',\n type: 'address',\n },\n {\n indexed: true,\n internalType: 'address',\n name: 'newVal',\n type: 'address',\n },\n ],\n name: 'AssetRouter_OracleChanged',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'address',\n name: 'token',\n type: 'address',\n },\n {\n indexed: false,\n internalType: 'bool',\n name: 'enabled',\n type: 'bool',\n },\n ],\n name: 'AssetRouter_RedeemEnabled',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'address',\n name: 'token',\n type: 'address',\n },\n {\n indexed: false,\n internalType: 'uint256',\n name: 'oldFee',\n type: 'uint256',\n },\n {\n indexed: false,\n internalType: 'uint256',\n name: 'newFee',\n type: 'uint256',\n },\n ],\n name: 'AssetRouter_RedeemFeeChanged',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'address',\n name: 'token',\n type: 'address',\n },\n {\n indexed: false,\n internalType: 'uint256',\n name: 'oldMinAmount',\n type: 'uint256',\n },\n {\n indexed: false,\n internalType: 'uint256',\n name: 'newMinAmount',\n type: 'uint256',\n },\n ],\n name: 'AssetRouter_RedeemForBtcMinAmountChanged',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'bytes32',\n name: 'fromToken',\n type: 'bytes32',\n },\n {\n indexed: true,\n internalType: 'bytes32',\n name: 'fromChainId',\n type: 'bytes32',\n },\n {\n indexed: true,\n internalType: 'bytes32',\n name: 'toToken',\n type: 'bytes32',\n },\n {\n indexed: false,\n internalType: 'bytes32',\n name: 'toChainId',\n type: 'bytes32',\n },\n ],\n name: 'AssetRouter_RouteRemoved',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'bytes32',\n name: 'fromToken',\n type: 'bytes32',\n },\n {\n indexed: true,\n internalType: 'bytes32',\n name: 'fromChainId',\n type: 'bytes32',\n },\n {\n indexed: true,\n internalType: 'bytes32',\n name: 'toToken',\n type: 'bytes32',\n },\n {\n indexed: false,\n internalType: 'bytes32',\n name: 'toChainId',\n type: 'bytes32',\n },\n {\n indexed: false,\n internalType: 'enum IAssetRouter.RouteType',\n name: 'routeType',\n type: 'uint8',\n },\n ],\n name: 'AssetRouter_RouteSet',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'uint256',\n name: 'oldCommission',\n type: 'uint256',\n },\n {\n indexed: true,\n internalType: 'uint256',\n name: 'newCommission',\n type: 'uint256',\n },\n ],\n name: 'AssetRouter_ToNativeCommissionChanged',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [],\n name: 'DefaultAdminDelayChangeCanceled',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: 'uint48',\n name: 'newDelay',\n type: 'uint48',\n },\n {\n indexed: false,\n internalType: 'uint48',\n name: 'effectSchedule',\n type: 'uint48',\n },\n ],\n name: 'DefaultAdminDelayChangeScheduled',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [],\n name: 'DefaultAdminTransferCanceled',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'address',\n name: 'newAdmin',\n type: 'address',\n },\n {\n indexed: false,\n internalType: 'uint48',\n name: 'acceptSchedule',\n type: 'uint48',\n },\n ],\n name: 'DefaultAdminTransferScheduled',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: 'uint64',\n name: 'version',\n type: 'uint64',\n },\n ],\n name: 'Initialized',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'bytes32',\n name: 'role',\n type: 'bytes32',\n },\n {\n indexed: true,\n internalType: 'bytes32',\n name: 'previousAdminRole',\n type: 'bytes32',\n },\n {\n indexed: true,\n internalType: 'bytes32',\n name: 'newAdminRole',\n type: 'bytes32',\n },\n ],\n name: 'RoleAdminChanged',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'bytes32',\n name: 'role',\n type: 'bytes32',\n },\n {\n indexed: true,\n internalType: 'address',\n name: 'account',\n type: 'address',\n },\n {\n indexed: true,\n internalType: 'address',\n name: 'sender',\n type: 'address',\n },\n ],\n name: 'RoleGranted',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'bytes32',\n name: 'role',\n type: 'bytes32',\n },\n {\n indexed: true,\n internalType: 'address',\n name: 'account',\n type: 'address',\n },\n {\n indexed: true,\n internalType: 'address',\n name: 'sender',\n type: 'address',\n },\n ],\n name: 'RoleRevoked',\n type: 'event',\n },\n {\n inputs: [],\n name: 'CALLER_ROLE',\n outputs: [\n {\n internalType: 'bytes32',\n name: '',\n type: 'bytes32',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'CLAIMER_ROLE',\n outputs: [\n {\n internalType: 'bytes32',\n name: '',\n type: 'bytes32',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'DEFAULT_ADMIN_ROLE',\n outputs: [\n {\n internalType: 'bytes32',\n name: '',\n type: 'bytes32',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'OPERATOR_ROLE',\n outputs: [\n {\n internalType: 'bytes32',\n name: '',\n type: 'bytes32',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'acceptDefaultAdminTransfer',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [],\n name: 'bascule',\n outputs: [\n {\n internalType: 'contract IBascule',\n name: '',\n type: 'address',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'bytes[]',\n name: 'payload',\n type: 'bytes[]',\n },\n {\n internalType: 'bytes[]',\n name: 'proof',\n type: 'bytes[]',\n },\n ],\n name: 'batchMint',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'bytes[]',\n name: 'mintPayload',\n type: 'bytes[]',\n },\n {\n internalType: 'bytes[]',\n name: 'proof',\n type: 'bytes[]',\n },\n {\n internalType: 'bytes[]',\n name: 'feePayload',\n type: 'bytes[]',\n },\n {\n internalType: 'bytes[]',\n name: 'userSignature',\n type: 'bytes[]',\n },\n ],\n name: 'batchMintWithFee',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'newAdmin',\n type: 'address',\n },\n ],\n name: 'beginDefaultAdminTransfer',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [],\n name: 'bitcoinChainId',\n outputs: [\n {\n internalType: 'bytes32',\n name: '',\n type: 'bytes32',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'token',\n type: 'address',\n },\n {\n internalType: 'bytes',\n name: 'scriptPubkey',\n type: 'bytes',\n },\n {\n internalType: 'uint256',\n name: 'amount',\n type: 'uint256',\n },\n ],\n name: 'calcUnstakeRequestAmount',\n outputs: [\n {\n internalType: 'uint256',\n name: 'amountAfterFee',\n type: 'uint256',\n },\n {\n internalType: 'bool',\n name: 'isAboveMinLimit',\n type: 'bool',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'cancelDefaultAdminTransfer',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'newVal',\n type: 'address',\n },\n ],\n name: 'changeBascule',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'uint48',\n name: 'newDelay',\n type: 'uint48',\n },\n ],\n name: 'changeDefaultAdminDelay',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'newVal',\n type: 'address',\n },\n ],\n name: 'changeMailbox',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'newValue',\n type: 'address',\n },\n ],\n name: 'changeNativeToken',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'token',\n type: 'address',\n },\n {\n internalType: 'address',\n name: 'newVal',\n type: 'address',\n },\n ],\n name: 'changeOracle',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'token',\n type: 'address',\n },\n {\n internalType: 'uint256',\n name: 'fee',\n type: 'uint256',\n },\n ],\n name: 'changeRedeemFee',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'uint256',\n name: 'fee',\n type: 'uint256',\n },\n ],\n name: 'changeRedeemFee',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'token',\n type: 'address',\n },\n {\n internalType: 'uint256',\n name: 'minAmount',\n type: 'uint256',\n },\n ],\n name: 'changeRedeemForBtcMinAmount',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'uint256',\n name: 'minAmount',\n type: 'uint256',\n },\n ],\n name: 'changeRedeemForBtcMinAmount',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'token',\n type: 'address',\n },\n {\n internalType: 'uint64',\n name: 'newValue',\n type: 'uint64',\n },\n ],\n name: 'changeToNativeCommission',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'token',\n type: 'address',\n },\n {\n internalType: 'uint256',\n name: 'redeemFee',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'redeemForBtcMinAmount',\n type: 'uint256',\n },\n {\n internalType: 'bool',\n name: 'redeemEnabled',\n type: 'bool',\n },\n ],\n name: 'changeTokenConfig',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'token',\n type: 'address',\n },\n {\n internalType: 'uint256',\n name: 'redeemFee',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'redeemForBtcMinAmount',\n type: 'uint256',\n },\n {\n internalType: 'address',\n name: 'oracle_',\n type: 'address',\n },\n {\n internalType: 'uint256',\n name: 'maximumMintCommission_',\n type: 'uint256',\n },\n {\n internalType: 'uint64',\n name: 'toNativeCommission_',\n type: 'uint64',\n },\n ],\n name: 'changeTokenConfigExt',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [],\n name: 'defaultAdmin',\n outputs: [\n {\n internalType: 'address',\n name: '',\n type: 'address',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'defaultAdminDelay',\n outputs: [\n {\n internalType: 'uint48',\n name: '',\n type: 'uint48',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'defaultAdminDelayIncreaseWait',\n outputs: [\n {\n internalType: 'uint48',\n name: '',\n type: 'uint48',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'fromAddress',\n type: 'address',\n },\n {\n internalType: 'address',\n name: 'toToken',\n type: 'address',\n },\n {\n internalType: 'uint256',\n name: 'amount',\n type: 'uint256',\n },\n ],\n name: 'deposit',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'bytes32',\n name: 'tolChainId',\n type: 'bytes32',\n },\n {\n internalType: 'bytes32',\n name: 'toToken',\n type: 'bytes32',\n },\n {\n internalType: 'bytes32',\n name: 'recipient',\n type: 'bytes32',\n },\n {\n internalType: 'uint256',\n name: 'amount',\n type: 'uint256',\n },\n ],\n name: 'deposit',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'token',\n type: 'address',\n },\n ],\n name: 'getRate',\n outputs: [\n {\n internalType: 'uint256',\n name: '',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'bytes32',\n name: 'role',\n type: 'bytes32',\n },\n ],\n name: 'getRoleAdmin',\n outputs: [\n {\n internalType: 'bytes32',\n name: '',\n type: 'bytes32',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'bytes32',\n name: 'fromToken',\n type: 'bytes32',\n },\n {\n internalType: 'bytes32',\n name: 'fromChainId',\n type: 'bytes32',\n },\n {\n internalType: 'bytes32',\n name: 'toChainId',\n type: 'bytes32',\n },\n {\n internalType: 'bytes32',\n name: 'toToken',\n type: 'bytes32',\n },\n ],\n name: 'getRouteType',\n outputs: [\n {\n internalType: 'enum IAssetRouter.RouteType',\n name: '',\n type: 'uint8',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'bytes32',\n name: 'role',\n type: 'bytes32',\n },\n {\n internalType: 'address',\n name: 'account',\n type: 'address',\n },\n ],\n name: 'grantRole',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n components: [\n {\n internalType: 'bytes32',\n name: 'id',\n type: 'bytes32',\n },\n {\n internalType: 'bytes32',\n name: 'msgPath',\n type: 'bytes32',\n },\n {\n internalType: 'uint256',\n name: 'msgNonce',\n type: 'uint256',\n },\n {\n internalType: 'bytes32',\n name: 'msgSender',\n type: 'bytes32',\n },\n {\n internalType: 'address',\n name: 'msgRecipient',\n type: 'address',\n },\n {\n internalType: 'address',\n name: 'msgDestinationCaller',\n type: 'address',\n },\n {\n internalType: 'bytes',\n name: 'msgBody',\n type: 'bytes',\n },\n ],\n internalType: 'struct GMPUtils.Payload',\n name: 'payload',\n type: 'tuple',\n },\n ],\n name: 'handlePayload',\n outputs: [\n {\n internalType: 'bytes',\n name: '',\n type: 'bytes',\n },\n ],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'bytes32',\n name: 'role',\n type: 'bytes32',\n },\n {\n internalType: 'address',\n name: 'account',\n type: 'address',\n },\n ],\n name: 'hasRole',\n outputs: [\n {\n internalType: 'bool',\n name: '',\n type: 'bool',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'owner_',\n type: 'address',\n },\n {\n internalType: 'uint48',\n name: 'initialOwnerDelay_',\n type: 'uint48',\n },\n {\n internalType: 'bytes32',\n name: 'ledgerChainId_',\n type: 'bytes32',\n },\n {\n internalType: 'bytes32',\n name: 'bitcoinChainId_',\n type: 'bytes32',\n },\n {\n internalType: 'address',\n name: 'mailbox_',\n type: 'address',\n },\n {\n internalType: 'address',\n name: 'bascule_',\n type: 'address',\n },\n ],\n name: 'initialize',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [],\n name: 'mailbox',\n outputs: [\n {\n internalType: 'contract IMailbox',\n name: '',\n type: 'address',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'token',\n type: 'address',\n },\n ],\n name: 'maxMintCommission',\n outputs: [\n {\n internalType: 'uint256',\n name: '',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'bytes',\n name: 'rawPayload',\n type: 'bytes',\n },\n {\n internalType: 'bytes',\n name: 'proof',\n type: 'bytes',\n },\n ],\n name: 'mint',\n outputs: [\n {\n internalType: 'address',\n name: '',\n type: 'address',\n },\n ],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'bytes',\n name: 'mintPayload',\n type: 'bytes',\n },\n {\n internalType: 'bytes',\n name: 'proof',\n type: 'bytes',\n },\n {\n internalType: 'bytes',\n name: 'feePayload',\n type: 'bytes',\n },\n {\n internalType: 'bytes',\n name: 'userSignature',\n type: 'bytes',\n },\n ],\n name: 'mintWithFee',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [],\n name: 'nativeToken',\n outputs: [\n {\n internalType: 'address',\n name: '',\n type: 'address',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'token',\n type: 'address',\n },\n ],\n name: 'oracle',\n outputs: [\n {\n internalType: 'contract IOracle',\n name: '',\n type: 'address',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'owner',\n outputs: [\n {\n internalType: 'address',\n name: '',\n type: 'address',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'pendingDefaultAdmin',\n outputs: [\n {\n internalType: 'address',\n name: 'newAdmin',\n type: 'address',\n },\n {\n internalType: 'uint48',\n name: 'schedule',\n type: 'uint48',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'pendingDefaultAdminDelay',\n outputs: [\n {\n internalType: 'uint48',\n name: 'newDelay',\n type: 'uint48',\n },\n {\n internalType: 'uint48',\n name: 'schedule',\n type: 'uint48',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'token',\n type: 'address',\n },\n ],\n name: 'ratio',\n outputs: [\n {\n internalType: 'uint256',\n name: '',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'fromAddress',\n type: 'address',\n },\n {\n internalType: 'address',\n name: 'fromToken',\n type: 'address',\n },\n {\n internalType: 'uint256',\n name: 'amount',\n type: 'uint256',\n },\n ],\n name: 'redeem',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'fromAddress',\n type: 'address',\n },\n {\n internalType: 'bytes32',\n name: 'tolChainId',\n type: 'bytes32',\n },\n {\n internalType: 'address',\n name: 'fromToken',\n type: 'address',\n },\n {\n internalType: 'bytes32',\n name: 'toToken',\n type: 'bytes32',\n },\n {\n internalType: 'bytes32',\n name: 'recipient',\n type: 'bytes32',\n },\n {\n internalType: 'uint256',\n name: 'amount',\n type: 'uint256',\n },\n ],\n name: 'redeem',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'fromAddress',\n type: 'address',\n },\n {\n internalType: 'address',\n name: 'fromToken',\n type: 'address',\n },\n {\n internalType: 'bytes',\n name: 'recipient',\n type: 'bytes',\n },\n {\n internalType: 'uint256',\n name: 'amount',\n type: 'uint256',\n },\n ],\n name: 'redeemForBtc',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'bytes32',\n name: 'fromToken',\n type: 'bytes32',\n },\n {\n internalType: 'bytes32',\n name: 'fromChainId',\n type: 'bytes32',\n },\n {\n internalType: 'bytes32',\n name: 'toToken',\n type: 'bytes32',\n },\n {\n internalType: 'bytes32',\n name: 'toChainId',\n type: 'bytes32',\n },\n ],\n name: 'removeRoute',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'bytes32',\n name: 'role',\n type: 'bytes32',\n },\n {\n internalType: 'address',\n name: 'account',\n type: 'address',\n },\n ],\n name: 'renounceRole',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'bytes32',\n name: 'role',\n type: 'bytes32',\n },\n {\n internalType: 'address',\n name: 'account',\n type: 'address',\n },\n ],\n name: 'revokeRole',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [],\n name: 'rollbackDefaultAdminDelay',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'token',\n type: 'address',\n },\n {\n internalType: 'uint256',\n name: 'fee',\n type: 'uint256',\n },\n ],\n name: 'setMaxMintCommission',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'bytes32',\n name: 'fromToken',\n type: 'bytes32',\n },\n {\n internalType: 'bytes32',\n name: 'fromChainId',\n type: 'bytes32',\n },\n {\n internalType: 'bytes32',\n name: 'toToken',\n type: 'bytes32',\n },\n {\n internalType: 'bytes32',\n name: 'toChainId',\n type: 'bytes32',\n },\n {\n internalType: 'enum IAssetRouter.RouteType',\n name: 'routeType',\n type: 'uint8',\n },\n ],\n name: 'setRoute',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'bytes4',\n name: 'interfaceId',\n type: 'bytes4',\n },\n ],\n name: 'supportsInterface',\n outputs: [\n {\n internalType: 'bool',\n name: '',\n type: 'bool',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'token',\n type: 'address',\n },\n ],\n name: 'toNativeCommission',\n outputs: [\n {\n internalType: 'uint64',\n name: '',\n type: 'uint64',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'toggleRedeem',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'token',\n type: 'address',\n },\n ],\n name: 'tokenConfig',\n outputs: [\n {\n internalType: 'uint256',\n name: 'redeemFee',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'redeemForBtcMinAmount',\n type: 'uint256',\n },\n {\n internalType: 'bool',\n name: 'isRedeemEnabled',\n type: 'bool',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n];\n","import BigNumber from 'bignumber.js';\n\nimport { makePublicClient } from '../../clients/public-client';\nimport { CommonParameters } from '../../common/parameters';\nimport ASSET_ROUTER_ABI from '../../tokens/abi/ASSET_ROUTER_ABI';\nimport { AddressKind, Token } from '../../tokens/token-addresses';\nimport { getTokenContractInfo, isUpgradedAbi } from '../../tokens/tokens';\nimport { determineEnv } from '../../utils/env';\nimport { fromSatoshi } from '../../utils/satoshi';\n\n/**\n * Gets LBTC minting fee amount.\n *\n * @param {CommonParameters} parameters - The parameters.\n * @param {ChainId} parameters.chainId - The chain id.\n * @param {string} parameters.rpcUrl - The optional rpc url.\n * @param {Env} parameters.env - The optional environment identifier.\n *\n * @return {Promise<BigNumber>}\n */\nexport async function getLBTCMintingFee(\n props: CommonParameters,\n): Promise<BigNumber> {\n return getMintingFee({ token: Token.LBTC, ...props });\n}\n\n/** Gets LBTC burn commission (fee) amount. */\nexport async function getLBTCBurningFee(props: CommonParameters) {\n return getRedeemFee({ token: Token.LBTC, ...props });\n}\n\nexport async function getMintingFee({\n token,\n chainId,\n rpcUrl,\n env,\n}: { token: Token } & CommonParameters) {\n if (![Token.LBTC, Token.BTCK, Token.BTCb].includes(token)) {\n throw new Error(`Unsupported token: ${token}`);\n }\n\n const environment = env || determineEnv(chainId);\n\n const publicClient = makePublicClient({ chainId, rpcUrl, env: environment });\n const tokenContract = await getTokenContractInfo(\n token,\n chainId,\n environment,\n AddressKind.Adapter,\n );\n const tokenContractAbi = tokenContract.abi;\n\n let rawFeeValue = 0n;\n\n if (isUpgradedAbi(tokenContractAbi) || token === Token.BTCb) {\n const assetRouterAddress = await publicClient.readContract({\n abi: tokenContractAbi,\n address: tokenContract.address,\n functionName: 'getAssetRouter',\n });\n\n const assetRouter = {\n abi: ASSET_ROUTER_ABI,\n address: assetRouterAddress,\n };\n\n rawFeeValue = (await publicClient.readContract({\n abi: assetRouter.abi,\n address: assetRouter.address,\n functionName: 'maxMintCommission',\n args: [tokenContract.address],\n })) as bigint;\n } else {\n rawFeeValue = await publicClient.readContract({\n abi: tokenContract.abi,\n address: tokenContract.address,\n functionName: 'getMintFee',\n });\n }\n\n return fromSatoshi(String(rawFeeValue));\n}\n\nexport async function getRedeemFee({\n token,\n chainId,\n rpcUrl,\n env,\n}: { token: Token } & CommonParameters) {\n if (![Token.LBTC, Token.BTCK, Token.BTCb].includes(token)) {\n throw new Error(`Unsupported token: ${token}`);\n }\n const environment = env || determineEnv(chainId);\n\n const publicClient = makePublicClient({ chainId, rpcUrl, env: environment });\n const tokenContract = await getTokenContractInfo(\n token,\n chainId,\n environment,\n AddressKind.Adapter,\n );\n\n let rawFeeValue = 0n;\n if (isUpgradedAbi(tokenContract.abi) || token === Token.BTCb) {\n const assetRouterAddress = await publicClient.readContract({\n abi: tokenContract.abi,\n address: tokenContract.address,\n functionName: 'getAssetRouter',\n });\n\n const assetRouter = {\n abi: ASSET_ROUTER_ABI,\n address: assetRouterAddress,\n };\n\n // 1.\n const toNativeCommissionValue = (await publicClient.readContract({\n abi: assetRouter.abi,\n address: assetRouter.address,\n functionName: 'toNativeCommission',\n args: [tokenContract.address],\n })) as bigint;\n\n // 2.\n const [redeemFeeValue /* redeemForBtcMinAmountValue, isRedeemEnabled */] =\n (await publicClient.readContract({\n abi: assetRouter.abi,\n address: assetRouter.address,\n functionName: 'tokenConfig',\n args: [tokenContract.address],\n })) as [bigint];\n\n rawFeeValue = toNativeCommissionValue + redeemFeeValue;\n } else {\n // legacy (and BTCK v1)\n rawFeeValue = await publicClient.readContract({\n abi: tokenContract.abi,\n address: tokenContract.address,\n functionName: 'getBurnCommission',\n });\n }\n\n return fromSatoshi(String(rawFeeValue));\n}\n\nexport async function getMinRedeemAmount({\n token,\n chainId,\n rpcUrl,\n env,\n}: { token: Token } & CommonParameters) {\n if (![Token.LBTC, Token.BTCK, Token.BTCb].includes(token)) {\n throw new Error(`Unsupported token: ${token}`);\n }\n\n const environment = env || determineEnv(chainId);\n\n const publicClient = makePublicClient({ chainId, rpcUrl, env: environment });\n const tokenContract = await getTokenContractInfo(\n token,\n chainId,\n environment,\n AddressKind.Adapter,\n );\n\n let value = 0n;\n if (isUpgradedAbi(tokenContract.abi) || token === Token.BTCb) {\n const assetRouterAddress = await publicClient.readContract({\n abi: tokenContract.abi,\n address: tokenContract.address,\n functionName: 'getAssetRouter',\n });\n\n const assetRouter = {\n abi: ASSET_ROUTER_ABI,\n address: assetRouterAddress,\n };\n\n const [, redeemForBtcMinAmountValue] = (await publicClient.readContract({\n abi: assetRouter.abi,\n address: assetRouter.address,\n functionName: 'tokenConfig',\n args: [tokenContract.address],\n })) as [undefined, bigint];\n\n value = redeemForBtcMinAmountValue;\n } else {\n // legacy (and BTCK v1)\n value = 2000n; // 0.00002\n }\n\n return fromSatoshi(String(value));\n}\n\n/**\n * Gets the minimum transfer amount required for a successful redemption to BTC.\n *\n * The contract deducts the redeem fee from the user's input first, then verifies\n * the remaining amount meets the minimum redeem threshold. Therefore, the minimum\n * transfer amount the user must provide is `redeemFee + minRedeemAmount`.\n *\n * @param params.token - The token to redeem (LBTC, BTCK, or BTCb).\n * @param params.chainId - The chain ID where the redemption takes place.\n * @param params.rpcUrl - Optional RPC URL override.\n * @param params.env - Optional environment identifier.\n *\n * @returns The minimum transfer amount in BTC (human-readable).\n *\n * @example\n * ```ts\n * const minTransfer = await getMinRedeemAmountWithFee({\n * token: Token.BTCb,\n * chainId: ChainId.avalanche,\n * env: Env.prod,\n * });\n * // e.g. BigNumber(0.000133) — user must send at least this much\n * ```\n */\nexport async function getMinRedeemAmountWithFee(\n params: { token: Token } & CommonParameters,\n): Promise<BigNumber> {\n const [fee, minRedeem] = await Promise.all([\n getRedeemFee(params),\n getMinRedeemAmount(params),\n ]);\n\n return fee.plus(minRedeem);\n}\n","/**\n * Validation utilities for stake and bake operations.\n * Provides early validation with descriptive error messages.\n */\n\nimport { Env } from '@lombard.finance/sdk-common';\n\nimport type { ChainId } from '../../common/chains';\nimport {\n DEFI_REGISTRY,\n DefiProtocol,\n StakeAndBakeStrategy,\n StakeAndBakeToken,\n} from '../../defi/defi-registry';\n\n/**\n * Custom error for stake and bake validation failures.\n * Includes error code and context for better debugging.\n */\nexport class StakeAndBakeValidationError extends Error {\n constructor(\n public readonly code: string,\n message: string,\n public readonly context?: Record<string, unknown>,\n ) {\n super(message);\n this.name = 'StakeAndBakeValidationError';\n }\n}\n\n/**\n * Validates stake and bake parameters and returns the strategy for the requested combo.\n * Throws StakeAndBakeValidationError for invalid combinations.\n *\n * @param vaultKey - The vault to stake into\n * @param token - The token to stake\n * @param chainId - The chain ID\n * @param env - The environment (prod, testnet, etc.)\n * @returns TokenApprovalConfig and spenderContract\n * @throws {StakeAndBakeValidationError} If vault/token/chain/env combination is invalid\n */\nexport function getStakeAndBakeConfig(\n protocol: DefiProtocol,\n token: StakeAndBakeToken,\n chainId: ChainId,\n env: Env,\n): StakeAndBakeStrategy {\n // Get token approval config from DeFi registry\n const protocolRegistry = DEFI_REGISTRY[protocol];\n if (!protocolRegistry) {\n throw new StakeAndBakeValidationError(\n 'UNSUPPORTED_VAULT',\n `Vault ${protocol} not found in DeFi registry`,\n { protocol },\n );\n }\n\n const tokenRegistry = protocolRegistry[token as keyof typeof protocolRegistry];\n if (!tokenRegistry) {\n throw new StakeAndBakeValidationError(\n 'UNSUPPORTED_TOKEN',\n `Token ${token} is not supported for stake and bake on vault ${protocol}. ` +\n `Supported tokens: ${Object.keys(protocolRegistry).join(', ')}`,\n { protocol, token, supportedTokens: Object.keys(protocolRegistry) },\n );\n }\n\n const envRegistry = tokenRegistry[env];\n if (!envRegistry) {\n throw new StakeAndBakeValidationError(\n 'UNSUPPORTED_ENV',\n `Environment ${env} is not supported for token ${token} on vault ${protocol}`,\n { protocol, token, env },\n );\n }\n\n const registryEntry = envRegistry[chainId as keyof typeof envRegistry];\n if (!registryEntry) {\n throw new StakeAndBakeValidationError(\n 'UNSUPPORTED_TOKEN_CHAIN',\n `Token ${token} is not supported on chain ${chainId} for vault ${protocol} in ${env}. ` +\n `Supported chains: ${Object.keys(envRegistry).join(', ')}`,\n {\n protocol,\n token,\n chainId,\n env,\n supportedChains: Object.keys(envRegistry),\n },\n );\n }\n\n return {\n protocol: protocol,\n token,\n env,\n chainId,\n ...registryEntry,\n };\n}\n\n/**\n * Checks if a token approval config exists for a given vault/token/chain/env combination.\n * Useful for determining if config-driven logic should be used.\n *\n * @param protocol - The vault to check\n * @param token - The token to check\n * @param chainId - The chain ID to check\n * @param env - The environment to check\n * @returns true if config exists, false otherwise\n */\nexport function hasTokenApprovalConfig(\n protocol: DefiProtocol,\n token: StakeAndBakeToken,\n chainId: ChainId,\n env: Env,\n): boolean {\n try {\n const config = getStakeAndBakeConfig(protocol, token, chainId, env);\n return config !== undefined;\n } catch {\n return false;\n }\n}\n","import { DEFAULT_ENV } from '@lombard.finance/sdk-common';\nimport BigNumber from 'bignumber.js';\nimport { getContract } from 'viem';\n\nimport { makePublicClient } from '../../clients/public-client';\nimport { CommonParameters } from '../../common/parameters';\nimport {\n DefiProtocol,\n DefiProtocols,\n StakeAndBakeToken,\n} from '../../defi/defi-registry';\nimport { Token } from '../../tokens/token-addresses';\nimport { getErrorMessage } from '../../utils/err';\nimport { fromSatoshi } from '../../utils/satoshi';\nimport { getStakeAndBakeConfig } from '../signStakeAndBake/validation';\n\n/**\n * Default token mapping for each protocol.\n * Used when token is not explicitly provided.\n */\nconst PROTOCOL_DEFAULT_TOKENS: Record<DefiProtocol, StakeAndBakeToken> = {\n [DefiProtocol.Veda]: Token.LBTC,\n [DefiProtocol.Silo]: Token.BTCb,\n};\n\nexport interface IGetStakeAndBakeFeeParams extends CommonParameters {\n /**\n * The DeFi protocol identifier (e.g., Veda, Silo).\n */\n protocol?: DefiProtocol;\n /**\n * The token to query the fee for (optional).\n * If not provided, defaults to the protocol's primary token:\n * - Veda: LBTC\n * - Silo: BTCb\n */\n token?: StakeAndBakeToken;\n}\n\n/**\n * Get Stake and bake fee for a specific DeFi protocol and token.\n *\n * If token is not provided, uses the default token for the protocol:\n * - Veda: LBTC\n * - Silo: BTCb\n *\n * @param {IGetStakeAndBakeFeeParams} parameters - The parameters.\n * @param {DefiProtocol} parameters.protocol - The optional DeFi protocol identifier (defaults to Veda).\n * @param {StakeAndBakeToken} parameters.token - The optional token (defaults to protocol's primary token).\n * @param {ChainId} parameters.chainId - The chain id.\n * @param {Env} parameters.env - The environment (prod, testnet, etc.).\n * @param {string} parameters.rpcUrl - The optional rpc url.\n *\n * @returns Stake and bake fee amount.\n */\nexport async function getStakeAndBakeFee({\n protocol = DefiProtocol.Veda,\n token,\n chainId,\n env = DEFAULT_ENV,\n rpcUrl,\n}: IGetStakeAndBakeFeeParams): Promise<BigNumber> {\n const protocolInfo = DefiProtocols[protocol];\n if (!protocolInfo) {\n throw new Error(`Unknown protocol: ${protocol}`);\n }\n\n // Use provided token or default to protocol's primary token\n const selectedToken = token ?? PROTOCOL_DEFAULT_TOKENS[protocol];\n\n // We use getStakeAndBakeConfig to ensure chain/env compatibility\n try {\n const strategy = getStakeAndBakeConfig(\n protocol,\n selectedToken,\n chainId,\n env,\n );\n\n const spenderContract = strategy.spenderContract;\n if (!spenderContract) {\n throw new Error(\n `Could not retrieve the stake and bake contract for ${protocol} on chain ${chainId}.`,\n );\n }\n\n const client = makePublicClient({ chainId, rpcUrl });\n const contract = getContract({\n abi: spenderContract.abi,\n address: spenderContract.address,\n client,\n });\n const fee = await contract.read.getStakeAndBakeFee();\n return fromSatoshi(String(fee));\n } catch (error) {\n const errorMessage = getErrorMessage(error);\n throw new Error(\n `Failed to get stake and bake fee for ${protocolInfo.name}: ${errorMessage}`,\n );\n }\n}\n","import { makeWalletClient } from '../../clients/wallet-client';\nimport { CommonWriteParameters } from '../../common/parameters';\n\nexport type SignLbtcDestinationAddrParams = Omit<\n CommonWriteParameters,\n 'env' | 'rpcUrl'\n>;\n\n/**\n * Generates the address confirmation message for a given chain ID.\n *\n * This is the exact message text that the backend expects when verifying\n * address confirmation signatures. The format is shared across all chain\n * types (EVM, Solana, Sui, Starknet).\n *\n * Use this function when you need to construct the message independently\n * (e.g., for custom signing flows) instead of using {@link signLbtcDestinationAddr}.\n *\n * @param chainId - The numeric chain ID (e.g., 43114 for Avalanche).\n * @returns The confirmation message string to be signed.\n *\n * @example\n * ```ts\n * import { getAddressConfirmationMessage } from '@lombard.finance/sdk';\n * import { ChainId } from '@lombard.finance/sdk';\n *\n * const message = getAddressConfirmationMessage(ChainId.avalanche);\n * // \"destination chain id is 43114\"\n *\n * // Sign with your own signer\n * const signature = await signer.signMessage(message);\n * ```\n */\nexport function getAddressConfirmationMessage(\n chainId: string | number,\n): string {\n return `destination chain id is ${chainId}`;\n}\n\n/**\n * Signs the destination address for the LBTC in active chain\n * in the current account. Signing is necessary for the\n * generation of the deposit address.\n *\n * @param {SignLbtcDestinationAddrParams} parameters - The parameters.\n * @param {Address} parameters.account - The EVM account address.\n * @param {ChainId} parameters.chainId - The chain id.\n * @param {EIP1193Provider} parameters.provider - The EIP1193 provider.\n *\n * @returns {Promise<string>} The signature of the message.\n */\nexport async function signLbtcDestinationAddr({\n account,\n chainId,\n provider,\n}: SignLbtcDestinationAddrParams): Promise<string> {\n const walletClient = makeWalletClient({ chainId, provider });\n\n const message = getAddressConfirmationMessage(chainId);\n const signed = await walletClient.signMessage({ account, message });\n\n return signed;\n}\n","import BigNumber from 'bignumber.js';\nimport { Hex } from 'viem';\n\nimport { makeWalletClient } from '../../clients/wallet-client';\nimport { CommonWriteParameters } from '../../common/parameters';\nimport { Token } from '../../tokens/token-addresses';\nimport { getTokenContractInfo } from '../../tokens/tokens';\nimport { DAY, now, toUnix } from '../../utils/time';\n\nexport interface ISignNetworkFeeParams extends CommonWriteParameters {\n /**\n * The authorized fee amount.\n * Recommended amount is the same as retuned from `getLBTCMintingFee`.\n */\n fee: BigNumber.Value;\n /**\n * The expiration time of the signature.\n * Defaults to 24h from now.\n */\n expiry?: number;\n /**\n * The token to use for signing.\n * Defaults to Token.LBTC for backwards compatibility.\n */\n token?: Token;\n}\n\nexport interface ISignNetworkFeeResponse {\n /**\n * The signature.\n */\n signature: Hex;\n /**\n * The typed data (JSON string) used for generating the returned signature.\n */\n typedData: string;\n}\n\n/**\n * Signs the network fee transaction in the current account.\n * Signing is necessary for the auto-mint.\n *\n * @param {ISignNetworkFeeParams} parameters - The parameters for signing network fee\n * @param {BigNumber.Value} parameters.fee - The fee amount (in satoshis).\n * @param {number} parameters.expiry = The optional expiration UNIX time of the signature.\n * @param {Address} parameters.account - The EVM account address.\n * @param {ChainId} parameters.chainId - The chain id.\n * @param {EIP1193Provider} parameters.provider - The EIP1193 provider.\n * @param {string} parameters.rpcUrl - The optional rpc url.\n *\n * @returns {Promise<ISignNetworkFeeResponse>} A promise that resolves to the signature and typed data\n */\nexport async function signNetworkFee({\n fee,\n expiry = toUnix(now() + DAY),\n account,\n chainId,\n provider,\n env,\n token = Token.LBTC,\n}: ISignNetworkFeeParams): Promise<ISignNetworkFeeResponse> {\n const tokenContract = await getTokenContractInfo(token, chainId, env);\n const walletClient = makeWalletClient({\n chainId,\n provider,\n });\n\n type TypedData = Parameters<typeof walletClient.signTypedData>[0];\n const typedData: TypedData = {\n account,\n domain: {\n name: token === Token.BTCb ? 'Bitcoin' : 'Lombard Staked Bitcoin',\n version: '1',\n chainId,\n verifyingContract: tokenContract.address,\n },\n message: {\n chainId,\n fee: BigInt(BigNumber(fee).toFixed()),\n expiry,\n },\n primaryType: 'feeApproval',\n types: {\n EIP712Domain: [\n { name: 'name', type: 'string' },\n { name: 'version', type: 'string' },\n { name: 'chainId', type: 'uint256' },\n { name: 'verifyingContract', type: 'address' },\n ],\n feeApproval: [\n { name: 'chainId', type: 'uint256' },\n { name: 'fee', type: 'uint256' },\n { name: 'expiry', type: 'uint256' },\n ],\n },\n };\n\n const signature = await walletClient.signTypedData(typedData);\n\n return {\n signature: signature,\n typedData: JSON.stringify(typedData, (_, v) =>\n typeof v === 'bigint' ? v.toString() : v,\n ),\n };\n}\n","import { DEFAULT_ENV } from '@lombard.finance/sdk-common';\nimport { Address } from 'viem';\n\nimport { makePublicClient } from '../../clients/public-client';\nimport { CommonParameters } from '../../common/parameters';\nimport { Token } from '../../tokens/token-addresses';\nimport { getTokenContractInfo } from '../../tokens/tokens';\nimport { determineEnv } from '../../utils/env';\n\nexport interface IGetPermitNonceParams extends CommonParameters {\n /**\n * Owner address to check permit nonce for\n */\n owner: Address;\n}\n\n/**\n * Get permit nonce for a specific owner address from LBTC contract.\n * This nonce is used in EIP-2612 permit operations.\n *\n * @param {IGetPermitNonceParams} parameters - The parameters.\n * @param {Address} parameters.owner - The account address.\n * @param {ChainId} parameters.chainId - The chain id.\n * @param {string} parameters.rpcUrl - The optional rpc url.\n * @param {Env} parameters.env - The optional environment identifier.\n */\nexport async function getPermitNonce({\n owner,\n chainId,\n rpcUrl,\n env = DEFAULT_ENV,\n}: IGetPermitNonceParams): Promise<string> {\n const environment = env || determineEnv(chainId);\n\n const publicClient = makePublicClient({ chainId, rpcUrl });\n const lbtcContract = await getTokenContractInfo(\n Token.LBTC,\n chainId,\n environment,\n );\n\n const nonce = await publicClient.readContract({\n abi: lbtcContract.abi,\n address: lbtcContract.address,\n functionName: 'nonces',\n args: [owner],\n });\n\n return String(nonce);\n}\n","/**\n * Typed data builders for EIP-712 signatures.\n * Centralizes EIP-712 structure creation for stake and bake operations.\n */\n\nimport type { Address } from 'viem';\n\nimport type { ChainId } from '../../common/chains';\nimport type { ApprovalMode } from '../../defi/defi-registry';\n\n/**\n * EIP-712 domain type definition.\n * Standard across all EIP-712 signatures.\n */\nexport const EIP712_DOMAIN_TYPES = [\n { name: 'name', type: 'string' },\n { name: 'version', type: 'string' },\n { name: 'chainId', type: 'uint256' },\n { name: 'verifyingContract', type: 'address' },\n] as const;\n\n/**\n * EIP-712 Permit message type definition (EIP-2612).\n * Used for gasless token approvals.\n */\nexport const PERMIT_MESSAGE_TYPES = [\n { name: 'owner', type: 'address' },\n { name: 'spender', type: 'address' },\n { name: 'value', type: 'uint256' },\n { name: 'nonce', type: 'uint256' },\n { name: 'deadline', type: 'uint256' },\n] as const;\n\n/**\n * EIP-712 Approve message type definition.\n * Used for traditional on-chain approvals (same structure as Permit).\n */\nexport const APPROVE_MESSAGE_TYPES = PERMIT_MESSAGE_TYPES;\n\n/**\n * Parameters for building typed data.\n */\nexport interface TypedDataParams {\n /** Approval mode (determines primary type) */\n mode: ApprovalMode;\n /** User's account address */\n account: Address;\n /** Chain ID */\n chainId: ChainId;\n /** Token contract address (verifying contract) */\n verifyingContract: Address;\n /** EIP-712 domain name */\n domainName: string;\n /** EIP-712 domain version */\n domainVersion: string;\n /** Spender contract address */\n spender: Address;\n /** Amount to approve/permit (in base units) */\n value: bigint;\n /** Nonce for replay protection */\n nonce: bigint;\n /** Deadline timestamp (or 0 for no deadline) */\n deadline: bigint;\n}\n\n/**\n * Builds EIP-712 typed data structure for signatures.\n *\n * @param params - Typed data parameters\n * @returns EIP-712 typed data structure ready for signing\n *\n * @example\n * ```typescript\n * const typedData = buildTypedData({\n * mode: 'permit',\n * account: '0x...',\n * chainId: 1,\n * verifyingContract: '0x...',\n * domainName: 'Lombard Staked Bitcoin',\n * domainVersion: '1',\n * spender: '0x...',\n * value: 1000000n,\n * nonce: 0n,\n * deadline: 1234567890n,\n * });\n *\n * const signature = await walletClient.signTypedData(typedData);\n * ```\n */\nexport function buildTypedData(params: TypedDataParams) {\n const primaryType = params.mode === 'permit' ? 'Permit' : 'Approve';\n\n return {\n account: params.account,\n domain: {\n name: params.domainName,\n version: params.domainVersion,\n chainId: BigInt(params.chainId),\n verifyingContract: params.verifyingContract,\n },\n types: {\n EIP712Domain: EIP712_DOMAIN_TYPES,\n [primaryType]:\n params.mode === 'permit' ? PERMIT_MESSAGE_TYPES : APPROVE_MESSAGE_TYPES,\n },\n primaryType,\n message: {\n owner: params.account,\n spender: params.spender,\n value: params.value,\n nonce: params.nonce,\n deadline: params.deadline,\n },\n } as const;\n}\n\n/**\n * Serializes typed data to JSON string.\n * Handles BigInt serialization by converting to strings.\n *\n * @param typedData - Typed data structure from buildTypedData\n * @returns JSON string representation\n *\n * @example\n * ```typescript\n * const typedData = buildTypedData(params);\n * const json = serializeTypedData(typedData);\n * // Store or transmit JSON string\n * ```\n */\nexport function serializeTypedData(\n typedData: ReturnType<typeof buildTypedData>,\n): string {\n return JSON.stringify(typedData, (_, v) =>\n typeof v === 'bigint' ? v.toString() : v,\n );\n}\n","import { Abi } from 'viem';\n\nimport { makePublicClient } from '../../clients/public-client';\nimport { makeWalletClient } from '../../clients/wallet-client';\nimport { ChainId } from '../../common/chains';\nimport {\n ISignStakeAndBakeParams,\n ISignStakeAndBakeResult,\n} from './signStakeAndBake';\nimport { buildTypedData, serializeTypedData } from './typed-data-builder';\n\n/**\n * Handle approve flow (on-chain transaction).\n * Checks allowance and submits approve transaction if needed.\n */\nexport async function handleApproveFlow(params: {\n account: `0x${string}`;\n chainId: ChainId;\n provider: ISignStakeAndBakeParams['provider'];\n rpcUrl: ISignStakeAndBakeParams['rpcUrl'];\n tokenAddress: `0x${string}`;\n tokenAbi: Abi;\n spenderAddress: `0x${string}`;\n typedData: ReturnType<typeof buildTypedData>;\n requiredAmount: bigint;\n}): Promise<ISignStakeAndBakeResult> {\n const {\n account,\n chainId,\n provider,\n rpcUrl,\n tokenAddress,\n tokenAbi,\n spenderAddress,\n typedData,\n requiredAmount,\n } = params;\n\n const publicClient = makePublicClient({ chainId, rpcUrl });\n const walletClient = makeWalletClient({ chainId, provider });\n\n // Check current allowance\n const currentAllowance = (await publicClient.readContract({\n address: tokenAddress,\n abi: tokenAbi,\n functionName: 'allowance',\n args: [account, spenderAddress],\n })) as bigint;\n\n let approvalTxHash: string | undefined;\n\n // Submit approve transaction if allowance is insufficient\n if (currentAllowance < requiredAmount) {\n const hash = await walletClient.writeContract({\n address: tokenAddress,\n abi: tokenAbi,\n functionName: 'approve',\n args: [spenderAddress, requiredAmount],\n account,\n chain: null,\n });\n\n // Wait for transaction confirmation\n const receipt = await publicClient.waitForTransactionReceipt({ hash });\n\n if (receipt.status !== 'success') {\n throw new Error(\n `Approve transaction failed: ${hash}. Please try again or contact support.`,\n );\n }\n\n approvalTxHash = hash;\n }\n\n return {\n mode: 'approve',\n signature: '',\n typedData: serializeTypedData(typedData),\n approvalTxHash,\n };\n}\n","import { makeWalletClient } from '../../clients/wallet-client';\nimport { ChainId } from '../../common/chains';\nimport {\n ISignStakeAndBakeParams,\n ISignStakeAndBakeResult,\n} from './signStakeAndBake';\nimport { buildTypedData, serializeTypedData } from './typed-data-builder';\n\n/**\n * Handle permit flow (off-chain signature).\n * Signs EIP-2612 typed data for gasless approval.\n */\nexport async function handlePermitFlow(params: {\n chainId: ChainId;\n provider: ISignStakeAndBakeParams['provider'];\n typedData: ReturnType<typeof buildTypedData>;\n}): Promise<ISignStakeAndBakeResult> {\n const { chainId, provider, typedData } = params;\n\n const walletClient = makeWalletClient({ chainId, provider });\n const signature = await walletClient.signTypedData(typedData);\n\n return {\n mode: 'permit',\n signature,\n typedData: serializeTypedData(typedData),\n };\n}\n","import { Env } from '@lombard.finance/sdk-common';\nimport BigNumber from 'bignumber.js';\n\nimport { getExchangeRatio } from '../../api-functions/getLBTCExchangeRate/get-exchange-ratio';\nimport { StakeAndBakeToken } from '../../defi/defi-registry';\nimport { AddressKind, Token } from '../../tokens/token-addresses';\nimport { getTokenContractInfo } from '../../tokens/tokens';\nimport { ISignStakeAndBakeParams } from './signStakeAndBake';\n\n/**\n * Calculate the permit value, applying BTC -> LBTC conversion if needed.\n */\nexport const getPermitValue = async (\n token: StakeAndBakeToken,\n value: BigNumber.Value,\n env: Env,\n): Promise<BigNumber> => {\n if (!token || token === 'BTC') {\n return await calculateStakeAndBakeLBTCAmount(value, env);\n }\n return new BigNumber(value);\n};\n\n/**\n * Get the token contract info for the given token.\n * For BTCb, always uses AddressKind.Token (the ERC20 token contract, not the adapter).\n */\nexport const getStakeAndBakeTokenContract = async (\n token: StakeAndBakeToken,\n chainId: ISignStakeAndBakeParams['chainId'],\n env: Env,\n): Promise<Awaited<ReturnType<typeof getTokenContractInfo>>> => {\n if (!token || token === 'BTC' || token === Token.LBTC) {\n return await getTokenContractInfo(Token.LBTC, chainId, env);\n }\n // For BTCb, use AddressKind.Token (ERC20 contract for permit/approve)\n return await getTokenContractInfo(token, chainId, env, AddressKind.Token);\n};\n\n/**\n * Helper function to calculate the correct LBTC amount for stake and bake\n * based on the current BTC to LBTC ratio.\n *\n * @param btcAmount - The original BTC amount entered by the user\n * @param env - The environment for fetching the exchange ratio\n * @returns The calculated LBTC amount that should be used in the permit signature\n */\nexport async function calculateStakeAndBakeLBTCAmount(\n btcAmount: BigNumber.Value,\n env?: Env,\n): Promise<BigNumber> {\n try {\n const ratios = await getExchangeRatio({ env });\n const btcTokenRatio = ratios.LBTC?.BTCTokenRatio || new BigNumber(1);\n const lbtcAmount = new BigNumber(btcAmount).dividedBy(btcTokenRatio);\n\n return lbtcAmount;\n } catch {\n throw new Error('Failed to get exchange ratio for stake and bake');\n }\n}\n","import { DEFAULT_ENV } from '@lombard.finance/sdk-common';\nimport BigNumber from 'bignumber.js';\n\nimport { CommonWriteParameters } from '../../common/parameters';\nimport {\n ApprovalMode,\n DefiProtocol,\n StakeAndBakeToken,\n} from '../../defi/defi-registry';\nimport { DAY, now, toUnix } from '../../utils/time';\nimport { getPermitNonce } from '../getPermitNonce/getPermitNonce';\nimport { handleApproveFlow } from './handleApprove';\nimport { handlePermitFlow } from './handlePermit';\nimport { buildTypedData } from './typed-data-builder';\nimport {\n calculateStakeAndBakeLBTCAmount,\n getStakeAndBakeTokenContract,\n} from './utils';\nimport { getStakeAndBakeConfig } from './validation';\n\nexport interface ISignStakeAndBakeParams extends CommonWriteParameters {\n /**\n * The approved BTC value that will be automatically claimed and deposited\n * to the chosen vault. The function will internally calculate the correct LBTC amount using the current ratio.\n */\n value: BigNumber.Value;\n /**\n * The expiration UNIX time of the signature.\n * Defaults to 24 hours from the time of signing.\n */\n expiry?: number;\n /**\n * The chosen DeFi vault to which the funds will be deposited.\n */\n vaultKey?: DefiProtocol;\n /**\n * The token for which the signature is generated.\n * - Defaults to **BTC**: the amount will be converted to the corresponding\n * **LBTC** value based on the current ratio.\n * - If **LBTC** is chosen: no conversion is performed.\n */\n token?: StakeAndBakeToken;\n}\n\nexport interface ISignStakeAndBakeResult {\n /**\n * The approval mode used for this signature.\n * - `permit`: Off-chain signature (EIP-2612), can be used directly by backend\n * - `approve`: On-chain approval transaction was submitted\n */\n mode: ApprovalMode;\n\n /**\n * The signature.\n * - For permit mode: Contains the EIP-2612 signature\n * - For approve mode: Empty string (approval was done on-chain)\n */\n signature: string;\n\n /**\n * The typed data used to generate the signature.\n * Contains the full EIP-712 structure for both permit and approve modes.\n */\n typedData: string;\n\n /**\n * Transaction hash for approve mode (when allowance was set).\n * Only present when mode is 'approve' and a transaction was submitted.\n */\n approvalTxHash?: string;\n}\n\n/**\n * Signs the \"stake and bake\" signature that allows Lombard to claim specified\n * amount of BTC (converted to LBTC using current ratio) and deposit that amount directly to the specified DeFi\n * vault.\n *\n * In order for the \"stake and bake\" process to work a user has to store the\n * signature to the Lombard's system, see: `storeStakeAndBakeSignature`\n *\n * @param {ISignStakeAndBakeParams} parameters - The parameters.\n * @param {BigNumber.Value} parameters.value - The amount of BTC that will be converted to LBTC using current ratio and deposited to the DeFi vault.\n * @param {number} parameters.expiry = The optional expiration UNIX time of the signature.\n * @param {DefiProtocol} parameters.vaultKey - The optional DeFi vault identifier.\n * @param {Address} parameters.account - The EVM account address.\n * @param {ChainId} parameters.chainId - The chain id.\n * @param {EIP1193Provider} parameters.provider - The EIP1193 provider.\n * @param {string} parameters.rpcUrl - The optional rpc url.\n *\n * @returns {Promise<ISignStakeAndBakeResult>} - The signature and typed data.\n */\nexport async function signStakeAndBake({\n account,\n expiry = toUnix(now() + DAY),\n value,\n // TODO: Rename vaultKey to protocol\n vaultKey: protocol = DefiProtocol.Veda,\n token = 'BTC',\n chainId,\n provider,\n rpcUrl,\n env = DEFAULT_ENV,\n}: ISignStakeAndBakeParams): Promise<ISignStakeAndBakeResult> {\n const strategy = getStakeAndBakeConfig(protocol, token, chainId, env);\n\n const spenderAddress = strategy.spenderContract.address;\n\n // Calculate permit value (with conversion if needed)\n const permitValue =\n strategy.amountStrategy === 'btcToLbtc'\n ? await calculateStakeAndBakeLBTCAmount(value, env)\n : new BigNumber(value);\n\n // Get token contract (always use Token address for permits/approves, not adapter)\n const tokenContract = await getStakeAndBakeTokenContract(token, chainId, env);\n const tokenAddress = tokenContract.address;\n const tokenAbi = tokenContract.abi;\n\n // Calculate deadline based on expiry behavior\n const deadline =\n strategy.approval.deadlineStrategy === 'zero' ? 0n : BigInt(expiry);\n\n // Get nonce if required\n const nonce =\n strategy.approval.nonceStrategy === 'chain'\n ? BigInt(await getPermitNonce({ owner: account, chainId, rpcUrl, env }))\n : 0n;\n\n // Build typed data using config\n const typedData = buildTypedData({\n mode: strategy.approval.mode,\n account,\n chainId,\n verifyingContract: tokenAddress,\n domainName: strategy.approval.domainName,\n domainVersion: strategy.approval.domainVersion,\n spender: spenderAddress,\n value: BigInt(permitValue.toFixed(0, BigNumber.ROUND_DOWN)),\n nonce,\n deadline,\n });\n\n // Delegate to appropriate handler based on mode\n if (strategy.approval.mode === 'approve') {\n return handleApproveFlow({\n account,\n chainId,\n provider,\n rpcUrl,\n tokenAddress,\n tokenAbi,\n spenderAddress,\n typedData,\n requiredAmount: BigInt(permitValue.toFixed(0, BigNumber.ROUND_DOWN)),\n });\n }\n\n // Permit mode\n return handlePermitFlow({ chainId, provider, typedData });\n}\n","import {\n Address,\n createWalletClient,\n Hex,\n http,\n isHex,\n LocalAccount,\n TransactionSerializable,\n WalletClient,\n} from 'viem';\n\nimport { CHAIN_ID_TO_VIEM_CHAIN_MAP, ChainId } from '../common/chains';\n\n/**\n * EVM transaction request structure compatible with unified bridge signers.\n * This matches the shape expected by bridge-unified's EvmSigner interface.\n */\nexport interface EvmTransactionRequest {\n /** Sender address */\n from: Address;\n /** Recipient address */\n to?: Address;\n /** Transaction data (calldata) */\n data?: Hex;\n /** Value to send in wei */\n value?: bigint;\n /** Gas limit */\n gas?: bigint;\n /** Maximum fee per gas (EIP-1559) */\n maxFeePerGas?: bigint;\n /** Maximum priority fee per gas (EIP-1559) */\n maxPriorityFeePerGas?: bigint;\n /** Chain ID in hex format (e.g., \"0x1\" for Ethereum mainnet) */\n chainId?: string;\n /** Transaction nonce */\n nonce?: number;\n}\n\n/**\n * Callback function to dispatch a signed transaction.\n * This is called by the signer after signing to broadcast the transaction.\n *\n * @param serializedTx - The signed, serialized transaction (0x-prefixed hex string)\n * @returns Promise resolving to the transaction hash\n */\nexport type DispatchCallback = (serializedTx: Hex) => Promise<Hex>;\n\n/**\n * Signer interface compatible with unified bridge's EvmSigner.\n * Handles transaction signing and optionally broadcasting.\n *\n * @remarks\n * The `sign` method receives a transaction request and a dispatch callback.\n * The signer should:\n * 1. Sign the transaction\n * 2. Call the dispatch callback with the signed transaction\n * 3. Return the transaction hash\n */\nexport interface SignerAdapter {\n /**\n * Signs a transaction and dispatches it via the provided callback.\n *\n * @param tx - The transaction request to sign\n * @param dispatch - Callback to broadcast the signed transaction\n * @returns Promise resolving to the transaction hash\n *\n * @example\n * ```ts\n * const txHash = await signer.sign(\n * { from, to, data, value },\n * (signedTx) => publicClient.sendRawTransaction({ serializedTransaction: signedTx })\n * );\n * ```\n */\n sign: (tx: EvmTransactionRequest, dispatch: DispatchCallback) => Promise<Hex>;\n}\n\n/**\n * Error thrown when transaction validation or signing fails.\n */\nexport class SignerError extends Error {\n constructor(\n public readonly code: string,\n message: string,\n public readonly context?: Record<string, unknown>,\n ) {\n super(message);\n this.name = 'SignerError';\n }\n}\n\n/**\n * Validates an EVM transaction request.\n * Throws SignerError if validation fails.\n *\n * @param tx - Transaction request to validate\n * @throws {SignerError} If required fields are missing or invalid\n */\nexport function validateTransactionRequest(\n tx: EvmTransactionRequest,\n operation = 'transaction',\n): void {\n if (!tx.from) {\n throw new SignerError(\n 'MISSING_FROM_ADDRESS',\n `Missing 'from' address for ${operation}`,\n { transaction: tx, operation },\n );\n }\n\n if (!tx.to) {\n throw new SignerError(\n 'MISSING_TO_ADDRESS',\n `Missing 'to' address for ${operation}`,\n { transaction: tx, operation },\n );\n }\n\n if (tx.data !== undefined && !isHex(tx.data)) {\n throw new SignerError(\n 'INVALID_DATA',\n `Transaction data must be valid hex string for ${operation}`,\n { transaction: tx, operation, data: tx.data },\n );\n }\n\n if (tx.chainId && !/^0x[0-9a-fA-F]+$/.test(tx.chainId)) {\n throw new SignerError(\n 'INVALID_CHAIN_ID',\n `Chain ID must be a hex string (e.g., \"0x1\") for ${operation}`,\n { transaction: tx, operation, chainId: tx.chainId },\n );\n }\n}\n\n/**\n * Creates a Viem LocalAccount from a SignerAdapter.\n * This allows the unified bridge's EvmSigner to be used as a standard Viem account.\n *\n * @param signer - The SignerAdapter to wrap\n * @param address - The account address\n * @param chainId - The chain ID\n * @returns A Viem LocalAccount that delegates signing to the SignerAdapter\n *\n * @remarks\n * This adapter enables the SDK to use a unified-bridge EvmSigner with Viem's\n * standard wallet client, eliminating the need for separate code paths.\n *\n * The adapter:\n * - Validates transaction requests before signing\n * - Converts between Viem and EvmSigner transaction formats\n * - Provides proper error context for debugging\n *\n * @example\n * ```ts\n * const account = createAccountFromSigner(\n * bridgeEvmSigner,\n * '0x1234...',\n * ChainId.ethereum\n * );\n *\n * const walletClient = createWalletClient({\n * account,\n * chain: mainnet,\n * transport: http(),\n * });\n *\n * // Now walletClient.writeContract works with the EvmSigner!\n * ```\n */\nexport function createAccountFromSigner(\n signer: SignerAdapter,\n address: Address,\n chainId: ChainId,\n): LocalAccount {\n const chain = CHAIN_ID_TO_VIEM_CHAIN_MAP[chainId];\n\n if (!chain) {\n throw new SignerError(\n 'UNSUPPORTED_CHAIN',\n `Chain ID ${chainId} is not supported`,\n { chainId, availableChains: Object.keys(CHAIN_ID_TO_VIEM_CHAIN_MAP) },\n );\n }\n\n /**\n * Custom account implementation that delegates to SignerAdapter\n */\n const customAccount: LocalAccount = {\n address,\n type: 'local' as const,\n publicKey:\n '0x0000000000000000000000000000000000000000000000000000000000000000' as Hex,\n source: 'custom' as const,\n\n /**\n * Signs a transaction using the SignerAdapter.\n * This is called by Viem's wallet client when executing transactions.\n */\n async signTransaction(transaction: TransactionSerializable): Promise<Hex> {\n // Convert Viem transaction to EvmTransactionRequest format\n const evmTx: EvmTransactionRequest = {\n from: address,\n to: transaction.to ?? undefined,\n data: transaction.data,\n value: transaction.value,\n gas: transaction.gas,\n maxFeePerGas: transaction.maxFeePerGas,\n maxPriorityFeePerGas: transaction.maxPriorityFeePerGas,\n chainId: transaction.chainId\n ? `0x${transaction.chainId.toString(16)}`\n : `0x${chain.id.toString(16)}`,\n nonce: transaction.nonce,\n };\n\n // Validate before signing\n validateTransactionRequest(evmTx, 'signTransaction');\n\n // Sign and return the serialized signed transaction\n // The dispatch callback here just returns what was passed (identity function)\n // because we want the signed transaction, not to broadcast it yet\n let signedTx: Hex | undefined;\n\n await signer.sign(evmTx, async serialized => {\n signedTx = serialized;\n // Return a dummy hash - the actual broadcasting happens via walletClient\n return serialized;\n });\n\n if (!signedTx) {\n throw new SignerError(\n 'SIGNING_FAILED',\n 'Signer did not return a signed transaction',\n { transaction: evmTx },\n );\n }\n\n // Ensure we return a Hex type (not null)\n return signedTx as Hex;\n },\n\n /**\n * Signs a message (EIP-191).\n * Not implemented as it's not needed for contract transactions.\n */\n async signMessage(): Promise<Hex> {\n throw new SignerError(\n 'NOT_IMPLEMENTED',\n 'Message signing is not supported by this adapter',\n { method: 'signMessage' },\n );\n },\n\n /**\n * Signs typed data (EIP-712).\n * Not implemented as it's not needed for contract transactions.\n */\n async signTypedData(): Promise<Hex> {\n throw new SignerError(\n 'NOT_IMPLEMENTED',\n 'Typed data signing is not supported by this adapter',\n { method: 'signTypedData' },\n );\n },\n };\n\n return customAccount;\n}\n\n/**\n * Creates a Viem wallet client from a SignerAdapter.\n * This is a convenience wrapper around createAccountFromSigner.\n *\n * @param signer - The SignerAdapter to use\n * @param address - The account address\n * @param chainId - The chain ID\n * @returns A Viem wallet client configured with the SignerAdapter\n *\n * @example\n * ```ts\n * const walletClient = createWalletClientFromSigner(\n * bridgeEvmSigner,\n * '0x1234...',\n * ChainId.ethereum\n * );\n *\n * // Use like any Viem wallet client\n * await walletClient.writeContract({ ... });\n * ```\n */\nexport function createWalletClientFromSigner(\n signer: SignerAdapter,\n address: Address,\n chainId: ChainId,\n): WalletClient {\n const chain = CHAIN_ID_TO_VIEM_CHAIN_MAP[chainId];\n\n if (!chain) {\n throw new SignerError(\n 'UNSUPPORTED_CHAIN',\n `Chain ID ${chainId} is not supported`,\n { chainId },\n );\n }\n\n const account = createAccountFromSigner(signer, address, chainId);\n\n return createWalletClient({\n account,\n chain,\n transport: http(), // Uses default RPC\n });\n}\n","import {\n Address,\n encodeFunctionData,\n Hex,\n PublicClient,\n SimulateContractParameters,\n SimulateContractReturnType,\n WalletClient,\n} from 'viem';\n\nimport {\n EvmTransactionRequest,\n SignerError,\n validateTransactionRequest,\n} from '../clients/evm-signer-adapter';\nimport { CHAIN_ID_TO_VIEM_CHAIN_MAP } from '../common/chains';\nimport {\n CommonSignerWriteParameters,\n CommonWriteParameters,\n isProviderFlow,\n isSignerFlow,\n} from '../common/parameters';\n\n/**\n * Minimal type-safe interface for contract simulation arguments.\n * Covers the essential properties we need while remaining flexible.\n */\nexport interface ContractCallArgs {\n /** Contract address to call */\n address: Address;\n /** Contract ABI */\n abi: readonly unknown[];\n /** Function name to call */\n functionName: string;\n /** Account making the call */\n account?: Address;\n /** Function arguments */\n args?: readonly unknown[];\n /** Value to send with the transaction */\n value?: bigint;\n /** Gas limit */\n gas?: bigint;\n /** Maximum fee per gas (EIP-1559) */\n maxFeePerGas?: bigint;\n /** Maximum priority fee per gas (EIP-1559) */\n maxPriorityFeePerGas?: bigint;\n /** Allow additional properties for chain-specific parameters */\n [key: string]: unknown;\n}\n\n/**\n * Parameters for executing a contract transaction.\n */\nexport interface ExecuteContractTxParams {\n /** The parameters provided by the caller (provider or signer flow) */\n params: CommonWriteParameters | CommonSignerWriteParameters;\n /** The public client for simulation and receipt waiting */\n publicClient: PublicClient;\n /** Optional wallet client (for provider flow) */\n walletClient?: WalletClient;\n /** The contract call to simulate */\n simulateArgs: ContractCallArgs;\n /** Operation name for error messages (e.g., \"approval\", \"redeem\") */\n operation: string;\n}\n\n/**\n * Result of a contract transaction execution.\n */\nexport interface ExecuteContractTxResult {\n /** The transaction hash */\n txHash: Hex;\n /** The simulation result (for debugging) */\n request: SimulateContractReturnType['request'];\n}\n\n/**\n * Executes a contract transaction using either provider or signer flow.\n *\n * This helper:\n * 1. Simulates the transaction with the public client\n * 2. Routes to appropriate execution path (provider or signer)\n * 3. Provides detailed error messages with context\n * 4. Validates all inputs before execution\n *\n * @param options - Execution parameters\n * @returns Transaction hash and request details\n * @throws {SignerError} If execution fails with detailed context\n *\n * @example\n * ```ts\n * // Provider flow\n * const result = await executeContractTransaction({\n * params: { provider, account, chainId, env },\n * publicClient,\n * walletClient,\n * simulateArgs: { address, abi, functionName, args },\n * operation: 'approval',\n * });\n *\n * // Signer flow\n * const result = await executeContractTransaction({\n * params: { signer, account, chainId, env },\n * publicClient,\n * simulateArgs: { address, abi, functionName, args },\n * operation: 'redeem',\n * });\n * ```\n */\nexport async function executeContractTransaction({\n params,\n publicClient,\n walletClient,\n simulateArgs,\n operation,\n}: ExecuteContractTxParams): Promise<ExecuteContractTxResult> {\n // Validate that we have either provider or signer\n if (!isProviderFlow(params) && !isSignerFlow(params)) {\n throw new SignerError(\n 'INVALID_PARAMETERS',\n 'Must provide either \"provider\" or \"signer\" in parameters',\n { params, operation },\n );\n }\n\n // Simulate the transaction\n let simulationResult: SimulateContractReturnType;\n try {\n // Cast to viem's expected type for simulation\n // This is safe because ContractCallArgs contains all required properties\n simulationResult = await publicClient.simulateContract(\n simulateArgs as SimulateContractParameters,\n );\n } catch (error) {\n throw new SignerError(\n 'SIMULATION_FAILED',\n `Failed to simulate ${operation} transaction: ${error instanceof Error ? error.message : 'Unknown error'}`,\n {\n operation,\n simulateArgs,\n error: error instanceof Error ? error.message : String(error),\n },\n );\n }\n\n const { request } = simulationResult;\n\n // Validate simulation result\n if (!request.account) {\n throw new SignerError(\n 'INVALID_SIMULATION',\n `Simulation succeeded but no account was set for ${operation}`,\n { operation, request },\n );\n }\n\n if (!request.address) {\n throw new SignerError(\n 'INVALID_SIMULATION',\n `Simulation succeeded but no target address was set for ${operation}`,\n { operation, request },\n );\n }\n\n // Execute transaction based on flow type\n let txHash: Hex;\n\n if (isProviderFlow(params)) {\n // Provider flow: use wallet client\n if (!walletClient) {\n throw new SignerError(\n 'MISSING_WALLET_CLIENT',\n 'Provider flow requires a wallet client',\n { operation, params },\n );\n }\n\n try {\n txHash = await walletClient.writeContract(request);\n } catch (error) {\n throw new SignerError(\n 'PROVIDER_TRANSACTION_FAILED',\n `Failed to execute ${operation} via provider: ${error instanceof Error ? error.message : 'Unknown error'}`,\n {\n operation,\n request,\n error: error instanceof Error ? error.message : String(error),\n },\n );\n }\n } else {\n // Signer flow: use signer adapter directly\n try {\n const chain = CHAIN_ID_TO_VIEM_CHAIN_MAP[params.chainId];\n\n if (!chain) {\n throw new SignerError(\n 'UNSUPPORTED_CHAIN',\n `Chain ${params.chainId} not supported`,\n { chainId: params.chainId },\n );\n }\n\n // Encode the contract call data from the original simulation args\n // (using simulateArgs.abi instead of request.abi to avoid type narrowing issues)\n const callData = encodeFunctionData({\n abi: simulateArgs.abi,\n functionName: simulateArgs.functionName,\n args: simulateArgs.args,\n });\n\n // Convert viem request to EvmTransactionRequest format\n const evmTx: EvmTransactionRequest = {\n from: params.account,\n to: request.address,\n data: callData,\n value: request.value,\n gas: request.gas,\n maxFeePerGas: request.maxFeePerGas,\n maxPriorityFeePerGas: request.maxPriorityFeePerGas,\n chainId: `0x${chain.id.toString(16)}`,\n };\n\n // Validate transaction before signing\n validateTransactionRequest(evmTx, operation);\n\n // Sign and broadcast using the signer adapter\n txHash = await params.signer.sign(evmTx, async signedTx => {\n // Dispatch callback: broadcast the signed transaction\n return await publicClient.sendRawTransaction({\n serializedTransaction: signedTx,\n });\n });\n } catch (error) {\n throw new SignerError(\n 'SIGNER_TRANSACTION_FAILED',\n `Failed to execute ${operation} via signer: ${error instanceof Error ? error.message : 'Unknown error'}`,\n {\n operation,\n request,\n error: error instanceof Error ? error.message : String(error),\n },\n );\n }\n }\n\n return { txHash, request };\n}\n\n/**\n * Waits for a transaction receipt and provides detailed error information on failure.\n *\n * @param publicClient - The public client to use\n * @param txHash - The transaction hash to wait for\n * @param operation - Operation name for error messages\n * @throws {SignerError} If waiting for receipt fails\n */\nexport async function waitForTransactionReceipt(\n publicClient: PublicClient,\n txHash: Hex,\n operation: string,\n) {\n try {\n const receipt = await publicClient.waitForTransactionReceipt({\n hash: txHash,\n });\n\n if (receipt.status === 'reverted') {\n throw new SignerError(\n 'TRANSACTION_REVERTED',\n `${operation} transaction reverted`,\n {\n operation,\n txHash,\n receipt: {\n blockNumber: receipt.blockNumber,\n gasUsed: receipt.gasUsed,\n },\n },\n );\n }\n\n return receipt;\n } catch (error) {\n if (error instanceof SignerError) {\n throw error;\n }\n\n throw new SignerError(\n 'RECEIPT_WAIT_FAILED',\n `Failed to wait for ${operation} transaction receipt: ${error instanceof Error ? error.message : 'Unknown error'}`,\n {\n operation,\n txHash,\n error: error instanceof Error ? error.message : String(error),\n },\n );\n }\n}\n","import { decodeFunctionData, encodeAbiParameters, keccak256 } from 'viem';\n\nconst GMP_V1_SELECTOR = '0xe288fb4a';\nconst MINT_SELECTOR = '0x155b6b13';\n\n// ABI for the outer payload (matches your Solidity encodePayload/MessageV1)\nconst gmpPayloadAbi = {\n type: 'function',\n name: 'MessageV1',\n inputs: [\n { name: 'msgPath', type: 'bytes32' },\n { name: 'msgNonce', type: 'uint256' },\n { name: 'msgSender', type: 'bytes32' },\n { name: 'msgRecipient', type: 'bytes32' },\n { name: 'msgDestinationCaller', type: 'bytes32' },\n { name: 'msgBody', type: 'bytes' },\n ],\n} as const;\n\n// ABI for the inner body (mint)\nconst mintAbi = {\n type: 'function',\n name: 'mint',\n inputs: [\n { name: 'toToken', type: 'bytes32' },\n { name: 'recipient', type: 'bytes32' },\n { name: 'amount', type: 'uint256' },\n ],\n} as const;\n\nexport interface DecodedMintBody {\n selector: string;\n toToken: string;\n recipient: string;\n amount: bigint;\n}\n\nexport interface DecodedGmpPayload {\n selector: string; // outer selector (GMP_V1_SELECTOR)\n msgPath: string;\n msgNonce: bigint;\n msgSender: string;\n msgRecipient: string;\n msgDestinationCaller: string;\n rawBody: string; // full hex of msgBody\n mint: DecodedMintBody; // decoded body\n}\n\n/**\n * Example usage (for testing/debugging):\n *\n * async function testDecoding() {\n * const res = decodeGmpMintPayload(\n * '0xe288fb4a022d9999f6a62cd3401ba6e03ae710a1b3fcd8a77325b435371108676e600a5f...',\n * );\n * console.log(res);\n * const mintID = calcMintIDFromDecoded(res, 747474); // Katana chainId\n * console.log(mintID);\n * }\n */\n\n/**\n * Decode ABI-encoded GMP Payload hex where msgBody is an ABI-encoded `mint` call.\n */\nexport function decodeGmpMintPayload(hexData: string): DecodedGmpPayload {\n if (!hexData.startsWith('0x')) {\n throw new Error('Payload must be 0x-prefixed hex');\n }\n\n // 1) Check outer selector\n const selector = hexData.slice(0, 10); // 4 bytes = 8 hex chars + '0x'\n if (selector.toLowerCase() !== GMP_V1_SELECTOR.toLowerCase()) {\n throw new Error(\n `Invalid GMP selector: expected ${GMP_V1_SELECTOR}, got ${selector}`,\n );\n }\n\n // 2) Decode outer payload using viem\n const decoded = decodeFunctionData({\n abi: [gmpPayloadAbi],\n data: hexData as `0x${string}`,\n });\n\n if (!decoded.args) {\n throw new Error('Failed to decode GMP payload: args is undefined');\n }\n\n const msgPath = decoded.args[0] as string;\n const msgNonce = decoded.args[1] as bigint;\n const msgSender = decoded.args[2] as string;\n const msgRecipient = decoded.args[3] as string;\n const msgDestinationCaller = decoded.args[4] as string;\n const msgBody = decoded.args[5] as string; // bytes => 0x…\n\n if (typeof msgBody !== 'string' || !msgBody.startsWith('0x')) {\n throw new Error('msgBody is not valid hex');\n }\n\n // 3) Check inner selector (mint)\n const bodySelector = msgBody.slice(0, 10);\n if (bodySelector.toLowerCase() !== MINT_SELECTOR.toLowerCase()) {\n throw new Error(\n `Invalid mint selector in body: expected ${MINT_SELECTOR}, got ${bodySelector}`,\n );\n }\n\n // 4) Decode mint body using viem\n const mintDecoded = decodeFunctionData({\n abi: [mintAbi],\n data: msgBody as `0x${string}`,\n });\n\n if (!mintDecoded.args) {\n throw new Error('Failed to decode mint body: args is undefined');\n }\n\n const toToken = mintDecoded.args[0] as string;\n const recipient = mintDecoded.args[1] as string;\n const amount = mintDecoded.args[2] as bigint;\n\n return {\n selector,\n msgPath,\n msgNonce,\n msgSender,\n msgRecipient,\n msgDestinationCaller,\n rawBody: msgBody,\n mint: {\n selector: bodySelector,\n toToken,\n recipient,\n amount,\n },\n };\n}\n\n/**\n * Calculate mintID off-chain, equivalent to Solidity _mintID(Message).\n *\n * @param decoded - result of decodeGmpMintPayload(...)\n * @param chainId - destination EVM chain id (same as block.chainid on that chain)\n */\nexport function calcMintIDFromDecoded(\n decoded: DecodedGmpPayload,\n chainId: bigint | number | string,\n): string {\n const { msgNonce, mint } = decoded;\n\n // Solidity: abi.encode(uint256 nonce, uint256 chainId, address recipient, address toToken, uint256 amount)\n const encoded = encodeAbiParameters(\n [\n { name: 'nonce', type: 'uint256' },\n { name: 'chainId', type: 'uint256' },\n { name: 'recipient', type: 'bytes32' },\n { name: 'toToken', type: 'bytes32' },\n { name: 'amount', type: 'uint256' },\n ],\n [\n BigInt(msgNonce), // self.nonce\n BigInt(chainId), // block.chainid\n mint.recipient as `0x${string}`, // self.recipient\n mint.toToken as `0x${string}`, // self.toToken\n BigInt(mint.amount), // self.amount\n ],\n );\n\n // bytes32 mintID = keccak256(encoded)\n return keccak256(encoded);\n}\n","export default [\n {\n inputs: [\n { internalType: 'address', name: 'aDefaultAdmin', type: 'address' },\n { internalType: 'address', name: 'aPauser', type: 'address' },\n { internalType: 'address', name: 'aMintReporter', type: 'address' },\n { internalType: 'address', name: 'aMintValidator', type: 'address' },\n { internalType: 'uint256', name: 'aMaxMints', type: 'uint256' },\n { internalType: 'address', name: 'aTrustedSigner', type: 'address' },\n ],\n stateMutability: 'nonpayable',\n type: 'constructor',\n },\n { inputs: [], name: 'AccessControlBadConfirmation', type: 'error' },\n {\n inputs: [{ internalType: 'uint48', name: 'schedule', type: 'uint48' }],\n name: 'AccessControlEnforcedDefaultAdminDelay',\n type: 'error',\n },\n {\n inputs: [],\n name: 'AccessControlEnforcedDefaultAdminRules',\n type: 'error',\n },\n {\n inputs: [\n { internalType: 'address', name: 'defaultAdmin', type: 'address' },\n ],\n name: 'AccessControlInvalidDefaultAdmin',\n type: 'error',\n },\n {\n inputs: [\n { internalType: 'address', name: 'account', type: 'address' },\n { internalType: 'bytes32', name: 'neededRole', type: 'bytes32' },\n ],\n name: 'AccessControlUnauthorizedAccount',\n type: 'error',\n },\n {\n inputs: [\n { internalType: 'bytes32', name: 'mintID', type: 'bytes32' },\n { internalType: 'uint256', name: 'mintAmount', type: 'uint256' },\n ],\n name: 'AlreadyMinted',\n type: 'error',\n },\n { inputs: [], name: 'BadMintProofsSize', type: 'error' },\n { inputs: [], name: 'BadMintReport', type: 'error' },\n {\n inputs: [\n { internalType: 'uint256', name: 'index', type: 'uint256' },\n { internalType: 'bytes32', name: 'mintID', type: 'bytes32' },\n { internalType: 'bytes', name: 'proof', type: 'bytes' },\n ],\n name: 'BadProof',\n type: 'error',\n },\n { inputs: [], name: 'EnforcedPause', type: 'error' },\n { inputs: [], name: 'ExpectedPause', type: 'error' },\n {\n inputs: [\n { internalType: 'bytes32', name: 'mintID', type: 'bytes32' },\n { internalType: 'uint256', name: 'mintAmount', type: 'uint256' },\n ],\n name: 'MintFailedValidation',\n type: 'error',\n },\n {\n inputs: [{ internalType: 'bytes32', name: 'mintID', type: 'bytes32' }],\n name: 'NotReported',\n type: 'error',\n },\n {\n inputs: [\n { internalType: 'uint8', name: 'bits', type: 'uint8' },\n { internalType: 'uint256', name: 'value', type: 'uint256' },\n ],\n name: 'SafeCastOverflowedUintDowncast',\n type: 'error',\n },\n { inputs: [], name: 'SameValidationThreshold', type: 'error' },\n { inputs: [], name: 'ZeroTrustedAddress', type: 'error' },\n {\n anonymous: false,\n inputs: [],\n name: 'DefaultAdminDelayChangeCanceled',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: 'uint48',\n name: 'newDelay',\n type: 'uint48',\n },\n {\n indexed: false,\n internalType: 'uint48',\n name: 'effectSchedule',\n type: 'uint48',\n },\n ],\n name: 'DefaultAdminDelayChangeScheduled',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [],\n name: 'DefaultAdminTransferCanceled',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'address',\n name: 'newAdmin',\n type: 'address',\n },\n {\n indexed: false,\n internalType: 'uint48',\n name: 'acceptSchedule',\n type: 'uint48',\n },\n ],\n name: 'DefaultAdminTransferScheduled',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: 'uint256',\n name: 'numMints',\n type: 'uint256',\n },\n ],\n name: 'MaxMintsUpdated',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'bytes32',\n name: 'mintID',\n type: 'bytes32',\n },\n ],\n name: 'MintAlreadyReportedOrProcessed',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: 'bytes32',\n name: 'mintID',\n type: 'bytes32',\n },\n {\n indexed: false,\n internalType: 'uint256',\n name: 'mintAmount',\n type: 'uint256',\n },\n ],\n name: 'MintNotValidated',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: 'bytes32',\n name: 'mintID',\n type: 'bytes32',\n },\n {\n indexed: false,\n internalType: 'uint256',\n name: 'mintAmount',\n type: 'uint256',\n },\n ],\n name: 'MintValidated',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'bytes32',\n name: 'reportId',\n type: 'bytes32',\n },\n {\n indexed: false,\n internalType: 'uint256',\n name: 'numMints',\n type: 'uint256',\n },\n ],\n name: 'MintsReported',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: 'address',\n name: 'account',\n type: 'address',\n },\n ],\n name: 'Paused',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'bytes32',\n name: 'role',\n type: 'bytes32',\n },\n {\n indexed: true,\n internalType: 'bytes32',\n name: 'previousAdminRole',\n type: 'bytes32',\n },\n {\n indexed: true,\n internalType: 'bytes32',\n name: 'newAdminRole',\n type: 'bytes32',\n },\n ],\n name: 'RoleAdminChanged',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'bytes32',\n name: 'role',\n type: 'bytes32',\n },\n {\n indexed: true,\n internalType: 'address',\n name: 'account',\n type: 'address',\n },\n {\n indexed: true,\n internalType: 'address',\n name: 'sender',\n type: 'address',\n },\n ],\n name: 'RoleGranted',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'bytes32',\n name: 'role',\n type: 'bytes32',\n },\n {\n indexed: true,\n internalType: 'address',\n name: 'account',\n type: 'address',\n },\n {\n indexed: true,\n internalType: 'address',\n name: 'sender',\n type: 'address',\n },\n ],\n name: 'RoleRevoked',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: 'address',\n name: 'trustedSigner',\n type: 'address',\n },\n ],\n name: 'TrustedSignerUpdated',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: 'address',\n name: 'account',\n type: 'address',\n },\n ],\n name: 'Unpaused',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: 'uint256',\n name: 'oldThreshold',\n type: 'uint256',\n },\n {\n indexed: false,\n internalType: 'uint256',\n name: 'newThreshold',\n type: 'uint256',\n },\n ],\n name: 'UpdateValidateThreshold',\n type: 'event',\n },\n {\n inputs: [],\n name: 'DEFAULT_ADMIN_ROLE',\n outputs: [{ internalType: 'bytes32', name: '', type: 'bytes32' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'MINT_REPORTER_ROLE',\n outputs: [{ internalType: 'bytes32', name: '', type: 'bytes32' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'MINT_VALIDATOR_ROLE',\n outputs: [{ internalType: 'bytes32', name: '', type: 'bytes32' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'PAUSER_ROLE',\n outputs: [{ internalType: 'bytes32', name: '', type: 'bytes32' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'VALIDATION_GUARDIAN_ROLE',\n outputs: [{ internalType: 'bytes32', name: '', type: 'bytes32' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'acceptDefaultAdminTransfer',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [{ internalType: 'address', name: 'newAdmin', type: 'address' }],\n name: 'beginDefaultAdminTransfer',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [],\n name: 'cancelDefaultAdminTransfer',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [{ internalType: 'uint48', name: 'newDelay', type: 'uint48' }],\n name: 'changeDefaultAdminDelay',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [],\n name: 'defaultAdmin',\n outputs: [{ internalType: 'address', name: '', type: 'address' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'defaultAdminDelay',\n outputs: [{ internalType: 'uint48', name: '', type: 'uint48' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'defaultAdminDelayIncreaseWait',\n outputs: [{ internalType: 'uint48', name: '', type: 'uint48' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [{ internalType: 'bytes32', name: 'role', type: 'bytes32' }],\n name: 'getRoleAdmin',\n outputs: [{ internalType: 'bytes32', name: '', type: 'bytes32' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n { internalType: 'bytes32', name: 'role', type: 'bytes32' },\n { internalType: 'address', name: 'account', type: 'address' },\n ],\n name: 'grantRole',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n { internalType: 'bytes32', name: 'role', type: 'bytes32' },\n { internalType: 'address', name: 'account', type: 'address' },\n ],\n name: 'hasRole',\n outputs: [{ internalType: 'bool', name: '', type: 'bool' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'maxMints',\n outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [{ internalType: 'bytes32', name: 'mintID', type: 'bytes32' }],\n name: 'mintHistory',\n outputs: [\n {\n components: [\n { internalType: 'uint256', name: 'nonce', type: 'uint256' },\n { internalType: 'address', name: 'recipient', type: 'address' },\n { internalType: 'address', name: 'toToken', type: 'address' },\n { internalType: 'uint256', name: 'amount', type: 'uint256' },\n ],\n internalType: 'struct IGMPBascule.Message',\n name: 'msg',\n type: 'tuple',\n },\n {\n internalType: 'enum GMPBasculeV1.MintState',\n name: 'status',\n type: 'uint8',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'owner',\n outputs: [{ internalType: 'address', name: '', type: 'address' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'pause',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [],\n name: 'paused',\n outputs: [{ internalType: 'bool', name: '', type: 'bool' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'pendingDefaultAdmin',\n outputs: [\n { internalType: 'address', name: 'newAdmin', type: 'address' },\n { internalType: 'uint48', name: 'schedule', type: 'uint48' },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'pendingDefaultAdminDelay',\n outputs: [\n { internalType: 'uint48', name: 'newDelay', type: 'uint48' },\n { internalType: 'uint48', name: 'schedule', type: 'uint48' },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n { internalType: 'bytes32', name: 'role', type: 'bytes32' },\n { internalType: 'address', name: 'account', type: 'address' },\n ],\n name: 'renounceRole',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n { internalType: 'bytes32', name: 'reportId', type: 'bytes32' },\n {\n components: [\n { internalType: 'uint256', name: 'nonce', type: 'uint256' },\n { internalType: 'address', name: 'recipient', type: 'address' },\n { internalType: 'address', name: 'toToken', type: 'address' },\n { internalType: 'uint256', name: 'amount', type: 'uint256' },\n ],\n internalType: 'struct IGMPBascule.Message[]',\n name: 'mints',\n type: 'tuple[]',\n },\n { internalType: 'bytes[]', name: 'proofs', type: 'bytes[]' },\n ],\n name: 'reportMints',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n { internalType: 'bytes32', name: 'role', type: 'bytes32' },\n { internalType: 'address', name: 'account', type: 'address' },\n ],\n name: 'revokeRole',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [],\n name: 'rollbackDefaultAdminDelay',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [{ internalType: 'uint256', name: 'aMaxMints', type: 'uint256' }],\n name: 'setMaxMints',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n { internalType: 'address', name: 'aTrustedSigner', type: 'address' },\n ],\n name: 'setTrustedSigner',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [{ internalType: 'bytes4', name: 'interfaceId', type: 'bytes4' }],\n name: 'supportsInterface',\n outputs: [{ internalType: 'bool', name: '', type: 'bool' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'trustedSigner',\n outputs: [{ internalType: 'address', name: '', type: 'address' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'unpause',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n { internalType: 'uint256', name: 'newThreshold', type: 'uint256' },\n ],\n name: 'updateValidateThreshold',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n components: [\n { internalType: 'uint256', name: 'nonce', type: 'uint256' },\n { internalType: 'address', name: 'recipient', type: 'address' },\n { internalType: 'address', name: 'toToken', type: 'address' },\n { internalType: 'uint256', name: 'amount', type: 'uint256' },\n ],\n internalType: 'struct IGMPBascule.Message',\n name: 'mintMsg',\n type: 'tuple',\n },\n ],\n name: 'validateMint',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [],\n name: 'validateThreshold',\n outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],\n stateMutability: 'view',\n type: 'function',\n },\n];\n","import { DEFAULT_ENV } from '@lombard.finance/sdk-common';\nimport {\n Address,\n ByteArray,\n Client,\n getContract,\n keccak256,\n PublicClient,\n zeroAddress,\n} from 'viem';\n\nimport { Deposit } from '../../api-functions/getDepositsByAddress/getDepositsByAddress';\nimport { makePublicClient } from '../../clients/public-client';\nimport { makeWalletClient } from '../../clients/wallet-client';\nimport {\n ChainId,\n isEthereumChain,\n isKatanaChain,\n isMegaethChain,\n isMonadChain,\n isStableChain,\n} from '../../common/chains';\nimport { CommonOptionalWriteParameters } from '../../common/parameters';\nimport ASSET_ROUTER_ABI from '../../tokens/abi/ASSET_ROUTER_ABI';\nimport KATANA_BASCULE_ABI from '../../tokens/abi/KATANA_BASCULE_ABI';\nimport LBTC_BASCULE_ABI from '../../tokens/abi/LBTC_BASCULE_ABI.json';\nimport { AddressKind, Token } from '../../tokens/token-addresses';\nimport { getTokenContractInfo, isUpgradedAbi } from '../../tokens/tokens';\nimport { getErrorMessage } from '../../utils/err';\nimport {\n calcMintIDFromDecoded,\n decodeGmpMintPayload,\n} from './decodeBasculeDepositStatus';\n\n/**\n * The bascule drawbridge deposit status.\n */\nexport enum BasculeDepositStatus {\n /**\n * The value representing that the deposit is unreported or potentially\n * still pending.\n */\n UNREPORTED = 0,\n /**\n * The value representing that the deposit is reported.\n */\n REPORTED = 1,\n /**\n * The value representing that the deposit has already been withdrawn.\n */\n WITHDRAWN = 2,\n}\n\nexport interface IGetBasculeDepositStatusParameters\n extends CommonOptionalWriteParameters {\n /**\n * The deposit for which the bascule status will be checked.\n * You can omit `rawPayload` parameter if `deposit` is provided.\n */\n deposit?: Deposit;\n /**\n * The `rawPayload` of the deposit for which the bascule status\n * will be checked.\n * You can omit `deposit` parameter if `rawPayload` is provided.\n */\n rawPayload?: string;\n token?: Token;\n}\n\n/**\n * Gets the Bascule drawbridge deposit status for given deposit.\n *\n * **Multiple Bascule Interfaces:**\n * This function supports two different bascule contract interfaces:\n * - **Asset Router (upgraded)**: Uses `bascule()` getter - for StakedLBTC and upgraded contracts\n * - **Bridge Token Adapter**: Uses `getBascule()` getter - for BTCb on Avalanche\n * - **Legacy NativeLBTC**: Uses `Bascule()` getter - for old LBTC contracts\n *\n * **MintID Calculation:**\n * For Katana chains, this function uses proper GMP payload decoding to calculate\n * the mintID, which matches the Solidity implementation. For other chains, it uses\n * a simplified method.\n *\n * @param {IGetBasculeDepositStatusParameters} parameters - The parameters.\n * @param {Deposit} parameters.deposit - The deposit for which the bascule status will be checked. You can omit `rawPayload` parameter if `deposit` is provided.\n * @param {string} parameters.rawPayload - The `rawPayload` of the deposit for which the bascule status will be checked. You can omit `deposit` parameter if `rawPayload` is provided.\n * @param {ChainId} parameters.chainId - The chain id. For Katana chains (Katana mainnet or Katana Tatara testnet), GMP payload decoding is used.\n * @param {Token} parameters.token - The token for which to check bascule status. Defaults to Token.LBTC.\n * @param {EIP1193Provider} parameters.provider - The optional EIP1193 provider.\n * @param {string} parameters.rpcUrl - The optional rpc url.\n * @param {Env} parameters.env - The optional environment identifier.\n *\n * @returns {Promise<BasculeDepositStatus>}\n */\nexport async function getBasculeDepositStatus({\n deposit,\n rawPayload,\n provider,\n chainId,\n rpcUrl,\n env = DEFAULT_ENV,\n token = Token.LBTC,\n}: IGetBasculeDepositStatusParameters) {\n const payload = deposit?.rawPayload || rawPayload;\n\n if (!payload) {\n throw new Error(\n \"No 'rawPayload' or 'deposit' data provided. Please provide 'rawPayload' or 'deposit' parameter.\",\n );\n }\n\n const publicClient = makePublicClient({ chainId, rpcUrl, env });\n const tokenContractInfo = await getTokenContractInfo(\n token,\n chainId,\n env,\n AddressKind.Adapter,\n );\n\n // Determine which bascule getter function to use based on the contract type\n // There are three different approaches:\n // 1. Upgraded contracts (Asset Router): token.getAssetRouter() -> assetRouter.bascule()\n // 2. Bridge Token Adapter (BTCb on Avalanche): getBascule()\n // 3. Legacy contracts (NativeLBTC): Bascule()\n\n let basculeContractAddress: Address;\n\n if (\n token === Token.BTCb &&\n (chainId === ChainId.avalanche || chainId === ChainId.avalancheFuji)\n ) {\n basculeContractAddress = (await publicClient.readContract({\n abi: tokenContractInfo.abi,\n address: tokenContractInfo.address,\n functionName: 'getBascule',\n })) as Address;\n } else if (isUpgradedAbi(tokenContractInfo.abi) && token === Token.LBTC) {\n // Upgraded contract - get bascule from Asset Router\n const assetRouterAddress = (await publicClient.readContract({\n abi: tokenContractInfo.abi,\n address: tokenContractInfo.address,\n functionName: 'getAssetRouter',\n })) as Address;\n\n basculeContractAddress = (await publicClient.readContract({\n abi: ASSET_ROUTER_ABI,\n address: assetRouterAddress,\n functionName: 'bascule',\n })) as Address;\n } else {\n basculeContractAddress = (await publicClient.readContract({\n abi: tokenContractInfo.abi,\n address: tokenContractInfo.address,\n functionName: 'Bascule',\n })) as Address;\n }\n\n // If there's no bascule contract address on the LBTC contract then return\n // the the deposit is ok (REPORTED).\n if (basculeContractAddress === zeroAddress) {\n return BasculeDepositStatus.REPORTED;\n }\n\n let client: PublicClient | Client | undefined = undefined;\n if (!provider) {\n client = makePublicClient({ chainId, rpcUrl });\n } else {\n client = makeWalletClient({ provider, chainId });\n }\n\n if (!client) {\n throw new Error(\n \"Could not determine the client for the contract interactions. Please provide the 'provider' and 'chainId' parameters or 'chainId' and optionally the 'rpcUrl' parameter.\",\n );\n }\n\n const shouldCheckMintHistory =\n (isKatanaChain(chainId) ||\n isMonadChain(chainId) ||\n isEthereumChain(chainId) ||\n isStableChain(chainId) ||\n isMegaethChain(chainId)) &&\n token === Token.LBTC;\n\n try {\n // For Katana chains, use proper GMP payload decoding to calculate mintID\n if (shouldCheckMintHistory) {\n const prefixedPayload = payload.startsWith('0x')\n ? payload\n : `0x${payload}`;\n const decoded = decodeGmpMintPayload(prefixedPayload);\n const mintId = calcMintIDFromDecoded(decoded, chainId);\n\n const [, status] = (await publicClient.readContract({\n abi: KATANA_BASCULE_ABI,\n address: basculeContractAddress,\n functionName: 'mintHistory',\n args: [mintId],\n })) as [unknown, BasculeDepositStatus];\n\n return status;\n }\n\n // For non-Katana chains, use the simple method\n const basculeDepositId = keccak256(\n Buffer.from(payload.slice(8), 'hex') as unknown as ByteArray,\n );\n\n const basculeContract = getContract({\n abi: LBTC_BASCULE_ABI,\n address: basculeContractAddress,\n client: publicClient,\n });\n\n const status = await basculeContract.read.depositHistory([\n basculeDepositId,\n ]);\n return status as BasculeDepositStatus;\n } catch (err) {\n throw new Error(getErrorMessage(err));\n }\n}\n","import { Env } from '@lombard.finance/sdk-common';\nimport BigNumber from 'bignumber.js';\nimport { Address, Hash } from 'viem';\n\nimport { makePublicClient } from '../../clients/public-client';\nimport { makeWalletClient } from '../../clients/wallet-client';\nimport { CHAIN_ID_TO_VIEM_CHAIN_MAP, ChainId } from '../../common/chains';\nimport { CommonWriteParameters, IEnvParam } from '../../common/parameters';\nimport { Token } from '../../tokens/token-addresses';\nimport {\n fromBaseDenomination,\n getTokenInfo,\n toBaseDenomination,\n} from '../../tokens/tokens';\nimport toBigInt from '../../utils/numbers';\n\nexport interface IApproveTokenParams extends CommonWriteParameters, IEnvParam {\n /**\n * The token to approve.\n */\n token: Token;\n /**\n * The spender account address.\n */\n spender: Address;\n /**\n * The approved amount of the token.\n */\n amount: BigNumber.Value;\n}\n\n/**\n * Approves the provided spender to withdraw a specified amount of a token from\n * your account.\n *\n * @param {IApproveTokenParams} parameters - The parameters.\n * @param {Token} parameters.token - The token to approve.\n * @param {Address} parameters.spender - The spender account address.\n * @param {BigNumber.Value} parameters.amount - The amount of the token.\n * @param {Address} parameters.account - The EVM account address.\n * @param {ChainId} parameters.chainId - The chain id.\n * @param {EIP1193Provider} parameters.provider - The EIP1193 provider.\n * @param {string} parameters.rpcUrl - The optional rpc url.\n * @param {Env} parameters.env - The optional environment identifier.\n *\n * @returns {Promise<Hash>}\n */\nexport async function approveToken({\n account,\n token,\n spender,\n amount,\n chainId,\n provider,\n rpcUrl,\n env,\n}: IApproveTokenParams): Promise<Hash> {\n const publicClient = makePublicClient({ chainId, rpcUrl, env });\n const walletClient = makeWalletClient({ chainId, provider });\n\n const tokenInfo = await getTokenInfo(token, chainId, env, rpcUrl);\n if (!tokenInfo) {\n throw new Error(`Token info not found for ${token} on chain ${chainId}`);\n }\n\n const amountBase = toBigInt(\n toBaseDenomination(BigNumber(amount), tokenInfo.decimals),\n );\n\n const { request } = await publicClient.simulateContract({\n address: tokenInfo.address,\n account,\n chain: CHAIN_ID_TO_VIEM_CHAIN_MAP[chainId],\n abi: tokenInfo.abi,\n functionName: 'approve',\n args: [spender, amountBase],\n });\n\n const txHash = await walletClient.writeContract(request);\n\n return txHash;\n}\n\n/**\n * Gets the allowance of a token for a spender.\n *\n * @param {Object} parameters - The parameters.\n * @param {Token} parameters.token - The token.\n * @param {Address} parameters.owner - The owner account address.\n * @param {Address} parameters.spender - The spender account address.\n * @param {ChainId} parameters.chainId - The chain id.\n * @param {string} parameters.rpcUrl - The optional rpc url.\n * @param {Env} parameters.env - The optional environment identifier.\n *\n * @returns {Promise<BigNumber>}\n */\nexport async function getTokenAllowance({\n token,\n owner,\n spender,\n chainId,\n rpcUrl,\n env,\n}: {\n token: Token;\n owner: Address;\n spender: Address;\n chainId: ChainId;\n rpcUrl?: string;\n env?: Env;\n}): Promise<BigNumber> {\n const publicClient = makePublicClient({ chainId, rpcUrl, env });\n const tokenInfo = await getTokenInfo(token, chainId, env, rpcUrl);\n if (!tokenInfo) {\n throw new Error(`Token info not found for ${token} on chain ${chainId}`);\n }\n\n const allowanceRaw = (await publicClient.readContract({\n address: tokenInfo.address,\n abi: tokenInfo.abi,\n functionName: 'allowance',\n args: [owner, spender],\n })) as bigint;\n\n return fromBaseDenomination(allowanceRaw.toString(), tokenInfo.decimals);\n}\n","import BigNumber from 'bignumber.js';\nimport { PublicClient } from 'viem';\n\nexport const estimateGasFees = async (\n publicClient: PublicClient,\n callData: Parameters<PublicClient['estimateContractGas']>[0],\n overwriteMaxPriorityFeePerGas?: bigint,\n) => {\n const fees = await publicClient.estimateFeesPerGas();\n\n const multiplier = BigNumber(String(fees.maxFeePerGas)).dividedBy(\n String(fees.maxPriorityFeePerGas),\n );\n\n const maxPriorityFeePerGas = overwriteMaxPriorityFeePerGas\n ? overwriteMaxPriorityFeePerGas\n : fees.maxPriorityFeePerGas;\n\n const maxFeePerGas = overwriteMaxPriorityFeePerGas\n ? BigInt(\n BigNumber(String(maxPriorityFeePerGas))\n .multipliedBy(multiplier)\n .toFixed(0),\n )\n : fees.maxFeePerGas;\n\n const gas = await publicClient.estimateContractGas(callData);\n\n const gasEstimationData = {\n gas,\n maxFeePerGas,\n maxPriorityFeePerGas,\n };\n\n return gasEstimationData;\n};\n","import { Hash, parseGwei } from 'viem';\n\nimport { makePublicClient } from '../../clients/public-client';\nimport { makeWalletClient } from '../../clients/wallet-client';\nimport { CHAIN_ID_TO_VIEM_CHAIN_MAP, isKatanaChain } from '../../common/chains';\nimport { CommonWriteParameters } from '../../common/parameters';\nimport { AddressKind, Token } from '../../tokens/token-addresses';\nimport { getTokenContractInfo } from '../../tokens/tokens';\nimport { estimateGasFees } from '../../utils/gas';\nimport { ensureHex } from '../../utils/hex';\nimport {\n BasculeDepositStatus,\n getBasculeDepositStatus,\n} from '../getBasculeDepositStatus';\n\nexport interface IClaimLBTCParams extends CommonWriteParameters {\n /**\n * The raw payload from deposit notarization, see `Deposit.rawPayload`.\n */\n data: string;\n /**\n * The proof signature from deposit notarization, see `Deposit.proof`.\n */\n proofSignature: string;\n}\n\n/**\n * Mints a specified token (LBTC or NativeLBTC) from a notarized deposit.\n *\n * This is the primary function for claiming tokens from a deposit notarization.\n *\n * It performs the following steps:\n * 1. Validates that the token is supported.\n * 2. Checks chain restrictions.\n * 3. Fetches the token contract information.\n * 4. Checks the deposit status via Bascule.\n * 5. Prepares the transaction call data and estimates gas fees if on Katana.\n * 6. Simulates the contract call and executes the transaction via the provided wallet.\n *\n * @param {Object} params - The parameters.\n * @param {string} params.data - Raw payload from the deposit notarization (`Deposit.rawPayload`).\n * @param {string} params.proofSignature - Signature from the deposit notarization (`Deposit.proof`).\n * @param {Address} params.account - The EVM account address that will receive the tokens.\n * @param {ChainId} params.chainId - The chain ID of the target blockchain network.\n * @param {EIP1193Provider} params.provider - The connected wallet provider.\n * @param {string} [params.rpcUrl] - Optional RPC URL for the blockchain network.\n * @param {Env} [params.env] - Optional environment identifier (e.g., `prod`, `staging`).\n * @param {Token} [params.token=Token.LBTC] - The token to mint. Defaults to LBTC.\n *\n * @returns {Promise<Hash>} Resolves with the transaction hash of the mint operation.\n *\n * @throws Will throw an error if:\n * - The token is unsupported.\n * - BTCK minting is attempted on a non-Katana chain.\n * - The deposit is unreported, withdrawn, or blocked by bridge security.\n */\nexport async function mintToken({\n data,\n proofSignature,\n account,\n chainId,\n provider,\n rpcUrl,\n env,\n token = Token.LBTC,\n}: IClaimLBTCParams & { token?: Token }) {\n if (![Token.LBTC, Token.BTCK, Token.BTCb].includes(token)) {\n throw new Error('Unsupported token');\n }\n\n if (token === Token.BTCK && !isKatanaChain(chainId)) {\n throw new Error('Operation not permitted');\n }\n\n const tokenContract = await getTokenContractInfo(\n token,\n chainId,\n env,\n AddressKind.Adapter,\n );\n const basculeStatus = await getBasculeDepositStatus({\n chainId,\n rawPayload: data,\n env,\n token,\n });\n\n if (basculeStatus !== BasculeDepositStatus.REPORTED) {\n switch (basculeStatus) {\n case BasculeDepositStatus.UNREPORTED:\n throw new Error(\n 'The deposit cannot be claimed because it is unreported or potentially still pending, please try again later.',\n );\n case BasculeDepositStatus.WITHDRAWN:\n throw new Error(\n 'The deposit cannot be claimed because it is withdrawn already.',\n );\n default: // unknown bascule deposit status\n throw new Error(\n 'The deposit cannot be claimed because it is blocked by bridge security.',\n );\n }\n }\n\n const publicClient = makePublicClient({ chainId, rpcUrl, env });\n const walletClient = makeWalletClient({ chainId, provider });\n\n const callData = {\n address: tokenContract.address,\n account,\n chain: CHAIN_ID_TO_VIEM_CHAIN_MAP[chainId],\n abi: tokenContract.abi,\n functionName:\n token === Token.BTCK || token === Token.BTCb ? 'mintV1' : 'mint',\n args: [ensureHex(data), ensureHex(proofSignature)],\n } as const;\n\n const gasEstimationData = isKatanaChain(chainId)\n ? await estimateGasFees(publicClient, callData, parseGwei('1'))\n : {};\n\n const { request } = await publicClient.simulateContract({\n ...callData,\n ...gasEstimationData,\n });\n\n const txHash = await walletClient.writeContract(request);\n\n return txHash;\n}\n\n/**\n * Convenience wrapper for minting LBTC from a deposit notarization.\n *\n * Internally calls `mintToken` with the `Token.LBTC` argument.\n *\n * @param {IClaimLBTCParams} params - The parameters for claiming LBTC.\n * @returns {Promise<Hash>} Resolves with the transaction hash of the LBTC mint operation.\n */\nexport async function claimLBTC({\n data,\n proofSignature,\n account,\n chainId,\n provider,\n rpcUrl,\n env,\n}: IClaimLBTCParams): Promise<Hash> {\n return mintToken({\n data,\n proofSignature,\n account,\n chainId,\n provider,\n rpcUrl,\n env,\n token: Token.LBTC,\n });\n}\n","/**\n * Asset Router deposit functionality for token swaps\n */\nimport BigNumber from 'bignumber.js';\nimport { Address } from 'viem';\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, IEnvParam } from '../../common/parameters';\nimport ASSET_ROUTER_ABI from '../../tokens/abi/ASSET_ROUTER_ABI';\nimport { AddressKind, Token } from '../../tokens/token-addresses';\nimport {\n fromBaseDenomination,\n getTokenContractInfo,\n retrieveTokenProperties,\n toBaseDenomination,\n} from '../../tokens/tokens';\nimport { UnsupportedTokenFlow } from '../../utils/err';\nimport toBigInt from '../../utils/numbers';\n\nconst AVAILABLE_FLOWS: Array<{\n tokenIn: Token;\n tokenOut: Token;\n}> = [\n {\n tokenIn: Token.BTCb,\n tokenOut: Token.LBTC,\n },\n];\n\n/* -------------------------------------------------------------------------- */\n/* Types */\n/* -------------------------------------------------------------------------- */\n\n/**\n * Parameters for depositing tokens into a supported token contract.\n *\n * Extends {@link CommonWriteParameters} and {@link IEnvParam}.\n */\ntype DepositTokenParameters = {\n /**\n * The amount of tokens to deposit in human-readable format\n * (e.g., `1.23` for 1.23 XBTC).\n */\n amount: BigNumber.Value;\n /**\n * The input token that will be deposited.\n * Defaults to {@link Token.BTCb}.\n */\n tokenIn: Token;\n /**\n * The output token to be minted after deposit.\n * Defaults to {@link Token.LBTC}.\n */\n tokenOut: Token;\n} & CommonWriteParameters &\n IEnvParam;\n\n/* -------------------------------------------------------------------------- */\n/* Public API */\n/* -------------------------------------------------------------------------- */\n\n/**\n * Gets the AssetRouter address for a given token.\n *\n * This is useful for approving tokens before calling the deposit function.\n *\n * @param tokenIn - The input token (e.g., Token.BTCb)\n * @param chainId - The chain ID\n * @param env - The environment\n * @param rpcUrl - Optional RPC URL\n * @returns The AssetRouter address\n */\nexport async function getAssetRouterAddress({\n tokenIn,\n chainId,\n env,\n rpcUrl,\n}: {\n tokenIn: Token;\n chainId: CommonWriteParameters['chainId'];\n env?: IEnvParam['env'];\n rpcUrl?: string;\n}): Promise<Address> {\n const publicClient = makePublicClient({ chainId, rpcUrl, env });\n\n const adapterContractInfo = await getTokenContractInfo(\n tokenIn,\n chainId,\n env,\n AddressKind.Adapter,\n );\n\n const assetRouterAddress = (await publicClient.readContract({\n address: adapterContractInfo.address,\n abi: adapterContractInfo.abi,\n functionName: 'getAssetRouter',\n })) as Address;\n\n return assetRouterAddress;\n}\n\n/**\n * Deposits tokens using the Asset Router contract to mint the corresponding output token.\n *\n * This function validates the deposit flow (input → output token), retrieves token and adapter contract\n * information, obtains the AssetRouter address, and submits a `deposit` transaction to the AssetRouter contract.\n *\n * **Note:** This function does NOT handle token approval. You must approve tokens for the AssetRouter\n * before calling this function. Use {@link getAssetRouterAddress} to get the spender address for approval.\n *\n * ---\n * **Supported flows:**\n * - BTC.b → LBTC\n *\n * ---\n * **Errors thrown:**\n * - `UnsupportedTokenDepositFlow` if the (tokenIn, tokenOut) pair is not supported\n * - `Error` if token contract properties cannot be retrieved\n * - `Error` if the deposit amount exceeds the account balance\n * - `Error` if insufficient allowance (tokens not approved)\n */\nexport async function depositToken({\n account: accountAddress,\n amount: amountRaw,\n chainId,\n env,\n provider,\n rpcUrl,\n tokenIn = Token.BTCb,\n tokenOut = Token.LBTC,\n}: DepositTokenParameters) {\n const flow = AVAILABLE_FLOWS.find(\n af => af.tokenIn === tokenIn && af.tokenOut === tokenOut,\n );\n if (!flow) {\n throw new UnsupportedTokenFlow(tokenIn, tokenOut, chainId, env);\n }\n\n const publicClient = makePublicClient({ chainId, rpcUrl, env });\n const walletClient = makeWalletClient({ provider, chainId });\n\n // Get adapter contract for tokenIn (BTC.b)\n const adapterContractInfo = await getTokenContractInfo(\n tokenIn,\n chainId,\n env,\n AddressKind.Adapter,\n );\n\n // Get token contract for tokenIn to check balance and approve\n const tokenInContractInfo = await getTokenContractInfo(\n tokenIn,\n chainId,\n env,\n AddressKind.Token,\n );\n\n // Get token contract for tokenOut to pass to AssetRouter\n const tokenOutContractInfo = await getTokenContractInfo(\n tokenOut,\n chainId,\n env,\n AddressKind.Token,\n );\n\n const IN = await retrieveTokenProperties(publicClient, tokenInContractInfo);\n if (!IN) {\n throw new Error(\n `Could not retrieve the properties of ${tokenIn} on ${chainId}`,\n );\n }\n\n // Get AssetRouter address from adapter contract\n const assetRouterAddress = (await publicClient.readContract({\n address: adapterContractInfo.address,\n abi: adapterContractInfo.abi,\n functionName: 'getAssetRouter',\n })) as Address;\n\n const amount = BigNumber(amountRaw);\n const amountBigInt = toBigInt(toBaseDenomination(amount, IN.decimals));\n\n // Check token balance\n const tokenInBalanceRaw = await publicClient.readContract({\n address: IN.address,\n abi: IN.abi,\n functionName: 'balanceOf',\n args: [accountAddress],\n });\n const tokenInBalance = fromBaseDenomination(tokenInBalanceRaw, IN.decimals);\n\n if (amount.isGreaterThan(tokenInBalance)) {\n throw new Error(\n `Unable to deposit ${amount.toString()} ${IN.symbol} because the amount exceeds the account's balance of ${tokenInBalance.toString()} ${IN.symbol}`,\n );\n }\n\n // const isAvalanche =\n // chainId === ChainId.avalanche || chainId === ChainId.avalancheFuji;\n\n // Call deposit on AssetRouter\n const hash = await walletClient.writeContract({\n address: assetRouterAddress,\n abi: ASSET_ROUTER_ABI,\n chain: CHAIN_ID_TO_VIEM_CHAIN_MAP[chainId],\n functionName: 'deposit',\n args: [accountAddress, tokenOutContractInfo.address, amountBigInt],\n account: accountAddress,\n });\n\n return hash;\n}\n","import { getOutputScript } from '@lombard.finance/sdk-common';\nimport BigNumber from 'bignumber.js';\nimport { Address, erc20Abi, Hex, parseGwei } from 'viem';\n\nimport { makePublicClient } from '../../clients/public-client';\nimport { makeWalletClient } from '../../clients/wallet-client';\nimport {\n CHAIN_ID_TO_VIEM_CHAIN_MAP,\n ChainId,\n isKatanaChain,\n} from '../../common/chains';\nimport {\n CommonSignerWriteParameters,\n CommonWriteParameters,\n isProviderFlow,\n} from '../../common/parameters';\nimport ASSET_ROUTER_ABI from '../../tokens/abi/ASSET_ROUTER_ABI';\nimport { AddressKind, Token } from '../../tokens/token-addresses';\nimport {\n fromBaseDenomination,\n getTokenContractInfo,\n isUpgradedAbi,\n retrieveTokenProperties,\n toBaseDenomination,\n} from '../../tokens/tokens';\nimport { UnsupportedTokenFlow } from '../../utils/err';\nimport { estimateGasFees } from '../../utils/gas';\nimport toBigInt from '../../utils/numbers';\nimport {\n executeContractTransaction,\n waitForTransactionReceipt,\n} from '../../utils/transaction-executor';\n\n/**\n * Supported redemption flows.\n *\n * - If `tokenOut` is `undefined`, the redemption defaults to **BTC**\n * and requires a BTC address as the destination.\n * - Otherwise, redemption will return the specified output token.\n */\nconst AVAILABLE_FLOWS: Array<{\n /** The token being redeemed */\n tokenIn: Token;\n /** The token received after redemption (or `undefined` for BTC) */\n tokenOut?: Token;\n}> = [\n // Redeem to BTC\n { tokenIn: Token.LBTC }, // -> BTC\n { tokenIn: Token.BTCb }, // -> BTC\n { tokenIn: Token.BTCK }, // -> BTC\n\n // Redeem to wrapped tokens\n { tokenIn: Token.LBTC, tokenOut: Token.BTCb }, // -> Native LBTC\n { tokenIn: Token.LBTC, tokenOut: Token.BTCK }, // -> Native LBTC\n];\n\ntype RedeemTokenParameters = {\n /**\n * The amount to redeem, expressed in human-readable format.\n *\n * For example, use `\"1.23\"` to represent 1.23 LBTC.\n */\n amount: BigNumber.Value;\n /**\n * (Optional) Destination BTC address for redemption.\n *\n * Required if {@link tokenOut} is omitted (since the default\n * redemption flow sends BTC).\n */\n btcAddress?: string;\n /**\n * The token to be redeemed.\n *\n * Defaults to {@link Token.LBTC}.\n */\n tokenIn: Token;\n /**\n * (Optional) The token to receive after redemption.\n *\n * - If provided, redemption will return the specified token.\n * - If omitted, redemption defaults to BTC and a {@link btcAddress}\n * must be supplied.\n */\n tokenOut?: Token;\n};\n\n/**\n * Union type for redeem token parameters supporting both provider and signer flows.\n */\ntype RedeemTokenParams =\n | (RedeemTokenParameters & CommonWriteParameters)\n | (RedeemTokenParameters & CommonSignerWriteParameters);\n\n/**\n * Parameters required to unstake (redeem) LBTC into BTC.\n *\n * Overrides {@link RedeemTokenParameters} to make `btcAddress` required,\n * since unstaking always goes to BTC.\n */\nexport type IUnstakeLBTCParams =\n | (RedeemTokenParameters & CommonWriteParameters & { btcAddress: string })\n | (RedeemTokenParameters &\n CommonSignerWriteParameters & { btcAddress: string });\n\n/**\n * Redeems a token into **BTC** or another supported token.\n *\n * @remarks\n * This is the **preferred** API for all redemption flows.\n * - If `tokenOut` is `undefined`, redemption sends BTC and requires a valid BTC address.\n * - If `tokenOut` is provided, redemption swaps to the target token\n * (requires an upgraded token contract ABI).\n *\n * Supports two execution modes:\n * 1. **Provider flow** (legacy): Pass `provider: EIP1193Provider`\n * 2. **Signer flow** (unified bridge): Pass `signer: SignerAdapter`\n *\n * @param params - Parameters including the source token, amount, and either provider or signer.\n * @returns Transaction hash of the executed redemption transaction.\n *\n * @throws {UnsupportedTokenFlow} If the requested flow is not supported.\n * @throws {Error} If balances are insufficient or required parameters are missing.\n * @throws {SignerError} If transaction execution fails (with detailed context).\n *\n * @example\n * ```ts\n * // Provider flow (legacy)\n * const txHash = await redeemToken({\n * provider,\n * account: '0x...',\n * amount: '1.5',\n * btcAddress: 'bc1q...',\n * chainId: ChainId.ethereum,\n * env: Env.prod,\n * tokenIn: Token.LBTC,\n * });\n *\n * // Signer flow (unified bridge)\n * const txHash = await redeemToken({\n * signer: evmSigner,\n * account: '0x...',\n * amount: '1.5',\n * btcAddress: 'bc1q...',\n * chainId: ChainId.avalancheFuji,\n * env: Env.testnet,\n * tokenIn: Token.BTCb,\n * });\n * ```\n */\nexport async function redeemToken(params: RedeemTokenParams): Promise<Hex> {\n const {\n account: accountAddress,\n amount: amountRaw,\n btcAddress,\n chainId,\n env,\n rpcUrl,\n tokenIn = Token.LBTC,\n tokenOut,\n } = params;\n const flow = AVAILABLE_FLOWS.find(\n af => af.tokenIn === tokenIn && af.tokenOut === tokenOut,\n );\n if (!flow) {\n throw new UnsupportedTokenFlow(tokenIn, tokenOut || 'BTC', chainId, env);\n }\n\n const publicClient = makePublicClient({ chainId, rpcUrl, env });\n\n // Create wallet client only for provider flow\n const walletClient = isProviderFlow(params)\n ? makeWalletClient({ provider: params.provider, chainId })\n : undefined;\n\n const tokenInContractInfo = await getTokenContractInfo(\n tokenIn,\n chainId,\n env,\n AddressKind.Token, // get the token contract, not adapter\n );\n const IN = await retrieveTokenProperties(publicClient, tokenInContractInfo);\n if (!IN) {\n throw new Error(\n `Could not retrieve the properties of ${tokenIn} on ${chainId}`,\n );\n }\n\n const amount = toBaseDenomination(amountRaw, IN.decimals);\n\n const tokenInBalanceRaw = await publicClient.readContract({\n address: IN.address,\n abi: IN.abi as typeof erc20Abi,\n functionName: 'balanceOf',\n args: [accountAddress],\n });\n const tokenInBalance = fromBaseDenomination(tokenInBalanceRaw, IN.decimals);\n if (amount.isGreaterThan(tokenInBalanceRaw)) {\n throw new Error(\n `Unable to redeem ${String(amountRaw)} ${IN.symbol} because the amount exceeds the account's balance of ${tokenInBalance.toString()} ${IN.symbol}`,\n );\n }\n\n // -> BTC\n if (!tokenOut) {\n if (!btcAddress) {\n throw new Error('Missing parameter: `btcAddress`.');\n }\n const outputScript = await getOutputScript(btcAddress, env);\n\n // The redemption of BTC.b -> BTC on Avalanche requires extra steps\n if (\n tokenIn === Token.BTCb &&\n (chainId === ChainId.avalanche || chainId === ChainId.avalancheFuji)\n ) {\n // 0. `IN` is a token contract (BTC.b)\n // 1. Get the adapter and asset route contracts\n const adapter = await getTokenContractInfo(\n tokenIn,\n chainId,\n env,\n AddressKind.Adapter,\n );\n const assetRouterContractAddress = (await publicClient.readContract({\n address: adapter.address,\n abi: adapter.abi,\n functionName: 'getAssetRouter',\n })) as Address;\n\n // 2. Check allowance\n const allowance = await publicClient.readContract({\n address: IN.address,\n abi: IN.abi,\n functionName: 'allowance',\n args: [accountAddress, adapter.address],\n });\n\n if (amount.isGreaterThan(allowance)) {\n const { txHash } = await executeContractTransaction({\n params,\n publicClient,\n walletClient,\n simulateArgs: {\n address: IN.address,\n abi: IN.abi,\n account: accountAddress as `0x${string}` | undefined,\n functionName: 'approve',\n args: [adapter.address, toBigInt(amount)],\n },\n operation: 'BTC.b approval',\n });\n\n const receipt = await waitForTransactionReceipt(\n publicClient,\n txHash,\n 'BTC.b approval',\n );\n\n console.info(\n `Approved adapter (${adapter.address}) for ${new BigNumber(amountRaw).toString()} ${IN.symbol}`,\n receipt.transactionHash,\n receipt.status,\n );\n }\n\n // 3. Run `redeemForBtc` on AssetRouter\n const { txHash } = await executeContractTransaction({\n params,\n publicClient,\n walletClient,\n simulateArgs: {\n address: assetRouterContractAddress,\n abi: ASSET_ROUTER_ABI,\n account: accountAddress as `0x${string}` | undefined,\n functionName: 'redeemForBtc',\n args: [\n accountAddress,\n adapter.address,\n outputScript,\n toBigInt(amount),\n ],\n },\n operation: 'BTC.b redeemForBtc',\n });\n\n return txHash;\n }\n\n // 0. IN is BTC.b token contract.\n const callData = {\n abi: IN.abi,\n address: IN.address,\n account: accountAddress,\n chain: CHAIN_ID_TO_VIEM_CHAIN_MAP[chainId],\n functionName:\n isUpgradedAbi(IN.abi) || tokenIn === Token.BTCb\n ? 'redeemForBtc' // upgraded\n : 'redeem', // legacy\n args: [outputScript, toBigInt(amount)],\n } as const;\n\n const gasEstimationData = isKatanaChain(chainId)\n ? await estimateGasFees(publicClient, callData, parseGwei('1'))\n : {};\n\n const { txHash } = await executeContractTransaction({\n params,\n publicClient,\n walletClient,\n simulateArgs: {\n ...callData,\n account: accountAddress as `0x${string}` | undefined,\n ...gasEstimationData,\n },\n operation: `${tokenIn} redeem to BTC`,\n });\n\n return txHash;\n }\n\n // -> tokenOut\n if (!isUpgradedAbi(IN.abi)) {\n throw new Error(\n `The ${tokenIn} contract (${IN.address}) doesn't support redemptions to ${tokenOut}.`,\n );\n }\n\n const callData = {\n abi: IN.abi,\n address: IN.address,\n account: accountAddress,\n chain: CHAIN_ID_TO_VIEM_CHAIN_MAP[chainId],\n functionName: 'redeem',\n args: [toBigInt(amount)],\n } as const;\n\n const gasEstimationData = isKatanaChain(chainId)\n ? await estimateGasFees(publicClient, callData, parseGwei('1'))\n : {};\n\n const { txHash } = await executeContractTransaction({\n params,\n publicClient,\n walletClient,\n simulateArgs: {\n ...callData,\n account: accountAddress as `0x${string}` | undefined,\n ...gasEstimationData,\n },\n operation: `${tokenIn} redeem to ${tokenOut}`,\n });\n\n return txHash;\n}\n\n/**\n * Convenience wrapper around {@link redeemToken} for redeeming **LBTC → BTC**.\n *\n * @remarks\n * This is a helper for the common \"unstake LBTC\" flow.\n * For more flexible redemptions (e.g. LBTC → BTCK), use {@link redeemToken} directly.\n *\n * Supports both provider and signer flows.\n *\n * @param params - See {@link IUnstakeLBTCParams}.\n * @returns Transaction hash of the redemption transaction.\n *\n * @example\n * ```ts\n * // Provider flow\n * const txHash = await unstakeLBTC({\n * provider,\n * account: '0x...',\n * btcAddress: 'bc1q...',\n * amount: '1.5',\n * chainId: ChainId.ethereum,\n * env: Env.prod,\n * });\n *\n * // Signer flow\n * const txHash = await unstakeLBTC({\n * signer: evmSigner,\n * account: '0x...',\n * btcAddress: 'bc1q...',\n * amount: '1.5',\n * chainId: ChainId.ethereum,\n * env: Env.prod,\n * });\n * ```\n */\nexport async function unstakeLBTC(params: IUnstakeLBTCParams): Promise<Hex> {\n return redeemToken({\n ...params,\n tokenIn: Token.LBTC,\n tokenOut: undefined,\n });\n}\n"],"names":["ASSET_ROUTER_ABI","getLBTCMintingFee","props","getMintingFee","Token","getLBTCBurningFee","getRedeemFee","token","chainId","rpcUrl","env","environment","determineEnv","publicClient","makePublicClient","tokenContract","getTokenContractInfo","AddressKind","tokenContractAbi","rawFeeValue","isUpgradedAbi","assetRouterAddress","assetRouter","fromSatoshi","toNativeCommissionValue","redeemFeeValue","getMinRedeemAmount","value","redeemForBtcMinAmountValue","getMinRedeemAmountWithFee","params","fee","minRedeem","StakeAndBakeValidationError","code","message","context","getStakeAndBakeConfig","protocol","protocolRegistry","DEFI_REGISTRY","tokenRegistry","envRegistry","registryEntry","PROTOCOL_DEFAULT_TOKENS","DefiProtocol","getStakeAndBakeFee","DEFAULT_ENV","protocolInfo","DefiProtocols","selectedToken","spenderContract","client","getContract","error","errorMessage","getErrorMessage","getAddressConfirmationMessage","signLbtcDestinationAddr","account","provider","walletClient","makeWalletClient","signNetworkFee","expiry","toUnix","now","DAY","typedData","BigNumber","_","v","getPermitNonce","owner","lbtcContract","nonce","EIP712_DOMAIN_TYPES","PERMIT_MESSAGE_TYPES","APPROVE_MESSAGE_TYPES","buildTypedData","primaryType","serializeTypedData","handleApproveFlow","tokenAddress","tokenAbi","spenderAddress","requiredAmount","currentAllowance","approvalTxHash","hash","handlePermitFlow","getStakeAndBakeTokenContract","calculateStakeAndBakeLBTCAmount","btcAmount","btcTokenRatio","_a","getExchangeRatio","signStakeAndBake","strategy","permitValue","deadline","SignerError","validateTransactionRequest","tx","operation","isHex","createAccountFromSigner","signer","address","chain","CHAIN_ID_TO_VIEM_CHAIN_MAP","transaction","evmTx","signedTx","serialized","createWalletClientFromSigner","createWalletClient","http","executeContractTransaction","simulateArgs","isProviderFlow","isSignerFlow","simulationResult","request","txHash","callData","encodeFunctionData","waitForTransactionReceipt","receipt","GMP_V1_SELECTOR","MINT_SELECTOR","gmpPayloadAbi","mintAbi","decodeGmpMintPayload","hexData","selector","decoded","decodeFunctionData","msgPath","msgNonce","msgSender","msgRecipient","msgDestinationCaller","msgBody","bodySelector","mintDecoded","toToken","recipient","amount","calcMintIDFromDecoded","mint","encoded","encodeAbiParameters","keccak256","KATANA_BASCULE_ABI","BasculeDepositStatus","getBasculeDepositStatus","deposit","rawPayload","payload","tokenContractInfo","basculeContractAddress","ChainId","zeroAddress","shouldCheckMintHistory","isKatanaChain","isMonadChain","isEthereumChain","isStableChain","isMegaethChain","prefixedPayload","mintId","status","basculeDepositId","LBTC_BASCULE_ABI","err","approveToken","spender","tokenInfo","getTokenInfo","amountBase","toBigInt","toBaseDenomination","getTokenAllowance","allowanceRaw","fromBaseDenomination","estimateGasFees","overwriteMaxPriorityFeePerGas","fees","multiplier","maxPriorityFeePerGas","maxFeePerGas","mintToken","data","proofSignature","basculeStatus","ensureHex","gasEstimationData","parseGwei","claimLBTC","AVAILABLE_FLOWS","getAssetRouterAddress","tokenIn","adapterContractInfo","depositToken","accountAddress","amountRaw","tokenOut","af","UnsupportedTokenFlow","tokenInContractInfo","tokenOutContractInfo","IN","retrieveTokenProperties","amountBigInt","tokenInBalanceRaw","tokenInBalance","redeemToken","btcAddress","outputScript","getOutputScript","adapter","assetRouterContractAddress","allowance","unstakeLBTC"],"mappings":";;;;;;;;;;;AAAA,MAAAA,IAAe;AAAA,EACb;AAAA,IACE,QAAQ,CAAA;AAAA,IACR,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ;AAAA,MACN;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ;AAAA,MACN;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ;AAAA,MACN;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ;AAAA,MACN;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ;AAAA,MACN;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ;AAAA,MACN;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ;AAAA,MACN;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ;AAAA,MACN;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ;AAAA,MACN;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ;AAAA,MACN;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ;AAAA,MACN;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ;AAAA,MACN;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ;AAAA,MACN;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ;AAAA,MACN;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,WAAW;AAAA,IACX,QAAQ;AAAA,MACN;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,WAAW;AAAA,IACX,QAAQ;AAAA,MACN;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,WAAW;AAAA,IACX,QAAQ;AAAA,MACN;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,WAAW;AAAA,IACX,QAAQ;AAAA,MACN;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,WAAW;AAAA,IACX,QAAQ;AAAA,MACN;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,WAAW;AAAA,IACX,QAAQ;AAAA,MACN;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,WAAW;AAAA,IACX,QAAQ;AAAA,MACN;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,WAAW;AAAA,IACX,QAAQ;AAAA,MACN;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,WAAW;AAAA,IACX,QAAQ;AAAA,MACN;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,WAAW;AAAA,IACX,QAAQ;AAAA,MACN;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,WAAW;AAAA,IACX,QAAQ;AAAA,MACN;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,WAAW;AAAA,IACX,QAAQ;AAAA,MACN;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,WAAW;AAAA,IACX,QAAQ;AAAA,MACN;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,WAAW;AAAA,IACX,QAAQ;AAAA,MACN;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,WAAW;AAAA,IACX,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,WAAW;AAAA,IACX,QAAQ;AAAA,MACN;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,WAAW;AAAA,IACX,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,WAAW;AAAA,IACX,QAAQ;AAAA,MACN;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,WAAW;AAAA,IACX,QAAQ;AAAA,MACN;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,WAAW;AAAA,IACX,QAAQ;AAAA,MACN;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,WAAW;AAAA,IACX,QAAQ;AAAA,MACN;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,WAAW;AAAA,IACX,QAAQ;AAAA,MACN;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,SAAS;AAAA,MACP;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,SAAS;AAAA,MACP;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,SAAS;AAAA,MACP;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,SAAS;AAAA,MACP;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,SAAS,CAAA;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,SAAS;AAAA,MACP;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ;AAAA,MACN;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,SAAS,CAAA;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ;AAAA,MACN;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,SAAS,CAAA;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ;AAAA,MACN;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,SAAS,CAAA;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,SAAS;AAAA,MACP;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ;AAAA,MACN;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,SAAS;AAAA,MACP;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,SAAS,CAAA;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ;AAAA,MACN;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,SAAS,CAAA;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ;AAAA,MACN;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,SAAS,CAAA;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ;AAAA,MACN;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,SAAS,CAAA;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ;AAAA,MACN;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,SAAS,CAAA;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ;AAAA,MACN;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,SAAS,CAAA;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ;AAAA,MACN;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,SAAS,CAAA;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ;AAAA,MACN;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,SAAS,CAAA;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ;AAAA,MACN;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,SAAS,CAAA;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ;AAAA,MACN;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,SAAS,CAAA;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ;AAAA,MACN;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,SAAS,CAAA;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ;AAAA,MACN;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,SAAS,CAAA;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ;AAAA,MACN;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,SAAS,CAAA;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,SAAS;AAAA,MACP;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,SAAS;AAAA,MACP;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,SAAS;AAAA,MACP;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ;AAAA,MACN;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,SAAS,CAAA;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ;AAAA,MACN;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,SAAS,CAAA;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ;AAAA,MACN;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,SAAS;AAAA,MACP;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ;AAAA,MACN;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,SAAS;AAAA,MACP;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ;AAAA,MACN;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,SAAS;AAAA,MACP;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ;AAAA,MACN;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,SAAS,CAAA;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ;AAAA,MACN;AAAA,QACE,YAAY;AAAA,UACV;AAAA,YACE,cAAc;AAAA,YACd,MAAM;AAAA,YACN,MAAM;AAAA,UAAA;AAAA,UAER;AAAA,YACE,cAAc;AAAA,YACd,MAAM;AAAA,YACN,MAAM;AAAA,UAAA;AAAA,UAER;AAAA,YACE,cAAc;AAAA,YACd,MAAM;AAAA,YACN,MAAM;AAAA,UAAA;AAAA,UAER;AAAA,YACE,cAAc;AAAA,YACd,MAAM;AAAA,YACN,MAAM;AAAA,UAAA;AAAA,UAER;AAAA,YACE,cAAc;AAAA,YACd,MAAM;AAAA,YACN,MAAM;AAAA,UAAA;AAAA,UAER;AAAA,YACE,cAAc;AAAA,YACd,MAAM;AAAA,YACN,MAAM;AAAA,UAAA;AAAA,UAER;AAAA,YACE,cAAc;AAAA,YACd,MAAM;AAAA,YACN,MAAM;AAAA,UAAA;AAAA,QACR;AAAA,QAEF,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,SAAS;AAAA,MACP;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ;AAAA,MACN;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,SAAS;AAAA,MACP;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ;AAAA,MACN;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,SAAS,CAAA;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,SAAS;AAAA,MACP;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ;AAAA,MACN;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,SAAS;AAAA,MACP;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ;AAAA,MACN;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,SAAS;AAAA,MACP;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ;AAAA,MACN;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,SAAS,CAAA;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,SAAS;AAAA,MACP;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ;AAAA,MACN;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,SAAS;AAAA,MACP;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,SAAS;AAAA,MACP;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,SAAS;AAAA,MACP;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,SAAS;AAAA,MACP;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ;AAAA,MACN;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,SAAS;AAAA,MACP;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ;AAAA,MACN;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,SAAS,CAAA;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ;AAAA,MACN;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,SAAS,CAAA;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ;AAAA,MACN;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,SAAS,CAAA;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ;AAAA,MACN;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,SAAS,CAAA;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ;AAAA,MACN;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,SAAS,CAAA;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ;AAAA,MACN;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,SAAS,CAAA;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,SAAS,CAAA;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ;AAAA,MACN;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,SAAS,CAAA;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ;AAAA,MACN;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,SAAS,CAAA;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ;AAAA,MACN;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,SAAS;AAAA,MACP;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ;AAAA,MACN;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,SAAS;AAAA,MACP;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,SAAS,CAAA;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ;AAAA,MACN;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,SAAS;AAAA,MACP;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAEV;ACz5DA,eAAsBC,GACpBC,GACoB;AACpB,SAAOC,GAAc,EAAE,OAAOC,EAAM,MAAM,GAAGF,GAAO;AACtD;AAGA,eAAsBG,GAAkBH,GAAyB;AAC/D,SAAOI,GAAa,EAAE,OAAOF,EAAM,MAAM,GAAGF,GAAO;AACrD;AAEA,eAAsBC,GAAc;AAAA,EAClC,OAAAI;AAAA,EACA,SAAAC;AAAA,EACA,QAAAC;AAAA,EACA,KAAAC;AACF,GAAwC;AACtC,MAAI,CAAC,CAACN,EAAM,MAAMA,EAAM,MAAMA,EAAM,IAAI,EAAE,SAASG,CAAK;AACtD,UAAM,IAAI,MAAM,sBAAsBA,CAAK,EAAE;AAG/C,QAAMI,IAAcD,KAAOE,EAAaJ,CAAO,GAEzCK,IAAeC,EAAiB,EAAE,SAAAN,GAAS,QAAAC,GAAQ,KAAKE,GAAa,GACrEI,IAAgB,MAAMC;AAAA,IAC1BT;AAAA,IACAC;AAAA,IACAG;AAAA,IACAM,EAAY;AAAA,EAAA,GAERC,IAAmBH,EAAc;AAEvC,MAAII,IAAc;AAElB,MAAIC,EAAcF,CAAgB,KAAKX,MAAUH,EAAM,MAAM;AAC3D,UAAMiB,IAAqB,MAAMR,EAAa,aAAa;AAAA,MACzD,KAAKK;AAAA,MACL,SAASH,EAAc;AAAA,MACvB,cAAc;AAAA,IAAA,CACf,GAEKO,IAAc;AAAA,MAClB,KAAKtB;AAAA,MACL,SAASqB;AAAA,IAAA;AAGX,IAAAF,IAAe,MAAMN,EAAa,aAAa;AAAA,MAC7C,KAAKS,EAAY;AAAA,MACjB,SAASA,EAAY;AAAA,MACrB,cAAc;AAAA,MACd,MAAM,CAACP,EAAc,OAAO;AAAA,IAAA,CAC7B;AAAA,EACH;AACE,IAAAI,IAAc,MAAMN,EAAa,aAAa;AAAA,MAC5C,KAAKE,EAAc;AAAA,MACnB,SAASA,EAAc;AAAA,MACvB,cAAc;AAAA,IAAA,CACf;AAGH,SAAOQ,EAAY,OAAOJ,CAAW,CAAC;AACxC;AAEA,eAAsBb,GAAa;AAAA,EACjC,OAAAC;AAAA,EACA,SAAAC;AAAA,EACA,QAAAC;AAAA,EACA,KAAAC;AACF,GAAwC;AACtC,MAAI,CAAC,CAACN,EAAM,MAAMA,EAAM,MAAMA,EAAM,IAAI,EAAE,SAASG,CAAK;AACtD,UAAM,IAAI,MAAM,sBAAsBA,CAAK,EAAE;AAE/C,QAAMI,IAAcD,KAAOE,EAAaJ,CAAO,GAEzCK,IAAeC,EAAiB,EAAE,SAAAN,GAAS,QAAAC,GAAQ,KAAKE,GAAa,GACrEI,IAAgB,MAAMC;AAAA,IAC1BT;AAAA,IACAC;AAAA,IACAG;AAAA,IACAM,EAAY;AAAA,EAAA;AAGd,MAAIE,IAAc;AAClB,MAAIC,EAAcL,EAAc,GAAG,KAAKR,MAAUH,EAAM,MAAM;AAC5D,UAAMiB,IAAqB,MAAMR,EAAa,aAAa;AAAA,MACzD,KAAKE,EAAc;AAAA,MACnB,SAASA,EAAc;AAAA,MACvB,cAAc;AAAA,IAAA,CACf,GAEKO,IAAc;AAAA,MAClB,KAAKtB;AAAA,MACL,SAASqB;AAAA,IAAA,GAILG,IAA2B,MAAMX,EAAa,aAAa;AAAA,MAC/D,KAAKS,EAAY;AAAA,MACjB,SAASA,EAAY;AAAA,MACrB,cAAc;AAAA,MACd,MAAM,CAACP,EAAc,OAAO;AAAA,IAAA,CAC7B,GAGK;AAAA,MAACU;AAAA;AAAA,IAAA,IACJ,MAAMZ,EAAa,aAAa;AAAA,MAC/B,KAAKS,EAAY;AAAA,MACjB,SAASA,EAAY;AAAA,MACrB,cAAc;AAAA,MACd,MAAM,CAACP,EAAc,OAAO;AAAA,IAAA,CAC7B;AAEH,IAAAI,IAAcK,IAA0BC;AAAA,EAC1C;AAEE,IAAAN,IAAc,MAAMN,EAAa,aAAa;AAAA,MAC5C,KAAKE,EAAc;AAAA,MACnB,SAASA,EAAc;AAAA,MACvB,cAAc;AAAA,IAAA,CACf;AAGH,SAAOQ,EAAY,OAAOJ,CAAW,CAAC;AACxC;AAEA,eAAsBO,GAAmB;AAAA,EACvC,OAAAnB;AAAA,EACA,SAAAC;AAAA,EACA,QAAAC;AAAA,EACA,KAAAC;AACF,GAAwC;AACtC,MAAI,CAAC,CAACN,EAAM,MAAMA,EAAM,MAAMA,EAAM,IAAI,EAAE,SAASG,CAAK;AACtD,UAAM,IAAI,MAAM,sBAAsBA,CAAK,EAAE;AAG/C,QAAMI,IAAcD,KAAOE,EAAaJ,CAAO,GAEzCK,IAAeC,EAAiB,EAAE,SAAAN,GAAS,QAAAC,GAAQ,KAAKE,GAAa,GACrEI,IAAgB,MAAMC;AAAA,IAC1BT;AAAA,IACAC;AAAA,IACAG;AAAA,IACAM,EAAY;AAAA,EAAA;AAGd,MAAIU,IAAQ;AACZ,MAAIP,EAAcL,EAAc,GAAG,KAAKR,MAAUH,EAAM,MAAM;AAC5D,UAAMiB,IAAqB,MAAMR,EAAa,aAAa;AAAA,MACzD,KAAKE,EAAc;AAAA,MACnB,SAASA,EAAc;AAAA,MACvB,cAAc;AAAA,IAAA,CACf,GAEKO,IAAc;AAAA,MAClB,KAAKtB;AAAA,MACL,SAASqB;AAAA,IAAA,GAGL,GAAGO,CAA0B,IAAK,MAAMf,EAAa,aAAa;AAAA,MACtE,KAAKS,EAAY;AAAA,MACjB,SAASA,EAAY;AAAA,MACrB,cAAc;AAAA,MACd,MAAM,CAACP,EAAc,OAAO;AAAA,IAAA,CAC7B;AAED,IAAAY,IAAQC;AAAA,EACV;AAEE,IAAAD,IAAQ;AAGV,SAAOJ,EAAY,OAAOI,CAAK,CAAC;AAClC;AA0BA,eAAsBE,GACpBC,GACoB;AACpB,QAAM,CAACC,GAAKC,CAAS,IAAI,MAAM,QAAQ,IAAI;AAAA,IACzC1B,GAAawB,CAAM;AAAA,IACnBJ,GAAmBI,CAAM;AAAA,EAAA,CAC1B;AAED,SAAOC,EAAI,KAAKC,CAAS;AAC3B;AChNO,MAAMC,UAAoC,MAAM;AAAA,EACrD,YACkBC,GAChBC,GACgBC,GAChB;AACA,UAAMD,CAAO,GAJG,KAAA,OAAAD,GAEA,KAAA,UAAAE,GAGhB,KAAK,OAAO;AAAA,EACd;AACF;AAaO,SAASC,GACdC,GACA/B,GACAC,GACAE,GACsB;AAEtB,QAAM6B,IAAmBC,GAAcF,CAAQ;AAC/C,MAAI,CAACC;AACH,UAAM,IAAIN;AAAA,MACR;AAAA,MACA,SAASK,CAAQ;AAAA,MACjB,EAAE,UAAAA,EAAA;AAAA,IAAS;AAIf,QAAMG,IAAgBF,EAAiBhC,CAAsC;AAC7E,MAAI,CAACkC;AACH,UAAM,IAAIR;AAAA,MACR;AAAA,MACA,SAAS1B,CAAK,iDAAiD+B,CAAQ,uBAChD,OAAO,KAAKC,CAAgB,EAAE,KAAK,IAAI,CAAC;AAAA,MAC/D,EAAE,UAAAD,GAAU,OAAA/B,GAAO,iBAAiB,OAAO,KAAKgC,CAAgB,EAAA;AAAA,IAAE;AAItE,QAAMG,IAAcD,EAAc/B,CAAG;AACrC,MAAI,CAACgC;AACH,UAAM,IAAIT;AAAA,MACR;AAAA,MACA,eAAevB,CAAG,+BAA+BH,CAAK,aAAa+B,CAAQ;AAAA,MAC3E,EAAE,UAAAA,GAAU,OAAA/B,GAAO,KAAAG,EAAA;AAAA,IAAI;AAI3B,QAAMiC,IAAgBD,EAAYlC,CAAmC;AACrE,MAAI,CAACmC;AACH,UAAM,IAAIV;AAAA,MACR;AAAA,MACA,SAAS1B,CAAK,8BAA8BC,CAAO,cAAc8B,CAAQ,OAAO5B,CAAG,uBAC5D,OAAO,KAAKgC,CAAW,EAAE,KAAK,IAAI,CAAC;AAAA,MAC1D;AAAA,QACE,UAAAJ;AAAA,QACA,OAAA/B;AAAA,QACA,SAAAC;AAAA,QACA,KAAAE;AAAA,QACA,iBAAiB,OAAO,KAAKgC,CAAW;AAAA,MAAA;AAAA,IAC1C;AAIJ,SAAO;AAAA,IACL,UAAAJ;AAAA,IACA,OAAA/B;AAAA,IACA,KAAAG;AAAA,IACA,SAAAF;AAAA,IACA,GAAGmC;AAAA,EAAA;AAEP;AC/EA,MAAMC,KAAmE;AAAA,EACvE,CAACC,EAAa,IAAI,GAAGzC,EAAM;AAAA,EAC3B,CAACyC,EAAa,IAAI,GAAGzC,EAAM;AAC7B;AAgCA,eAAsB0C,GAAmB;AAAA,EACvC,UAAAR,IAAWO,EAAa;AAAA,EACxB,OAAAtC;AAAA,EACA,SAAAC;AAAA,EACA,KAAAE,IAAMqC;AAAAA,EACN,QAAAtC;AACF,GAAkD;AAChD,QAAMuC,IAAeC,GAAcX,CAAQ;AAC3C,MAAI,CAACU;AACH,UAAM,IAAI,MAAM,qBAAqBV,CAAQ,EAAE;AAIjD,QAAMY,IAAgB3C,KAASqC,GAAwBN,CAAQ;AAG/D,MAAI;AAQF,UAAMa,IAPWd;AAAA,MACfC;AAAA,MACAY;AAAA,MACA1C;AAAA,MACAE;AAAA,IAAA,EAG+B;AACjC,QAAI,CAACyC;AACH,YAAM,IAAI;AAAA,QACR,sDAAsDb,CAAQ,aAAa9B,CAAO;AAAA,MAAA;AAItF,UAAM4C,IAAStC,EAAiB,EAAE,SAAAN,GAAS,QAAAC,GAAQ,GAM7CsB,IAAM,MALKsB,GAAY;AAAA,MAC3B,KAAKF,EAAgB;AAAA,MACrB,SAASA,EAAgB;AAAA,MACzB,QAAAC;AAAA,IAAA,CACD,EAC0B,KAAK,mBAAA;AAChC,WAAO7B,EAAY,OAAOQ,CAAG,CAAC;AAAA,EAChC,SAASuB,GAAO;AACd,UAAMC,IAAeC,EAAgBF,CAAK;AAC1C,UAAM,IAAI;AAAA,MACR,wCAAwCN,EAAa,IAAI,KAAKO,CAAY;AAAA,IAAA;AAAA,EAE9E;AACF;ACnEO,SAASE,GACdjD,GACQ;AACR,SAAO,2BAA2BA,CAAO;AAC3C;AAcA,eAAsBkD,GAAwB;AAAA,EAC5C,SAAAC;AAAA,EACA,SAAAnD;AAAA,EACA,UAAAoD;AACF,GAAmD;AACjD,QAAMC,IAAeC,EAAiB,EAAE,SAAAtD,GAAS,UAAAoD,GAAU,GAErDzB,IAAUsB,GAA8BjD,CAAO;AAGrD,SAFe,MAAMqD,EAAa,YAAY,EAAE,SAAAF,GAAS,SAAAxB,GAAS;AAGpE;ACVA,eAAsB4B,GAAe;AAAA,EACnC,KAAAhC;AAAA,EACA,QAAAiC,IAASC,GAAOC,GAAA,IAAQC,EAAG;AAAA,EAC3B,SAAAR;AAAA,EACA,SAAAnD;AAAA,EACA,UAAAoD;AAAA,EACA,KAAAlD;AAAA,EACA,OAAAH,IAAQH,EAAM;AAChB,GAA4D;AAC1D,QAAMW,IAAgB,MAAMC,EAAqBT,GAAOC,GAASE,CAAG,GAC9DmD,IAAeC,EAAiB;AAAA,IACpC,SAAAtD;AAAA,IACA,UAAAoD;AAAA,EAAA,CACD,GAGKQ,IAAuB;AAAA,IAC3B,SAAAT;AAAA,IACA,QAAQ;AAAA,MACN,MAAMpD,MAAUH,EAAM,OAAO,YAAY;AAAA,MACzC,SAAS;AAAA,MACT,SAAAI;AAAA,MACA,mBAAmBO,EAAc;AAAA,IAAA;AAAA,IAEnC,SAAS;AAAA,MACP,SAAAP;AAAA,MACA,KAAK,OAAO6D,EAAUtC,CAAG,EAAE,SAAS;AAAA,MACpC,QAAAiC;AAAA,IAAA;AAAA,IAEF,aAAa;AAAA,IACb,OAAO;AAAA,MACL,cAAc;AAAA,QACZ,EAAE,MAAM,QAAQ,MAAM,SAAA;AAAA,QACtB,EAAE,MAAM,WAAW,MAAM,SAAA;AAAA,QACzB,EAAE,MAAM,WAAW,MAAM,UAAA;AAAA,QACzB,EAAE,MAAM,qBAAqB,MAAM,UAAA;AAAA,MAAU;AAAA,MAE/C,aAAa;AAAA,QACX,EAAE,MAAM,WAAW,MAAM,UAAA;AAAA,QACzB,EAAE,MAAM,OAAO,MAAM,UAAA;AAAA,QACrB,EAAE,MAAM,UAAU,MAAM,UAAA;AAAA,MAAU;AAAA,IACpC;AAAA,EACF;AAKF,SAAO;AAAA,IACL,WAHgB,MAAMH,EAAa,cAAcO,CAAS;AAAA,IAI1D,WAAW,KAAK;AAAA,MAAUA;AAAA,MAAW,CAACE,GAAGC,MACvC,OAAOA,KAAM,WAAWA,EAAE,aAAaA;AAAA,IAAA;AAAA,EACzC;AAEJ;AC/EA,eAAsBC,GAAe;AAAA,EACnC,OAAAC;AAAA,EACA,SAAAjE;AAAA,EACA,QAAAC;AAAA,EACA,KAAAC,IAAMqC;AACR,GAA2C;AACzC,QAAMpC,IAAcD,KAAOE,EAAaJ,CAAO,GAEzCK,IAAeC,EAAiB,EAAE,SAAAN,GAAS,QAAAC,GAAQ,GACnDiE,IAAe,MAAM1D;AAAA,IACzBZ,EAAM;AAAA,IACNI;AAAA,IACAG;AAAA,EAAA,GAGIgE,IAAQ,MAAM9D,EAAa,aAAa;AAAA,IAC5C,KAAK6D,EAAa;AAAA,IAClB,SAASA,EAAa;AAAA,IACtB,cAAc;AAAA,IACd,MAAM,CAACD,CAAK;AAAA,EAAA,CACb;AAED,SAAO,OAAOE,CAAK;AACrB;ACnCO,MAAMC,KAAsB;AAAA,EACjC,EAAE,MAAM,QAAQ,MAAM,SAAA;AAAA,EACtB,EAAE,MAAM,WAAW,MAAM,SAAA;AAAA,EACzB,EAAE,MAAM,WAAW,MAAM,UAAA;AAAA,EACzB,EAAE,MAAM,qBAAqB,MAAM,UAAA;AACrC,GAMaC,KAAuB;AAAA,EAClC,EAAE,MAAM,SAAS,MAAM,UAAA;AAAA,EACvB,EAAE,MAAM,WAAW,MAAM,UAAA;AAAA,EACzB,EAAE,MAAM,SAAS,MAAM,UAAA;AAAA,EACvB,EAAE,MAAM,SAAS,MAAM,UAAA;AAAA,EACvB,EAAE,MAAM,YAAY,MAAM,UAAA;AAC5B,GAMaC,KAAwBD;AAoD9B,SAASE,GAAejD,GAAyB;AACtD,QAAMkD,IAAclD,EAAO,SAAS,WAAW,WAAW;AAE1D,SAAO;AAAA,IACL,SAASA,EAAO;AAAA,IAChB,QAAQ;AAAA,MACN,MAAMA,EAAO;AAAA,MACb,SAASA,EAAO;AAAA,MAChB,SAAS,OAAOA,EAAO,OAAO;AAAA,MAC9B,mBAAmBA,EAAO;AAAA,IAAA;AAAA,IAE5B,OAAO;AAAA,MACL,cAAc8C;AAAA,MACd,CAACI,CAAW,GACVlD,EAAO,SAAS,WAAW+C,KAAuBC;AAAA,IAAA;AAAA,IAEtD,aAAAE;AAAA,IACA,SAAS;AAAA,MACP,OAAOlD,EAAO;AAAA,MACd,SAASA,EAAO;AAAA,MAChB,OAAOA,EAAO;AAAA,MACd,OAAOA,EAAO;AAAA,MACd,UAAUA,EAAO;AAAA,IAAA;AAAA,EACnB;AAEJ;AAgBO,SAASmD,GACdb,GACQ;AACR,SAAO,KAAK;AAAA,IAAUA;AAAA,IAAW,CAACE,GAAGC,MACnC,OAAOA,KAAM,WAAWA,EAAE,aAAaA;AAAA,EAAA;AAE3C;ACzHA,eAAsBW,GAAkBpD,GAUH;AACnC,QAAM;AAAA,IACJ,SAAA6B;AAAA,IACA,SAAAnD;AAAA,IACA,UAAAoD;AAAA,IACA,QAAAnD;AAAA,IACA,cAAA0E;AAAA,IACA,UAAAC;AAAA,IACA,gBAAAC;AAAA,IACA,WAAAjB;AAAA,IACA,gBAAAkB;AAAA,EAAA,IACExD,GAEEjB,IAAeC,EAAiB,EAAE,SAAAN,GAAS,QAAAC,GAAQ,GACnDoD,IAAeC,EAAiB,EAAE,SAAAtD,GAAS,UAAAoD,GAAU,GAGrD2B,IAAoB,MAAM1E,EAAa,aAAa;AAAA,IACxD,SAASsE;AAAA,IACT,KAAKC;AAAA,IACL,cAAc;AAAA,IACd,MAAM,CAACzB,GAAS0B,CAAc;AAAA,EAAA,CAC/B;AAED,MAAIG;AAGJ,MAAID,IAAmBD,GAAgB;AACrC,UAAMG,IAAO,MAAM5B,EAAa,cAAc;AAAA,MAC5C,SAASsB;AAAA,MACT,KAAKC;AAAA,MACL,cAAc;AAAA,MACd,MAAM,CAACC,GAAgBC,CAAc;AAAA,MACrC,SAAA3B;AAAA,MACA,OAAO;AAAA,IAAA,CACR;AAKD,SAFgB,MAAM9C,EAAa,0BAA0B,EAAE,MAAA4E,GAAM,GAEzD,WAAW;AACrB,YAAM,IAAI;AAAA,QACR,+BAA+BA,CAAI;AAAA,MAAA;AAIvC,IAAAD,IAAiBC;AAAA,EACnB;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,WAAW;AAAA,IACX,WAAWR,GAAmBb,CAAS;AAAA,IACvC,gBAAAoB;AAAA,EAAA;AAEJ;ACpEA,eAAsBE,GAAiB5D,GAIF;AACnC,QAAM,EAAE,SAAAtB,GAAS,UAAAoD,GAAU,WAAAQ,EAAA,IAActC;AAKzC,SAAO;AAAA,IACL,MAAM;AAAA,IACN,WAJgB,MADGgC,EAAiB,EAAE,SAAAtD,GAAS,UAAAoD,GAAU,EACtB,cAAcQ,CAAS;AAAA,IAK1D,WAAWa,GAAmBb,CAAS;AAAA,EAAA;AAE3C;ACAO,MAAMuB,KAA+B,OAC1CpF,GACAC,GACAE,MAEI,CAACH,KAASA,MAAU,SAASA,MAAUH,EAAM,OACxC,MAAMY,EAAqBZ,EAAM,MAAMI,GAASE,CAAG,IAGrD,MAAMM,EAAqBT,GAAOC,GAASE,GAAKO,EAAY,KAAK;AAW1E,eAAsB2E,GACpBC,GACAnF,GACoB;;AACpB,MAAI;AAEF,UAAMoF,MAAgBC,KADP,MAAMC,GAAiB,EAAE,KAAAtF,GAAK,GAChB,SAAP,gBAAAqF,EAAa,kBAAiB,IAAI1B,EAAU,CAAC;AAGnE,WAFmB,IAAIA,EAAUwB,CAAS,EAAE,UAAUC,CAAa;AAAA,EAGrE,QAAQ;AACN,UAAM,IAAI,MAAM,iDAAiD;AAAA,EACnE;AACF;AC+BA,eAAsBG,GAAiB;AAAA,EACrC,SAAAtC;AAAA,EACA,QAAAK,IAASC,GAAOC,GAAA,IAAQC,EAAG;AAAA,EAC3B,OAAAxC;AAAA;AAAA,EAEA,UAAUW,IAAWO,EAAa;AAAA,EAClC,OAAAtC,IAAQ;AAAA,EACR,SAAAC;AAAA,EACA,UAAAoD;AAAA,EACA,QAAAnD;AAAA,EACA,KAAAC,IAAMqC;AACR,GAA8D;AAC5D,QAAMmD,IAAW7D,GAAsBC,GAAU/B,GAAOC,GAASE,CAAG,GAE9D2E,IAAiBa,EAAS,gBAAgB,SAG1CC,IACJD,EAAS,mBAAmB,cACxB,MAAMN,GAAgCjE,GAAOjB,CAAG,IAChD,IAAI2D,EAAU1C,CAAK,GAGnBZ,IAAgB,MAAM4E,GAA6BpF,GAAOC,GAASE,CAAG,GACtEyE,IAAepE,EAAc,SAC7BqE,IAAWrE,EAAc,KAGzBqF,IACJF,EAAS,SAAS,qBAAqB,SAAS,KAAK,OAAOlC,CAAM,GAG9DW,IACJuB,EAAS,SAAS,kBAAkB,UAChC,OAAO,MAAM1B,GAAe,EAAE,OAAOb,GAAS,SAAAnD,GAAS,QAAAC,GAAQ,KAAAC,EAAA,CAAK,CAAC,IACrE,IAGA0D,IAAYW,GAAe;AAAA,IAC/B,MAAMmB,EAAS,SAAS;AAAA,IACxB,SAAAvC;AAAA,IACA,SAAAnD;AAAA,IACA,mBAAmB2E;AAAA,IACnB,YAAYe,EAAS,SAAS;AAAA,IAC9B,eAAeA,EAAS,SAAS;AAAA,IACjC,SAASb;AAAA,IACT,OAAO,OAAOc,EAAY,QAAQ,GAAG9B,EAAU,UAAU,CAAC;AAAA,IAC1D,OAAAM;AAAA,IACA,UAAAyB;AAAA,EAAA,CACD;AAGD,SAAIF,EAAS,SAAS,SAAS,YACtBhB,GAAkB;AAAA,IACvB,SAAAvB;AAAA,IACA,SAAAnD;AAAA,IACA,UAAAoD;AAAA,IACA,QAAAnD;AAAA,IACA,cAAA0E;AAAA,IACA,UAAAC;AAAA,IACA,gBAAAC;AAAA,IACA,WAAAjB;AAAA,IACA,gBAAgB,OAAO+B,EAAY,QAAQ,GAAG9B,EAAU,UAAU,CAAC;AAAA,EAAA,CACpE,IAIIqB,GAAiB,EAAE,SAAAlF,GAAS,UAAAoD,GAAU,WAAAQ,GAAW;AAC1D;AC/EO,MAAMiC,UAAoB,MAAM;AAAA,EACrC,YACkBnE,GAChBC,GACgBC,GAChB;AACA,UAAMD,CAAO,GAJG,KAAA,OAAAD,GAEA,KAAA,UAAAE,GAGhB,KAAK,OAAO;AAAA,EACd;AACF;AASO,SAASkE,GACdC,GACAC,IAAY,eACN;AACN,MAAI,CAACD,EAAG;AACN,UAAM,IAAIF;AAAA,MACR;AAAA,MACA,8BAA8BG,CAAS;AAAA,MACvC,EAAE,aAAaD,GAAI,WAAAC,EAAA;AAAA,IAAU;AAIjC,MAAI,CAACD,EAAG;AACN,UAAM,IAAIF;AAAA,MACR;AAAA,MACA,4BAA4BG,CAAS;AAAA,MACrC,EAAE,aAAaD,GAAI,WAAAC,EAAA;AAAA,IAAU;AAIjC,MAAID,EAAG,SAAS,UAAa,CAACE,GAAMF,EAAG,IAAI;AACzC,UAAM,IAAIF;AAAA,MACR;AAAA,MACA,iDAAiDG,CAAS;AAAA,MAC1D,EAAE,aAAaD,GAAI,WAAAC,GAAW,MAAMD,EAAG,KAAA;AAAA,IAAK;AAIhD,MAAIA,EAAG,WAAW,CAAC,mBAAmB,KAAKA,EAAG,OAAO;AACnD,UAAM,IAAIF;AAAA,MACR;AAAA,MACA,mDAAmDG,CAAS;AAAA,MAC5D,EAAE,aAAaD,GAAI,WAAAC,GAAW,SAASD,EAAG,QAAA;AAAA,IAAQ;AAGxD;AAqCO,SAASG,GACdC,GACAC,GACApG,GACc;AACd,QAAMqG,IAAQC,EAA2BtG,CAAO;AAEhD,MAAI,CAACqG;AACH,UAAM,IAAIR;AAAA,MACR;AAAA,MACA,YAAY7F,CAAO;AAAA,MACnB,EAAE,SAAAA,GAAS,iBAAiB,OAAO,KAAKsG,CAA0B,EAAA;AAAA,IAAE;AAqFxE,SA9EoC;AAAA,IAClC,SAAAF;AAAA,IACA,MAAM;AAAA,IACN,WACE;AAAA,IACF,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,IAMR,MAAM,gBAAgBG,GAAoD;AAExE,YAAMC,IAA+B;AAAA,QACnC,MAAMJ;AAAA,QACN,IAAIG,EAAY,MAAM;AAAA,QACtB,MAAMA,EAAY;AAAA,QAClB,OAAOA,EAAY;AAAA,QACnB,KAAKA,EAAY;AAAA,QACjB,cAAcA,EAAY;AAAA,QAC1B,sBAAsBA,EAAY;AAAA,QAClC,SAASA,EAAY,UACjB,KAAKA,EAAY,QAAQ,SAAS,EAAE,CAAC,KACrC,KAAKF,EAAM,GAAG,SAAS,EAAE,CAAC;AAAA,QAC9B,OAAOE,EAAY;AAAA,MAAA;AAIrB,MAAAT,GAA2BU,GAAO,iBAAiB;AAKnD,UAAIC;AAQJ,UANA,MAAMN,EAAO,KAAKK,GAAO,OAAME,OAC7BD,IAAWC,GAEJA,EACR,GAEG,CAACD;AACH,cAAM,IAAIZ;AAAA,UACR;AAAA,UACA;AAAA,UACA,EAAE,aAAaW,EAAA;AAAA,QAAM;AAKzB,aAAOC;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,MAAM,cAA4B;AAChC,YAAM,IAAIZ;AAAA,QACR;AAAA,QACA;AAAA,QACA,EAAE,QAAQ,cAAA;AAAA,MAAc;AAAA,IAE5B;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,MAAM,gBAA8B;AAClC,YAAM,IAAIA;AAAA,QACR;AAAA,QACA;AAAA,QACA,EAAE,QAAQ,gBAAA;AAAA,MAAgB;AAAA,IAE9B;AAAA,EAAA;AAIJ;AAuBO,SAASc,GACdR,GACAC,GACApG,GACc;AACd,QAAMqG,IAAQC,EAA2BtG,CAAO;AAEhD,MAAI,CAACqG;AACH,UAAM,IAAIR;AAAA,MACR;AAAA,MACA,YAAY7F,CAAO;AAAA,MACnB,EAAE,SAAAA,EAAA;AAAA,IAAQ;AAId,QAAMmD,IAAU+C,GAAwBC,GAAQC,GAASpG,CAAO;AAEhE,SAAO4G,GAAmB;AAAA,IACxB,SAAAzD;AAAA,IACA,OAAAkD;AAAA,IACA,WAAWQ,GAAA;AAAA;AAAA,EAAK,CACjB;AACH;AC3MA,eAAsBC,EAA2B;AAAA,EAC/C,QAAAxF;AAAA,EACA,cAAAjB;AAAA,EACA,cAAAgD;AAAA,EACA,cAAA0D;AAAA,EACA,WAAAf;AACF,GAA8D;AAE5D,MAAI,CAACgB,EAAe1F,CAAM,KAAK,CAAC2F,GAAa3F,CAAM;AACjD,UAAM,IAAIuE;AAAA,MACR;AAAA,MACA;AAAA,MACA,EAAE,QAAAvE,GAAQ,WAAA0E,EAAA;AAAA,IAAU;AAKxB,MAAIkB;AACJ,MAAI;AAGF,IAAAA,IAAmB,MAAM7G,EAAa;AAAA,MACpC0G;AAAA,IAAA;AAAA,EAEJ,SAASjE,GAAO;AACd,UAAM,IAAI+C;AAAA,MACR;AAAA,MACA,sBAAsBG,CAAS,iBAAiBlD,aAAiB,QAAQA,EAAM,UAAU,eAAe;AAAA,MACxG;AAAA,QACE,WAAAkD;AAAA,QACA,cAAAe;AAAA,QACA,OAAOjE,aAAiB,QAAQA,EAAM,UAAU,OAAOA,CAAK;AAAA,MAAA;AAAA,IAC9D;AAAA,EAEJ;AAEA,QAAM,EAAE,SAAAqE,MAAYD;AAGpB,MAAI,CAACC,EAAQ;AACX,UAAM,IAAItB;AAAA,MACR;AAAA,MACA,mDAAmDG,CAAS;AAAA,MAC5D,EAAE,WAAAA,GAAW,SAAAmB,EAAA;AAAA,IAAQ;AAIzB,MAAI,CAACA,EAAQ;AACX,UAAM,IAAItB;AAAA,MACR;AAAA,MACA,0DAA0DG,CAAS;AAAA,MACnE,EAAE,WAAAA,GAAW,SAAAmB,EAAA;AAAA,IAAQ;AAKzB,MAAIC;AAEJ,MAAIJ,EAAe1F,CAAM,GAAG;AAE1B,QAAI,CAAC+B;AACH,YAAM,IAAIwC;AAAA,QACR;AAAA,QACA;AAAA,QACA,EAAE,WAAAG,GAAW,QAAA1E,EAAA;AAAA,MAAO;AAIxB,QAAI;AACF,MAAA8F,IAAS,MAAM/D,EAAa,cAAc8D,CAAO;AAAA,IACnD,SAASrE,GAAO;AACd,YAAM,IAAI+C;AAAA,QACR;AAAA,QACA,qBAAqBG,CAAS,kBAAkBlD,aAAiB,QAAQA,EAAM,UAAU,eAAe;AAAA,QACxG;AAAA,UACE,WAAAkD;AAAA,UACA,SAAAmB;AAAA,UACA,OAAOrE,aAAiB,QAAQA,EAAM,UAAU,OAAOA,CAAK;AAAA,QAAA;AAAA,MAC9D;AAAA,IAEJ;AAAA,EACF;AAEE,QAAI;AACF,YAAMuD,IAAQC,EAA2BhF,EAAO,OAAO;AAEvD,UAAI,CAAC+E;AACH,cAAM,IAAIR;AAAA,UACR;AAAA,UACA,SAASvE,EAAO,OAAO;AAAA,UACvB,EAAE,SAASA,EAAO,QAAA;AAAA,QAAQ;AAM9B,YAAM+F,IAAWC,GAAmB;AAAA,QAClC,KAAKP,EAAa;AAAA,QAClB,cAAcA,EAAa;AAAA,QAC3B,MAAMA,EAAa;AAAA,MAAA,CACpB,GAGKP,IAA+B;AAAA,QACnC,MAAMlF,EAAO;AAAA,QACb,IAAI6F,EAAQ;AAAA,QACZ,MAAME;AAAA,QACN,OAAOF,EAAQ;AAAA,QACf,KAAKA,EAAQ;AAAA,QACb,cAAcA,EAAQ;AAAA,QACtB,sBAAsBA,EAAQ;AAAA,QAC9B,SAAS,KAAKd,EAAM,GAAG,SAAS,EAAE,CAAC;AAAA,MAAA;AAIrC,MAAAP,GAA2BU,GAAOR,CAAS,GAG3CoB,IAAS,MAAM9F,EAAO,OAAO,KAAKkF,GAAO,OAAMC,MAEtC,MAAMpG,EAAa,mBAAmB;AAAA,QAC3C,uBAAuBoG;AAAA,MAAA,CACxB,CACF;AAAA,IACH,SAAS3D,GAAO;AACd,YAAM,IAAI+C;AAAA,QACR;AAAA,QACA,qBAAqBG,CAAS,gBAAgBlD,aAAiB,QAAQA,EAAM,UAAU,eAAe;AAAA,QACtG;AAAA,UACE,WAAAkD;AAAA,UACA,SAAAmB;AAAA,UACA,OAAOrE,aAAiB,QAAQA,EAAM,UAAU,OAAOA,CAAK;AAAA,QAAA;AAAA,MAC9D;AAAA,IAEJ;AAGF,SAAO,EAAE,QAAAsE,GAAQ,SAAAD,EAAA;AACnB;AAUA,eAAsBI,GACpBlH,GACA+G,GACApB,GACA;AACA,MAAI;AACF,UAAMwB,IAAU,MAAMnH,EAAa,0BAA0B;AAAA,MAC3D,MAAM+G;AAAA,IAAA,CACP;AAED,QAAII,EAAQ,WAAW;AACrB,YAAM,IAAI3B;AAAA,QACR;AAAA,QACA,GAAGG,CAAS;AAAA,QACZ;AAAA,UACE,WAAAA;AAAA,UACA,QAAAoB;AAAA,UACA,SAAS;AAAA,YACP,aAAaI,EAAQ;AAAA,YACrB,SAASA,EAAQ;AAAA,UAAA;AAAA,QACnB;AAAA,MACF;AAIJ,WAAOA;AAAA,EACT,SAAS1E,GAAO;AACd,UAAIA,aAAiB+C,IACb/C,IAGF,IAAI+C;AAAA,MACR;AAAA,MACA,sBAAsBG,CAAS,yBAAyBlD,aAAiB,QAAQA,EAAM,UAAU,eAAe;AAAA,MAChH;AAAA,QACE,WAAAkD;AAAA,QACA,QAAAoB;AAAA,QACA,OAAOtE,aAAiB,QAAQA,EAAM,UAAU,OAAOA,CAAK;AAAA,MAAA;AAAA,IAC9D;AAAA,EAEJ;AACF;ACxSA,MAAM2E,IAAkB,cAClBC,IAAgB,cAGhBC,KAAgB;AAAA,EACpB,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AAAA,IACN,EAAE,MAAM,WAAW,MAAM,UAAA;AAAA,IACzB,EAAE,MAAM,YAAY,MAAM,UAAA;AAAA,IAC1B,EAAE,MAAM,aAAa,MAAM,UAAA;AAAA,IAC3B,EAAE,MAAM,gBAAgB,MAAM,UAAA;AAAA,IAC9B,EAAE,MAAM,wBAAwB,MAAM,UAAA;AAAA,IACtC,EAAE,MAAM,WAAW,MAAM,QAAA;AAAA,EAAQ;AAErC,GAGMC,KAAU;AAAA,EACd,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AAAA,IACN,EAAE,MAAM,WAAW,MAAM,UAAA;AAAA,IACzB,EAAE,MAAM,aAAa,MAAM,UAAA;AAAA,IAC3B,EAAE,MAAM,UAAU,MAAM,UAAA;AAAA,EAAU;AAEtC;AAoCO,SAASC,GAAqBC,GAAoC;AACvE,MAAI,CAACA,EAAQ,WAAW,IAAI;AAC1B,UAAM,IAAI,MAAM,iCAAiC;AAInD,QAAMC,IAAWD,EAAQ,MAAM,GAAG,EAAE;AACpC,MAAIC,EAAS,YAAA,MAAkBN,EAAgB;AAC7C,UAAM,IAAI;AAAA,MACR,kCAAkCA,CAAe,SAASM,CAAQ;AAAA,IAAA;AAKtE,QAAMC,IAAUC,EAAmB;AAAA,IACjC,KAAK,CAACN,EAAa;AAAA,IACnB,MAAMG;AAAA,EAAA,CACP;AAED,MAAI,CAACE,EAAQ;AACX,UAAM,IAAI,MAAM,iDAAiD;AAGnE,QAAME,IAAUF,EAAQ,KAAK,CAAC,GACxBG,IAAWH,EAAQ,KAAK,CAAC,GACzBI,IAAYJ,EAAQ,KAAK,CAAC,GAC1BK,IAAeL,EAAQ,KAAK,CAAC,GAC7BM,IAAuBN,EAAQ,KAAK,CAAC,GACrCO,IAAUP,EAAQ,KAAK,CAAC;AAE9B,MAAI,OAAOO,KAAY,YAAY,CAACA,EAAQ,WAAW,IAAI;AACzD,UAAM,IAAI,MAAM,0BAA0B;AAI5C,QAAMC,IAAeD,EAAQ,MAAM,GAAG,EAAE;AACxC,MAAIC,EAAa,YAAA,MAAkBd,EAAc;AAC/C,UAAM,IAAI;AAAA,MACR,2CAA2CA,CAAa,SAASc,CAAY;AAAA,IAAA;AAKjF,QAAMC,IAAcR,EAAmB;AAAA,IACrC,KAAK,CAACL,EAAO;AAAA,IACb,MAAMW;AAAA,EAAA,CACP;AAED,MAAI,CAACE,EAAY;AACf,UAAM,IAAI,MAAM,+CAA+C;AAGjE,QAAMC,IAAUD,EAAY,KAAK,CAAC,GAC5BE,IAAYF,EAAY,KAAK,CAAC,GAC9BG,IAASH,EAAY,KAAK,CAAC;AAEjC,SAAO;AAAA,IACL,UAAAV;AAAA,IACA,SAAAG;AAAA,IACA,UAAAC;AAAA,IACA,WAAAC;AAAA,IACA,cAAAC;AAAA,IACA,sBAAAC;AAAA,IACA,SAASC;AAAA,IACT,MAAM;AAAA,MACJ,UAAUC;AAAA,MACV,SAAAE;AAAA,MACA,WAAAC;AAAA,MACA,QAAAC;AAAA,IAAA;AAAA,EACF;AAEJ;AAQO,SAASC,GACdb,GACAhI,GACQ;AACR,QAAM,EAAE,UAAAmI,GAAU,MAAAW,EAAA,IAASd,GAGrBe,IAAUC;AAAA,IACd;AAAA,MACE,EAAE,MAAM,SAAS,MAAM,UAAA;AAAA,MACvB,EAAE,MAAM,WAAW,MAAM,UAAA;AAAA,MACzB,EAAE,MAAM,aAAa,MAAM,UAAA;AAAA,MAC3B,EAAE,MAAM,WAAW,MAAM,UAAA;AAAA,MACzB,EAAE,MAAM,UAAU,MAAM,UAAA;AAAA,IAAU;AAAA,IAEpC;AAAA,MACE,OAAOb,CAAQ;AAAA;AAAA,MACf,OAAOnI,CAAO;AAAA;AAAA,MACd8I,EAAK;AAAA;AAAA,MACLA,EAAK;AAAA;AAAA,MACL,OAAOA,EAAK,MAAM;AAAA;AAAA,IAAA;AAAA,EACpB;AAIF,SAAOG,GAAUF,CAAO;AAC1B;ACzKA,MAAAG,KAAe;AAAA,EACb;AAAA,IACE,QAAQ;AAAA,MACN,EAAE,cAAc,WAAW,MAAM,iBAAiB,MAAM,UAAA;AAAA,MACxD,EAAE,cAAc,WAAW,MAAM,WAAW,MAAM,UAAA;AAAA,MAClD,EAAE,cAAc,WAAW,MAAM,iBAAiB,MAAM,UAAA;AAAA,MACxD,EAAE,cAAc,WAAW,MAAM,kBAAkB,MAAM,UAAA;AAAA,MACzD,EAAE,cAAc,WAAW,MAAM,aAAa,MAAM,UAAA;AAAA,MACpD,EAAE,cAAc,WAAW,MAAM,kBAAkB,MAAM,UAAA;AAAA,IAAU;AAAA,IAErE,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,QAAQ,CAAA,GAAI,MAAM,gCAAgC,MAAM,QAAA;AAAA,EAC1D;AAAA,IACE,QAAQ,CAAC,EAAE,cAAc,UAAU,MAAM,YAAY,MAAM,UAAU;AAAA,IACrE,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ;AAAA,MACN,EAAE,cAAc,WAAW,MAAM,gBAAgB,MAAM,UAAA;AAAA,IAAU;AAAA,IAEnE,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ;AAAA,MACN,EAAE,cAAc,WAAW,MAAM,WAAW,MAAM,UAAA;AAAA,MAClD,EAAE,cAAc,WAAW,MAAM,cAAc,MAAM,UAAA;AAAA,IAAU;AAAA,IAEjE,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ;AAAA,MACN,EAAE,cAAc,WAAW,MAAM,UAAU,MAAM,UAAA;AAAA,MACjD,EAAE,cAAc,WAAW,MAAM,cAAc,MAAM,UAAA;AAAA,IAAU;AAAA,IAEjE,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,QAAQ,CAAA,GAAI,MAAM,qBAAqB,MAAM,QAAA;AAAA,EAC/C,EAAE,QAAQ,CAAA,GAAI,MAAM,iBAAiB,MAAM,QAAA;AAAA,EAC3C;AAAA,IACE,QAAQ;AAAA,MACN,EAAE,cAAc,WAAW,MAAM,SAAS,MAAM,UAAA;AAAA,MAChD,EAAE,cAAc,WAAW,MAAM,UAAU,MAAM,UAAA;AAAA,MACjD,EAAE,cAAc,SAAS,MAAM,SAAS,MAAM,QAAA;AAAA,IAAQ;AAAA,IAExD,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,QAAQ,CAAA,GAAI,MAAM,iBAAiB,MAAM,QAAA;AAAA,EAC3C,EAAE,QAAQ,CAAA,GAAI,MAAM,iBAAiB,MAAM,QAAA;AAAA,EAC3C;AAAA,IACE,QAAQ;AAAA,MACN,EAAE,cAAc,WAAW,MAAM,UAAU,MAAM,UAAA;AAAA,MACjD,EAAE,cAAc,WAAW,MAAM,cAAc,MAAM,UAAA;AAAA,IAAU;AAAA,IAEjE,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAC,EAAE,cAAc,WAAW,MAAM,UAAU,MAAM,WAAW;AAAA,IACrE,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ;AAAA,MACN,EAAE,cAAc,SAAS,MAAM,QAAQ,MAAM,QAAA;AAAA,MAC7C,EAAE,cAAc,WAAW,MAAM,SAAS,MAAM,UAAA;AAAA,IAAU;AAAA,IAE5D,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER,EAAE,QAAQ,CAAA,GAAI,MAAM,2BAA2B,MAAM,QAAA;AAAA,EACrD,EAAE,QAAQ,CAAA,GAAI,MAAM,sBAAsB,MAAM,QAAA;AAAA,EAChD;AAAA,IACE,WAAW;AAAA,IACX,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,WAAW;AAAA,IACX,QAAQ;AAAA,MACN;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,WAAW;AAAA,IACX,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,WAAW;AAAA,IACX,QAAQ;AAAA,MACN;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,WAAW;AAAA,IACX,QAAQ;AAAA,MACN;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,WAAW;AAAA,IACX,QAAQ;AAAA,MACN;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,WAAW;AAAA,IACX,QAAQ;AAAA,MACN;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,WAAW;AAAA,IACX,QAAQ;AAAA,MACN;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,WAAW;AAAA,IACX,QAAQ;AAAA,MACN;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,WAAW;AAAA,IACX,QAAQ;AAAA,MACN;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,WAAW;AAAA,IACX,QAAQ;AAAA,MACN;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,WAAW;AAAA,IACX,QAAQ;AAAA,MACN;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,WAAW;AAAA,IACX,QAAQ;AAAA,MACN;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,WAAW;AAAA,IACX,QAAQ;AAAA,MACN;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,WAAW;AAAA,IACX,QAAQ;AAAA,MACN;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,WAAW;AAAA,IACX,QAAQ;AAAA,MACN;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,SAAS,CAAC,EAAE,cAAc,WAAW,MAAM,IAAI,MAAM,WAAW;AAAA,IAChE,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,SAAS,CAAC,EAAE,cAAc,WAAW,MAAM,IAAI,MAAM,WAAW;AAAA,IAChE,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,SAAS,CAAC,EAAE,cAAc,WAAW,MAAM,IAAI,MAAM,WAAW;AAAA,IAChE,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,SAAS,CAAC,EAAE,cAAc,WAAW,MAAM,IAAI,MAAM,WAAW;AAAA,IAChE,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,SAAS,CAAC,EAAE,cAAc,WAAW,MAAM,IAAI,MAAM,WAAW;AAAA,IAChE,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,SAAS,CAAA;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAC,EAAE,cAAc,WAAW,MAAM,YAAY,MAAM,WAAW;AAAA,IACvE,MAAM;AAAA,IACN,SAAS,CAAA;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,SAAS,CAAA;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAC,EAAE,cAAc,UAAU,MAAM,YAAY,MAAM,UAAU;AAAA,IACrE,MAAM;AAAA,IACN,SAAS,CAAA;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,SAAS,CAAC,EAAE,cAAc,WAAW,MAAM,IAAI,MAAM,WAAW;AAAA,IAChE,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,SAAS,CAAC,EAAE,cAAc,UAAU,MAAM,IAAI,MAAM,UAAU;AAAA,IAC9D,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,SAAS,CAAC,EAAE,cAAc,UAAU,MAAM,IAAI,MAAM,UAAU;AAAA,IAC9D,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAC,EAAE,cAAc,WAAW,MAAM,QAAQ,MAAM,WAAW;AAAA,IACnE,MAAM;AAAA,IACN,SAAS,CAAC,EAAE,cAAc,WAAW,MAAM,IAAI,MAAM,WAAW;AAAA,IAChE,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ;AAAA,MACN,EAAE,cAAc,WAAW,MAAM,QAAQ,MAAM,UAAA;AAAA,MAC/C,EAAE,cAAc,WAAW,MAAM,WAAW,MAAM,UAAA;AAAA,IAAU;AAAA,IAE9D,MAAM;AAAA,IACN,SAAS,CAAA;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ;AAAA,MACN,EAAE,cAAc,WAAW,MAAM,QAAQ,MAAM,UAAA;AAAA,MAC/C,EAAE,cAAc,WAAW,MAAM,WAAW,MAAM,UAAA;AAAA,IAAU;AAAA,IAE9D,MAAM;AAAA,IACN,SAAS,CAAC,EAAE,cAAc,QAAQ,MAAM,IAAI,MAAM,QAAQ;AAAA,IAC1D,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,SAAS,CAAC,EAAE,cAAc,WAAW,MAAM,IAAI,MAAM,WAAW;AAAA,IAChE,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAC,EAAE,cAAc,WAAW,MAAM,UAAU,MAAM,WAAW;AAAA,IACrE,MAAM;AAAA,IACN,SAAS;AAAA,MACP;AAAA,QACE,YAAY;AAAA,UACV,EAAE,cAAc,WAAW,MAAM,SAAS,MAAM,UAAA;AAAA,UAChD,EAAE,cAAc,WAAW,MAAM,aAAa,MAAM,UAAA;AAAA,UACpD,EAAE,cAAc,WAAW,MAAM,WAAW,MAAM,UAAA;AAAA,UAClD,EAAE,cAAc,WAAW,MAAM,UAAU,MAAM,UAAA;AAAA,QAAU;AAAA,QAE7D,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,SAAS,CAAC,EAAE,cAAc,WAAW,MAAM,IAAI,MAAM,WAAW;AAAA,IAChE,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,SAAS,CAAA;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,SAAS,CAAC,EAAE,cAAc,QAAQ,MAAM,IAAI,MAAM,QAAQ;AAAA,IAC1D,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,SAAS;AAAA,MACP,EAAE,cAAc,WAAW,MAAM,YAAY,MAAM,UAAA;AAAA,MACnD,EAAE,cAAc,UAAU,MAAM,YAAY,MAAM,SAAA;AAAA,IAAS;AAAA,IAE7D,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,SAAS;AAAA,MACP,EAAE,cAAc,UAAU,MAAM,YAAY,MAAM,SAAA;AAAA,MAClD,EAAE,cAAc,UAAU,MAAM,YAAY,MAAM,SAAA;AAAA,IAAS;AAAA,IAE7D,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ;AAAA,MACN,EAAE,cAAc,WAAW,MAAM,QAAQ,MAAM,UAAA;AAAA,MAC/C,EAAE,cAAc,WAAW,MAAM,WAAW,MAAM,UAAA;AAAA,IAAU;AAAA,IAE9D,MAAM;AAAA,IACN,SAAS,CAAA;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ;AAAA,MACN,EAAE,cAAc,WAAW,MAAM,YAAY,MAAM,UAAA;AAAA,MACnD;AAAA,QACE,YAAY;AAAA,UACV,EAAE,cAAc,WAAW,MAAM,SAAS,MAAM,UAAA;AAAA,UAChD,EAAE,cAAc,WAAW,MAAM,aAAa,MAAM,UAAA;AAAA,UACpD,EAAE,cAAc,WAAW,MAAM,WAAW,MAAM,UAAA;AAAA,UAClD,EAAE,cAAc,WAAW,MAAM,UAAU,MAAM,UAAA;AAAA,QAAU;AAAA,QAE7D,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,MAER,EAAE,cAAc,WAAW,MAAM,UAAU,MAAM,UAAA;AAAA,IAAU;AAAA,IAE7D,MAAM;AAAA,IACN,SAAS,CAAA;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ;AAAA,MACN,EAAE,cAAc,WAAW,MAAM,QAAQ,MAAM,UAAA;AAAA,MAC/C,EAAE,cAAc,WAAW,MAAM,WAAW,MAAM,UAAA;AAAA,IAAU;AAAA,IAE9D,MAAM;AAAA,IACN,SAAS,CAAA;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,SAAS,CAAA;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAC,EAAE,cAAc,WAAW,MAAM,aAAa,MAAM,WAAW;AAAA,IACxE,MAAM;AAAA,IACN,SAAS,CAAA;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ;AAAA,MACN,EAAE,cAAc,WAAW,MAAM,kBAAkB,MAAM,UAAA;AAAA,IAAU;AAAA,IAErE,MAAM;AAAA,IACN,SAAS,CAAA;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAC,EAAE,cAAc,UAAU,MAAM,eAAe,MAAM,UAAU;AAAA,IACxE,MAAM;AAAA,IACN,SAAS,CAAC,EAAE,cAAc,QAAQ,MAAM,IAAI,MAAM,QAAQ;AAAA,IAC1D,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,SAAS,CAAC,EAAE,cAAc,WAAW,MAAM,IAAI,MAAM,WAAW;AAAA,IAChE,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,SAAS,CAAA;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ;AAAA,MACN,EAAE,cAAc,WAAW,MAAM,gBAAgB,MAAM,UAAA;AAAA,IAAU;AAAA,IAEnE,MAAM;AAAA,IACN,SAAS,CAAA;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ;AAAA,MACN;AAAA,QACE,YAAY;AAAA,UACV,EAAE,cAAc,WAAW,MAAM,SAAS,MAAM,UAAA;AAAA,UAChD,EAAE,cAAc,WAAW,MAAM,aAAa,MAAM,UAAA;AAAA,UACpD,EAAE,cAAc,WAAW,MAAM,WAAW,MAAM,UAAA;AAAA,UAClD,EAAE,cAAc,WAAW,MAAM,UAAU,MAAM,UAAA;AAAA,QAAU;AAAA,QAE7D,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,IAEF,MAAM;AAAA,IACN,SAAS,CAAA;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAAA,EAER;AAAA,IACE,QAAQ,CAAA;AAAA,IACR,MAAM;AAAA,IACN,SAAS,CAAC,EAAE,cAAc,WAAW,MAAM,IAAI,MAAM,WAAW;AAAA,IAChE,iBAAiB;AAAA,IACjB,MAAM;AAAA,EAAA;AAEV;ACvmBO,IAAKC,sBAAAA,OAKVA,EAAAA,EAAA,aAAa,CAAA,IAAb,cAIAA,EAAAA,EAAA,WAAW,CAAA,IAAX,YAIAA,EAAAA,EAAA,YAAY,CAAA,IAAZ,aAbUA,IAAAA,KAAA,CAAA,CAAA;AAyDZ,eAAsBC,GAAwB;AAAA,EAC5C,SAAAC;AAAA,EACA,YAAAC;AAAA,EACA,UAAAlG;AAAA,EACA,SAAApD;AAAA,EACA,QAAAC;AAAA,EACA,KAAAC,IAAMqC;AAAAA,EACN,OAAAxC,IAAQH,EAAM;AAChB,GAAuC;AACrC,QAAM2J,KAAUF,KAAA,gBAAAA,EAAS,eAAcC;AAEvC,MAAI,CAACC;AACH,UAAM,IAAI;AAAA,MACR;AAAA,IAAA;AAIJ,QAAMlJ,IAAeC,EAAiB,EAAE,SAAAN,GAAS,QAAAC,GAAQ,KAAAC,GAAK,GACxDsJ,IAAoB,MAAMhJ;AAAA,IAC9BT;AAAA,IACAC;AAAA,IACAE;AAAA,IACAO,EAAY;AAAA,EAAA;AASd,MAAIgJ;AAEJ,MACE1J,MAAUH,EAAM,SACfI,MAAY0J,EAAQ,aAAa1J,MAAY0J,EAAQ;AAEtD,IAAAD,IAA0B,MAAMpJ,EAAa,aAAa;AAAA,MACxD,KAAKmJ,EAAkB;AAAA,MACvB,SAASA,EAAkB;AAAA,MAC3B,cAAc;AAAA,IAAA,CACf;AAAA,WACQ5I,EAAc4I,EAAkB,GAAG,KAAKzJ,MAAUH,EAAM,MAAM;AAEvE,UAAMiB,IAAsB,MAAMR,EAAa,aAAa;AAAA,MAC1D,KAAKmJ,EAAkB;AAAA,MACvB,SAASA,EAAkB;AAAA,MAC3B,cAAc;AAAA,IAAA,CACf;AAED,IAAAC,IAA0B,MAAMpJ,EAAa,aAAa;AAAA,MACxD,KAAKb;AAAA,MACL,SAASqB;AAAA,MACT,cAAc;AAAA,IAAA,CACf;AAAA,EACH;AACE,IAAA4I,IAA0B,MAAMpJ,EAAa,aAAa;AAAA,MACxD,KAAKmJ,EAAkB;AAAA,MACvB,SAASA,EAAkB;AAAA,MAC3B,cAAc;AAAA,IAAA,CACf;AAKH,MAAIC,MAA2BE;AAC7B,WAAO;AAGT,MAAI/G;AAOJ,MANKQ,IAGHR,IAASU,EAAiB,EAAE,UAAAF,GAAU,SAAApD,EAAA,CAAS,IAF/C4C,IAAStC,EAAiB,EAAE,SAAAN,GAAS,QAAAC,EAAA,CAAQ,GAK3C,CAAC2C;AACH,UAAM,IAAI;AAAA,MACR;AAAA,IAAA;AAIJ,QAAMgH,KACHC,EAAc7J,CAAO,KACpB8J,GAAa9J,CAAO,KACpB+J,GAAgB/J,CAAO,KACvBgK,GAAchK,CAAO,KACrBiK,GAAejK,CAAO,MACxBD,MAAUH,EAAM;AAElB,MAAI;AAEF,QAAIgK,GAAwB;AAC1B,YAAMM,IAAkBX,EAAQ,WAAW,IAAI,IAC3CA,IACA,KAAKA,CAAO,IACVvB,IAAUH,GAAqBqC,CAAe,GAC9CC,IAAStB,GAAsBb,GAAShI,CAAO,GAE/C,GAAGoK,CAAM,IAAK,MAAM/J,EAAa,aAAa;AAAA,QAClD,KAAK6I;AAAA,QACL,SAASO;AAAA,QACT,cAAc;AAAA,QACd,MAAM,CAACU,CAAM;AAAA,MAAA,CACd;AAED,aAAOC;AAAAA,IACT;AAGA,UAAMC,IAAmBpB;AAAA,MACvB,OAAO,KAAKM,EAAQ,MAAM,CAAC,GAAG,KAAK;AAAA,IAAA;AAYrC,WAHe,MANS1G,GAAY;AAAA,MAClC,KAAKyH;AAAA,MACL,SAASb;AAAA,MACT,QAAQpJ;AAAA,IAAA,CACT,EAEoC,KAAK,eAAe;AAAA,MACvDgK;AAAA,IAAA,CACD;AAAA,EAEH,SAASE,GAAK;AACZ,UAAM,IAAI,MAAMvH,EAAgBuH,CAAG,CAAC;AAAA,EACtC;AACF;AC9KA,eAAsBC,GAAa;AAAA,EACjC,SAAArH;AAAA,EACA,OAAApD;AAAA,EACA,SAAA0K;AAAA,EACA,QAAA7B;AAAA,EACA,SAAA5I;AAAA,EACA,UAAAoD;AAAA,EACA,QAAAnD;AAAA,EACA,KAAAC;AACF,GAAuC;AACrC,QAAMG,IAAeC,EAAiB,EAAE,SAAAN,GAAS,QAAAC,GAAQ,KAAAC,GAAK,GACxDmD,IAAeC,EAAiB,EAAE,SAAAtD,GAAS,UAAAoD,GAAU,GAErDsH,IAAY,MAAMC,GAAa5K,GAAOC,GAASE,GAAKD,CAAM;AAChE,MAAI,CAACyK;AACH,UAAM,IAAI,MAAM,4BAA4B3K,CAAK,aAAaC,CAAO,EAAE;AAGzE,QAAM4K,IAAaC;AAAA,IACjBC,EAAmBjH,EAAU+E,CAAM,GAAG8B,EAAU,QAAQ;AAAA,EAAA,GAGpD,EAAE,SAAAvD,EAAA,IAAY,MAAM9G,EAAa,iBAAiB;AAAA,IACtD,SAASqK,EAAU;AAAA,IACnB,SAAAvH;AAAA,IACA,OAAOmD,EAA2BtG,CAAO;AAAA,IACzC,KAAK0K,EAAU;AAAA,IACf,cAAc;AAAA,IACd,MAAM,CAACD,GAASG,CAAU;AAAA,EAAA,CAC3B;AAID,SAFe,MAAMvH,EAAa,cAAc8D,CAAO;AAGzD;AAeA,eAAsB4D,GAAkB;AAAA,EACtC,OAAAhL;AAAA,EACA,OAAAkE;AAAA,EACA,SAAAwG;AAAA,EACA,SAAAzK;AAAA,EACA,QAAAC;AAAA,EACA,KAAAC;AACF,GAOuB;AACrB,QAAMG,IAAeC,EAAiB,EAAE,SAAAN,GAAS,QAAAC,GAAQ,KAAAC,GAAK,GACxDwK,IAAY,MAAMC,GAAa5K,GAAOC,GAASE,GAAKD,CAAM;AAChE,MAAI,CAACyK;AACH,UAAM,IAAI,MAAM,4BAA4B3K,CAAK,aAAaC,CAAO,EAAE;AAGzE,QAAMgL,IAAgB,MAAM3K,EAAa,aAAa;AAAA,IACpD,SAASqK,EAAU;AAAA,IACnB,KAAKA,EAAU;AAAA,IACf,cAAc;AAAA,IACd,MAAM,CAACzG,GAAOwG,CAAO;AAAA,EAAA,CACtB;AAED,SAAOQ,EAAqBD,EAAa,SAAA,GAAYN,EAAU,QAAQ;AACzE;AC1HO,MAAMQ,IAAkB,OAC7B7K,GACAgH,GACA8D,MACG;AACH,QAAMC,IAAO,MAAM/K,EAAa,mBAAA,GAE1BgL,IAAaxH,EAAU,OAAOuH,EAAK,YAAY,CAAC,EAAE;AAAA,IACtD,OAAOA,EAAK,oBAAoB;AAAA,EAAA,GAG5BE,IAAuBH,KAEzBC,EAAK,sBAEHG,IAAeJ,IACjB;AAAA,IACEtH,EAAU,OAAOyH,CAAoB,CAAC,EACnC,aAAaD,CAAU,EACvB,QAAQ,CAAC;AAAA,EAAA,IAEdD,EAAK;AAUT,SAN0B;AAAA,IACxB,KAHU,MAAM/K,EAAa,oBAAoBgH,CAAQ;AAAA,IAIzD,cAAAkE;AAAA,IACA,sBAAAD;AAAA,EAAA;AAIJ;ACqBA,eAAsBE,GAAU;AAAA,EAC9B,MAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,SAAAvI;AAAA,EACA,SAAAnD;AAAA,EACA,UAAAoD;AAAA,EACA,QAAAnD;AAAA,EACA,KAAAC;AAAA,EACA,OAAAH,IAAQH,EAAM;AAChB,GAAyC;AACvC,MAAI,CAAC,CAACA,EAAM,MAAMA,EAAM,MAAMA,EAAM,IAAI,EAAE,SAASG,CAAK;AACtD,UAAM,IAAI,MAAM,mBAAmB;AAGrC,MAAIA,MAAUH,EAAM,QAAQ,CAACiK,EAAc7J,CAAO;AAChD,UAAM,IAAI,MAAM,yBAAyB;AAG3C,QAAMO,IAAgB,MAAMC;AAAA,IAC1BT;AAAA,IACAC;AAAA,IACAE;AAAA,IACAO,EAAY;AAAA,EAAA,GAERkL,IAAgB,MAAMvC,GAAwB;AAAA,IAClD,SAAApJ;AAAA,IACA,YAAYyL;AAAA,IACZ,KAAAvL;AAAA,IACA,OAAAH;AAAA,EAAA,CACD;AAED,MAAI4L,MAAkBxC,EAAqB;AACzC,YAAQwC,GAAA;AAAA,MACN,KAAKxC,EAAqB;AACxB,cAAM,IAAI;AAAA,UACR;AAAA,QAAA;AAAA,MAEJ,KAAKA,EAAqB;AACxB,cAAM,IAAI;AAAA,UACR;AAAA,QAAA;AAAA,MAEJ;AACE,cAAM,IAAI;AAAA,UACR;AAAA,QAAA;AAAA,IACF;AAIN,QAAM9I,IAAeC,EAAiB,EAAE,SAAAN,GAAS,QAAAC,GAAQ,KAAAC,GAAK,GACxDmD,IAAeC,EAAiB,EAAE,SAAAtD,GAAS,UAAAoD,GAAU,GAErDiE,IAAW;AAAA,IACf,SAAS9G,EAAc;AAAA,IACvB,SAAA4C;AAAA,IACA,OAAOmD,EAA2BtG,CAAO;AAAA,IACzC,KAAKO,EAAc;AAAA,IACnB,cACER,MAAUH,EAAM,QAAQG,MAAUH,EAAM,OAAO,WAAW;AAAA,IAC5D,MAAM,CAACgM,EAAUH,CAAI,GAAGG,EAAUF,CAAc,CAAC;AAAA,EAAA,GAG7CG,IAAoBhC,EAAc7J,CAAO,IAC3C,MAAMkL,EAAgB7K,GAAcgH,GAAUyE,EAAU,GAAG,CAAC,IAC5D,CAAA,GAEE,EAAE,SAAA3E,EAAA,IAAY,MAAM9G,EAAa,iBAAiB;AAAA,IACtD,GAAGgH;AAAA,IACH,GAAGwE;AAAA,EAAA,CACJ;AAID,SAFe,MAAMxI,EAAa,cAAc8D,CAAO;AAGzD;AAUA,eAAsB4E,GAAU;AAAA,EAC9B,MAAAN;AAAA,EACA,gBAAAC;AAAA,EACA,SAAAvI;AAAA,EACA,SAAAnD;AAAA,EACA,UAAAoD;AAAA,EACA,QAAAnD;AAAA,EACA,KAAAC;AACF,GAAoC;AAClC,SAAOsL,GAAU;AAAA,IACf,MAAAC;AAAA,IACA,gBAAAC;AAAA,IACA,SAAAvI;AAAA,IACA,SAAAnD;AAAA,IACA,UAAAoD;AAAA,IACA,QAAAnD;AAAA,IACA,KAAAC;AAAA,IACA,OAAON,EAAM;AAAA,EAAA,CACd;AACH;ACzIA,MAAMoM,KAGD;AAAA,EACH;AAAA,IACE,SAASpM,EAAM;AAAA,IACf,UAAUA,EAAM;AAAA,EAAA;AAEpB;AA6CA,eAAsBqM,GAAsB;AAAA,EAC1C,SAAAC;AAAA,EACA,SAAAlM;AAAA,EACA,KAAAE;AAAA,EACA,QAAAD;AACF,GAKqB;AACnB,QAAMI,IAAeC,EAAiB,EAAE,SAAAN,GAAS,QAAAC,GAAQ,KAAAC,GAAK,GAExDiM,IAAsB,MAAM3L;AAAA,IAChC0L;AAAA,IACAlM;AAAA,IACAE;AAAA,IACAO,EAAY;AAAA,EAAA;AASd,SAN4B,MAAMJ,EAAa,aAAa;AAAA,IAC1D,SAAS8L,EAAoB;AAAA,IAC7B,KAAKA,EAAoB;AAAA,IACzB,cAAc;AAAA,EAAA,CACf;AAGH;AAsBA,eAAsBC,GAAa;AAAA,EACjC,SAASC;AAAA,EACT,QAAQC;AAAA,EACR,SAAAtM;AAAA,EACA,KAAAE;AAAA,EACA,UAAAkD;AAAA,EACA,QAAAnD;AAAA,EACA,SAAAiM,IAAUtM,EAAM;AAAA,EAChB,UAAA2M,IAAW3M,EAAM;AACnB,GAA2B;AAIzB,MAAI,CAHSoM,GAAgB;AAAA,IAC3B,CAAAQ,MAAMA,EAAG,YAAYN,KAAWM,EAAG,aAAaD;AAAA,EAAA;AAGhD,UAAM,IAAIE,GAAqBP,GAASK,GAAUvM,GAASE,CAAG;AAGhE,QAAMG,IAAeC,EAAiB,EAAE,SAAAN,GAAS,QAAAC,GAAQ,KAAAC,GAAK,GACxDmD,IAAeC,EAAiB,EAAE,UAAAF,GAAU,SAAApD,GAAS,GAGrDmM,IAAsB,MAAM3L;AAAA,IAChC0L;AAAA,IACAlM;AAAA,IACAE;AAAA,IACAO,EAAY;AAAA,EAAA,GAIRiM,IAAsB,MAAMlM;AAAA,IAChC0L;AAAA,IACAlM;AAAA,IACAE;AAAA,IACAO,EAAY;AAAA,EAAA,GAIRkM,IAAuB,MAAMnM;AAAA,IACjC+L;AAAA,IACAvM;AAAA,IACAE;AAAA,IACAO,EAAY;AAAA,EAAA,GAGRmM,IAAK,MAAMC,GAAwBxM,GAAcqM,CAAmB;AAC1E,MAAI,CAACE;AACH,UAAM,IAAI;AAAA,MACR,wCAAwCV,CAAO,OAAOlM,CAAO;AAAA,IAAA;AAKjE,QAAMa,IAAsB,MAAMR,EAAa,aAAa;AAAA,IAC1D,SAAS8L,EAAoB;AAAA,IAC7B,KAAKA,EAAoB;AAAA,IACzB,cAAc;AAAA,EAAA,CACf,GAEKvD,IAAS/E,EAAUyI,CAAS,GAC5BQ,IAAejC,EAASC,EAAmBlC,GAAQgE,EAAG,QAAQ,CAAC,GAG/DG,IAAoB,MAAM1M,EAAa,aAAa;AAAA,IACxD,SAASuM,EAAG;AAAA,IACZ,KAAKA,EAAG;AAAA,IACR,cAAc;AAAA,IACd,MAAM,CAACP,CAAc;AAAA,EAAA,CACtB,GACKW,IAAiB/B,EAAqB8B,GAAmBH,EAAG,QAAQ;AAE1E,MAAIhE,EAAO,cAAcoE,CAAc;AACrC,UAAM,IAAI;AAAA,MACR,qBAAqBpE,EAAO,SAAA,CAAU,IAAIgE,EAAG,MAAM,wDAAwDI,EAAe,SAAA,CAAU,IAAIJ,EAAG,MAAM;AAAA,IAAA;AAiBrJ,SATa,MAAMvJ,EAAa,cAAc;AAAA,IAC5C,SAASxC;AAAA,IACT,KAAKrB;AAAA,IACL,OAAO8G,EAA2BtG,CAAO;AAAA,IACzC,cAAc;AAAA,IACd,MAAM,CAACqM,GAAgBM,EAAqB,SAASG,CAAY;AAAA,IACjE,SAAST;AAAA,EAAA,CACV;AAGH;AC7KA,MAAML,KAKD;AAAA;AAAA,EAEH,EAAE,SAASpM,EAAM,KAAA;AAAA;AAAA,EACjB,EAAE,SAASA,EAAM,KAAA;AAAA;AAAA,EACjB,EAAE,SAASA,EAAM,KAAA;AAAA;AAAA;AAAA,EAGjB,EAAE,SAASA,EAAM,MAAM,UAAUA,EAAM,KAAA;AAAA;AAAA,EACvC,EAAE,SAASA,EAAM,MAAM,UAAUA,EAAM,KAAA;AAAA;AACzC;AA+FA,eAAsBqN,GAAY3L,GAAyC;AACzE,QAAM;AAAA,IACJ,SAAS+K;AAAA,IACT,QAAQC;AAAA,IACR,YAAAY;AAAA,IACA,SAAAlN;AAAA,IACA,KAAAE;AAAA,IACA,QAAAD;AAAA,IACA,SAAAiM,IAAUtM,EAAM;AAAA,IAChB,UAAA2M;AAAA,EAAA,IACEjL;AAIJ,MAAI,CAHS0K,GAAgB;AAAA,IAC3B,CAAAQ,MAAMA,EAAG,YAAYN,KAAWM,EAAG,aAAaD;AAAA,EAAA;AAGhD,UAAM,IAAIE,GAAqBP,GAASK,KAAY,OAAOvM,GAASE,CAAG;AAGzE,QAAMG,IAAeC,EAAiB,EAAE,SAAAN,GAAS,QAAAC,GAAQ,KAAAC,GAAK,GAGxDmD,IAAe2D,EAAe1F,CAAM,IACtCgC,EAAiB,EAAE,UAAUhC,EAAO,UAAU,SAAAtB,EAAA,CAAS,IACvD,QAEE0M,IAAsB,MAAMlM;AAAA,IAChC0L;AAAA,IACAlM;AAAA,IACAE;AAAA,IACAO,EAAY;AAAA;AAAA,EAAA,GAERmM,IAAK,MAAMC,GAAwBxM,GAAcqM,CAAmB;AAC1E,MAAI,CAACE;AACH,UAAM,IAAI;AAAA,MACR,wCAAwCV,CAAO,OAAOlM,CAAO;AAAA,IAAA;AAIjE,QAAM4I,IAASkC,EAAmBwB,GAAWM,EAAG,QAAQ,GAElDG,IAAoB,MAAM1M,EAAa,aAAa;AAAA,IACxD,SAASuM,EAAG;AAAA,IACZ,KAAKA,EAAG;AAAA,IACR,cAAc;AAAA,IACd,MAAM,CAACP,CAAc;AAAA,EAAA,CACtB,GACKW,IAAiB/B,EAAqB8B,GAAmBH,EAAG,QAAQ;AAC1E,MAAIhE,EAAO,cAAcmE,CAAiB;AACxC,UAAM,IAAI;AAAA,MACR,oBAAoB,OAAOT,CAAS,CAAC,IAAIM,EAAG,MAAM,wDAAwDI,EAAe,SAAA,CAAU,IAAIJ,EAAG,MAAM;AAAA,IAAA;AAKpJ,MAAI,CAACL,GAAU;AACb,QAAI,CAACW;AACH,YAAM,IAAI,MAAM,kCAAkC;AAEpD,UAAMC,IAAe,MAAMC,GAAgBF,GAAYhN,CAAG;AAG1D,QACEgM,MAAYtM,EAAM,SACjBI,MAAY0J,EAAQ,aAAa1J,MAAY0J,EAAQ,gBACtD;AAGA,YAAM2D,IAAU,MAAM7M;AAAA,QACpB0L;AAAA,QACAlM;AAAA,QACAE;AAAA,QACAO,EAAY;AAAA,MAAA,GAER6M,KAA8B,MAAMjN,EAAa,aAAa;AAAA,QAClE,SAASgN,EAAQ;AAAA,QACjB,KAAKA,EAAQ;AAAA,QACb,cAAc;AAAA,MAAA,CACf,GAGKE,KAAY,MAAMlN,EAAa,aAAa;AAAA,QAChD,SAASuM,EAAG;AAAA,QACZ,KAAKA,EAAG;AAAA,QACR,cAAc;AAAA,QACd,MAAM,CAACP,GAAgBgB,EAAQ,OAAO;AAAA,MAAA,CACvC;AAED,UAAIzE,EAAO,cAAc2E,EAAS,GAAG;AACnC,cAAM,EAAE,QAAAnG,GAAAA,IAAW,MAAMN,EAA2B;AAAA,UAClD,QAAAxF;AAAA,UACA,cAAAjB;AAAA,UACA,cAAAgD;AAAA,UACA,cAAc;AAAA,YACZ,SAASuJ,EAAG;AAAA,YACZ,KAAKA,EAAG;AAAA,YACR,SAASP;AAAA,YACT,cAAc;AAAA,YACd,MAAM,CAACgB,EAAQ,SAASxC,EAASjC,CAAM,CAAC;AAAA,UAAA;AAAA,UAE1C,WAAW;AAAA,QAAA,CACZ,GAEKpB,IAAU,MAAMD;AAAA,UACpBlH;AAAA,UACA+G;AAAAA,UACA;AAAA,QAAA;AAGF,gBAAQ;AAAA,UACN,qBAAqBiG,EAAQ,OAAO,SAAS,IAAIxJ,EAAUyI,CAAS,EAAE,SAAA,CAAU,IAAIM,EAAG,MAAM;AAAA,UAC7FpF,EAAQ;AAAA,UACRA,EAAQ;AAAA,QAAA;AAAA,MAEZ;AAGA,YAAM,EAAE,QAAAJ,GAAAA,IAAW,MAAMN,EAA2B;AAAA,QAClD,QAAAxF;AAAA,QACA,cAAAjB;AAAA,QACA,cAAAgD;AAAA,QACA,cAAc;AAAA,UACZ,SAASiK;AAAA,UACT,KAAK9N;AAAA,UACL,SAAS6M;AAAA,UACT,cAAc;AAAA,UACd,MAAM;AAAA,YACJA;AAAA,YACAgB,EAAQ;AAAA,YACRF;AAAA,YACAtC,EAASjC,CAAM;AAAA,UAAA;AAAA,QACjB;AAAA,QAEF,WAAW;AAAA,MAAA,CACZ;AAED,aAAOxB;AAAAA,IACT;AAGA,UAAMC,IAAW;AAAA,MACf,KAAKuF,EAAG;AAAA,MACR,SAASA,EAAG;AAAA,MACZ,SAASP;AAAA,MACT,OAAO/F,EAA2BtG,CAAO;AAAA,MACzC,cACEY,EAAcgM,EAAG,GAAG,KAAKV,MAAYtM,EAAM,OACvC,iBACA;AAAA;AAAA,MACN,MAAM,CAACuN,GAActC,EAASjC,CAAM,CAAC;AAAA,IAAA,GAGjCiD,KAAoBhC,EAAc7J,CAAO,IAC3C,MAAMkL,EAAgB7K,GAAcgH,GAAUyE,EAAU,GAAG,CAAC,IAC5D,CAAA,GAEE,EAAE,QAAA1E,GAAAA,IAAW,MAAMN,EAA2B;AAAA,MAClD,QAAAxF;AAAA,MACA,cAAAjB;AAAA,MACA,cAAAgD;AAAA,MACA,cAAc;AAAA,QACZ,GAAGgE;AAAAA,QACH,SAASgF;AAAA,QACT,GAAGR;AAAAA,MAAA;AAAA,MAEL,WAAW,GAAGK,CAAO;AAAA,IAAA,CACtB;AAED,WAAO9E;AAAAA,EACT;AAGA,MAAI,CAACxG,EAAcgM,EAAG,GAAG;AACvB,UAAM,IAAI;AAAA,MACR,OAAOV,CAAO,cAAcU,EAAG,OAAO,oCAAoCL,CAAQ;AAAA,IAAA;AAItF,QAAMlF,IAAW;AAAA,IACf,KAAKuF,EAAG;AAAA,IACR,SAASA,EAAG;AAAA,IACZ,SAASP;AAAA,IACT,OAAO/F,EAA2BtG,CAAO;AAAA,IACzC,cAAc;AAAA,IACd,MAAM,CAAC6K,EAASjC,CAAM,CAAC;AAAA,EAAA,GAGnBiD,IAAoBhC,EAAc7J,CAAO,IAC3C,MAAMkL,EAAgB7K,GAAcgH,GAAUyE,EAAU,GAAG,CAAC,IAC5D,CAAA,GAEE,EAAE,QAAA1E,MAAW,MAAMN,EAA2B;AAAA,IAClD,QAAAxF;AAAA,IACA,cAAAjB;AAAA,IACA,cAAAgD;AAAA,IACA,cAAc;AAAA,MACZ,GAAGgE;AAAA,MACH,SAASgF;AAAA,MACT,GAAGR;AAAA,IAAA;AAAA,IAEL,WAAW,GAAGK,CAAO,cAAcK,CAAQ;AAAA,EAAA,CAC5C;AAED,SAAOnF;AACT;AAqCA,eAAsBoG,GAAYlM,GAA0C;AAC1E,SAAO2L,GAAY;AAAA,IACjB,GAAG3L;AAAA,IACH,SAAS1B,EAAM;AAAA,IACf,UAAU;AAAA,EAAA,CACX;AACH;"}
|
|
1
|
+
{"version":3,"file":"unstakeLBTC-DtvVbpbU.js","sources":["../../src/tokens/abi/ASSET_ROUTER_ABI.ts","../../src/contract-functions/getLBTCMintingFee/getLBTCMintingFee.ts","../../src/contract-functions/signStakeAndBake/validation.ts","../../src/contract-functions/getStakeAndBakeFee/getStakeAndBakeFee.tsx","../../src/contract-functions/signLbtcDestionationAddr/signLbtcDestinationAddr.ts","../../src/contract-functions/signNetworkFee/signNetworkFee.ts","../../src/contract-functions/getPermitNonce/getPermitNonce.ts","../../src/contract-functions/signStakeAndBake/typed-data-builder.ts","../../src/contract-functions/signStakeAndBake/handleApprove.ts","../../src/contract-functions/signStakeAndBake/handlePermit.ts","../../src/contract-functions/signStakeAndBake/utils.ts","../../src/contract-functions/signStakeAndBake/signStakeAndBake.ts","../../src/clients/evm-signer-adapter.ts","../../src/utils/transaction-executor.ts","../../src/contract-functions/getBasculeDepositStatus/decodeBasculeDepositStatus.ts","../../src/tokens/abi/KATANA_BASCULE_ABI.ts","../../src/contract-functions/getBasculeDepositStatus/getBasculeDepositStatus.ts","../../src/contract-functions/approveToken/approveToken.ts","../../src/utils/gas.ts","../../src/contract-functions/claimLBTC/claimLBTC.ts","../../src/contract-functions/deposit/depositToken.ts","../../src/contract-functions/unstakeLBTC/unstakeLBTC.ts"],"sourcesContent":["export default [\n {\n inputs: [],\n stateMutability: 'nonpayable',\n type: 'constructor',\n },\n {\n inputs: [],\n name: 'AccessControlBadConfirmation',\n type: 'error',\n },\n {\n inputs: [\n {\n internalType: 'uint48',\n name: 'schedule',\n type: 'uint48',\n },\n ],\n name: 'AccessControlEnforcedDefaultAdminDelay',\n type: 'error',\n },\n {\n inputs: [],\n name: 'AccessControlEnforcedDefaultAdminRules',\n type: 'error',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'defaultAdmin',\n type: 'address',\n },\n ],\n name: 'AccessControlInvalidDefaultAdmin',\n type: 'error',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'account',\n type: 'address',\n },\n {\n internalType: 'bytes32',\n name: 'neededRole',\n type: 'bytes32',\n },\n ],\n name: 'AccessControlUnauthorizedAccount',\n type: 'error',\n },\n {\n inputs: [\n {\n internalType: 'uint256',\n name: 'dustLimit',\n type: 'uint256',\n },\n ],\n name: 'AmountBelowMinLimit',\n type: 'error',\n },\n {\n inputs: [\n {\n internalType: 'uint256',\n name: 'fee',\n type: 'uint256',\n },\n ],\n name: 'AmountLessThanCommission',\n type: 'error',\n },\n {\n inputs: [],\n name: 'AssertRouter_UnauthorizedAccount',\n type: 'error',\n },\n {\n inputs: [],\n name: 'AssertRouter_WrongRedeemDestinationChain',\n type: 'error',\n },\n {\n inputs: [],\n name: 'AssertRouter_WrongRouteType',\n type: 'error',\n },\n {\n inputs: [],\n name: 'AssertRouter_WrongToken',\n type: 'error',\n },\n {\n inputs: [],\n name: 'AssetOperation_DepositNotAllowed',\n type: 'error',\n },\n {\n inputs: [],\n name: 'AssetOperation_RedeemNotAllowed',\n type: 'error',\n },\n {\n inputs: [],\n name: 'AssetRouter_FeeGreaterThanAmount',\n type: 'error',\n },\n {\n inputs: [],\n name: 'AssetRouter_MailboxExpected',\n type: 'error',\n },\n {\n inputs: [],\n name: 'AssetRouter_MintProcessingError',\n type: 'error',\n },\n {\n inputs: [],\n name: 'AssetRouter_PayloadAlreadyUsed',\n type: 'error',\n },\n {\n inputs: [],\n name: 'AssetRouter_Unauthorized',\n type: 'error',\n },\n {\n inputs: [],\n name: 'AssetRouter_WrongNativeToken',\n type: 'error',\n },\n {\n inputs: [],\n name: 'AssetRouter_WrongOperation',\n type: 'error',\n },\n {\n inputs: [],\n name: 'AssetRouter_WrongSender',\n type: 'error',\n },\n {\n inputs: [],\n name: 'AssetRouter_ZeroAddress',\n type: 'error',\n },\n {\n inputs: [],\n name: 'AssetRouter_ZeroMailbox',\n type: 'error',\n },\n {\n inputs: [\n {\n internalType: 'uint256',\n name: 'expected',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'actual',\n type: 'uint256',\n },\n ],\n name: 'Assets_InvalidPayloadSize',\n type: 'error',\n },\n {\n inputs: [\n {\n internalType: 'bytes4',\n name: 'expected',\n type: 'bytes4',\n },\n {\n internalType: 'bytes4',\n name: 'actual',\n type: 'bytes4',\n },\n ],\n name: 'Assets_InvalidSelector',\n type: 'error',\n },\n {\n inputs: [],\n name: 'Assets_ZeroAmount',\n type: 'error',\n },\n {\n inputs: [],\n name: 'Assets_ZeroRecipient',\n type: 'error',\n },\n {\n inputs: [],\n name: 'Assets_ZeroToToken',\n type: 'error',\n },\n {\n inputs: [],\n name: 'ECDSAInvalidSignature',\n type: 'error',\n },\n {\n inputs: [\n {\n internalType: 'uint256',\n name: 'length',\n type: 'uint256',\n },\n ],\n name: 'ECDSAInvalidSignatureLength',\n type: 'error',\n },\n {\n inputs: [\n {\n internalType: 'bytes32',\n name: 's',\n type: 'bytes32',\n },\n ],\n name: 'ECDSAInvalidSignatureS',\n type: 'error',\n },\n {\n inputs: [],\n name: 'GMP_InvalidAddess',\n type: 'error',\n },\n {\n inputs: [\n {\n internalType: 'bytes4',\n name: 'expected',\n type: 'bytes4',\n },\n {\n internalType: 'bytes4',\n name: 'actual',\n type: 'bytes4',\n },\n ],\n name: 'InvalidAction',\n type: 'error',\n },\n {\n inputs: [],\n name: 'InvalidFeeApprovalSignature',\n type: 'error',\n },\n {\n inputs: [],\n name: 'InvalidInitialization',\n type: 'error',\n },\n {\n inputs: [\n {\n internalType: 'uint256',\n name: 'expected',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'actual',\n type: 'uint256',\n },\n ],\n name: 'InvalidPayloadSize',\n type: 'error',\n },\n {\n inputs: [\n {\n internalType: 'uint256',\n name: 'a',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'b',\n type: 'uint256',\n },\n ],\n name: 'NonEqualLength',\n type: 'error',\n },\n {\n inputs: [],\n name: 'NotInitializing',\n type: 'error',\n },\n {\n inputs: [],\n name: 'NotStakingToken',\n type: 'error',\n },\n {\n inputs: [],\n name: 'ReentrancyGuardReentrantCall',\n type: 'error',\n },\n {\n inputs: [\n {\n internalType: 'uint8',\n name: 'bits',\n type: 'uint8',\n },\n {\n internalType: 'uint256',\n name: 'value',\n type: 'uint256',\n },\n ],\n name: 'SafeCastOverflowedUintDowncast',\n type: 'error',\n },\n {\n inputs: [],\n name: 'ScriptPubkeyUnsupported',\n type: 'error',\n },\n {\n inputs: [\n {\n internalType: 'uint256',\n name: 'expiry',\n type: 'uint256',\n },\n ],\n name: 'UserSignatureExpired',\n type: 'error',\n },\n {\n inputs: [],\n name: 'ZeroFee',\n type: 'error',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'address',\n name: 'prevVal',\n type: 'address',\n },\n {\n indexed: true,\n internalType: 'address',\n name: 'newVal',\n type: 'address',\n },\n ],\n name: 'AssetRouter_BasculeChanged',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'bytes32',\n name: 'payloadHash',\n type: 'bytes32',\n },\n {\n indexed: false,\n internalType: 'string',\n name: 'reason',\n type: 'string',\n },\n {\n indexed: false,\n internalType: 'bytes',\n name: 'customError',\n type: 'bytes',\n },\n ],\n name: 'AssetRouter_BatchMintError',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'uint256',\n name: 'oldRate',\n type: 'uint256',\n },\n {\n indexed: true,\n internalType: 'uint256',\n name: 'newRate',\n type: 'uint256',\n },\n ],\n name: 'AssetRouter_DustFeeRateChanged',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'uint256',\n name: 'fee',\n type: 'uint256',\n },\n {\n indexed: false,\n internalType: 'bytes',\n name: 'userSignature',\n type: 'bytes',\n },\n ],\n name: 'AssetRouter_FeeCharged',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'address',\n name: 'prevVal',\n type: 'address',\n },\n {\n indexed: true,\n internalType: 'address',\n name: 'newVal',\n type: 'address',\n },\n ],\n name: 'AssetRouter_MailboxChanged',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'uint256',\n name: 'oldFee',\n type: 'uint256',\n },\n {\n indexed: true,\n internalType: 'uint256',\n name: 'newFee',\n type: 'uint256',\n },\n ],\n name: 'AssetRouter_MintFeeChanged',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'address',\n name: 'oldAddress',\n type: 'address',\n },\n {\n indexed: true,\n internalType: 'address',\n name: 'newAddress',\n type: 'address',\n },\n ],\n name: 'AssetRouter_NativeTokenChanged',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'address',\n name: 'prevVal',\n type: 'address',\n },\n {\n indexed: true,\n internalType: 'address',\n name: 'newVal',\n type: 'address',\n },\n ],\n name: 'AssetRouter_OracleChanged',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'address',\n name: 'token',\n type: 'address',\n },\n {\n indexed: false,\n internalType: 'bool',\n name: 'enabled',\n type: 'bool',\n },\n ],\n name: 'AssetRouter_RedeemEnabled',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'address',\n name: 'token',\n type: 'address',\n },\n {\n indexed: false,\n internalType: 'uint256',\n name: 'oldFee',\n type: 'uint256',\n },\n {\n indexed: false,\n internalType: 'uint256',\n name: 'newFee',\n type: 'uint256',\n },\n ],\n name: 'AssetRouter_RedeemFeeChanged',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'address',\n name: 'token',\n type: 'address',\n },\n {\n indexed: false,\n internalType: 'uint256',\n name: 'oldMinAmount',\n type: 'uint256',\n },\n {\n indexed: false,\n internalType: 'uint256',\n name: 'newMinAmount',\n type: 'uint256',\n },\n ],\n name: 'AssetRouter_RedeemForBtcMinAmountChanged',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'bytes32',\n name: 'fromToken',\n type: 'bytes32',\n },\n {\n indexed: true,\n internalType: 'bytes32',\n name: 'fromChainId',\n type: 'bytes32',\n },\n {\n indexed: true,\n internalType: 'bytes32',\n name: 'toToken',\n type: 'bytes32',\n },\n {\n indexed: false,\n internalType: 'bytes32',\n name: 'toChainId',\n type: 'bytes32',\n },\n ],\n name: 'AssetRouter_RouteRemoved',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'bytes32',\n name: 'fromToken',\n type: 'bytes32',\n },\n {\n indexed: true,\n internalType: 'bytes32',\n name: 'fromChainId',\n type: 'bytes32',\n },\n {\n indexed: true,\n internalType: 'bytes32',\n name: 'toToken',\n type: 'bytes32',\n },\n {\n indexed: false,\n internalType: 'bytes32',\n name: 'toChainId',\n type: 'bytes32',\n },\n {\n indexed: false,\n internalType: 'enum IAssetRouter.RouteType',\n name: 'routeType',\n type: 'uint8',\n },\n ],\n name: 'AssetRouter_RouteSet',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'uint256',\n name: 'oldCommission',\n type: 'uint256',\n },\n {\n indexed: true,\n internalType: 'uint256',\n name: 'newCommission',\n type: 'uint256',\n },\n ],\n name: 'AssetRouter_ToNativeCommissionChanged',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [],\n name: 'DefaultAdminDelayChangeCanceled',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: 'uint48',\n name: 'newDelay',\n type: 'uint48',\n },\n {\n indexed: false,\n internalType: 'uint48',\n name: 'effectSchedule',\n type: 'uint48',\n },\n ],\n name: 'DefaultAdminDelayChangeScheduled',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [],\n name: 'DefaultAdminTransferCanceled',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'address',\n name: 'newAdmin',\n type: 'address',\n },\n {\n indexed: false,\n internalType: 'uint48',\n name: 'acceptSchedule',\n type: 'uint48',\n },\n ],\n name: 'DefaultAdminTransferScheduled',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: 'uint64',\n name: 'version',\n type: 'uint64',\n },\n ],\n name: 'Initialized',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'bytes32',\n name: 'role',\n type: 'bytes32',\n },\n {\n indexed: true,\n internalType: 'bytes32',\n name: 'previousAdminRole',\n type: 'bytes32',\n },\n {\n indexed: true,\n internalType: 'bytes32',\n name: 'newAdminRole',\n type: 'bytes32',\n },\n ],\n name: 'RoleAdminChanged',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'bytes32',\n name: 'role',\n type: 'bytes32',\n },\n {\n indexed: true,\n internalType: 'address',\n name: 'account',\n type: 'address',\n },\n {\n indexed: true,\n internalType: 'address',\n name: 'sender',\n type: 'address',\n },\n ],\n name: 'RoleGranted',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'bytes32',\n name: 'role',\n type: 'bytes32',\n },\n {\n indexed: true,\n internalType: 'address',\n name: 'account',\n type: 'address',\n },\n {\n indexed: true,\n internalType: 'address',\n name: 'sender',\n type: 'address',\n },\n ],\n name: 'RoleRevoked',\n type: 'event',\n },\n {\n inputs: [],\n name: 'CALLER_ROLE',\n outputs: [\n {\n internalType: 'bytes32',\n name: '',\n type: 'bytes32',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'CLAIMER_ROLE',\n outputs: [\n {\n internalType: 'bytes32',\n name: '',\n type: 'bytes32',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'DEFAULT_ADMIN_ROLE',\n outputs: [\n {\n internalType: 'bytes32',\n name: '',\n type: 'bytes32',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'OPERATOR_ROLE',\n outputs: [\n {\n internalType: 'bytes32',\n name: '',\n type: 'bytes32',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'acceptDefaultAdminTransfer',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [],\n name: 'bascule',\n outputs: [\n {\n internalType: 'contract IBascule',\n name: '',\n type: 'address',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'bytes[]',\n name: 'payload',\n type: 'bytes[]',\n },\n {\n internalType: 'bytes[]',\n name: 'proof',\n type: 'bytes[]',\n },\n ],\n name: 'batchMint',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'bytes[]',\n name: 'mintPayload',\n type: 'bytes[]',\n },\n {\n internalType: 'bytes[]',\n name: 'proof',\n type: 'bytes[]',\n },\n {\n internalType: 'bytes[]',\n name: 'feePayload',\n type: 'bytes[]',\n },\n {\n internalType: 'bytes[]',\n name: 'userSignature',\n type: 'bytes[]',\n },\n ],\n name: 'batchMintWithFee',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'newAdmin',\n type: 'address',\n },\n ],\n name: 'beginDefaultAdminTransfer',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [],\n name: 'bitcoinChainId',\n outputs: [\n {\n internalType: 'bytes32',\n name: '',\n type: 'bytes32',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'token',\n type: 'address',\n },\n {\n internalType: 'bytes',\n name: 'scriptPubkey',\n type: 'bytes',\n },\n {\n internalType: 'uint256',\n name: 'amount',\n type: 'uint256',\n },\n ],\n name: 'calcUnstakeRequestAmount',\n outputs: [\n {\n internalType: 'uint256',\n name: 'amountAfterFee',\n type: 'uint256',\n },\n {\n internalType: 'bool',\n name: 'isAboveMinLimit',\n type: 'bool',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'cancelDefaultAdminTransfer',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'newVal',\n type: 'address',\n },\n ],\n name: 'changeBascule',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'uint48',\n name: 'newDelay',\n type: 'uint48',\n },\n ],\n name: 'changeDefaultAdminDelay',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'newVal',\n type: 'address',\n },\n ],\n name: 'changeMailbox',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'newValue',\n type: 'address',\n },\n ],\n name: 'changeNativeToken',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'token',\n type: 'address',\n },\n {\n internalType: 'address',\n name: 'newVal',\n type: 'address',\n },\n ],\n name: 'changeOracle',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'token',\n type: 'address',\n },\n {\n internalType: 'uint256',\n name: 'fee',\n type: 'uint256',\n },\n ],\n name: 'changeRedeemFee',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'uint256',\n name: 'fee',\n type: 'uint256',\n },\n ],\n name: 'changeRedeemFee',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'token',\n type: 'address',\n },\n {\n internalType: 'uint256',\n name: 'minAmount',\n type: 'uint256',\n },\n ],\n name: 'changeRedeemForBtcMinAmount',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'uint256',\n name: 'minAmount',\n type: 'uint256',\n },\n ],\n name: 'changeRedeemForBtcMinAmount',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'token',\n type: 'address',\n },\n {\n internalType: 'uint64',\n name: 'newValue',\n type: 'uint64',\n },\n ],\n name: 'changeToNativeCommission',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'token',\n type: 'address',\n },\n {\n internalType: 'uint256',\n name: 'redeemFee',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'redeemForBtcMinAmount',\n type: 'uint256',\n },\n {\n internalType: 'bool',\n name: 'redeemEnabled',\n type: 'bool',\n },\n ],\n name: 'changeTokenConfig',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'token',\n type: 'address',\n },\n {\n internalType: 'uint256',\n name: 'redeemFee',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'redeemForBtcMinAmount',\n type: 'uint256',\n },\n {\n internalType: 'address',\n name: 'oracle_',\n type: 'address',\n },\n {\n internalType: 'uint256',\n name: 'maximumMintCommission_',\n type: 'uint256',\n },\n {\n internalType: 'uint64',\n name: 'toNativeCommission_',\n type: 'uint64',\n },\n ],\n name: 'changeTokenConfigExt',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [],\n name: 'defaultAdmin',\n outputs: [\n {\n internalType: 'address',\n name: '',\n type: 'address',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'defaultAdminDelay',\n outputs: [\n {\n internalType: 'uint48',\n name: '',\n type: 'uint48',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'defaultAdminDelayIncreaseWait',\n outputs: [\n {\n internalType: 'uint48',\n name: '',\n type: 'uint48',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'fromAddress',\n type: 'address',\n },\n {\n internalType: 'address',\n name: 'toToken',\n type: 'address',\n },\n {\n internalType: 'uint256',\n name: 'amount',\n type: 'uint256',\n },\n ],\n name: 'deposit',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'bytes32',\n name: 'tolChainId',\n type: 'bytes32',\n },\n {\n internalType: 'bytes32',\n name: 'toToken',\n type: 'bytes32',\n },\n {\n internalType: 'bytes32',\n name: 'recipient',\n type: 'bytes32',\n },\n {\n internalType: 'uint256',\n name: 'amount',\n type: 'uint256',\n },\n ],\n name: 'deposit',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'token',\n type: 'address',\n },\n ],\n name: 'getRate',\n outputs: [\n {\n internalType: 'uint256',\n name: '',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'bytes32',\n name: 'role',\n type: 'bytes32',\n },\n ],\n name: 'getRoleAdmin',\n outputs: [\n {\n internalType: 'bytes32',\n name: '',\n type: 'bytes32',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'bytes32',\n name: 'fromToken',\n type: 'bytes32',\n },\n {\n internalType: 'bytes32',\n name: 'fromChainId',\n type: 'bytes32',\n },\n {\n internalType: 'bytes32',\n name: 'toChainId',\n type: 'bytes32',\n },\n {\n internalType: 'bytes32',\n name: 'toToken',\n type: 'bytes32',\n },\n ],\n name: 'getRouteType',\n outputs: [\n {\n internalType: 'enum IAssetRouter.RouteType',\n name: '',\n type: 'uint8',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'bytes32',\n name: 'role',\n type: 'bytes32',\n },\n {\n internalType: 'address',\n name: 'account',\n type: 'address',\n },\n ],\n name: 'grantRole',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n components: [\n {\n internalType: 'bytes32',\n name: 'id',\n type: 'bytes32',\n },\n {\n internalType: 'bytes32',\n name: 'msgPath',\n type: 'bytes32',\n },\n {\n internalType: 'uint256',\n name: 'msgNonce',\n type: 'uint256',\n },\n {\n internalType: 'bytes32',\n name: 'msgSender',\n type: 'bytes32',\n },\n {\n internalType: 'address',\n name: 'msgRecipient',\n type: 'address',\n },\n {\n internalType: 'address',\n name: 'msgDestinationCaller',\n type: 'address',\n },\n {\n internalType: 'bytes',\n name: 'msgBody',\n type: 'bytes',\n },\n ],\n internalType: 'struct GMPUtils.Payload',\n name: 'payload',\n type: 'tuple',\n },\n ],\n name: 'handlePayload',\n outputs: [\n {\n internalType: 'bytes',\n name: '',\n type: 'bytes',\n },\n ],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'bytes32',\n name: 'role',\n type: 'bytes32',\n },\n {\n internalType: 'address',\n name: 'account',\n type: 'address',\n },\n ],\n name: 'hasRole',\n outputs: [\n {\n internalType: 'bool',\n name: '',\n type: 'bool',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'owner_',\n type: 'address',\n },\n {\n internalType: 'uint48',\n name: 'initialOwnerDelay_',\n type: 'uint48',\n },\n {\n internalType: 'bytes32',\n name: 'ledgerChainId_',\n type: 'bytes32',\n },\n {\n internalType: 'bytes32',\n name: 'bitcoinChainId_',\n type: 'bytes32',\n },\n {\n internalType: 'address',\n name: 'mailbox_',\n type: 'address',\n },\n {\n internalType: 'address',\n name: 'bascule_',\n type: 'address',\n },\n ],\n name: 'initialize',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [],\n name: 'mailbox',\n outputs: [\n {\n internalType: 'contract IMailbox',\n name: '',\n type: 'address',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'token',\n type: 'address',\n },\n ],\n name: 'maxMintCommission',\n outputs: [\n {\n internalType: 'uint256',\n name: '',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'bytes',\n name: 'rawPayload',\n type: 'bytes',\n },\n {\n internalType: 'bytes',\n name: 'proof',\n type: 'bytes',\n },\n ],\n name: 'mint',\n outputs: [\n {\n internalType: 'address',\n name: '',\n type: 'address',\n },\n ],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'bytes',\n name: 'mintPayload',\n type: 'bytes',\n },\n {\n internalType: 'bytes',\n name: 'proof',\n type: 'bytes',\n },\n {\n internalType: 'bytes',\n name: 'feePayload',\n type: 'bytes',\n },\n {\n internalType: 'bytes',\n name: 'userSignature',\n type: 'bytes',\n },\n ],\n name: 'mintWithFee',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [],\n name: 'nativeToken',\n outputs: [\n {\n internalType: 'address',\n name: '',\n type: 'address',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'token',\n type: 'address',\n },\n ],\n name: 'oracle',\n outputs: [\n {\n internalType: 'contract IOracle',\n name: '',\n type: 'address',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'owner',\n outputs: [\n {\n internalType: 'address',\n name: '',\n type: 'address',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'pendingDefaultAdmin',\n outputs: [\n {\n internalType: 'address',\n name: 'newAdmin',\n type: 'address',\n },\n {\n internalType: 'uint48',\n name: 'schedule',\n type: 'uint48',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'pendingDefaultAdminDelay',\n outputs: [\n {\n internalType: 'uint48',\n name: 'newDelay',\n type: 'uint48',\n },\n {\n internalType: 'uint48',\n name: 'schedule',\n type: 'uint48',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'token',\n type: 'address',\n },\n ],\n name: 'ratio',\n outputs: [\n {\n internalType: 'uint256',\n name: '',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'fromAddress',\n type: 'address',\n },\n {\n internalType: 'address',\n name: 'fromToken',\n type: 'address',\n },\n {\n internalType: 'uint256',\n name: 'amount',\n type: 'uint256',\n },\n ],\n name: 'redeem',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'fromAddress',\n type: 'address',\n },\n {\n internalType: 'bytes32',\n name: 'tolChainId',\n type: 'bytes32',\n },\n {\n internalType: 'address',\n name: 'fromToken',\n type: 'address',\n },\n {\n internalType: 'bytes32',\n name: 'toToken',\n type: 'bytes32',\n },\n {\n internalType: 'bytes32',\n name: 'recipient',\n type: 'bytes32',\n },\n {\n internalType: 'uint256',\n name: 'amount',\n type: 'uint256',\n },\n ],\n name: 'redeem',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'fromAddress',\n type: 'address',\n },\n {\n internalType: 'address',\n name: 'fromToken',\n type: 'address',\n },\n {\n internalType: 'bytes',\n name: 'recipient',\n type: 'bytes',\n },\n {\n internalType: 'uint256',\n name: 'amount',\n type: 'uint256',\n },\n ],\n name: 'redeemForBtc',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'bytes32',\n name: 'fromToken',\n type: 'bytes32',\n },\n {\n internalType: 'bytes32',\n name: 'fromChainId',\n type: 'bytes32',\n },\n {\n internalType: 'bytes32',\n name: 'toToken',\n type: 'bytes32',\n },\n {\n internalType: 'bytes32',\n name: 'toChainId',\n type: 'bytes32',\n },\n ],\n name: 'removeRoute',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'bytes32',\n name: 'role',\n type: 'bytes32',\n },\n {\n internalType: 'address',\n name: 'account',\n type: 'address',\n },\n ],\n name: 'renounceRole',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'bytes32',\n name: 'role',\n type: 'bytes32',\n },\n {\n internalType: 'address',\n name: 'account',\n type: 'address',\n },\n ],\n name: 'revokeRole',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [],\n name: 'rollbackDefaultAdminDelay',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'token',\n type: 'address',\n },\n {\n internalType: 'uint256',\n name: 'fee',\n type: 'uint256',\n },\n ],\n name: 'setMaxMintCommission',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'bytes32',\n name: 'fromToken',\n type: 'bytes32',\n },\n {\n internalType: 'bytes32',\n name: 'fromChainId',\n type: 'bytes32',\n },\n {\n internalType: 'bytes32',\n name: 'toToken',\n type: 'bytes32',\n },\n {\n internalType: 'bytes32',\n name: 'toChainId',\n type: 'bytes32',\n },\n {\n internalType: 'enum IAssetRouter.RouteType',\n name: 'routeType',\n type: 'uint8',\n },\n ],\n name: 'setRoute',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'bytes4',\n name: 'interfaceId',\n type: 'bytes4',\n },\n ],\n name: 'supportsInterface',\n outputs: [\n {\n internalType: 'bool',\n name: '',\n type: 'bool',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'token',\n type: 'address',\n },\n ],\n name: 'toNativeCommission',\n outputs: [\n {\n internalType: 'uint64',\n name: '',\n type: 'uint64',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'toggleRedeem',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n internalType: 'address',\n name: 'token',\n type: 'address',\n },\n ],\n name: 'tokenConfig',\n outputs: [\n {\n internalType: 'uint256',\n name: 'redeemFee',\n type: 'uint256',\n },\n {\n internalType: 'uint256',\n name: 'redeemForBtcMinAmount',\n type: 'uint256',\n },\n {\n internalType: 'bool',\n name: 'isRedeemEnabled',\n type: 'bool',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n];\n","import BigNumber from 'bignumber.js';\n\nimport { makePublicClient } from '../../clients/public-client';\nimport { CommonParameters } from '../../common/parameters';\nimport ASSET_ROUTER_ABI from '../../tokens/abi/ASSET_ROUTER_ABI';\nimport { AddressKind, Token } from '../../tokens/token-addresses';\nimport { getTokenContractInfo, isUpgradedAbi } from '../../tokens/tokens';\nimport { determineEnv } from '../../utils/env';\nimport { fromSatoshi } from '../../utils/satoshi';\n\n/**\n * Gets LBTC minting fee amount.\n *\n * @param {CommonParameters} parameters - The parameters.\n * @param {ChainId} parameters.chainId - The chain id.\n * @param {string} parameters.rpcUrl - The optional rpc url.\n * @param {Env} parameters.env - The optional environment identifier.\n *\n * @return {Promise<BigNumber>}\n */\nexport async function getLBTCMintingFee(\n props: CommonParameters,\n): Promise<BigNumber> {\n return getMintingFee({ token: Token.LBTC, ...props });\n}\n\n/** Gets LBTC burn commission (fee) amount. */\nexport async function getLBTCBurningFee(props: CommonParameters) {\n return getRedeemFee({ token: Token.LBTC, ...props });\n}\n\nexport async function getMintingFee({\n token,\n chainId,\n rpcUrl,\n env,\n}: { token: Token } & CommonParameters) {\n if (![Token.LBTC, Token.BTCK, Token.BTCb].includes(token)) {\n throw new Error(`Unsupported token: ${token}`);\n }\n\n const environment = env || determineEnv(chainId);\n\n const publicClient = makePublicClient({ chainId, rpcUrl, env: environment });\n const tokenContract = await getTokenContractInfo(\n token,\n chainId,\n environment,\n AddressKind.Adapter,\n );\n const tokenContractAbi = tokenContract.abi;\n\n let rawFeeValue = 0n;\n\n if (isUpgradedAbi(tokenContractAbi) || token === Token.BTCb) {\n const assetRouterAddress = await publicClient.readContract({\n abi: tokenContractAbi,\n address: tokenContract.address,\n functionName: 'getAssetRouter',\n });\n\n const assetRouter = {\n abi: ASSET_ROUTER_ABI,\n address: assetRouterAddress,\n };\n\n rawFeeValue = (await publicClient.readContract({\n abi: assetRouter.abi,\n address: assetRouter.address,\n functionName: 'maxMintCommission',\n args: [tokenContract.address],\n })) as bigint;\n } else {\n rawFeeValue = await publicClient.readContract({\n abi: tokenContract.abi,\n address: tokenContract.address,\n functionName: 'getMintFee',\n });\n }\n\n return fromSatoshi(String(rawFeeValue));\n}\n\nexport async function getRedeemFee({\n token,\n chainId,\n rpcUrl,\n env,\n}: { token: Token } & CommonParameters) {\n if (![Token.LBTC, Token.BTCK, Token.BTCb].includes(token)) {\n throw new Error(`Unsupported token: ${token}`);\n }\n const environment = env || determineEnv(chainId);\n\n const publicClient = makePublicClient({ chainId, rpcUrl, env: environment });\n const tokenContract = await getTokenContractInfo(\n token,\n chainId,\n environment,\n AddressKind.Adapter,\n );\n\n let rawFeeValue = 0n;\n if (isUpgradedAbi(tokenContract.abi) || token === Token.BTCb) {\n const assetRouterAddress = await publicClient.readContract({\n abi: tokenContract.abi,\n address: tokenContract.address,\n functionName: 'getAssetRouter',\n });\n\n const assetRouter = {\n abi: ASSET_ROUTER_ABI,\n address: assetRouterAddress,\n };\n\n // 1.\n const toNativeCommissionValue = (await publicClient.readContract({\n abi: assetRouter.abi,\n address: assetRouter.address,\n functionName: 'toNativeCommission',\n args: [tokenContract.address],\n })) as bigint;\n\n // 2.\n const [redeemFeeValue /* redeemForBtcMinAmountValue, isRedeemEnabled */] =\n (await publicClient.readContract({\n abi: assetRouter.abi,\n address: assetRouter.address,\n functionName: 'tokenConfig',\n args: [tokenContract.address],\n })) as [bigint];\n\n rawFeeValue = toNativeCommissionValue + redeemFeeValue;\n } else {\n // legacy (and BTCK v1)\n rawFeeValue = await publicClient.readContract({\n abi: tokenContract.abi,\n address: tokenContract.address,\n functionName: 'getBurnCommission',\n });\n }\n\n return fromSatoshi(String(rawFeeValue));\n}\n\nexport async function getMinRedeemAmount({\n token,\n chainId,\n rpcUrl,\n env,\n}: { token: Token } & CommonParameters) {\n if (![Token.LBTC, Token.BTCK, Token.BTCb].includes(token)) {\n throw new Error(`Unsupported token: ${token}`);\n }\n\n const environment = env || determineEnv(chainId);\n\n const publicClient = makePublicClient({ chainId, rpcUrl, env: environment });\n const tokenContract = await getTokenContractInfo(\n token,\n chainId,\n environment,\n AddressKind.Adapter,\n );\n\n let value = 0n;\n if (isUpgradedAbi(tokenContract.abi) || token === Token.BTCb) {\n const assetRouterAddress = await publicClient.readContract({\n abi: tokenContract.abi,\n address: tokenContract.address,\n functionName: 'getAssetRouter',\n });\n\n const assetRouter = {\n abi: ASSET_ROUTER_ABI,\n address: assetRouterAddress,\n };\n\n const [, redeemForBtcMinAmountValue] = (await publicClient.readContract({\n abi: assetRouter.abi,\n address: assetRouter.address,\n functionName: 'tokenConfig',\n args: [tokenContract.address],\n })) as [undefined, bigint];\n\n value = redeemForBtcMinAmountValue;\n } else {\n // legacy (and BTCK v1)\n value = 2000n; // 0.00002\n }\n\n return fromSatoshi(String(value));\n}\n\n/**\n * Gets the minimum transfer amount required for a successful redemption to BTC.\n *\n * The contract deducts the redeem fee from the user's input first, then verifies\n * the remaining amount meets the minimum redeem threshold. Therefore, the minimum\n * transfer amount the user must provide is `redeemFee + minRedeemAmount`.\n *\n * @param params.token - The token to redeem (LBTC, BTCK, or BTCb).\n * @param params.chainId - The chain ID where the redemption takes place.\n * @param params.rpcUrl - Optional RPC URL override.\n * @param params.env - Optional environment identifier.\n *\n * @returns The minimum transfer amount in BTC (human-readable).\n *\n * @example\n * ```ts\n * const minTransfer = await getMinRedeemAmountWithFee({\n * token: Token.BTCb,\n * chainId: ChainId.avalanche,\n * env: Env.prod,\n * });\n * // e.g. BigNumber(0.000133) — user must send at least this much\n * ```\n */\nexport async function getMinRedeemAmountWithFee(\n params: { token: Token } & CommonParameters,\n): Promise<BigNumber> {\n const [fee, minRedeem] = await Promise.all([\n getRedeemFee(params),\n getMinRedeemAmount(params),\n ]);\n\n return fee.plus(minRedeem);\n}\n","/**\n * Validation utilities for stake and bake operations.\n * Provides early validation with descriptive error messages.\n */\n\nimport { Env } from '@lombard.finance/sdk-common';\n\nimport type { ChainId } from '../../common/chains';\nimport {\n DEFI_REGISTRY,\n DefiProtocol,\n StakeAndBakeStrategy,\n StakeAndBakeToken,\n} from '../../defi/defi-registry';\n\n/**\n * Custom error for stake and bake validation failures.\n * Includes error code and context for better debugging.\n */\nexport class StakeAndBakeValidationError extends Error {\n constructor(\n public readonly code: string,\n message: string,\n public readonly context?: Record<string, unknown>,\n ) {\n super(message);\n this.name = 'StakeAndBakeValidationError';\n }\n}\n\n/**\n * Validates stake and bake parameters and returns the strategy for the requested combo.\n * Throws StakeAndBakeValidationError for invalid combinations.\n *\n * @param vaultKey - The vault to stake into\n * @param token - The token to stake\n * @param chainId - The chain ID\n * @param env - The environment (prod, testnet, etc.)\n * @returns TokenApprovalConfig and spenderContract\n * @throws {StakeAndBakeValidationError} If vault/token/chain/env combination is invalid\n */\nexport function getStakeAndBakeConfig(\n protocol: DefiProtocol,\n token: StakeAndBakeToken,\n chainId: ChainId,\n env: Env,\n): StakeAndBakeStrategy {\n // Get token approval config from DeFi registry\n const protocolRegistry = DEFI_REGISTRY[protocol];\n if (!protocolRegistry) {\n throw new StakeAndBakeValidationError(\n 'UNSUPPORTED_VAULT',\n `Vault ${protocol} not found in DeFi registry`,\n { protocol },\n );\n }\n\n const tokenRegistry = protocolRegistry[token as keyof typeof protocolRegistry];\n if (!tokenRegistry) {\n throw new StakeAndBakeValidationError(\n 'UNSUPPORTED_TOKEN',\n `Token ${token} is not supported for stake and bake on vault ${protocol}. ` +\n `Supported tokens: ${Object.keys(protocolRegistry).join(', ')}`,\n { protocol, token, supportedTokens: Object.keys(protocolRegistry) },\n );\n }\n\n const envRegistry = tokenRegistry[env];\n if (!envRegistry) {\n throw new StakeAndBakeValidationError(\n 'UNSUPPORTED_ENV',\n `Environment ${env} is not supported for token ${token} on vault ${protocol}`,\n { protocol, token, env },\n );\n }\n\n const registryEntry = envRegistry[chainId as keyof typeof envRegistry];\n if (!registryEntry) {\n throw new StakeAndBakeValidationError(\n 'UNSUPPORTED_TOKEN_CHAIN',\n `Token ${token} is not supported on chain ${chainId} for vault ${protocol} in ${env}. ` +\n `Supported chains: ${Object.keys(envRegistry).join(', ')}`,\n {\n protocol,\n token,\n chainId,\n env,\n supportedChains: Object.keys(envRegistry),\n },\n );\n }\n\n return {\n protocol: protocol,\n token,\n env,\n chainId,\n ...registryEntry,\n };\n}\n\n/**\n * Checks if a token approval config exists for a given vault/token/chain/env combination.\n * Useful for determining if config-driven logic should be used.\n *\n * @param protocol - The vault to check\n * @param token - The token to check\n * @param chainId - The chain ID to check\n * @param env - The environment to check\n * @returns true if config exists, false otherwise\n */\nexport function hasTokenApprovalConfig(\n protocol: DefiProtocol,\n token: StakeAndBakeToken,\n chainId: ChainId,\n env: Env,\n): boolean {\n try {\n const config = getStakeAndBakeConfig(protocol, token, chainId, env);\n return config !== undefined;\n } catch {\n return false;\n }\n}\n","import { DEFAULT_ENV } from '@lombard.finance/sdk-common';\nimport BigNumber from 'bignumber.js';\nimport { getContract } from 'viem';\n\nimport { makePublicClient } from '../../clients/public-client';\nimport { CommonParameters } from '../../common/parameters';\nimport {\n DefiProtocol,\n DefiProtocols,\n StakeAndBakeToken,\n} from '../../defi/defi-registry';\nimport { Token } from '../../tokens/token-addresses';\nimport { getErrorMessage } from '../../utils/err';\nimport { fromSatoshi } from '../../utils/satoshi';\nimport { getStakeAndBakeConfig } from '../signStakeAndBake/validation';\n\n/**\n * Default token mapping for each protocol.\n * Used when token is not explicitly provided.\n */\nconst PROTOCOL_DEFAULT_TOKENS: Record<DefiProtocol, StakeAndBakeToken> = {\n [DefiProtocol.Veda]: Token.LBTC,\n [DefiProtocol.Silo]: Token.BTCb,\n};\n\nexport interface IGetStakeAndBakeFeeParams extends CommonParameters {\n /**\n * The DeFi protocol identifier (e.g., Veda, Silo).\n */\n protocol?: DefiProtocol;\n /**\n * The token to query the fee for (optional).\n * If not provided, defaults to the protocol's primary token:\n * - Veda: LBTC\n * - Silo: BTCb\n */\n token?: StakeAndBakeToken;\n}\n\n/**\n * Get Stake and bake fee for a specific DeFi protocol and token.\n *\n * If token is not provided, uses the default token for the protocol:\n * - Veda: LBTC\n * - Silo: BTCb\n *\n * @param {IGetStakeAndBakeFeeParams} parameters - The parameters.\n * @param {DefiProtocol} parameters.protocol - The optional DeFi protocol identifier (defaults to Veda).\n * @param {StakeAndBakeToken} parameters.token - The optional token (defaults to protocol's primary token).\n * @param {ChainId} parameters.chainId - The chain id.\n * @param {Env} parameters.env - The environment (prod, testnet, etc.).\n * @param {string} parameters.rpcUrl - The optional rpc url.\n *\n * @returns Stake and bake fee amount.\n */\nexport async function getStakeAndBakeFee({\n protocol = DefiProtocol.Veda,\n token,\n chainId,\n env = DEFAULT_ENV,\n rpcUrl,\n}: IGetStakeAndBakeFeeParams): Promise<BigNumber> {\n const protocolInfo = DefiProtocols[protocol];\n if (!protocolInfo) {\n throw new Error(`Unknown protocol: ${protocol}`);\n }\n\n // Use provided token or default to protocol's primary token\n const selectedToken = token ?? PROTOCOL_DEFAULT_TOKENS[protocol];\n\n // We use getStakeAndBakeConfig to ensure chain/env compatibility\n try {\n const strategy = getStakeAndBakeConfig(\n protocol,\n selectedToken,\n chainId,\n env,\n );\n\n const spenderContract = strategy.spenderContract;\n if (!spenderContract) {\n throw new Error(\n `Could not retrieve the stake and bake contract for ${protocol} on chain ${chainId}.`,\n );\n }\n\n const client = makePublicClient({ chainId, rpcUrl });\n const contract = getContract({\n abi: spenderContract.abi,\n address: spenderContract.address,\n client,\n });\n const fee = await contract.read.getStakeAndBakeFee();\n return fromSatoshi(String(fee));\n } catch (error) {\n const errorMessage = getErrorMessage(error);\n throw new Error(\n `Failed to get stake and bake fee for ${protocolInfo.name}: ${errorMessage}`,\n );\n }\n}\n","import { makeWalletClient } from '../../clients/wallet-client';\nimport { CommonWriteParameters } from '../../common/parameters';\n\nexport type SignLbtcDestinationAddrParams = Omit<\n CommonWriteParameters,\n 'env' | 'rpcUrl'\n>;\n\n/**\n * Generates the address confirmation message for a given chain ID.\n *\n * This is the exact message text that the backend expects when verifying\n * address confirmation signatures. The format is shared across all chain\n * types (EVM, Solana, Sui, Starknet).\n *\n * Use this function when you need to construct the message independently\n * (e.g., for custom signing flows) instead of using {@link signLbtcDestinationAddr}.\n *\n * @param chainId - The numeric chain ID (e.g., 43114 for Avalanche).\n * @returns The confirmation message string to be signed.\n *\n * @example\n * ```ts\n * import { getAddressConfirmationMessage } from '@lombard.finance/sdk';\n * import { ChainId } from '@lombard.finance/sdk';\n *\n * const message = getAddressConfirmationMessage(ChainId.avalanche);\n * // \"destination chain id is 43114\"\n *\n * // Sign with your own signer\n * const signature = await signer.signMessage(message);\n * ```\n */\nexport function getAddressConfirmationMessage(\n chainId: string | number,\n): string {\n return `destination chain id is ${chainId}`;\n}\n\n/**\n * Signs the destination address for the LBTC in active chain\n * in the current account. Signing is necessary for the\n * generation of the deposit address.\n *\n * @param {SignLbtcDestinationAddrParams} parameters - The parameters.\n * @param {Address} parameters.account - The EVM account address.\n * @param {ChainId} parameters.chainId - The chain id.\n * @param {EIP1193Provider} parameters.provider - The EIP1193 provider.\n *\n * @returns {Promise<string>} The signature of the message.\n */\nexport async function signLbtcDestinationAddr({\n account,\n chainId,\n provider,\n}: SignLbtcDestinationAddrParams): Promise<string> {\n const walletClient = makeWalletClient({ chainId, provider });\n\n const message = getAddressConfirmationMessage(chainId);\n const signed = await walletClient.signMessage({ account, message });\n\n return signed;\n}\n","import BigNumber from 'bignumber.js';\nimport { Hex } from 'viem';\n\nimport { makeWalletClient } from '../../clients/wallet-client';\nimport { CommonWriteParameters } from '../../common/parameters';\nimport { Token } from '../../tokens/token-addresses';\nimport { getTokenContractInfo } from '../../tokens/tokens';\nimport { DAY, now, toUnix } from '../../utils/time';\n\nexport interface ISignNetworkFeeParams extends CommonWriteParameters {\n /**\n * The authorized fee amount.\n * Recommended amount is the same as retuned from `getLBTCMintingFee`.\n */\n fee: BigNumber.Value;\n /**\n * The expiration time of the signature.\n * Defaults to 24h from now.\n */\n expiry?: number;\n /**\n * The token to use for signing.\n * Defaults to Token.LBTC for backwards compatibility.\n */\n token?: Token;\n}\n\nexport interface ISignNetworkFeeResponse {\n /**\n * The signature.\n */\n signature: Hex;\n /**\n * The typed data (JSON string) used for generating the returned signature.\n */\n typedData: string;\n}\n\n/**\n * Signs the network fee transaction in the current account.\n * Signing is necessary for the auto-mint.\n *\n * @param {ISignNetworkFeeParams} parameters - The parameters for signing network fee\n * @param {BigNumber.Value} parameters.fee - The fee amount (in satoshis).\n * @param {number} parameters.expiry = The optional expiration UNIX time of the signature.\n * @param {Address} parameters.account - The EVM account address.\n * @param {ChainId} parameters.chainId - The chain id.\n * @param {EIP1193Provider} parameters.provider - The EIP1193 provider.\n * @param {string} parameters.rpcUrl - The optional rpc url.\n *\n * @returns {Promise<ISignNetworkFeeResponse>} A promise that resolves to the signature and typed data\n */\nexport async function signNetworkFee({\n fee,\n expiry = toUnix(now() + DAY),\n account,\n chainId,\n provider,\n env,\n token = Token.LBTC,\n}: ISignNetworkFeeParams): Promise<ISignNetworkFeeResponse> {\n const tokenContract = await getTokenContractInfo(token, chainId, env);\n const walletClient = makeWalletClient({\n chainId,\n provider,\n });\n\n type TypedData = Parameters<typeof walletClient.signTypedData>[0];\n const typedData: TypedData = {\n account,\n domain: {\n name: token === Token.BTCb ? 'Bitcoin' : 'Lombard Staked Bitcoin',\n version: '1',\n chainId,\n verifyingContract: tokenContract.address,\n },\n message: {\n chainId,\n fee: BigInt(BigNumber(fee).toFixed()),\n expiry,\n },\n primaryType: 'feeApproval',\n types: {\n EIP712Domain: [\n { name: 'name', type: 'string' },\n { name: 'version', type: 'string' },\n { name: 'chainId', type: 'uint256' },\n { name: 'verifyingContract', type: 'address' },\n ],\n feeApproval: [\n { name: 'chainId', type: 'uint256' },\n { name: 'fee', type: 'uint256' },\n { name: 'expiry', type: 'uint256' },\n ],\n },\n };\n\n const signature = await walletClient.signTypedData(typedData);\n\n return {\n signature: signature,\n typedData: JSON.stringify(typedData, (_, v) =>\n typeof v === 'bigint' ? v.toString() : v,\n ),\n };\n}\n","import { DEFAULT_ENV } from '@lombard.finance/sdk-common';\nimport { Address } from 'viem';\n\nimport { makePublicClient } from '../../clients/public-client';\nimport { CommonParameters } from '../../common/parameters';\nimport { Token } from '../../tokens/token-addresses';\nimport { getTokenContractInfo } from '../../tokens/tokens';\nimport { determineEnv } from '../../utils/env';\n\nexport interface IGetPermitNonceParams extends CommonParameters {\n /**\n * Owner address to check permit nonce for\n */\n owner: Address;\n}\n\n/**\n * Get permit nonce for a specific owner address from LBTC contract.\n * This nonce is used in EIP-2612 permit operations.\n *\n * @param {IGetPermitNonceParams} parameters - The parameters.\n * @param {Address} parameters.owner - The account address.\n * @param {ChainId} parameters.chainId - The chain id.\n * @param {string} parameters.rpcUrl - The optional rpc url.\n * @param {Env} parameters.env - The optional environment identifier.\n */\nexport async function getPermitNonce({\n owner,\n chainId,\n rpcUrl,\n env = DEFAULT_ENV,\n}: IGetPermitNonceParams): Promise<string> {\n const environment = env || determineEnv(chainId);\n\n const publicClient = makePublicClient({ chainId, rpcUrl });\n const lbtcContract = await getTokenContractInfo(\n Token.LBTC,\n chainId,\n environment,\n );\n\n const nonce = await publicClient.readContract({\n abi: lbtcContract.abi,\n address: lbtcContract.address,\n functionName: 'nonces',\n args: [owner],\n });\n\n return String(nonce);\n}\n","/**\n * Typed data builders for EIP-712 signatures.\n * Centralizes EIP-712 structure creation for stake and bake operations.\n */\n\nimport type { Address } from 'viem';\n\nimport type { ChainId } from '../../common/chains';\nimport type { ApprovalMode } from '../../defi/defi-registry';\n\n/**\n * EIP-712 domain type definition.\n * Standard across all EIP-712 signatures.\n */\nexport const EIP712_DOMAIN_TYPES = [\n { name: 'name', type: 'string' },\n { name: 'version', type: 'string' },\n { name: 'chainId', type: 'uint256' },\n { name: 'verifyingContract', type: 'address' },\n] as const;\n\n/**\n * EIP-712 Permit message type definition (EIP-2612).\n * Used for gasless token approvals.\n */\nexport const PERMIT_MESSAGE_TYPES = [\n { name: 'owner', type: 'address' },\n { name: 'spender', type: 'address' },\n { name: 'value', type: 'uint256' },\n { name: 'nonce', type: 'uint256' },\n { name: 'deadline', type: 'uint256' },\n] as const;\n\n/**\n * EIP-712 Approve message type definition.\n * Used for traditional on-chain approvals (same structure as Permit).\n */\nexport const APPROVE_MESSAGE_TYPES = PERMIT_MESSAGE_TYPES;\n\n/**\n * Parameters for building typed data.\n */\nexport interface TypedDataParams {\n /** Approval mode (determines primary type) */\n mode: ApprovalMode;\n /** User's account address */\n account: Address;\n /** Chain ID */\n chainId: ChainId;\n /** Token contract address (verifying contract) */\n verifyingContract: Address;\n /** EIP-712 domain name */\n domainName: string;\n /** EIP-712 domain version */\n domainVersion: string;\n /** Spender contract address */\n spender: Address;\n /** Amount to approve/permit (in base units) */\n value: bigint;\n /** Nonce for replay protection */\n nonce: bigint;\n /** Deadline timestamp (or 0 for no deadline) */\n deadline: bigint;\n}\n\n/**\n * Builds EIP-712 typed data structure for signatures.\n *\n * @param params - Typed data parameters\n * @returns EIP-712 typed data structure ready for signing\n *\n * @example\n * ```typescript\n * const typedData = buildTypedData({\n * mode: 'permit',\n * account: '0x...',\n * chainId: 1,\n * verifyingContract: '0x...',\n * domainName: 'Lombard Staked Bitcoin',\n * domainVersion: '1',\n * spender: '0x...',\n * value: 1000000n,\n * nonce: 0n,\n * deadline: 1234567890n,\n * });\n *\n * const signature = await walletClient.signTypedData(typedData);\n * ```\n */\nexport function buildTypedData(params: TypedDataParams) {\n const primaryType = params.mode === 'permit' ? 'Permit' : 'Approve';\n\n return {\n account: params.account,\n domain: {\n name: params.domainName,\n version: params.domainVersion,\n chainId: BigInt(params.chainId),\n verifyingContract: params.verifyingContract,\n },\n types: {\n EIP712Domain: EIP712_DOMAIN_TYPES,\n [primaryType]:\n params.mode === 'permit' ? PERMIT_MESSAGE_TYPES : APPROVE_MESSAGE_TYPES,\n },\n primaryType,\n message: {\n owner: params.account,\n spender: params.spender,\n value: params.value,\n nonce: params.nonce,\n deadline: params.deadline,\n },\n } as const;\n}\n\n/**\n * Serializes typed data to JSON string.\n * Handles BigInt serialization by converting to strings.\n *\n * @param typedData - Typed data structure from buildTypedData\n * @returns JSON string representation\n *\n * @example\n * ```typescript\n * const typedData = buildTypedData(params);\n * const json = serializeTypedData(typedData);\n * // Store or transmit JSON string\n * ```\n */\nexport function serializeTypedData(\n typedData: ReturnType<typeof buildTypedData>,\n): string {\n return JSON.stringify(typedData, (_, v) =>\n typeof v === 'bigint' ? v.toString() : v,\n );\n}\n","import { Abi } from 'viem';\n\nimport { makePublicClient } from '../../clients/public-client';\nimport { makeWalletClient } from '../../clients/wallet-client';\nimport { ChainId } from '../../common/chains';\nimport {\n ISignStakeAndBakeParams,\n ISignStakeAndBakeResult,\n} from './signStakeAndBake';\nimport { buildTypedData, serializeTypedData } from './typed-data-builder';\n\n/**\n * Handle approve flow (on-chain transaction).\n * Checks allowance and submits approve transaction if needed.\n */\nexport async function handleApproveFlow(params: {\n account: `0x${string}`;\n chainId: ChainId;\n provider: ISignStakeAndBakeParams['provider'];\n rpcUrl: ISignStakeAndBakeParams['rpcUrl'];\n tokenAddress: `0x${string}`;\n tokenAbi: Abi;\n spenderAddress: `0x${string}`;\n typedData: ReturnType<typeof buildTypedData>;\n requiredAmount: bigint;\n}): Promise<ISignStakeAndBakeResult> {\n const {\n account,\n chainId,\n provider,\n rpcUrl,\n tokenAddress,\n tokenAbi,\n spenderAddress,\n typedData,\n requiredAmount,\n } = params;\n\n const publicClient = makePublicClient({ chainId, rpcUrl });\n const walletClient = makeWalletClient({ chainId, provider });\n\n // Check current allowance\n const currentAllowance = (await publicClient.readContract({\n address: tokenAddress,\n abi: tokenAbi,\n functionName: 'allowance',\n args: [account, spenderAddress],\n })) as bigint;\n\n let approvalTxHash: string | undefined;\n\n // Submit approve transaction if allowance is insufficient\n if (currentAllowance < requiredAmount) {\n const hash = await walletClient.writeContract({\n address: tokenAddress,\n abi: tokenAbi,\n functionName: 'approve',\n args: [spenderAddress, requiredAmount],\n account,\n chain: null,\n });\n\n // Wait for transaction confirmation\n const receipt = await publicClient.waitForTransactionReceipt({ hash });\n\n if (receipt.status !== 'success') {\n throw new Error(\n `Approve transaction failed: ${hash}. Please try again or contact support.`,\n );\n }\n\n approvalTxHash = hash;\n }\n\n return {\n mode: 'approve',\n signature: '',\n typedData: serializeTypedData(typedData),\n approvalTxHash,\n };\n}\n","import { makeWalletClient } from '../../clients/wallet-client';\nimport { ChainId } from '../../common/chains';\nimport {\n ISignStakeAndBakeParams,\n ISignStakeAndBakeResult,\n} from './signStakeAndBake';\nimport { buildTypedData, serializeTypedData } from './typed-data-builder';\n\n/**\n * Handle permit flow (off-chain signature).\n * Signs EIP-2612 typed data for gasless approval.\n */\nexport async function handlePermitFlow(params: {\n chainId: ChainId;\n provider: ISignStakeAndBakeParams['provider'];\n typedData: ReturnType<typeof buildTypedData>;\n}): Promise<ISignStakeAndBakeResult> {\n const { chainId, provider, typedData } = params;\n\n const walletClient = makeWalletClient({ chainId, provider });\n const signature = await walletClient.signTypedData(typedData);\n\n return {\n mode: 'permit',\n signature,\n typedData: serializeTypedData(typedData),\n };\n}\n","import { Env } from '@lombard.finance/sdk-common';\nimport BigNumber from 'bignumber.js';\n\nimport { getExchangeRatio } from '../../api-functions/getLBTCExchangeRate/get-exchange-ratio';\nimport { StakeAndBakeToken } from '../../defi/defi-registry';\nimport { AddressKind, Token } from '../../tokens/token-addresses';\nimport { getTokenContractInfo } from '../../tokens/tokens';\nimport { ISignStakeAndBakeParams } from './signStakeAndBake';\n\n/**\n * Calculate the permit value, applying BTC -> LBTC conversion if needed.\n */\nexport const getPermitValue = async (\n token: StakeAndBakeToken,\n value: BigNumber.Value,\n env: Env,\n): Promise<BigNumber> => {\n if (!token || token === 'BTC') {\n return await calculateStakeAndBakeLBTCAmount(value, env);\n }\n return new BigNumber(value);\n};\n\n/**\n * Get the token contract info for the given token.\n * For BTCb, always uses AddressKind.Token (the ERC20 token contract, not the adapter).\n */\nexport const getStakeAndBakeTokenContract = async (\n token: StakeAndBakeToken,\n chainId: ISignStakeAndBakeParams['chainId'],\n env: Env,\n): Promise<Awaited<ReturnType<typeof getTokenContractInfo>>> => {\n if (!token || token === 'BTC' || token === Token.LBTC) {\n return await getTokenContractInfo(Token.LBTC, chainId, env);\n }\n // For BTCb, use AddressKind.Token (ERC20 contract for permit/approve)\n return await getTokenContractInfo(token, chainId, env, AddressKind.Token);\n};\n\n/**\n * Helper function to calculate the correct LBTC amount for stake and bake\n * based on the current BTC to LBTC ratio.\n *\n * @param btcAmount - The original BTC amount entered by the user\n * @param env - The environment for fetching the exchange ratio\n * @returns The calculated LBTC amount that should be used in the permit signature\n */\nexport async function calculateStakeAndBakeLBTCAmount(\n btcAmount: BigNumber.Value,\n env?: Env,\n): Promise<BigNumber> {\n try {\n const ratios = await getExchangeRatio({ env });\n const btcTokenRatio = ratios.LBTC?.BTCTokenRatio || new BigNumber(1);\n const lbtcAmount = new BigNumber(btcAmount).dividedBy(btcTokenRatio);\n\n return lbtcAmount;\n } catch {\n throw new Error('Failed to get exchange ratio for stake and bake');\n }\n}\n","import { DEFAULT_ENV } from '@lombard.finance/sdk-common';\nimport BigNumber from 'bignumber.js';\n\nimport { CommonWriteParameters } from '../../common/parameters';\nimport {\n ApprovalMode,\n DefiProtocol,\n StakeAndBakeToken,\n} from '../../defi/defi-registry';\nimport { DAY, now, toUnix } from '../../utils/time';\nimport { getPermitNonce } from '../getPermitNonce/getPermitNonce';\nimport { handleApproveFlow } from './handleApprove';\nimport { handlePermitFlow } from './handlePermit';\nimport { buildTypedData } from './typed-data-builder';\nimport {\n calculateStakeAndBakeLBTCAmount,\n getStakeAndBakeTokenContract,\n} from './utils';\nimport { getStakeAndBakeConfig } from './validation';\n\nexport interface ISignStakeAndBakeParams extends CommonWriteParameters {\n /**\n * The approved BTC value that will be automatically claimed and deposited\n * to the chosen vault. The function will internally calculate the correct LBTC amount using the current ratio.\n */\n value: BigNumber.Value;\n /**\n * The expiration UNIX time of the signature.\n * Defaults to 24 hours from the time of signing.\n */\n expiry?: number;\n /**\n * The chosen DeFi vault to which the funds will be deposited.\n */\n vaultKey?: DefiProtocol;\n /**\n * The token for which the signature is generated.\n * - Defaults to **BTC**: the amount will be converted to the corresponding\n * **LBTC** value based on the current ratio.\n * - If **LBTC** is chosen: no conversion is performed.\n */\n token?: StakeAndBakeToken;\n}\n\nexport interface ISignStakeAndBakeResult {\n /**\n * The approval mode used for this signature.\n * - `permit`: Off-chain signature (EIP-2612), can be used directly by backend\n * - `approve`: On-chain approval transaction was submitted\n */\n mode: ApprovalMode;\n\n /**\n * The signature.\n * - For permit mode: Contains the EIP-2612 signature\n * - For approve mode: Empty string (approval was done on-chain)\n */\n signature: string;\n\n /**\n * The typed data used to generate the signature.\n * Contains the full EIP-712 structure for both permit and approve modes.\n */\n typedData: string;\n\n /**\n * Transaction hash for approve mode (when allowance was set).\n * Only present when mode is 'approve' and a transaction was submitted.\n */\n approvalTxHash?: string;\n}\n\n/**\n * Signs the \"stake and bake\" signature that allows Lombard to claim specified\n * amount of BTC (converted to LBTC using current ratio) and deposit that amount directly to the specified DeFi\n * vault.\n *\n * In order for the \"stake and bake\" process to work a user has to store the\n * signature to the Lombard's system, see: `storeStakeAndBakeSignature`\n *\n * @param {ISignStakeAndBakeParams} parameters - The parameters.\n * @param {BigNumber.Value} parameters.value - The amount of BTC that will be converted to LBTC using current ratio and deposited to the DeFi vault.\n * @param {number} parameters.expiry = The optional expiration UNIX time of the signature.\n * @param {DefiProtocol} parameters.vaultKey - The optional DeFi vault identifier.\n * @param {Address} parameters.account - The EVM account address.\n * @param {ChainId} parameters.chainId - The chain id.\n * @param {EIP1193Provider} parameters.provider - The EIP1193 provider.\n * @param {string} parameters.rpcUrl - The optional rpc url.\n *\n * @returns {Promise<ISignStakeAndBakeResult>} - The signature and typed data.\n */\nexport async function signStakeAndBake({\n account,\n expiry = toUnix(now() + DAY),\n value,\n // TODO: Rename vaultKey to protocol\n vaultKey: protocol = DefiProtocol.Veda,\n token = 'BTC',\n chainId,\n provider,\n rpcUrl,\n env = DEFAULT_ENV,\n}: ISignStakeAndBakeParams): Promise<ISignStakeAndBakeResult> {\n const strategy = getStakeAndBakeConfig(protocol, token, chainId, env);\n\n const spenderAddress = strategy.spenderContract.address;\n\n // Calculate permit value (with conversion if needed)\n const permitValue =\n strategy.amountStrategy === 'btcToLbtc'\n ? await calculateStakeAndBakeLBTCAmount(value, env)\n : new BigNumber(value);\n\n // Get token contract (always use Token address for permits/approves, not adapter)\n const tokenContract = await getStakeAndBakeTokenContract(token, chainId, env);\n const tokenAddress = tokenContract.address;\n const tokenAbi = tokenContract.abi;\n\n // Calculate deadline based on expiry behavior\n const deadline =\n strategy.approval.deadlineStrategy === 'zero' ? 0n : BigInt(expiry);\n\n // Get nonce if required\n const nonce =\n strategy.approval.nonceStrategy === 'chain'\n ? BigInt(await getPermitNonce({ owner: account, chainId, rpcUrl, env }))\n : 0n;\n\n // Build typed data using config\n const typedData = buildTypedData({\n mode: strategy.approval.mode,\n account,\n chainId,\n verifyingContract: tokenAddress,\n domainName: strategy.approval.domainName,\n domainVersion: strategy.approval.domainVersion,\n spender: spenderAddress,\n value: BigInt(permitValue.toFixed(0, BigNumber.ROUND_DOWN)),\n nonce,\n deadline,\n });\n\n // Delegate to appropriate handler based on mode\n if (strategy.approval.mode === 'approve') {\n return handleApproveFlow({\n account,\n chainId,\n provider,\n rpcUrl,\n tokenAddress,\n tokenAbi,\n spenderAddress,\n typedData,\n requiredAmount: BigInt(permitValue.toFixed(0, BigNumber.ROUND_DOWN)),\n });\n }\n\n // Permit mode\n return handlePermitFlow({ chainId, provider, typedData });\n}\n","import {\n Address,\n createWalletClient,\n Hex,\n http,\n isHex,\n LocalAccount,\n TransactionSerializable,\n WalletClient,\n} from 'viem';\n\nimport { CHAIN_ID_TO_VIEM_CHAIN_MAP, ChainId } from '../common/chains';\n\n/**\n * EVM transaction request structure compatible with unified bridge signers.\n * This matches the shape expected by bridge-unified's EvmSigner interface.\n */\nexport interface EvmTransactionRequest {\n /** Sender address */\n from: Address;\n /** Recipient address */\n to?: Address;\n /** Transaction data (calldata) */\n data?: Hex;\n /** Value to send in wei */\n value?: bigint;\n /** Gas limit */\n gas?: bigint;\n /** Maximum fee per gas (EIP-1559) */\n maxFeePerGas?: bigint;\n /** Maximum priority fee per gas (EIP-1559) */\n maxPriorityFeePerGas?: bigint;\n /** Chain ID in hex format (e.g., \"0x1\" for Ethereum mainnet) */\n chainId?: string;\n /** Transaction nonce */\n nonce?: number;\n}\n\n/**\n * Callback function to dispatch a signed transaction.\n * This is called by the signer after signing to broadcast the transaction.\n *\n * @param serializedTx - The signed, serialized transaction (0x-prefixed hex string)\n * @returns Promise resolving to the transaction hash\n */\nexport type DispatchCallback = (serializedTx: Hex) => Promise<Hex>;\n\n/**\n * Signer interface compatible with unified bridge's EvmSigner.\n * Handles transaction signing and optionally broadcasting.\n *\n * @remarks\n * The `sign` method receives a transaction request and a dispatch callback.\n * The signer should:\n * 1. Sign the transaction\n * 2. Call the dispatch callback with the signed transaction\n * 3. Return the transaction hash\n */\nexport interface SignerAdapter {\n /**\n * Signs a transaction and dispatches it via the provided callback.\n *\n * @param tx - The transaction request to sign\n * @param dispatch - Callback to broadcast the signed transaction\n * @returns Promise resolving to the transaction hash\n *\n * @example\n * ```ts\n * const txHash = await signer.sign(\n * { from, to, data, value },\n * (signedTx) => publicClient.sendRawTransaction({ serializedTransaction: signedTx })\n * );\n * ```\n */\n sign: (tx: EvmTransactionRequest, dispatch: DispatchCallback) => Promise<Hex>;\n}\n\n/**\n * Error thrown when transaction validation or signing fails.\n */\nexport class SignerError extends Error {\n constructor(\n public readonly code: string,\n message: string,\n public readonly context?: Record<string, unknown>,\n ) {\n super(message);\n this.name = 'SignerError';\n }\n}\n\n/**\n * Validates an EVM transaction request.\n * Throws SignerError if validation fails.\n *\n * @param tx - Transaction request to validate\n * @throws {SignerError} If required fields are missing or invalid\n */\nexport function validateTransactionRequest(\n tx: EvmTransactionRequest,\n operation = 'transaction',\n): void {\n if (!tx.from) {\n throw new SignerError(\n 'MISSING_FROM_ADDRESS',\n `Missing 'from' address for ${operation}`,\n { transaction: tx, operation },\n );\n }\n\n if (!tx.to) {\n throw new SignerError(\n 'MISSING_TO_ADDRESS',\n `Missing 'to' address for ${operation}`,\n { transaction: tx, operation },\n );\n }\n\n if (tx.data !== undefined && !isHex(tx.data)) {\n throw new SignerError(\n 'INVALID_DATA',\n `Transaction data must be valid hex string for ${operation}`,\n { transaction: tx, operation, data: tx.data },\n );\n }\n\n if (tx.chainId && !/^0x[0-9a-fA-F]+$/.test(tx.chainId)) {\n throw new SignerError(\n 'INVALID_CHAIN_ID',\n `Chain ID must be a hex string (e.g., \"0x1\") for ${operation}`,\n { transaction: tx, operation, chainId: tx.chainId },\n );\n }\n}\n\n/**\n * Creates a Viem LocalAccount from a SignerAdapter.\n * This allows the unified bridge's EvmSigner to be used as a standard Viem account.\n *\n * @param signer - The SignerAdapter to wrap\n * @param address - The account address\n * @param chainId - The chain ID\n * @returns A Viem LocalAccount that delegates signing to the SignerAdapter\n *\n * @remarks\n * This adapter enables the SDK to use a unified-bridge EvmSigner with Viem's\n * standard wallet client, eliminating the need for separate code paths.\n *\n * The adapter:\n * - Validates transaction requests before signing\n * - Converts between Viem and EvmSigner transaction formats\n * - Provides proper error context for debugging\n *\n * @example\n * ```ts\n * const account = createAccountFromSigner(\n * bridgeEvmSigner,\n * '0x1234...',\n * ChainId.ethereum\n * );\n *\n * const walletClient = createWalletClient({\n * account,\n * chain: mainnet,\n * transport: http(),\n * });\n *\n * // Now walletClient.writeContract works with the EvmSigner!\n * ```\n */\nexport function createAccountFromSigner(\n signer: SignerAdapter,\n address: Address,\n chainId: ChainId,\n): LocalAccount {\n const chain = CHAIN_ID_TO_VIEM_CHAIN_MAP[chainId];\n\n if (!chain) {\n throw new SignerError(\n 'UNSUPPORTED_CHAIN',\n `Chain ID ${chainId} is not supported`,\n { chainId, availableChains: Object.keys(CHAIN_ID_TO_VIEM_CHAIN_MAP) },\n );\n }\n\n /**\n * Custom account implementation that delegates to SignerAdapter\n */\n const customAccount: LocalAccount = {\n address,\n type: 'local' as const,\n publicKey:\n '0x0000000000000000000000000000000000000000000000000000000000000000' as Hex,\n source: 'custom' as const,\n\n /**\n * Signs a transaction using the SignerAdapter.\n * This is called by Viem's wallet client when executing transactions.\n */\n async signTransaction(transaction: TransactionSerializable): Promise<Hex> {\n // Convert Viem transaction to EvmTransactionRequest format\n const evmTx: EvmTransactionRequest = {\n from: address,\n to: transaction.to ?? undefined,\n data: transaction.data,\n value: transaction.value,\n gas: transaction.gas,\n maxFeePerGas: transaction.maxFeePerGas,\n maxPriorityFeePerGas: transaction.maxPriorityFeePerGas,\n chainId: transaction.chainId\n ? `0x${transaction.chainId.toString(16)}`\n : `0x${chain.id.toString(16)}`,\n nonce: transaction.nonce,\n };\n\n // Validate before signing\n validateTransactionRequest(evmTx, 'signTransaction');\n\n // Sign and return the serialized signed transaction\n // The dispatch callback here just returns what was passed (identity function)\n // because we want the signed transaction, not to broadcast it yet\n let signedTx: Hex | undefined;\n\n await signer.sign(evmTx, async serialized => {\n signedTx = serialized;\n // Return a dummy hash - the actual broadcasting happens via walletClient\n return serialized;\n });\n\n if (!signedTx) {\n throw new SignerError(\n 'SIGNING_FAILED',\n 'Signer did not return a signed transaction',\n { transaction: evmTx },\n );\n }\n\n // Ensure we return a Hex type (not null)\n return signedTx as Hex;\n },\n\n /**\n * Signs a message (EIP-191).\n * Not implemented as it's not needed for contract transactions.\n */\n async signMessage(): Promise<Hex> {\n throw new SignerError(\n 'NOT_IMPLEMENTED',\n 'Message signing is not supported by this adapter',\n { method: 'signMessage' },\n );\n },\n\n /**\n * Signs typed data (EIP-712).\n * Not implemented as it's not needed for contract transactions.\n */\n async signTypedData(): Promise<Hex> {\n throw new SignerError(\n 'NOT_IMPLEMENTED',\n 'Typed data signing is not supported by this adapter',\n { method: 'signTypedData' },\n );\n },\n };\n\n return customAccount;\n}\n\n/**\n * Creates a Viem wallet client from a SignerAdapter.\n * This is a convenience wrapper around createAccountFromSigner.\n *\n * @param signer - The SignerAdapter to use\n * @param address - The account address\n * @param chainId - The chain ID\n * @returns A Viem wallet client configured with the SignerAdapter\n *\n * @example\n * ```ts\n * const walletClient = createWalletClientFromSigner(\n * bridgeEvmSigner,\n * '0x1234...',\n * ChainId.ethereum\n * );\n *\n * // Use like any Viem wallet client\n * await walletClient.writeContract({ ... });\n * ```\n */\nexport function createWalletClientFromSigner(\n signer: SignerAdapter,\n address: Address,\n chainId: ChainId,\n): WalletClient {\n const chain = CHAIN_ID_TO_VIEM_CHAIN_MAP[chainId];\n\n if (!chain) {\n throw new SignerError(\n 'UNSUPPORTED_CHAIN',\n `Chain ID ${chainId} is not supported`,\n { chainId },\n );\n }\n\n const account = createAccountFromSigner(signer, address, chainId);\n\n return createWalletClient({\n account,\n chain,\n transport: http(), // Uses default RPC\n });\n}\n","import {\n Address,\n encodeFunctionData,\n Hex,\n PublicClient,\n SimulateContractParameters,\n SimulateContractReturnType,\n WalletClient,\n} from 'viem';\n\nimport {\n EvmTransactionRequest,\n SignerError,\n validateTransactionRequest,\n} from '../clients/evm-signer-adapter';\nimport { CHAIN_ID_TO_VIEM_CHAIN_MAP } from '../common/chains';\nimport {\n CommonSignerWriteParameters,\n CommonWriteParameters,\n isProviderFlow,\n isSignerFlow,\n} from '../common/parameters';\n\n/**\n * Minimal type-safe interface for contract simulation arguments.\n * Covers the essential properties we need while remaining flexible.\n */\nexport interface ContractCallArgs {\n /** Contract address to call */\n address: Address;\n /** Contract ABI */\n abi: readonly unknown[];\n /** Function name to call */\n functionName: string;\n /** Account making the call */\n account?: Address;\n /** Function arguments */\n args?: readonly unknown[];\n /** Value to send with the transaction */\n value?: bigint;\n /** Gas limit */\n gas?: bigint;\n /** Maximum fee per gas (EIP-1559) */\n maxFeePerGas?: bigint;\n /** Maximum priority fee per gas (EIP-1559) */\n maxPriorityFeePerGas?: bigint;\n /** Allow additional properties for chain-specific parameters */\n [key: string]: unknown;\n}\n\n/**\n * Parameters for executing a contract transaction.\n */\nexport interface ExecuteContractTxParams {\n /** The parameters provided by the caller (provider or signer flow) */\n params: CommonWriteParameters | CommonSignerWriteParameters;\n /** The public client for simulation and receipt waiting */\n publicClient: PublicClient;\n /** Optional wallet client (for provider flow) */\n walletClient?: WalletClient;\n /** The contract call to simulate */\n simulateArgs: ContractCallArgs;\n /** Operation name for error messages (e.g., \"approval\", \"redeem\") */\n operation: string;\n}\n\n/**\n * Result of a contract transaction execution.\n */\nexport interface ExecuteContractTxResult {\n /** The transaction hash */\n txHash: Hex;\n /** The simulation result (for debugging) */\n request: SimulateContractReturnType['request'];\n}\n\n/**\n * Executes a contract transaction using either provider or signer flow.\n *\n * This helper:\n * 1. Simulates the transaction with the public client\n * 2. Routes to appropriate execution path (provider or signer)\n * 3. Provides detailed error messages with context\n * 4. Validates all inputs before execution\n *\n * @param options - Execution parameters\n * @returns Transaction hash and request details\n * @throws {SignerError} If execution fails with detailed context\n *\n * @example\n * ```ts\n * // Provider flow\n * const result = await executeContractTransaction({\n * params: { provider, account, chainId, env },\n * publicClient,\n * walletClient,\n * simulateArgs: { address, abi, functionName, args },\n * operation: 'approval',\n * });\n *\n * // Signer flow\n * const result = await executeContractTransaction({\n * params: { signer, account, chainId, env },\n * publicClient,\n * simulateArgs: { address, abi, functionName, args },\n * operation: 'redeem',\n * });\n * ```\n */\nexport async function executeContractTransaction({\n params,\n publicClient,\n walletClient,\n simulateArgs,\n operation,\n}: ExecuteContractTxParams): Promise<ExecuteContractTxResult> {\n // Validate that we have either provider or signer\n if (!isProviderFlow(params) && !isSignerFlow(params)) {\n throw new SignerError(\n 'INVALID_PARAMETERS',\n 'Must provide either \"provider\" or \"signer\" in parameters',\n { params, operation },\n );\n }\n\n // Simulate the transaction\n let simulationResult: SimulateContractReturnType;\n try {\n // Cast to viem's expected type for simulation\n // This is safe because ContractCallArgs contains all required properties\n simulationResult = await publicClient.simulateContract(\n simulateArgs as SimulateContractParameters,\n );\n } catch (error) {\n throw new SignerError(\n 'SIMULATION_FAILED',\n `Failed to simulate ${operation} transaction: ${error instanceof Error ? error.message : 'Unknown error'}`,\n {\n operation,\n simulateArgs,\n error: error instanceof Error ? error.message : String(error),\n },\n );\n }\n\n const { request } = simulationResult;\n\n // Validate simulation result\n if (!request.account) {\n throw new SignerError(\n 'INVALID_SIMULATION',\n `Simulation succeeded but no account was set for ${operation}`,\n { operation, request },\n );\n }\n\n if (!request.address) {\n throw new SignerError(\n 'INVALID_SIMULATION',\n `Simulation succeeded but no target address was set for ${operation}`,\n { operation, request },\n );\n }\n\n // Execute transaction based on flow type\n let txHash: Hex;\n\n if (isProviderFlow(params)) {\n // Provider flow: use wallet client\n if (!walletClient) {\n throw new SignerError(\n 'MISSING_WALLET_CLIENT',\n 'Provider flow requires a wallet client',\n { operation, params },\n );\n }\n\n try {\n txHash = await walletClient.writeContract(request);\n } catch (error) {\n throw new SignerError(\n 'PROVIDER_TRANSACTION_FAILED',\n `Failed to execute ${operation} via provider: ${error instanceof Error ? error.message : 'Unknown error'}`,\n {\n operation,\n request,\n error: error instanceof Error ? error.message : String(error),\n },\n );\n }\n } else {\n // Signer flow: use signer adapter directly\n try {\n const chain = CHAIN_ID_TO_VIEM_CHAIN_MAP[params.chainId];\n\n if (!chain) {\n throw new SignerError(\n 'UNSUPPORTED_CHAIN',\n `Chain ${params.chainId} not supported`,\n { chainId: params.chainId },\n );\n }\n\n // Encode the contract call data from the original simulation args\n // (using simulateArgs.abi instead of request.abi to avoid type narrowing issues)\n const callData = encodeFunctionData({\n abi: simulateArgs.abi,\n functionName: simulateArgs.functionName,\n args: simulateArgs.args,\n });\n\n // Convert viem request to EvmTransactionRequest format\n const evmTx: EvmTransactionRequest = {\n from: params.account,\n to: request.address,\n data: callData,\n value: request.value,\n gas: request.gas,\n maxFeePerGas: request.maxFeePerGas,\n maxPriorityFeePerGas: request.maxPriorityFeePerGas,\n chainId: `0x${chain.id.toString(16)}`,\n };\n\n // Validate transaction before signing\n validateTransactionRequest(evmTx, operation);\n\n // Sign and broadcast using the signer adapter\n txHash = await params.signer.sign(evmTx, async signedTx => {\n // Dispatch callback: broadcast the signed transaction\n return await publicClient.sendRawTransaction({\n serializedTransaction: signedTx,\n });\n });\n } catch (error) {\n throw new SignerError(\n 'SIGNER_TRANSACTION_FAILED',\n `Failed to execute ${operation} via signer: ${error instanceof Error ? error.message : 'Unknown error'}`,\n {\n operation,\n request,\n error: error instanceof Error ? error.message : String(error),\n },\n );\n }\n }\n\n return { txHash, request };\n}\n\n/**\n * Waits for a transaction receipt and provides detailed error information on failure.\n *\n * @param publicClient - The public client to use\n * @param txHash - The transaction hash to wait for\n * @param operation - Operation name for error messages\n * @throws {SignerError} If waiting for receipt fails\n */\nexport async function waitForTransactionReceipt(\n publicClient: PublicClient,\n txHash: Hex,\n operation: string,\n) {\n try {\n const receipt = await publicClient.waitForTransactionReceipt({\n hash: txHash,\n });\n\n if (receipt.status === 'reverted') {\n throw new SignerError(\n 'TRANSACTION_REVERTED',\n `${operation} transaction reverted`,\n {\n operation,\n txHash,\n receipt: {\n blockNumber: receipt.blockNumber,\n gasUsed: receipt.gasUsed,\n },\n },\n );\n }\n\n return receipt;\n } catch (error) {\n if (error instanceof SignerError) {\n throw error;\n }\n\n throw new SignerError(\n 'RECEIPT_WAIT_FAILED',\n `Failed to wait for ${operation} transaction receipt: ${error instanceof Error ? error.message : 'Unknown error'}`,\n {\n operation,\n txHash,\n error: error instanceof Error ? error.message : String(error),\n },\n );\n }\n}\n","import { decodeFunctionData, encodeAbiParameters, keccak256 } from 'viem';\n\nconst GMP_V1_SELECTOR = '0xe288fb4a';\nconst MINT_SELECTOR = '0x155b6b13';\n\n// ABI for the outer payload (matches your Solidity encodePayload/MessageV1)\nconst gmpPayloadAbi = {\n type: 'function',\n name: 'MessageV1',\n inputs: [\n { name: 'msgPath', type: 'bytes32' },\n { name: 'msgNonce', type: 'uint256' },\n { name: 'msgSender', type: 'bytes32' },\n { name: 'msgRecipient', type: 'bytes32' },\n { name: 'msgDestinationCaller', type: 'bytes32' },\n { name: 'msgBody', type: 'bytes' },\n ],\n} as const;\n\n// ABI for the inner body (mint)\nconst mintAbi = {\n type: 'function',\n name: 'mint',\n inputs: [\n { name: 'toToken', type: 'bytes32' },\n { name: 'recipient', type: 'bytes32' },\n { name: 'amount', type: 'uint256' },\n ],\n} as const;\n\nexport interface DecodedMintBody {\n selector: string;\n toToken: string;\n recipient: string;\n amount: bigint;\n}\n\nexport interface DecodedGmpPayload {\n selector: string; // outer selector (GMP_V1_SELECTOR)\n msgPath: string;\n msgNonce: bigint;\n msgSender: string;\n msgRecipient: string;\n msgDestinationCaller: string;\n rawBody: string; // full hex of msgBody\n mint: DecodedMintBody; // decoded body\n}\n\n/**\n * Example usage (for testing/debugging):\n *\n * async function testDecoding() {\n * const res = decodeGmpMintPayload(\n * '0xe288fb4a022d9999f6a62cd3401ba6e03ae710a1b3fcd8a77325b435371108676e600a5f...',\n * );\n * console.log(res);\n * const mintID = calcMintIDFromDecoded(res, 747474); // Katana chainId\n * console.log(mintID);\n * }\n */\n\n/**\n * Decode ABI-encoded GMP Payload hex where msgBody is an ABI-encoded `mint` call.\n */\nexport function decodeGmpMintPayload(hexData: string): DecodedGmpPayload {\n if (!hexData.startsWith('0x')) {\n throw new Error('Payload must be 0x-prefixed hex');\n }\n\n // 1) Check outer selector\n const selector = hexData.slice(0, 10); // 4 bytes = 8 hex chars + '0x'\n if (selector.toLowerCase() !== GMP_V1_SELECTOR.toLowerCase()) {\n throw new Error(\n `Invalid GMP selector: expected ${GMP_V1_SELECTOR}, got ${selector}`,\n );\n }\n\n // 2) Decode outer payload using viem\n const decoded = decodeFunctionData({\n abi: [gmpPayloadAbi],\n data: hexData as `0x${string}`,\n });\n\n if (!decoded.args) {\n throw new Error('Failed to decode GMP payload: args is undefined');\n }\n\n const msgPath = decoded.args[0] as string;\n const msgNonce = decoded.args[1] as bigint;\n const msgSender = decoded.args[2] as string;\n const msgRecipient = decoded.args[3] as string;\n const msgDestinationCaller = decoded.args[4] as string;\n const msgBody = decoded.args[5] as string; // bytes => 0x…\n\n if (typeof msgBody !== 'string' || !msgBody.startsWith('0x')) {\n throw new Error('msgBody is not valid hex');\n }\n\n // 3) Check inner selector (mint)\n const bodySelector = msgBody.slice(0, 10);\n if (bodySelector.toLowerCase() !== MINT_SELECTOR.toLowerCase()) {\n throw new Error(\n `Invalid mint selector in body: expected ${MINT_SELECTOR}, got ${bodySelector}`,\n );\n }\n\n // 4) Decode mint body using viem\n const mintDecoded = decodeFunctionData({\n abi: [mintAbi],\n data: msgBody as `0x${string}`,\n });\n\n if (!mintDecoded.args) {\n throw new Error('Failed to decode mint body: args is undefined');\n }\n\n const toToken = mintDecoded.args[0] as string;\n const recipient = mintDecoded.args[1] as string;\n const amount = mintDecoded.args[2] as bigint;\n\n return {\n selector,\n msgPath,\n msgNonce,\n msgSender,\n msgRecipient,\n msgDestinationCaller,\n rawBody: msgBody,\n mint: {\n selector: bodySelector,\n toToken,\n recipient,\n amount,\n },\n };\n}\n\n/**\n * Calculate mintID off-chain, equivalent to Solidity _mintID(Message).\n *\n * @param decoded - result of decodeGmpMintPayload(...)\n * @param chainId - destination EVM chain id (same as block.chainid on that chain)\n */\nexport function calcMintIDFromDecoded(\n decoded: DecodedGmpPayload,\n chainId: bigint | number | string,\n): string {\n const { msgNonce, mint } = decoded;\n\n // Solidity: abi.encode(uint256 nonce, uint256 chainId, address recipient, address toToken, uint256 amount)\n const encoded = encodeAbiParameters(\n [\n { name: 'nonce', type: 'uint256' },\n { name: 'chainId', type: 'uint256' },\n { name: 'recipient', type: 'bytes32' },\n { name: 'toToken', type: 'bytes32' },\n { name: 'amount', type: 'uint256' },\n ],\n [\n BigInt(msgNonce), // self.nonce\n BigInt(chainId), // block.chainid\n mint.recipient as `0x${string}`, // self.recipient\n mint.toToken as `0x${string}`, // self.toToken\n BigInt(mint.amount), // self.amount\n ],\n );\n\n // bytes32 mintID = keccak256(encoded)\n return keccak256(encoded);\n}\n","export default [\n {\n inputs: [\n { internalType: 'address', name: 'aDefaultAdmin', type: 'address' },\n { internalType: 'address', name: 'aPauser', type: 'address' },\n { internalType: 'address', name: 'aMintReporter', type: 'address' },\n { internalType: 'address', name: 'aMintValidator', type: 'address' },\n { internalType: 'uint256', name: 'aMaxMints', type: 'uint256' },\n { internalType: 'address', name: 'aTrustedSigner', type: 'address' },\n ],\n stateMutability: 'nonpayable',\n type: 'constructor',\n },\n { inputs: [], name: 'AccessControlBadConfirmation', type: 'error' },\n {\n inputs: [{ internalType: 'uint48', name: 'schedule', type: 'uint48' }],\n name: 'AccessControlEnforcedDefaultAdminDelay',\n type: 'error',\n },\n {\n inputs: [],\n name: 'AccessControlEnforcedDefaultAdminRules',\n type: 'error',\n },\n {\n inputs: [\n { internalType: 'address', name: 'defaultAdmin', type: 'address' },\n ],\n name: 'AccessControlInvalidDefaultAdmin',\n type: 'error',\n },\n {\n inputs: [\n { internalType: 'address', name: 'account', type: 'address' },\n { internalType: 'bytes32', name: 'neededRole', type: 'bytes32' },\n ],\n name: 'AccessControlUnauthorizedAccount',\n type: 'error',\n },\n {\n inputs: [\n { internalType: 'bytes32', name: 'mintID', type: 'bytes32' },\n { internalType: 'uint256', name: 'mintAmount', type: 'uint256' },\n ],\n name: 'AlreadyMinted',\n type: 'error',\n },\n { inputs: [], name: 'BadMintProofsSize', type: 'error' },\n { inputs: [], name: 'BadMintReport', type: 'error' },\n {\n inputs: [\n { internalType: 'uint256', name: 'index', type: 'uint256' },\n { internalType: 'bytes32', name: 'mintID', type: 'bytes32' },\n { internalType: 'bytes', name: 'proof', type: 'bytes' },\n ],\n name: 'BadProof',\n type: 'error',\n },\n { inputs: [], name: 'EnforcedPause', type: 'error' },\n { inputs: [], name: 'ExpectedPause', type: 'error' },\n {\n inputs: [\n { internalType: 'bytes32', name: 'mintID', type: 'bytes32' },\n { internalType: 'uint256', name: 'mintAmount', type: 'uint256' },\n ],\n name: 'MintFailedValidation',\n type: 'error',\n },\n {\n inputs: [{ internalType: 'bytes32', name: 'mintID', type: 'bytes32' }],\n name: 'NotReported',\n type: 'error',\n },\n {\n inputs: [\n { internalType: 'uint8', name: 'bits', type: 'uint8' },\n { internalType: 'uint256', name: 'value', type: 'uint256' },\n ],\n name: 'SafeCastOverflowedUintDowncast',\n type: 'error',\n },\n { inputs: [], name: 'SameValidationThreshold', type: 'error' },\n { inputs: [], name: 'ZeroTrustedAddress', type: 'error' },\n {\n anonymous: false,\n inputs: [],\n name: 'DefaultAdminDelayChangeCanceled',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: 'uint48',\n name: 'newDelay',\n type: 'uint48',\n },\n {\n indexed: false,\n internalType: 'uint48',\n name: 'effectSchedule',\n type: 'uint48',\n },\n ],\n name: 'DefaultAdminDelayChangeScheduled',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [],\n name: 'DefaultAdminTransferCanceled',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'address',\n name: 'newAdmin',\n type: 'address',\n },\n {\n indexed: false,\n internalType: 'uint48',\n name: 'acceptSchedule',\n type: 'uint48',\n },\n ],\n name: 'DefaultAdminTransferScheduled',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: 'uint256',\n name: 'numMints',\n type: 'uint256',\n },\n ],\n name: 'MaxMintsUpdated',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'bytes32',\n name: 'mintID',\n type: 'bytes32',\n },\n ],\n name: 'MintAlreadyReportedOrProcessed',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: 'bytes32',\n name: 'mintID',\n type: 'bytes32',\n },\n {\n indexed: false,\n internalType: 'uint256',\n name: 'mintAmount',\n type: 'uint256',\n },\n ],\n name: 'MintNotValidated',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: 'bytes32',\n name: 'mintID',\n type: 'bytes32',\n },\n {\n indexed: false,\n internalType: 'uint256',\n name: 'mintAmount',\n type: 'uint256',\n },\n ],\n name: 'MintValidated',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'bytes32',\n name: 'reportId',\n type: 'bytes32',\n },\n {\n indexed: false,\n internalType: 'uint256',\n name: 'numMints',\n type: 'uint256',\n },\n ],\n name: 'MintsReported',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: 'address',\n name: 'account',\n type: 'address',\n },\n ],\n name: 'Paused',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'bytes32',\n name: 'role',\n type: 'bytes32',\n },\n {\n indexed: true,\n internalType: 'bytes32',\n name: 'previousAdminRole',\n type: 'bytes32',\n },\n {\n indexed: true,\n internalType: 'bytes32',\n name: 'newAdminRole',\n type: 'bytes32',\n },\n ],\n name: 'RoleAdminChanged',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'bytes32',\n name: 'role',\n type: 'bytes32',\n },\n {\n indexed: true,\n internalType: 'address',\n name: 'account',\n type: 'address',\n },\n {\n indexed: true,\n internalType: 'address',\n name: 'sender',\n type: 'address',\n },\n ],\n name: 'RoleGranted',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: 'bytes32',\n name: 'role',\n type: 'bytes32',\n },\n {\n indexed: true,\n internalType: 'address',\n name: 'account',\n type: 'address',\n },\n {\n indexed: true,\n internalType: 'address',\n name: 'sender',\n type: 'address',\n },\n ],\n name: 'RoleRevoked',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: 'address',\n name: 'trustedSigner',\n type: 'address',\n },\n ],\n name: 'TrustedSignerUpdated',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: 'address',\n name: 'account',\n type: 'address',\n },\n ],\n name: 'Unpaused',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: 'uint256',\n name: 'oldThreshold',\n type: 'uint256',\n },\n {\n indexed: false,\n internalType: 'uint256',\n name: 'newThreshold',\n type: 'uint256',\n },\n ],\n name: 'UpdateValidateThreshold',\n type: 'event',\n },\n {\n inputs: [],\n name: 'DEFAULT_ADMIN_ROLE',\n outputs: [{ internalType: 'bytes32', name: '', type: 'bytes32' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'MINT_REPORTER_ROLE',\n outputs: [{ internalType: 'bytes32', name: '', type: 'bytes32' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'MINT_VALIDATOR_ROLE',\n outputs: [{ internalType: 'bytes32', name: '', type: 'bytes32' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'PAUSER_ROLE',\n outputs: [{ internalType: 'bytes32', name: '', type: 'bytes32' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'VALIDATION_GUARDIAN_ROLE',\n outputs: [{ internalType: 'bytes32', name: '', type: 'bytes32' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'acceptDefaultAdminTransfer',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [{ internalType: 'address', name: 'newAdmin', type: 'address' }],\n name: 'beginDefaultAdminTransfer',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [],\n name: 'cancelDefaultAdminTransfer',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [{ internalType: 'uint48', name: 'newDelay', type: 'uint48' }],\n name: 'changeDefaultAdminDelay',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [],\n name: 'defaultAdmin',\n outputs: [{ internalType: 'address', name: '', type: 'address' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'defaultAdminDelay',\n outputs: [{ internalType: 'uint48', name: '', type: 'uint48' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'defaultAdminDelayIncreaseWait',\n outputs: [{ internalType: 'uint48', name: '', type: 'uint48' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [{ internalType: 'bytes32', name: 'role', type: 'bytes32' }],\n name: 'getRoleAdmin',\n outputs: [{ internalType: 'bytes32', name: '', type: 'bytes32' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n { internalType: 'bytes32', name: 'role', type: 'bytes32' },\n { internalType: 'address', name: 'account', type: 'address' },\n ],\n name: 'grantRole',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n { internalType: 'bytes32', name: 'role', type: 'bytes32' },\n { internalType: 'address', name: 'account', type: 'address' },\n ],\n name: 'hasRole',\n outputs: [{ internalType: 'bool', name: '', type: 'bool' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'maxMints',\n outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [{ internalType: 'bytes32', name: 'mintID', type: 'bytes32' }],\n name: 'mintHistory',\n outputs: [\n {\n components: [\n { internalType: 'uint256', name: 'nonce', type: 'uint256' },\n { internalType: 'address', name: 'recipient', type: 'address' },\n { internalType: 'address', name: 'toToken', type: 'address' },\n { internalType: 'uint256', name: 'amount', type: 'uint256' },\n ],\n internalType: 'struct IGMPBascule.Message',\n name: 'msg',\n type: 'tuple',\n },\n {\n internalType: 'enum GMPBasculeV1.MintState',\n name: 'status',\n type: 'uint8',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'owner',\n outputs: [{ internalType: 'address', name: '', type: 'address' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'pause',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [],\n name: 'paused',\n outputs: [{ internalType: 'bool', name: '', type: 'bool' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'pendingDefaultAdmin',\n outputs: [\n { internalType: 'address', name: 'newAdmin', type: 'address' },\n { internalType: 'uint48', name: 'schedule', type: 'uint48' },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'pendingDefaultAdminDelay',\n outputs: [\n { internalType: 'uint48', name: 'newDelay', type: 'uint48' },\n { internalType: 'uint48', name: 'schedule', type: 'uint48' },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n { internalType: 'bytes32', name: 'role', type: 'bytes32' },\n { internalType: 'address', name: 'account', type: 'address' },\n ],\n name: 'renounceRole',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n { internalType: 'bytes32', name: 'reportId', type: 'bytes32' },\n {\n components: [\n { internalType: 'uint256', name: 'nonce', type: 'uint256' },\n { internalType: 'address', name: 'recipient', type: 'address' },\n { internalType: 'address', name: 'toToken', type: 'address' },\n { internalType: 'uint256', name: 'amount', type: 'uint256' },\n ],\n internalType: 'struct IGMPBascule.Message[]',\n name: 'mints',\n type: 'tuple[]',\n },\n { internalType: 'bytes[]', name: 'proofs', type: 'bytes[]' },\n ],\n name: 'reportMints',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n { internalType: 'bytes32', name: 'role', type: 'bytes32' },\n { internalType: 'address', name: 'account', type: 'address' },\n ],\n name: 'revokeRole',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [],\n name: 'rollbackDefaultAdminDelay',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [{ internalType: 'uint256', name: 'aMaxMints', type: 'uint256' }],\n name: 'setMaxMints',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n { internalType: 'address', name: 'aTrustedSigner', type: 'address' },\n ],\n name: 'setTrustedSigner',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [{ internalType: 'bytes4', name: 'interfaceId', type: 'bytes4' }],\n name: 'supportsInterface',\n outputs: [{ internalType: 'bool', name: '', type: 'bool' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'trustedSigner',\n outputs: [{ internalType: 'address', name: '', type: 'address' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'unpause',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n { internalType: 'uint256', name: 'newThreshold', type: 'uint256' },\n ],\n name: 'updateValidateThreshold',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n {\n components: [\n { internalType: 'uint256', name: 'nonce', type: 'uint256' },\n { internalType: 'address', name: 'recipient', type: 'address' },\n { internalType: 'address', name: 'toToken', type: 'address' },\n { internalType: 'uint256', name: 'amount', type: 'uint256' },\n ],\n internalType: 'struct IGMPBascule.Message',\n name: 'mintMsg',\n type: 'tuple',\n },\n ],\n name: 'validateMint',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [],\n name: 'validateThreshold',\n outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],\n stateMutability: 'view',\n type: 'function',\n },\n];\n","import { DEFAULT_ENV } from '@lombard.finance/sdk-common';\nimport {\n Address,\n ByteArray,\n Client,\n getContract,\n keccak256,\n PublicClient,\n zeroAddress,\n} from 'viem';\n\nimport { Deposit } from '../../api-functions/getDepositsByAddress/getDepositsByAddress';\nimport { makePublicClient } from '../../clients/public-client';\nimport { makeWalletClient } from '../../clients/wallet-client';\nimport {\n ChainId,\n isEthereumChain,\n isKatanaChain,\n isMegaethChain,\n isMonadChain,\n isStableChain,\n} from '../../common/chains';\nimport { CommonOptionalWriteParameters } from '../../common/parameters';\nimport ASSET_ROUTER_ABI from '../../tokens/abi/ASSET_ROUTER_ABI';\nimport KATANA_BASCULE_ABI from '../../tokens/abi/KATANA_BASCULE_ABI';\nimport LBTC_BASCULE_ABI from '../../tokens/abi/LBTC_BASCULE_ABI.json';\nimport { AddressKind, Token } from '../../tokens/token-addresses';\nimport { getTokenContractInfo, isUpgradedAbi } from '../../tokens/tokens';\nimport { getErrorMessage } from '../../utils/err';\nimport {\n calcMintIDFromDecoded,\n decodeGmpMintPayload,\n} from './decodeBasculeDepositStatus';\n\n/**\n * The bascule drawbridge deposit status.\n */\nexport enum BasculeDepositStatus {\n /**\n * The value representing that the deposit is unreported or potentially\n * still pending.\n */\n UNREPORTED = 0,\n /**\n * The value representing that the deposit is reported.\n */\n REPORTED = 1,\n /**\n * The value representing that the deposit has already been withdrawn.\n */\n WITHDRAWN = 2,\n}\n\nexport interface IGetBasculeDepositStatusParameters\n extends CommonOptionalWriteParameters {\n /**\n * The deposit for which the bascule status will be checked.\n * You can omit `rawPayload` parameter if `deposit` is provided.\n */\n deposit?: Deposit;\n /**\n * The `rawPayload` of the deposit for which the bascule status\n * will be checked.\n * You can omit `deposit` parameter if `rawPayload` is provided.\n */\n rawPayload?: string;\n token?: Token;\n}\n\n/**\n * Gets the Bascule drawbridge deposit status for given deposit.\n *\n * **Multiple Bascule Interfaces:**\n * This function supports two different bascule contract interfaces:\n * - **Asset Router (upgraded)**: Uses `bascule()` getter - for StakedLBTC and upgraded contracts\n * - **Bridge Token Adapter**: Uses `getBascule()` getter - for BTCb on Avalanche\n * - **Legacy NativeLBTC**: Uses `Bascule()` getter - for old LBTC contracts\n *\n * **MintID Calculation:**\n * For Katana chains, this function uses proper GMP payload decoding to calculate\n * the mintID, which matches the Solidity implementation. For other chains, it uses\n * a simplified method.\n *\n * @param {IGetBasculeDepositStatusParameters} parameters - The parameters.\n * @param {Deposit} parameters.deposit - The deposit for which the bascule status will be checked. You can omit `rawPayload` parameter if `deposit` is provided.\n * @param {string} parameters.rawPayload - The `rawPayload` of the deposit for which the bascule status will be checked. You can omit `deposit` parameter if `rawPayload` is provided.\n * @param {ChainId} parameters.chainId - The chain id. For Katana chains (Katana mainnet or Katana Tatara testnet), GMP payload decoding is used.\n * @param {Token} parameters.token - The token for which to check bascule status. Defaults to Token.LBTC.\n * @param {EIP1193Provider} parameters.provider - The optional EIP1193 provider.\n * @param {string} parameters.rpcUrl - The optional rpc url.\n * @param {Env} parameters.env - The optional environment identifier.\n *\n * @returns {Promise<BasculeDepositStatus>}\n */\nexport async function getBasculeDepositStatus({\n deposit,\n rawPayload,\n provider,\n chainId,\n rpcUrl,\n env = DEFAULT_ENV,\n token = Token.LBTC,\n}: IGetBasculeDepositStatusParameters) {\n const payload = deposit?.rawPayload || rawPayload;\n\n if (!payload) {\n throw new Error(\n \"No 'rawPayload' or 'deposit' data provided. Please provide 'rawPayload' or 'deposit' parameter.\",\n );\n }\n\n const publicClient = makePublicClient({ chainId, rpcUrl, env });\n const tokenContractInfo = await getTokenContractInfo(\n token,\n chainId,\n env,\n AddressKind.Adapter,\n );\n\n // Determine which bascule getter function to use based on the contract type\n // There are three different approaches:\n // 1. Upgraded contracts (Asset Router): token.getAssetRouter() -> assetRouter.bascule()\n // 2. Bridge Token Adapter (BTCb on Avalanche): getBascule()\n // 3. Legacy contracts (NativeLBTC): Bascule()\n\n let basculeContractAddress: Address;\n\n if (\n token === Token.BTCb &&\n (chainId === ChainId.avalanche || chainId === ChainId.avalancheFuji)\n ) {\n basculeContractAddress = (await publicClient.readContract({\n abi: tokenContractInfo.abi,\n address: tokenContractInfo.address,\n functionName: 'getBascule',\n })) as Address;\n } else if (isUpgradedAbi(tokenContractInfo.abi) && token === Token.LBTC) {\n // Upgraded contract - get bascule from Asset Router\n const assetRouterAddress = (await publicClient.readContract({\n abi: tokenContractInfo.abi,\n address: tokenContractInfo.address,\n functionName: 'getAssetRouter',\n })) as Address;\n\n basculeContractAddress = (await publicClient.readContract({\n abi: ASSET_ROUTER_ABI,\n address: assetRouterAddress,\n functionName: 'bascule',\n })) as Address;\n } else {\n basculeContractAddress = (await publicClient.readContract({\n abi: tokenContractInfo.abi,\n address: tokenContractInfo.address,\n functionName: 'Bascule',\n })) as Address;\n }\n\n // If there's no bascule contract address on the LBTC contract then return\n // the the deposit is ok (REPORTED).\n if (basculeContractAddress === zeroAddress) {\n return BasculeDepositStatus.REPORTED;\n }\n\n let client: PublicClient | Client | undefined = undefined;\n if (!provider) {\n client = makePublicClient({ chainId, rpcUrl });\n } else {\n client = makeWalletClient({ provider, chainId });\n }\n\n if (!client) {\n throw new Error(\n \"Could not determine the client for the contract interactions. Please provide the 'provider' and 'chainId' parameters or 'chainId' and optionally the 'rpcUrl' parameter.\",\n );\n }\n\n const shouldCheckMintHistory =\n (isKatanaChain(chainId) ||\n isMonadChain(chainId) ||\n isEthereumChain(chainId) ||\n isStableChain(chainId) ||\n isMegaethChain(chainId)) &&\n token === Token.LBTC;\n\n try {\n // For Katana chains, use proper GMP payload decoding to calculate mintID\n if (shouldCheckMintHistory) {\n const prefixedPayload = payload.startsWith('0x')\n ? payload\n : `0x${payload}`;\n const decoded = decodeGmpMintPayload(prefixedPayload);\n const mintId = calcMintIDFromDecoded(decoded, chainId);\n\n const [, status] = (await publicClient.readContract({\n abi: KATANA_BASCULE_ABI,\n address: basculeContractAddress,\n functionName: 'mintHistory',\n args: [mintId],\n })) as [unknown, BasculeDepositStatus];\n\n return status;\n }\n\n // For non-Katana chains, use the simple method\n const basculeDepositId = keccak256(\n Buffer.from(payload.slice(8), 'hex') as unknown as ByteArray,\n );\n\n const basculeContract = getContract({\n abi: LBTC_BASCULE_ABI,\n address: basculeContractAddress,\n client: publicClient,\n });\n\n const status = await basculeContract.read.depositHistory([\n basculeDepositId,\n ]);\n return status as BasculeDepositStatus;\n } catch (err) {\n throw new Error(getErrorMessage(err));\n }\n}\n","import { Env } from '@lombard.finance/sdk-common';\nimport BigNumber from 'bignumber.js';\nimport { Address, Hash } from 'viem';\n\nimport { makePublicClient } from '../../clients/public-client';\nimport { makeWalletClient } from '../../clients/wallet-client';\nimport { CHAIN_ID_TO_VIEM_CHAIN_MAP, ChainId } from '../../common/chains';\nimport { CommonWriteParameters, IEnvParam } from '../../common/parameters';\nimport { Token } from '../../tokens/token-addresses';\nimport {\n fromBaseDenomination,\n getTokenInfo,\n toBaseDenomination,\n} from '../../tokens/tokens';\nimport toBigInt from '../../utils/numbers';\n\nexport interface IApproveTokenParams extends CommonWriteParameters, IEnvParam {\n /**\n * The token to approve.\n */\n token: Token;\n /**\n * The spender account address.\n */\n spender: Address;\n /**\n * The approved amount of the token.\n */\n amount: BigNumber.Value;\n}\n\n/**\n * Approves the provided spender to withdraw a specified amount of a token from\n * your account.\n *\n * @param {IApproveTokenParams} parameters - The parameters.\n * @param {Token} parameters.token - The token to approve.\n * @param {Address} parameters.spender - The spender account address.\n * @param {BigNumber.Value} parameters.amount - The amount of the token.\n * @param {Address} parameters.account - The EVM account address.\n * @param {ChainId} parameters.chainId - The chain id.\n * @param {EIP1193Provider} parameters.provider - The EIP1193 provider.\n * @param {string} parameters.rpcUrl - The optional rpc url.\n * @param {Env} parameters.env - The optional environment identifier.\n *\n * @returns {Promise<Hash>}\n */\nexport async function approveToken({\n account,\n token,\n spender,\n amount,\n chainId,\n provider,\n rpcUrl,\n env,\n}: IApproveTokenParams): Promise<Hash> {\n const publicClient = makePublicClient({ chainId, rpcUrl, env });\n const walletClient = makeWalletClient({ chainId, provider });\n\n const tokenInfo = await getTokenInfo(token, chainId, env, rpcUrl);\n if (!tokenInfo) {\n throw new Error(`Token info not found for ${token} on chain ${chainId}`);\n }\n\n const amountBase = toBigInt(\n toBaseDenomination(BigNumber(amount), tokenInfo.decimals),\n );\n\n const { request } = await publicClient.simulateContract({\n address: tokenInfo.address,\n account,\n chain: CHAIN_ID_TO_VIEM_CHAIN_MAP[chainId],\n abi: tokenInfo.abi,\n functionName: 'approve',\n args: [spender, amountBase],\n });\n\n const txHash = await walletClient.writeContract(request);\n\n return txHash;\n}\n\n/**\n * Gets the allowance of a token for a spender.\n *\n * @param {Object} parameters - The parameters.\n * @param {Token} parameters.token - The token.\n * @param {Address} parameters.owner - The owner account address.\n * @param {Address} parameters.spender - The spender account address.\n * @param {ChainId} parameters.chainId - The chain id.\n * @param {string} parameters.rpcUrl - The optional rpc url.\n * @param {Env} parameters.env - The optional environment identifier.\n *\n * @returns {Promise<BigNumber>}\n */\nexport async function getTokenAllowance({\n token,\n owner,\n spender,\n chainId,\n rpcUrl,\n env,\n}: {\n token: Token;\n owner: Address;\n spender: Address;\n chainId: ChainId;\n rpcUrl?: string;\n env?: Env;\n}): Promise<BigNumber> {\n const publicClient = makePublicClient({ chainId, rpcUrl, env });\n const tokenInfo = await getTokenInfo(token, chainId, env, rpcUrl);\n if (!tokenInfo) {\n throw new Error(`Token info not found for ${token} on chain ${chainId}`);\n }\n\n const allowanceRaw = (await publicClient.readContract({\n address: tokenInfo.address,\n abi: tokenInfo.abi,\n functionName: 'allowance',\n args: [owner, spender],\n })) as bigint;\n\n return fromBaseDenomination(allowanceRaw.toString(), tokenInfo.decimals);\n}\n","import BigNumber from 'bignumber.js';\nimport { PublicClient } from 'viem';\n\nexport const estimateGasFees = async (\n publicClient: PublicClient,\n callData: Parameters<PublicClient['estimateContractGas']>[0],\n overwriteMaxPriorityFeePerGas?: bigint,\n) => {\n const fees = await publicClient.estimateFeesPerGas();\n\n const multiplier = BigNumber(String(fees.maxFeePerGas)).dividedBy(\n String(fees.maxPriorityFeePerGas),\n );\n\n const maxPriorityFeePerGas = overwriteMaxPriorityFeePerGas\n ? overwriteMaxPriorityFeePerGas\n : fees.maxPriorityFeePerGas;\n\n const maxFeePerGas = overwriteMaxPriorityFeePerGas\n ? BigInt(\n BigNumber(String(maxPriorityFeePerGas))\n .multipliedBy(multiplier)\n .toFixed(0),\n )\n : fees.maxFeePerGas;\n\n const gas = await publicClient.estimateContractGas(callData);\n\n const gasEstimationData = {\n gas,\n maxFeePerGas,\n maxPriorityFeePerGas,\n };\n\n return gasEstimationData;\n};\n","import { Hash, parseGwei } from 'viem';\n\nimport { makePublicClient } from '../../clients/public-client';\nimport { makeWalletClient } from '../../clients/wallet-client';\nimport { CHAIN_ID_TO_VIEM_CHAIN_MAP, isKatanaChain } from '../../common/chains';\nimport { CommonWriteParameters } from '../../common/parameters';\nimport { AddressKind, Token } from '../../tokens/token-addresses';\nimport { getTokenContractInfo } from '../../tokens/tokens';\nimport { estimateGasFees } from '../../utils/gas';\nimport { ensureHex } from '../../utils/hex';\nimport {\n BasculeDepositStatus,\n getBasculeDepositStatus,\n} from '../getBasculeDepositStatus';\n\nexport interface IClaimLBTCParams extends CommonWriteParameters {\n /**\n * The raw payload from deposit notarization, see `Deposit.rawPayload`.\n */\n data: string;\n /**\n * The proof signature from deposit notarization, see `Deposit.proof`.\n */\n proofSignature: string;\n}\n\n/**\n * Mints a specified token (LBTC or NativeLBTC) from a notarized deposit.\n *\n * This is the primary function for claiming tokens from a deposit notarization.\n *\n * It performs the following steps:\n * 1. Validates that the token is supported.\n * 2. Checks chain restrictions.\n * 3. Fetches the token contract information.\n * 4. Checks the deposit status via Bascule.\n * 5. Prepares the transaction call data and estimates gas fees if on Katana.\n * 6. Simulates the contract call and executes the transaction via the provided wallet.\n *\n * @param {Object} params - The parameters.\n * @param {string} params.data - Raw payload from the deposit notarization (`Deposit.rawPayload`).\n * @param {string} params.proofSignature - Signature from the deposit notarization (`Deposit.proof`).\n * @param {Address} params.account - The EVM account address that will receive the tokens.\n * @param {ChainId} params.chainId - The chain ID of the target blockchain network.\n * @param {EIP1193Provider} params.provider - The connected wallet provider.\n * @param {string} [params.rpcUrl] - Optional RPC URL for the blockchain network.\n * @param {Env} [params.env] - Optional environment identifier (e.g., `prod`, `staging`).\n * @param {Token} [params.token=Token.LBTC] - The token to mint. Defaults to LBTC.\n *\n * @returns {Promise<Hash>} Resolves with the transaction hash of the mint operation.\n *\n * @throws Will throw an error if:\n * - The token is unsupported.\n * - BTCK minting is attempted on a non-Katana chain.\n * - The deposit is unreported, withdrawn, or blocked by bridge security.\n */\nexport async function mintToken({\n data,\n proofSignature,\n account,\n chainId,\n provider,\n rpcUrl,\n env,\n token = Token.LBTC,\n}: IClaimLBTCParams & { token?: Token }) {\n if (![Token.LBTC, Token.BTCK, Token.BTCb].includes(token)) {\n throw new Error('Unsupported token');\n }\n\n if (token === Token.BTCK && !isKatanaChain(chainId)) {\n throw new Error('Operation not permitted');\n }\n\n const tokenContract = await getTokenContractInfo(\n token,\n chainId,\n env,\n AddressKind.Adapter,\n );\n const basculeStatus = await getBasculeDepositStatus({\n chainId,\n rawPayload: data,\n env,\n token,\n });\n\n if (basculeStatus !== BasculeDepositStatus.REPORTED) {\n switch (basculeStatus) {\n case BasculeDepositStatus.UNREPORTED:\n throw new Error(\n 'The deposit cannot be claimed because it is unreported or potentially still pending, please try again later.',\n );\n case BasculeDepositStatus.WITHDRAWN:\n throw new Error(\n 'The deposit cannot be claimed because it is withdrawn already.',\n );\n default: // unknown bascule deposit status\n throw new Error(\n 'The deposit cannot be claimed because it is blocked by bridge security.',\n );\n }\n }\n\n const publicClient = makePublicClient({ chainId, rpcUrl, env });\n const walletClient = makeWalletClient({ chainId, provider });\n\n const callData = {\n address: tokenContract.address,\n account,\n chain: CHAIN_ID_TO_VIEM_CHAIN_MAP[chainId],\n abi: tokenContract.abi,\n functionName:\n token === Token.BTCK || token === Token.BTCb ? 'mintV1' : 'mint',\n args: [ensureHex(data), ensureHex(proofSignature)],\n } as const;\n\n const gasEstimationData = isKatanaChain(chainId)\n ? await estimateGasFees(publicClient, callData, parseGwei('1'))\n : {};\n\n const { request } = await publicClient.simulateContract({\n ...callData,\n ...gasEstimationData,\n });\n\n const txHash = await walletClient.writeContract(request);\n\n return txHash;\n}\n\n/**\n * Convenience wrapper for minting LBTC from a deposit notarization.\n *\n * Internally calls `mintToken` with the `Token.LBTC` argument.\n *\n * @param {IClaimLBTCParams} params - The parameters for claiming LBTC.\n * @returns {Promise<Hash>} Resolves with the transaction hash of the LBTC mint operation.\n */\nexport async function claimLBTC({\n data,\n proofSignature,\n account,\n chainId,\n provider,\n rpcUrl,\n env,\n}: IClaimLBTCParams): Promise<Hash> {\n return mintToken({\n data,\n proofSignature,\n account,\n chainId,\n provider,\n rpcUrl,\n env,\n token: Token.LBTC,\n });\n}\n","/**\n * Asset Router deposit functionality for token swaps\n */\nimport BigNumber from 'bignumber.js';\nimport { Address } from 'viem';\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, IEnvParam } from '../../common/parameters';\nimport ASSET_ROUTER_ABI from '../../tokens/abi/ASSET_ROUTER_ABI';\nimport { AddressKind, Token } from '../../tokens/token-addresses';\nimport {\n fromBaseDenomination,\n getTokenContractInfo,\n retrieveTokenProperties,\n toBaseDenomination,\n} from '../../tokens/tokens';\nimport { UnsupportedTokenFlow } from '../../utils/err';\nimport toBigInt from '../../utils/numbers';\n\nconst AVAILABLE_FLOWS: Array<{\n tokenIn: Token;\n tokenOut: Token;\n}> = [\n {\n tokenIn: Token.BTCb,\n tokenOut: Token.LBTC,\n },\n];\n\n/* -------------------------------------------------------------------------- */\n/* Types */\n/* -------------------------------------------------------------------------- */\n\n/**\n * Parameters for depositing tokens into a supported token contract.\n *\n * Extends {@link CommonWriteParameters} and {@link IEnvParam}.\n */\ntype DepositTokenParameters = {\n /**\n * The amount of tokens to deposit in human-readable format\n * (e.g., `1.23` for 1.23 XBTC).\n */\n amount: BigNumber.Value;\n /**\n * The input token that will be deposited.\n * Defaults to {@link Token.BTCb}.\n */\n tokenIn: Token;\n /**\n * The output token to be minted after deposit.\n * Defaults to {@link Token.LBTC}.\n */\n tokenOut: Token;\n} & CommonWriteParameters &\n IEnvParam;\n\n/* -------------------------------------------------------------------------- */\n/* Public API */\n/* -------------------------------------------------------------------------- */\n\n/**\n * Gets the AssetRouter address for a given token.\n *\n * This is useful for approving tokens before calling the deposit function.\n *\n * @param tokenIn - The input token (e.g., Token.BTCb)\n * @param chainId - The chain ID\n * @param env - The environment\n * @param rpcUrl - Optional RPC URL\n * @returns The AssetRouter address\n */\nexport async function getAssetRouterAddress({\n tokenIn,\n chainId,\n env,\n rpcUrl,\n}: {\n tokenIn: Token;\n chainId: CommonWriteParameters['chainId'];\n env?: IEnvParam['env'];\n rpcUrl?: string;\n}): Promise<Address> {\n const publicClient = makePublicClient({ chainId, rpcUrl, env });\n\n const adapterContractInfo = await getTokenContractInfo(\n tokenIn,\n chainId,\n env,\n AddressKind.Adapter,\n );\n\n const assetRouterAddress = (await publicClient.readContract({\n address: adapterContractInfo.address,\n abi: adapterContractInfo.abi,\n functionName: 'getAssetRouter',\n })) as Address;\n\n return assetRouterAddress;\n}\n\n/**\n * Deposits tokens using the Asset Router contract to mint the corresponding output token.\n *\n * This function validates the deposit flow (input → output token), retrieves token and adapter contract\n * information, obtains the AssetRouter address, and submits a `deposit` transaction to the AssetRouter contract.\n *\n * **Note:** This function does NOT handle token approval. You must approve tokens for the AssetRouter\n * before calling this function. Use {@link getAssetRouterAddress} to get the spender address for approval.\n *\n * ---\n * **Supported flows:**\n * - BTC.b → LBTC\n *\n * ---\n * **Errors thrown:**\n * - `UnsupportedTokenDepositFlow` if the (tokenIn, tokenOut) pair is not supported\n * - `Error` if token contract properties cannot be retrieved\n * - `Error` if the deposit amount exceeds the account balance\n * - `Error` if insufficient allowance (tokens not approved)\n */\nexport async function depositToken({\n account: accountAddress,\n amount: amountRaw,\n chainId,\n env,\n provider,\n rpcUrl,\n tokenIn = Token.BTCb,\n tokenOut = Token.LBTC,\n}: DepositTokenParameters) {\n const flow = AVAILABLE_FLOWS.find(\n af => af.tokenIn === tokenIn && af.tokenOut === tokenOut,\n );\n if (!flow) {\n throw new UnsupportedTokenFlow(tokenIn, tokenOut, chainId, env);\n }\n\n const publicClient = makePublicClient({ chainId, rpcUrl, env });\n const walletClient = makeWalletClient({ provider, chainId });\n\n // Get adapter contract for tokenIn (BTC.b)\n const adapterContractInfo = await getTokenContractInfo(\n tokenIn,\n chainId,\n env,\n AddressKind.Adapter,\n );\n\n // Get token contract for tokenIn to check balance and approve\n const tokenInContractInfo = await getTokenContractInfo(\n tokenIn,\n chainId,\n env,\n AddressKind.Token,\n );\n\n // Get token contract for tokenOut to pass to AssetRouter\n const tokenOutContractInfo = await getTokenContractInfo(\n tokenOut,\n chainId,\n env,\n AddressKind.Token,\n );\n\n const IN = await retrieveTokenProperties(publicClient, tokenInContractInfo);\n if (!IN) {\n throw new Error(\n `Could not retrieve the properties of ${tokenIn} on ${chainId}`,\n );\n }\n\n // Get AssetRouter address from adapter contract\n const assetRouterAddress = (await publicClient.readContract({\n address: adapterContractInfo.address,\n abi: adapterContractInfo.abi,\n functionName: 'getAssetRouter',\n })) as Address;\n\n const amount = BigNumber(amountRaw);\n const amountBigInt = toBigInt(toBaseDenomination(amount, IN.decimals));\n\n // Check token balance\n const tokenInBalanceRaw = await publicClient.readContract({\n address: IN.address,\n abi: IN.abi,\n functionName: 'balanceOf',\n args: [accountAddress],\n });\n const tokenInBalance = fromBaseDenomination(tokenInBalanceRaw, IN.decimals);\n\n if (amount.isGreaterThan(tokenInBalance)) {\n throw new Error(\n `Unable to deposit ${amount.toString()} ${IN.symbol} because the amount exceeds the account's balance of ${tokenInBalance.toString()} ${IN.symbol}`,\n );\n }\n\n // const isAvalanche =\n // chainId === ChainId.avalanche || chainId === ChainId.avalancheFuji;\n\n // Call deposit on AssetRouter\n const hash = await walletClient.writeContract({\n address: assetRouterAddress,\n abi: ASSET_ROUTER_ABI,\n chain: CHAIN_ID_TO_VIEM_CHAIN_MAP[chainId],\n functionName: 'deposit',\n args: [accountAddress, tokenOutContractInfo.address, amountBigInt],\n account: accountAddress,\n });\n\n return hash;\n}\n","import { getOutputScript } from '@lombard.finance/sdk-common';\nimport BigNumber from 'bignumber.js';\nimport { Address, erc20Abi, Hex, parseGwei } from 'viem';\n\nimport { makePublicClient } from '../../clients/public-client';\nimport { makeWalletClient } from '../../clients/wallet-client';\nimport {\n CHAIN_ID_TO_VIEM_CHAIN_MAP,\n ChainId,\n isKatanaChain,\n} from '../../common/chains';\nimport {\n CommonSignerWriteParameters,\n CommonWriteParameters,\n isProviderFlow,\n} from '../../common/parameters';\nimport ASSET_ROUTER_ABI from '../../tokens/abi/ASSET_ROUTER_ABI';\nimport { AddressKind, Token } from '../../tokens/token-addresses';\nimport {\n fromBaseDenomination,\n getTokenContractInfo,\n isUpgradedAbi,\n retrieveTokenProperties,\n toBaseDenomination,\n} from '../../tokens/tokens';\nimport { UnsupportedTokenFlow } from '../../utils/err';\nimport { estimateGasFees } from '../../utils/gas';\nimport toBigInt from '../../utils/numbers';\nimport {\n executeContractTransaction,\n waitForTransactionReceipt,\n} from '../../utils/transaction-executor';\n\n/**\n * Supported redemption flows.\n *\n * - If `tokenOut` is `undefined`, the redemption defaults to **BTC**\n * and requires a BTC address as the destination.\n * - Otherwise, redemption will return the specified output token.\n */\nconst AVAILABLE_FLOWS: Array<{\n /** The token being redeemed */\n tokenIn: Token;\n /** The token received after redemption (or `undefined` for BTC) */\n tokenOut?: Token;\n}> = [\n // Redeem to BTC\n { tokenIn: Token.LBTC }, // -> BTC\n { tokenIn: Token.BTCb }, // -> BTC\n { tokenIn: Token.BTCK }, // -> BTC\n\n // Redeem to wrapped tokens\n { tokenIn: Token.LBTC, tokenOut: Token.BTCb }, // -> Native LBTC\n { tokenIn: Token.LBTC, tokenOut: Token.BTCK }, // -> Native LBTC\n];\n\ntype RedeemTokenParameters = {\n /**\n * The amount to redeem, expressed in human-readable format.\n *\n * For example, use `\"1.23\"` to represent 1.23 LBTC.\n */\n amount: BigNumber.Value;\n /**\n * (Optional) Destination BTC address for redemption.\n *\n * Required if {@link tokenOut} is omitted (since the default\n * redemption flow sends BTC).\n */\n btcAddress?: string;\n /**\n * The token to be redeemed.\n *\n * Defaults to {@link Token.LBTC}.\n */\n tokenIn: Token;\n /**\n * (Optional) The token to receive after redemption.\n *\n * - If provided, redemption will return the specified token.\n * - If omitted, redemption defaults to BTC and a {@link btcAddress}\n * must be supplied.\n */\n tokenOut?: Token;\n};\n\n/**\n * Union type for redeem token parameters supporting both provider and signer flows.\n */\ntype RedeemTokenParams =\n | (RedeemTokenParameters & CommonWriteParameters)\n | (RedeemTokenParameters & CommonSignerWriteParameters);\n\n/**\n * Parameters required to unstake (redeem) LBTC into BTC.\n *\n * Overrides {@link RedeemTokenParameters} to make `btcAddress` required,\n * since unstaking always goes to BTC.\n */\nexport type IUnstakeLBTCParams =\n | (RedeemTokenParameters & CommonWriteParameters & { btcAddress: string })\n | (RedeemTokenParameters &\n CommonSignerWriteParameters & { btcAddress: string });\n\n/**\n * Redeems a token into **BTC** or another supported token.\n *\n * @remarks\n * This is the **preferred** API for all redemption flows.\n * - If `tokenOut` is `undefined`, redemption sends BTC and requires a valid BTC address.\n * - If `tokenOut` is provided, redemption swaps to the target token\n * (requires an upgraded token contract ABI).\n *\n * Supports two execution modes:\n * 1. **Provider flow** (legacy): Pass `provider: EIP1193Provider`\n * 2. **Signer flow** (unified bridge): Pass `signer: SignerAdapter`\n *\n * @param params - Parameters including the source token, amount, and either provider or signer.\n * @returns Transaction hash of the executed redemption transaction.\n *\n * @throws {UnsupportedTokenFlow} If the requested flow is not supported.\n * @throws {Error} If balances are insufficient or required parameters are missing.\n * @throws {SignerError} If transaction execution fails (with detailed context).\n *\n * @example\n * ```ts\n * // Provider flow (legacy)\n * const txHash = await redeemToken({\n * provider,\n * account: '0x...',\n * amount: '1.5',\n * btcAddress: 'bc1q...',\n * chainId: ChainId.ethereum,\n * env: Env.prod,\n * tokenIn: Token.LBTC,\n * });\n *\n * // Signer flow (unified bridge)\n * const txHash = await redeemToken({\n * signer: evmSigner,\n * account: '0x...',\n * amount: '1.5',\n * btcAddress: 'bc1q...',\n * chainId: ChainId.avalancheFuji,\n * env: Env.testnet,\n * tokenIn: Token.BTCb,\n * });\n * ```\n */\nexport async function redeemToken(params: RedeemTokenParams): Promise<Hex> {\n const {\n account: accountAddress,\n amount: amountRaw,\n btcAddress,\n chainId,\n env,\n rpcUrl,\n tokenIn = Token.LBTC,\n tokenOut,\n } = params;\n const flow = AVAILABLE_FLOWS.find(\n af => af.tokenIn === tokenIn && af.tokenOut === tokenOut,\n );\n if (!flow) {\n throw new UnsupportedTokenFlow(tokenIn, tokenOut || 'BTC', chainId, env);\n }\n\n const publicClient = makePublicClient({ chainId, rpcUrl, env });\n\n // Create wallet client only for provider flow\n const walletClient = isProviderFlow(params)\n ? makeWalletClient({ provider: params.provider, chainId })\n : undefined;\n\n const tokenInContractInfo = await getTokenContractInfo(\n tokenIn,\n chainId,\n env,\n AddressKind.Token, // get the token contract, not adapter\n );\n const IN = await retrieveTokenProperties(publicClient, tokenInContractInfo);\n if (!IN) {\n throw new Error(\n `Could not retrieve the properties of ${tokenIn} on ${chainId}`,\n );\n }\n\n const amount = toBaseDenomination(amountRaw, IN.decimals);\n\n const tokenInBalanceRaw = await publicClient.readContract({\n address: IN.address,\n abi: IN.abi as typeof erc20Abi,\n functionName: 'balanceOf',\n args: [accountAddress],\n });\n const tokenInBalance = fromBaseDenomination(tokenInBalanceRaw, IN.decimals);\n if (amount.isGreaterThan(tokenInBalanceRaw)) {\n throw new Error(\n `Unable to redeem ${String(amountRaw)} ${IN.symbol} because the amount exceeds the account's balance of ${tokenInBalance.toString()} ${IN.symbol}`,\n );\n }\n\n // -> BTC\n if (!tokenOut) {\n if (!btcAddress) {\n throw new Error('Missing parameter: `btcAddress`.');\n }\n const outputScript = await getOutputScript(btcAddress, env);\n\n // The redemption of BTC.b -> BTC on Avalanche requires extra steps\n if (\n tokenIn === Token.BTCb &&\n (chainId === ChainId.avalanche || chainId === ChainId.avalancheFuji)\n ) {\n // 0. `IN` is a token contract (BTC.b)\n // 1. Get the adapter and asset route contracts\n const adapter = await getTokenContractInfo(\n tokenIn,\n chainId,\n env,\n AddressKind.Adapter,\n );\n const assetRouterContractAddress = (await publicClient.readContract({\n address: adapter.address,\n abi: adapter.abi,\n functionName: 'getAssetRouter',\n })) as Address;\n\n // 2. Check allowance\n const allowance = await publicClient.readContract({\n address: IN.address,\n abi: IN.abi,\n functionName: 'allowance',\n args: [accountAddress, adapter.address],\n });\n\n if (amount.isGreaterThan(allowance)) {\n const { txHash } = await executeContractTransaction({\n params,\n publicClient,\n walletClient,\n simulateArgs: {\n address: IN.address,\n abi: IN.abi,\n account: accountAddress as `0x${string}` | undefined,\n functionName: 'approve',\n args: [adapter.address, toBigInt(amount)],\n },\n operation: 'BTC.b approval',\n });\n\n const receipt = await waitForTransactionReceipt(\n publicClient,\n txHash,\n 'BTC.b approval',\n );\n\n console.info(\n `Approved adapter (${adapter.address}) for ${new BigNumber(amountRaw).toString()} ${IN.symbol}`,\n receipt.transactionHash,\n receipt.status,\n );\n }\n\n // 3. Run `redeemForBtc` on AssetRouter\n const { txHash } = await executeContractTransaction({\n params,\n publicClient,\n walletClient,\n simulateArgs: {\n address: assetRouterContractAddress,\n abi: ASSET_ROUTER_ABI,\n account: accountAddress as `0x${string}` | undefined,\n functionName: 'redeemForBtc',\n args: [\n accountAddress,\n adapter.address,\n outputScript,\n toBigInt(amount),\n ],\n },\n operation: 'BTC.b redeemForBtc',\n });\n\n return txHash;\n }\n\n // 0. IN is BTC.b token contract.\n const callData = {\n abi: IN.abi,\n address: IN.address,\n account: accountAddress,\n chain: CHAIN_ID_TO_VIEM_CHAIN_MAP[chainId],\n functionName:\n isUpgradedAbi(IN.abi) || tokenIn === Token.BTCb\n ? 'redeemForBtc' // upgraded\n : 'redeem', // legacy\n args: [outputScript, toBigInt(amount)],\n } as const;\n\n const gasEstimationData = isKatanaChain(chainId)\n ? await estimateGasFees(publicClient, callData, parseGwei('1'))\n : {};\n\n const { txHash } = await executeContractTransaction({\n params,\n publicClient,\n walletClient,\n simulateArgs: {\n ...callData,\n account: accountAddress as `0x${string}` | undefined,\n ...gasEstimationData,\n },\n operation: `${tokenIn} redeem to BTC`,\n });\n\n return txHash;\n }\n\n // -> tokenOut\n if (!isUpgradedAbi(IN.abi)) {\n throw new Error(\n `The ${tokenIn} contract (${IN.address}) doesn't support redemptions to ${tokenOut}.`,\n );\n }\n\n const callData = {\n abi: IN.abi,\n address: IN.address,\n account: accountAddress,\n chain: CHAIN_ID_TO_VIEM_CHAIN_MAP[chainId],\n functionName: 'redeem',\n args: [toBigInt(amount)],\n } as const;\n\n const gasEstimationData = isKatanaChain(chainId)\n ? await estimateGasFees(publicClient, callData, parseGwei('1'))\n : {};\n\n const { txHash } = await executeContractTransaction({\n params,\n publicClient,\n walletClient,\n simulateArgs: {\n ...callData,\n account: accountAddress as `0x${string}` | undefined,\n ...gasEstimationData,\n },\n operation: `${tokenIn} redeem to ${tokenOut}`,\n });\n\n return txHash;\n}\n\n/**\n * Convenience wrapper around {@link redeemToken} for redeeming **LBTC → BTC**.\n *\n * @remarks\n * This is a helper for the common \"unstake LBTC\" flow.\n * For more flexible redemptions (e.g. LBTC → BTCK), use {@link redeemToken} directly.\n *\n * Supports both provider and signer flows.\n *\n * @param params - See {@link IUnstakeLBTCParams}.\n * @returns Transaction hash of the redemption transaction.\n *\n * @example\n * ```ts\n * // Provider flow\n * const txHash = await unstakeLBTC({\n * provider,\n * account: '0x...',\n * btcAddress: 'bc1q...',\n * amount: '1.5',\n * chainId: ChainId.ethereum,\n * env: Env.prod,\n * });\n *\n * // Signer flow\n * const txHash = await unstakeLBTC({\n * signer: evmSigner,\n * account: '0x...',\n * btcAddress: 'bc1q...',\n * amount: '1.5',\n * chainId: ChainId.ethereum,\n * env: Env.prod,\n * });\n * ```\n */\nexport async function unstakeLBTC(params: IUnstakeLBTCParams): Promise<Hex> {\n return redeemToken({\n ...params,\n tokenIn: Token.LBTC,\n tokenOut: undefined,\n });\n}\n"],"names":["ASSET_ROUTER_ABI","getLBTCMintingFee","props","getMintingFee","Token","getLBTCBurningFee","getRedeemFee","token","chainId","rpcUrl","env","environment","determineEnv","publicClient","makePublicClient","tokenContract","getTokenContractInfo","AddressKind","tokenContractAbi","rawFeeValue","isUpgradedAbi","assetRouterAddress","assetRouter","fromSatoshi","toNativeCommissionValue","redeemFeeValue","getMinRedeemAmount","value","redeemForBtcMinAmountValue","getMinRedeemAmountWithFee","params","fee","minRedeem","StakeAndBakeValidationError","code","message","context","getStakeAndBakeConfig","protocol","protocolRegistry","DEFI_REGISTRY","tokenRegistry","envRegistry","registryEntry","PROTOCOL_DEFAULT_TOKENS","DefiProtocol","getStakeAndBakeFee","DEFAULT_ENV","protocolInfo","DefiProtocols","selectedToken","spenderContract","client","getContract","error","errorMessage","getErrorMessage","getAddressConfirmationMessage","signLbtcDestinationAddr","account","provider","walletClient","makeWalletClient","signNetworkFee","expiry","toUnix","now","DAY","typedData","BigNumber","_","v","getPermitNonce","owner","lbtcContract","nonce","EIP712_DOMAIN_TYPES","PERMIT_MESSAGE_TYPES","APPROVE_MESSAGE_TYPES","buildTypedData","primaryType","serializeTypedData","handleApproveFlow","tokenAddress","tokenAbi","spenderAddress","requiredAmount","currentAllowance","approvalTxHash","hash","handlePermitFlow","getStakeAndBakeTokenContract","calculateStakeAndBakeLBTCAmount","btcAmount","btcTokenRatio","_a","getExchangeRatio","signStakeAndBake","strategy","permitValue","deadline","SignerError","validateTransactionRequest","tx","operation","isHex","createAccountFromSigner","signer","address","chain","CHAIN_ID_TO_VIEM_CHAIN_MAP","transaction","evmTx","signedTx","serialized","createWalletClientFromSigner","createWalletClient","http","executeContractTransaction","simulateArgs","isProviderFlow","isSignerFlow","simulationResult","request","txHash","callData","encodeFunctionData","waitForTransactionReceipt","receipt","GMP_V1_SELECTOR","MINT_SELECTOR","gmpPayloadAbi","mintAbi","decodeGmpMintPayload","hexData","selector","decoded","decodeFunctionData","msgPath","msgNonce","msgSender","msgRecipient","msgDestinationCaller","msgBody","bodySelector","mintDecoded","toToken","recipient","amount","calcMintIDFromDecoded","mint","encoded","encodeAbiParameters","keccak256","KATANA_BASCULE_ABI","BasculeDepositStatus","getBasculeDepositStatus","deposit","rawPayload","payload","tokenContractInfo","basculeContractAddress","ChainId","zeroAddress","shouldCheckMintHistory","isKatanaChain","isMonadChain","isEthereumChain","isStableChain","isMegaethChain","prefixedPayload","mintId","status","basculeDepositId","LBTC_BASCULE_ABI","err","approveToken","spender","tokenInfo","getTokenInfo","amountBase","toBigInt","toBaseDenomination","getTokenAllowance","allowanceRaw","fromBaseDenomination","estimateGasFees","overwriteMaxPriorityFeePerGas","fees","multiplier","maxPriorityFeePerGas","maxFeePerGas","mintToken","data","proofSignature","basculeStatus","ensureHex","gasEstimationData","parseGwei","claimLBTC","AVAILABLE_FLOWS","getAssetRouterAddress","tokenIn","adapterContractInfo","depositToken","accountAddress","amountRaw","tokenOut","af","UnsupportedTokenFlow","tokenInContractInfo","tokenOutContractInfo","IN","retrieveTokenProperties","amountBigInt","tokenInBalanceRaw","tokenInBalance","redeemToken","btcAddress","outputScript","getOutputScript","adapter","assetRouterContractAddress","allowance","unstakeLBTC"],"mappings":"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"}
|