@lombard.finance/sdk 4.0.0 → 4.1.2
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 +12 -0
- package/dist/bridge/lib/ccip-config.d.ts.map +1 -1
- package/dist/bridge/lib/config.d.ts +3 -3
- package/dist/bridge/lib/config.d.ts.map +1 -1
- package/dist/common/chains.d.ts +2 -2
- package/dist/common/chains.d.ts.map +1 -1
- package/dist/common/feature-config.d.ts.map +1 -1
- package/dist/contract-functions/getBasculeDepositStatus/getBasculeDepositStatus.d.ts.map +1 -1
- package/dist/index2.cjs +6 -6
- package/dist/index2.js +792 -759
- package/dist/vaults/lib/config.d.ts +1 -1
- package/package.json +7 -8
- package/src/__tests__/AssetNamespace.spec.ts +0 -234
- package/src/__tests__/helpers/createTestConfig.ts +0 -90
- package/src/__tests__/integration/automint-fee.integration.test.ts +0 -74
- package/src/__tests__/integration/btc-deposit.integration.test.ts +0 -109
- package/src/__tests__/integration/btc-stake-and-deploy.integration.test.ts +0 -96
- package/src/__tests__/integration/btc-stake.integration.test.ts +0 -466
- package/src/__tests__/integration/evm-actions.integration.test.ts +0 -932
- package/src/__tests__/integration/evm-deploy.integration.test.ts +0 -122
- package/src/__tests__/integration/evm-redeem.integration.test.ts +0 -157
- package/src/__tests__/integration/faq-patterns.integration.test.ts +0 -465
- package/src/__tests__/integration/getLBTCMintingFee.integration.test.ts +0 -195
- package/src/__tests__/real-wallet/btc/btc-stake.real.test.ts +0 -70
- package/src/__tests__/real-wallet/evm/evm-stake.real.test.ts +0 -47
- package/src/__tests__/real-wallet/evm/evm-unstake.real.test.ts +0 -49
- package/src/__tests__/real-wallet/non-evm/solana-unstake.real.test.ts +0 -19
- package/src/__tests__/real-wallet/non-evm/starknet-unstake.real.test.ts +0 -19
- package/src/__tests__/real-wallet/non-evm/sui-unstake.real.test.ts +0 -19
- package/src/__tests__/services/ApiService.test.ts +0 -62
- package/src/__tests__/services/BtcService.test.ts +0 -30
- package/src/__tests__/services/EvmService.test.ts +0 -39
- package/src/__tests__/setup.ts +0 -16
- package/src/__tests__/test-utils/eip1193-adapter.ts +0 -48
- package/src/__tests__/test-utils/evm-wallet.ts +0 -38
- package/src/__tests__/test-utils/solana-wallet.ts +0 -22
- package/src/__tests__/test-utils/starknet-wallet.ts +0 -9
- package/src/__tests__/test-utils/sui-wallet.ts +0 -14
- package/src/__tests__/test-utils/test-constraints.ts +0 -110
- package/src/__tests__/unit/btc/BtcDeposit.test.ts +0 -253
- package/src/__tests__/unit/btc/BtcDepositAndDeploy.test.ts +0 -174
- package/src/__tests__/unit/btc/BtcDepositConfig.test.ts +0 -143
- package/src/__tests__/unit/btc/BtcDepositStatusTransition.test.ts +0 -221
- package/src/__tests__/unit/btc/BtcStakeAndDeploy.test.ts +0 -194
- package/src/__tests__/unit/btc/ExistingSignatureHandling.test.ts +0 -301
- package/src/__tests__/unit/btc/StakeAndBakeRatioConversion.test.ts +0 -200
- package/src/__tests__/unit/btc/StakeAndBakeSignatureRestore.test.ts +0 -216
- package/src/__tests__/unit/btc/TokenParameterConsistency.test.ts +0 -184
- package/src/__tests__/unit/btc/btc-deposit-token.test.ts +0 -191
- package/src/__tests__/unit/catalog/AssetCatalog.test.ts +0 -293
- package/src/__tests__/unit/config/ChainConfig.test.ts +0 -47
- package/src/__tests__/unit/config/FeeAuthConfig.test.ts +0 -76
- package/src/__tests__/unit/contract-functions/getLBTCMintingFee.test.ts +0 -128
- package/src/__tests__/unit/core/chain-parsing.test.ts +0 -257
- package/src/__tests__/unit/defi/AvailableProtocols.test.ts +0 -100
- package/src/__tests__/unit/defi/DefiRegistry.test.ts +0 -25
- package/src/__tests__/unit/evm/EvmDeploy.test.ts +0 -224
- package/src/__tests__/unit/evm/EvmRedeem.test.ts +0 -207
- package/src/__tests__/unit/evm/EvmRedeemFeeAuth.test.ts +0 -93
- package/src/__tests__/unit/evm/EvmStake.test.ts +0 -207
- package/src/__tests__/unit/evm/EvmStakeFeeAuth.test.ts +0 -193
- package/src/__tests__/unit/evm/EvmUnstakeAllowance.test.ts +0 -69
- package/src/__tests__/unit/evm/EvmUnstakeConfig.test.ts +0 -203
- package/src/__tests__/unit/fee-signature-expiration.test.ts +0 -76
- package/src/__tests__/unit/modules/CapabilityRegistry.test.ts +0 -55
- package/src/__tests__/unit/shared/BaseAction.test.ts +0 -122
- package/src/__tests__/unit/shared/BaseBtcAction.test.ts +0 -114
- package/src/__tests__/unit/solana/SolanaUnstake.test.ts +0 -314
- package/src/__tests__/unit/starknet/StarknetUnstake.test.ts +0 -318
- package/src/__tests__/unit/sui/SuiUnstake.test.ts +0 -310
- package/src/__tests__/unit/utils/satoshi.test.ts +0 -27
- package/src/__tests__/unit/validation/address-validation.test.ts +0 -350
- package/src/api-functions/generateDepositBtcAddress/generateDepositBtcAddress.stories.tsx +0 -71
- package/src/api-functions/generateDepositBtcAddress/generateDepositBtcAddress.ts +0 -235
- package/src/api-functions/generateDepositBtcAddress/index.ts +0 -1
- package/src/api-functions/get-badges-by-address/get-badges-by-address.ts +0 -13
- package/src/api-functions/get-badges-by-address/index.ts +0 -1
- package/src/api-functions/getDepositAddressReferrer/getDepositAddressReferrer.ts +0 -38
- package/src/api-functions/getDepositAddressReferrer/index.ts +0 -1
- package/src/api-functions/getDepositBtcAddress/getDepositBtcAddress.stories.tsx +0 -59
- package/src/api-functions/getDepositBtcAddress/getDepositBtcAddress.test.ts +0 -265
- package/src/api-functions/getDepositBtcAddress/getDepositBtcAddress.ts +0 -167
- package/src/api-functions/getDepositBtcAddress/getDepositBtcAddresses.stories.tsx +0 -58
- package/src/api-functions/getDepositBtcAddress/index.ts +0 -1
- package/src/api-functions/getDepositBtcAddress/make-request.ts +0 -59
- package/src/api-functions/getDepositBtcAddress/types.ts +0 -106
- package/src/api-functions/getDepositsByAddress/getDepositsByAddress.stories.tsx +0 -51
- package/src/api-functions/getDepositsByAddress/getDepositsByAddress.ts +0 -502
- package/src/api-functions/getDepositsByAddress/index.ts +0 -1
- package/src/api-functions/getLBTCExchangeRate/get-exchange-ratio.stories.tsx +0 -48
- package/src/api-functions/getLBTCExchangeRate/get-exchange-ratio.ts +0 -59
- package/src/api-functions/getLBTCExchangeRate/getLBTCExchangeRate.stories.tsx +0 -55
- package/src/api-functions/getLBTCExchangeRate/getLBTCExchangeRate.ts +0 -75
- package/src/api-functions/getLBTCExchangeRate/index.ts +0 -2
- package/src/api-functions/getNetworkFeeSignature/getNetworkFeeSignature.stories.tsx +0 -59
- package/src/api-functions/getNetworkFeeSignature/getNetworkFeeSignature.ts +0 -116
- package/src/api-functions/getNetworkFeeSignature/index.ts +0 -1
- package/src/api-functions/getPointsByAddress/getPointsByAddress.stories.tsx +0 -51
- package/src/api-functions/getPointsByAddress/getPointsByAddress.ts +0 -304
- package/src/api-functions/getPointsByAddress/index.ts +0 -1
- package/src/api-functions/getUnstakesByAddress/getUnstakesByAddress.stories.tsx +0 -51
- package/src/api-functions/getUnstakesByAddress/getUnstakesByAddress.ts +0 -368
- package/src/api-functions/getUnstakesByAddress/index.ts +0 -1
- package/src/api-functions/getUserStakeAndBakeSignature/getUserStakeAndBakeSignature.stories.tsx +0 -70
- package/src/api-functions/getUserStakeAndBakeSignature/getUserStakeAndBakeSignature.ts +0 -91
- package/src/api-functions/getUserStakeAndBakeSignature/index.ts +0 -1
- package/src/api-functions/index.ts +0 -11
- package/src/api-functions/setReferral/index.ts +0 -1
- package/src/api-functions/setReferral/setReferral.ts +0 -67
- package/src/api-functions/storeNetworkFeeSignature/index.ts +0 -1
- package/src/api-functions/storeNetworkFeeSignature/storeNetworkFeeSignature.stories.tsx +0 -57
- package/src/api-functions/storeNetworkFeeSignature/storeNetworkFeeSignature.ts +0 -75
- package/src/api-functions/storeStakeAndBakeSignature/index.ts +0 -1
- package/src/api-functions/storeStakeAndBakeSignature/storeStakeAndBakeSignature.stories.tsx +0 -57
- package/src/api-functions/storeStakeAndBakeSignature/storeStakeAndBakeSignature.ts +0 -61
- package/src/bridge/abi/CCIP_BRIDGE_ADAPTER_ABI.json +0 -704
- package/src/bridge/abi/CCIP_ROUTER_ABI.json +0 -702
- package/src/bridge/abi/OFT_BRIDGE_ADAPTER_ABI.json +0 -912
- package/src/bridge/index.ts +0 -16
- package/src/bridge/lib/bridge.stories.tsx +0 -90
- package/src/bridge/lib/bridge.ts +0 -115
- package/src/bridge/lib/ccip-bridge.stories.tsx +0 -91
- package/src/bridge/lib/ccip-bridge.ts +0 -214
- package/src/bridge/lib/ccip-config.ts +0 -54
- package/src/bridge/lib/config.ts +0 -384
- package/src/bridge/lib/oft-bridge.stories.tsx +0 -90
- package/src/bridge/lib/oft-bridge.ts +0 -217
- package/src/chains/btc/BtcActions.ts +0 -192
- package/src/chains/btc/actions/deposit/BtcDeposit.ts +0 -388
- package/src/chains/btc/actions/deposit/config/evm.ts +0 -197
- package/src/chains/btc/actions/deposit/config/index.ts +0 -53
- package/src/chains/btc/actions/deposit/config/types.ts +0 -108
- package/src/chains/btc/actions/deposit/factory.ts +0 -53
- package/src/chains/btc/actions/deposit/index.ts +0 -23
- package/src/chains/btc/actions/deposit/types.ts +0 -120
- package/src/chains/btc/actions/depositAndDeploy/BtcDepositAndDeploy.ts +0 -366
- package/src/chains/btc/actions/depositAndDeploy/config/evm.ts +0 -105
- package/src/chains/btc/actions/depositAndDeploy/config/index.ts +0 -111
- package/src/chains/btc/actions/depositAndDeploy/config/types.ts +0 -67
- package/src/chains/btc/actions/depositAndDeploy/factory.ts +0 -38
- package/src/chains/btc/actions/depositAndDeploy/index.ts +0 -24
- package/src/chains/btc/actions/depositAndDeploy/types.ts +0 -120
- package/src/chains/btc/actions/index.ts +0 -14
- package/src/chains/btc/actions/shared/BaseBtcAction.ts +0 -495
- package/src/chains/btc/actions/shared/index.ts +0 -28
- package/src/chains/btc/actions/shared/tokenUtils.ts +0 -68
- package/src/chains/btc/actions/shared/validation.ts +0 -180
- package/src/chains/btc/actions/stake/BtcStake.ts +0 -433
- package/src/chains/btc/actions/stake/__tests__/BtcStake.test.ts +0 -247
- package/src/chains/btc/actions/stake/config/evm.ts +0 -183
- package/src/chains/btc/actions/stake/config/index.ts +0 -122
- package/src/chains/btc/actions/stake/config/solana.ts +0 -96
- package/src/chains/btc/actions/stake/config/starknet.ts +0 -66
- package/src/chains/btc/actions/stake/config/sui.ts +0 -61
- package/src/chains/btc/actions/stake/config/types.ts +0 -165
- package/src/chains/btc/actions/stake/factory.ts +0 -53
- package/src/chains/btc/actions/stake/index.ts +0 -22
- package/src/chains/btc/actions/stake/types.ts +0 -175
- package/src/chains/btc/actions/stakeAndDeploy/BtcStakeAndDeploy.ts +0 -415
- package/src/chains/btc/actions/stakeAndDeploy/config/evm.ts +0 -135
- package/src/chains/btc/actions/stakeAndDeploy/config/index.ts +0 -119
- package/src/chains/btc/actions/stakeAndDeploy/config/types.ts +0 -93
- package/src/chains/btc/actions/stakeAndDeploy/factory.ts +0 -54
- package/src/chains/btc/actions/stakeAndDeploy/index.ts +0 -26
- package/src/chains/btc/actions/stakeAndDeploy/types.ts +0 -118
- package/src/chains/btc/client/getCurrentBlockHeight.ts +0 -28
- package/src/chains/btc/client/mempool/error.ts +0 -24
- package/src/chains/btc/client/mempool/mempool.ts +0 -23
- package/src/chains/btc/index.ts +0 -71
- package/src/chains/evm/EvmActions.ts +0 -185
- package/src/chains/evm/actions/deploy/EvmDeploy.ts +0 -256
- package/src/chains/evm/actions/deploy/config/evm.ts +0 -80
- package/src/chains/evm/actions/deploy/config/index.ts +0 -8
- package/src/chains/evm/actions/deploy/config/types.ts +0 -43
- package/src/chains/evm/actions/deploy/factory.ts +0 -44
- package/src/chains/evm/actions/deploy/index.ts +0 -17
- package/src/chains/evm/actions/deploy/types.ts +0 -74
- package/src/chains/evm/actions/deposit/EvmDeposit.ts +0 -159
- package/src/chains/evm/actions/deposit/config/evm.ts +0 -100
- package/src/chains/evm/actions/deposit/config/index.ts +0 -8
- package/src/chains/evm/actions/deposit/config/types.ts +0 -39
- package/src/chains/evm/actions/deposit/factory.ts +0 -44
- package/src/chains/evm/actions/deposit/index.ts +0 -17
- package/src/chains/evm/actions/deposit/types.ts +0 -87
- package/src/chains/evm/actions/index.ts +0 -67
- package/src/chains/evm/actions/redeem/EvmRedeem.ts +0 -263
- package/src/chains/evm/actions/redeem/config/evm.ts +0 -85
- package/src/chains/evm/actions/redeem/config/index.ts +0 -8
- package/src/chains/evm/actions/redeem/config/types.ts +0 -39
- package/src/chains/evm/actions/redeem/factory.ts +0 -43
- package/src/chains/evm/actions/redeem/index.ts +0 -17
- package/src/chains/evm/actions/redeem/types.ts +0 -93
- package/src/chains/evm/actions/stake/EvmStake.ts +0 -339
- package/src/chains/evm/actions/stake/config/evm.ts +0 -89
- package/src/chains/evm/actions/stake/config/index.ts +0 -8
- package/src/chains/evm/actions/stake/config/types.ts +0 -89
- package/src/chains/evm/actions/stake/factory.ts +0 -52
- package/src/chains/evm/actions/stake/index.ts +0 -30
- package/src/chains/evm/actions/stake/types.ts +0 -104
- package/src/chains/evm/actions/unstake/EvmUnstake.ts +0 -258
- package/src/chains/evm/actions/unstake/config/evm.ts +0 -123
- package/src/chains/evm/actions/unstake/config/index.ts +0 -13
- package/src/chains/evm/actions/unstake/config/types.ts +0 -37
- package/src/chains/evm/actions/unstake/factory.ts +0 -44
- package/src/chains/evm/actions/unstake/index.ts +0 -22
- package/src/chains/evm/actions/unstake/types.ts +0 -87
- package/src/chains/evm/index.ts +0 -16
- package/src/chains/evm/shared/feeAuth.ts +0 -198
- package/src/chains/evm/shared/index.ts +0 -7
- package/src/chains/solana/SolanaActions.ts +0 -85
- package/src/chains/solana/actions/index.ts +0 -7
- package/src/chains/solana/actions/unstake/SolanaUnstake.ts +0 -151
- package/src/chains/solana/actions/unstake/config/btc.ts +0 -47
- package/src/chains/solana/actions/unstake/config/index.ts +0 -8
- package/src/chains/solana/actions/unstake/config/solana.ts +0 -47
- package/src/chains/solana/actions/unstake/config/types.ts +0 -35
- package/src/chains/solana/actions/unstake/factory.ts +0 -34
- package/src/chains/solana/actions/unstake/index.ts +0 -14
- package/src/chains/solana/actions/unstake/types.ts +0 -58
- package/src/chains/solana/index.ts +0 -8
- package/src/chains/starknet/StarknetActions.ts +0 -85
- package/src/chains/starknet/actions/index.ts +0 -7
- package/src/chains/starknet/actions/unstake/StarknetUnstake.ts +0 -128
- package/src/chains/starknet/actions/unstake/config/btc.ts +0 -43
- package/src/chains/starknet/actions/unstake/config/index.ts +0 -8
- package/src/chains/starknet/actions/unstake/config/starknet.ts +0 -43
- package/src/chains/starknet/actions/unstake/config/types.ts +0 -27
- package/src/chains/starknet/actions/unstake/factory.ts +0 -32
- package/src/chains/starknet/actions/unstake/index.ts +0 -14
- package/src/chains/starknet/actions/unstake/types.ts +0 -57
- package/src/chains/starknet/index.ts +0 -8
- package/src/chains/sui/SuiActions.ts +0 -82
- package/src/chains/sui/actions/index.ts +0 -7
- package/src/chains/sui/actions/unstake/SuiUnstake.ts +0 -146
- package/src/chains/sui/actions/unstake/config/btc.ts +0 -43
- package/src/chains/sui/actions/unstake/config/index.ts +0 -8
- package/src/chains/sui/actions/unstake/config/sui.ts +0 -43
- package/src/chains/sui/actions/unstake/config/types.ts +0 -27
- package/src/chains/sui/actions/unstake/factory.ts +0 -32
- package/src/chains/sui/actions/unstake/index.ts +0 -14
- package/src/chains/sui/actions/unstake/types.ts +0 -57
- package/src/chains/sui/index.ts +0 -8
- package/src/client/ApiNamespace.ts +0 -302
- package/src/client/AssetNamespace.ts +0 -112
- package/src/client/LombardSDK.ts +0 -212
- package/src/client/PartnerConfiguration.ts +0 -50
- package/src/client/createConfig.ts +0 -90
- package/src/client/createLombardSDK.ts +0 -130
- package/src/clients/evm-signer-adapter.ts +0 -313
- package/src/clients/public-client.ts +0 -49
- package/src/clients/rpc-url-config.ts +0 -64
- package/src/clients/wallet-client.ts +0 -34
- package/src/common/api-config.ts +0 -48
- package/src/common/blockchain-identifier.ts +0 -217
- package/src/common/chains.stories.tsx +0 -68
- package/src/common/chains.ts +0 -449
- package/src/common/constants.ts +0 -1
- package/src/common/contract-info.ts +0 -9
- package/src/common/feature-config.ts +0 -79
- package/src/common/fee-requirements.ts +0 -34
- package/src/common/parameters.ts +0 -89
- package/src/config/defaults.ts +0 -49
- package/src/config/index.ts +0 -12
- package/src/config/providers.ts +0 -81
- package/src/config/types.ts +0 -216
- package/src/config/validation.ts +0 -69
- package/src/contract-functions/approveLBTC/approveLBTC.stories.tsx +0 -79
- package/src/contract-functions/approveLBTC/approveLBTC.ts +0 -66
- package/src/contract-functions/approveLBTC/index.ts +0 -1
- package/src/contract-functions/approveToken/approveToken.ts +0 -126
- package/src/contract-functions/approveToken/index.ts +0 -1
- package/src/contract-functions/claimLBTC/claimLBTC.stories.tsx +0 -82
- package/src/contract-functions/claimLBTC/claimLBTC.ts +0 -159
- package/src/contract-functions/claimLBTC/index.ts +0 -1
- package/src/contract-functions/claimUnstakeRedeem/claimUnstakeRedeem.ts +0 -95
- package/src/contract-functions/claimUnstakeRedeem/index.ts +0 -1
- package/src/contract-functions/deposit/depositToken.stories.tsx +0 -83
- package/src/contract-functions/deposit/depositToken.ts +0 -214
- package/src/contract-functions/deposit/index.ts +0 -1
- package/src/contract-functions/getBasculeDepositStatus/decodeBasculeDepositStatus.ts +0 -170
- package/src/contract-functions/getBasculeDepositStatus/getBasculeDepositStatus.stories.tsx +0 -62
- package/src/contract-functions/getBasculeDepositStatus/getBasculeDepositStatus.ts +0 -211
- package/src/contract-functions/getBasculeDepositStatus/index.ts +0 -2
- package/src/contract-functions/getLBTCMintingFee/getLBTCMintingFee.stories.tsx +0 -61
- package/src/contract-functions/getLBTCMintingFee/getLBTCMintingFee.ts +0 -193
- package/src/contract-functions/getLBTCMintingFee/index.ts +0 -1
- package/src/contract-functions/getLBTCTotalSupply/getLBTCTotalSupply.stories.tsx +0 -51
- package/src/contract-functions/getLBTCTotalSupply/getLBTCTotalSupply.ts +0 -40
- package/src/contract-functions/getLBTCTotalSupply/index.ts +0 -1
- package/src/contract-functions/getPermitNonce/getPermitNonce.stories.tsx +0 -56
- package/src/contract-functions/getPermitNonce/getPermitNonce.ts +0 -50
- package/src/contract-functions/getPermitNonce/index.ts +0 -1
- package/src/contract-functions/getShareValue/getShareValue.stories.tsx +0 -58
- package/src/contract-functions/getShareValue/getShareValue.ts +0 -59
- package/src/contract-functions/getShareValue/index.ts +0 -1
- package/src/contract-functions/getSharesByAddress/getSharesByAddress.stories.tsx +0 -65
- package/src/contract-functions/getSharesByAddress/getSharesByAddress.ts +0 -86
- package/src/contract-functions/getSharesByAddress/index.ts +0 -4
- package/src/contract-functions/getStakeAndBakeFee/__tests__/getStakeAndBakeFee.test.ts +0 -167
- package/src/contract-functions/getStakeAndBakeFee/getStakeAndBakeFee.stories.tsx +0 -180
- package/src/contract-functions/getStakeAndBakeFee/getStakeAndBakeFee.tsx +0 -101
- package/src/contract-functions/getStakeAndBakeFee/index.ts +0 -1
- package/src/contract-functions/index.ts +0 -21
- package/src/contract-functions/signLbtcDestionationAddr/index.ts +0 -1
- package/src/contract-functions/signLbtcDestionationAddr/signLbtcDestinationAddr.ts +0 -32
- package/src/contract-functions/signLbtcDestionationAddr/signLbtcDestionationAddr.stories.tsx +0 -64
- package/src/contract-functions/signNetworkFee/getTypedData.ts +0 -41
- package/src/contract-functions/signNetworkFee/index.ts +0 -1
- package/src/contract-functions/signNetworkFee/signNetworkFee.stories.tsx +0 -94
- package/src/contract-functions/signNetworkFee/signNetworkFee.ts +0 -106
- package/src/contract-functions/signStakeAndBake/__tests__/signStakeAndBake.test.ts +0 -888
- package/src/contract-functions/signStakeAndBake/handleApprove.ts +0 -81
- package/src/contract-functions/signStakeAndBake/handlePermit.ts +0 -28
- package/src/contract-functions/signStakeAndBake/index.ts +0 -2
- package/src/contract-functions/signStakeAndBake/signStakeAndBake.stories.tsx +0 -202
- package/src/contract-functions/signStakeAndBake/signStakeAndBake.ts +0 -160
- package/src/contract-functions/signStakeAndBake/typed-data-builder.ts +0 -137
- package/src/contract-functions/signStakeAndBake/utils.ts +0 -61
- package/src/contract-functions/signStakeAndBake/validation.ts +0 -124
- package/src/contract-functions/unstakeLBTC/index.ts +0 -1
- package/src/contract-functions/unstakeLBTC/unstakeLBTC.stories.tsx +0 -92
- package/src/contract-functions/unstakeLBTC/unstakeLBTC.ts +0 -396
- package/src/contracts/abis/index.ts +0 -29
- package/src/contracts/index.ts +0 -63
- package/src/contracts/types.ts +0 -143
- package/src/contracts/utils.ts +0 -288
- package/src/core/assets/catalog.ts +0 -343
- package/src/core/assets/index.ts +0 -40
- package/src/core/assets/types.ts +0 -142
- package/src/core/assets/utils.ts +0 -287
- package/src/core/chains/catalog.ts +0 -396
- package/src/core/chains/index.ts +0 -39
- package/src/core/chains/types.ts +0 -193
- package/src/core/chains/utils.ts +0 -245
- package/src/core/index.ts +0 -72
- package/src/core/types.ts +0 -126
- package/src/debug-api/btc-script-to-address.ts +0 -20
- package/src/debug-api/btc-tx-info.ts +0 -32
- package/src/debug-api/evm-by-btc-address.ts +0 -26
- package/src/debug-api/index.ts +0 -3
- package/src/defi/README.md +0 -517
- package/src/defi/defi-registry.stories.tsx +0 -527
- package/src/defi/defi-registry.ts +0 -295
- package/src/defi/index.ts +0 -17
- package/src/index.ts +0 -336
- package/src/metrics/get-additional-rewards.ts +0 -69
- package/src/metrics/get-lbtc-apy.ts +0 -74
- package/src/metrics/get-lbtc-stats.stories.tsx +0 -57
- package/src/metrics/get-lbtc-stats.ts +0 -59
- package/src/metrics/get-positions-summary.stories.tsx +0 -58
- package/src/metrics/get-positions-summary.ts +0 -132
- package/src/modules/CapabilityRegistry.ts +0 -125
- package/src/modules/apiModule.ts +0 -51
- package/src/modules/btcModule.ts +0 -43
- package/src/modules/evmModule.ts +0 -48
- package/src/modules/index.ts +0 -60
- package/src/referrals/ReferralsClient.ts +0 -34
- package/src/referrals/index.ts +0 -1
- package/src/services/ApiService.ts +0 -152
- package/src/services/BtcService.ts +0 -29
- package/src/services/EvmService.ts +0 -127
- package/src/services/index.ts +0 -43
- package/src/shared/__tests__/errors.test.ts +0 -185
- package/src/shared/__tests__/events.test.ts +0 -120
- package/src/shared/__tests__/types.test.ts +0 -155
- package/src/shared/actions/BaseAction.ts +0 -497
- package/src/shared/actions/__tests__/BaseAction.test.ts +0 -292
- package/src/shared/actions/index.ts +0 -9
- package/src/shared/constants/statusConstants.ts +0 -108
- package/src/shared/context/ContextBuilder.ts +0 -149
- package/src/shared/context/index.ts +0 -8
- package/src/shared/context/types.ts +0 -156
- package/src/shared/deposits/depositStatus.ts +0 -402
- package/src/shared/deposits/index.ts +0 -29
- package/src/shared/errors.ts +0 -405
- package/src/shared/events.ts +0 -260
- package/src/shared/evm/switchChain.ts +0 -109
- package/src/shared/index.ts +0 -54
- package/src/shared/monitoring/__tests__/createEventEmitter.test.ts +0 -150
- package/src/shared/monitoring/createEventEmitter.ts +0 -160
- package/src/shared/monitoring/createProgressEmitter.ts +0 -46
- package/src/shared/monitoring/depositMonitor.ts +0 -211
- package/src/shared/monitoring/index.ts +0 -25
- package/src/shared/validation/index.ts +0 -411
- package/src/stories/arg-types.ts +0 -38
- package/src/stories/components/Badge.tsx +0 -27
- package/src/stories/components/Button/Button.css +0 -10
- package/src/stories/components/Button/Button.tsx +0 -52
- package/src/stories/components/Button/index.ts +0 -1
- package/src/stories/components/Card.tsx +0 -18
- package/src/stories/components/CodeBlock/CodeBlock.tsx +0 -27
- package/src/stories/components/CodeBlock/CodeBlockStyles.css +0 -3
- package/src/stories/components/CodeBlock/index.ts +0 -1
- package/src/stories/components/ConnectButton/connect-button.tsx +0 -248
- package/src/stories/components/ConnectButton/index.ts +0 -1
- package/src/stories/components/JsonPreview.tsx +0 -84
- package/src/stories/components/Spinner/Spinner.tsx +0 -27
- package/src/stories/components/Spinner/index.ts +0 -1
- package/src/stories/components/StatsCard.tsx +0 -30
- package/src/stories/components/StatusIndicator.tsx +0 -37
- package/src/stories/components/TreeNode.tsx +0 -47
- package/src/stories/components/decorators/function-type.tsx +0 -63
- package/src/stories/components/decorators/index.ts +0 -2
- package/src/stories/components/decorators/wagmi-decorator.tsx +0 -92
- package/src/stories/components/error-block.tsx +0 -21
- package/src/stories/components/index.ts +0 -11
- package/src/stories/constants.ts +0 -3
- package/src/stories/hooks/useConnection.ts +0 -63
- package/src/stories/hooks/useQuery.ts +0 -57
- package/src/tokens/__tests__/token-addresses.test.ts +0 -551
- package/src/tokens/abi/ASSET_ROUTER_ABI.ts +0 -1966
- package/src/tokens/abi/BRIDGE_TOKEN_ADAPTER_ABI.ts +0 -1405
- package/src/tokens/abi/BTCK_ABI.ts +0 -1092
- package/src/tokens/abi/KATANA_BASCULE_ABI.ts +0 -653
- package/src/tokens/abi/LBTC_ABI.json +0 -1761
- package/src/tokens/abi/LBTC_ABI.ts +0 -1761
- package/src/tokens/abi/LBTC_BASCULE_ABI.json +0 -850
- package/src/tokens/abi/NATIVE_LBTC_ABI.ts +0 -1147
- package/src/tokens/abi/STLBTC_ABI.ts +0 -1062
- package/src/tokens/cross-chain-addresses.stories.tsx +0 -236
- package/src/tokens/denomination-utils.stories.tsx +0 -176
- package/src/tokens/getLbtcContractAddresses.stories.tsx +0 -158
- package/src/tokens/getTokenByAddress.stories.tsx +0 -172
- package/src/tokens/getTokenContractInfo.stories.tsx +0 -148
- package/src/tokens/getTokenInfo.stories.tsx +0 -133
- package/src/tokens/isUpgradedContract.stories.tsx +0 -124
- package/src/tokens/lbtc-addresses.ts +0 -18
- package/src/tokens/token-addresses.ts +0 -477
- package/src/tokens/tokens.ts +0 -249
- package/src/tokens/types.ts +0 -80
- package/src/utils/array.ts +0 -31
- package/src/utils/block.ts +0 -23
- package/src/utils/chain.ts +0 -152
- package/src/utils/consoleLogger.ts +0 -140
- package/src/utils/ensureNotSanctionedAddress.ts +0 -11
- package/src/utils/env.ts +0 -20
- package/src/utils/err.ts +0 -83
- package/src/utils/evmAccount.ts +0 -47
- package/src/utils/gas.ts +0 -36
- package/src/utils/hex.ts +0 -9
- package/src/utils/http.ts +0 -224
- package/src/utils/numbers.ts +0 -37
- package/src/utils/pagination.ts +0 -70
- package/src/utils/satoshi.ts +0 -41
- package/src/utils/time.ts +0 -12
- package/src/utils/transaction-executor.ts +0 -299
- package/src/vaults/abi/SILO_VAULT_SPENDER_ABI.json +0 -793
- package/src/vaults/abi/VEDA_VAULT_ABI.json +0 -452
- package/src/vaults/abi/VEDA_VAULT_ACCOUNTANT_ABI.json +0 -591
- package/src/vaults/abi/VEDA_VAULT_BASE_ASSET_ABI.json +0 -296
- package/src/vaults/abi/VEDA_VAULT_BORING_WITHDRAW_QUEUE_ABI.json +0 -502
- package/src/vaults/abi/VEDA_VAULT_LENS_ABI.json +0 -175
- package/src/vaults/abi/VEDA_VAULT_SPENDER_ABI.json +0 -408
- package/src/vaults/abi/VEDA_VAULT_TELLER_ABI.json +0 -700
- package/src/vaults/abi/index.ts +0 -4
- package/src/vaults/index.ts +0 -46
- package/src/vaults/lib/config.ts +0 -184
- package/src/vaults/lib/metrics/get-vault-apy.stories.tsx +0 -58
- package/src/vaults/lib/metrics/get-vault-apy.ts +0 -176
- package/src/vaults/lib/metrics/get-vault-points.stories.tsx +0 -60
- package/src/vaults/lib/metrics/get-vault-points.ts +0 -74
- package/src/vaults/lib/metrics/get-vault-tvl.stories.tsx +0 -58
- package/src/vaults/lib/metrics/get-vault-tvl.ts +0 -121
- package/src/vaults/lib/ops/cancel-withdraw.stories.tsx +0 -80
- package/src/vaults/lib/ops/deposit.stories.tsx +0 -82
- package/src/vaults/lib/ops/deposit.ts +0 -152
- package/src/vaults/lib/ops/get-vault-deposits.stories.tsx +0 -65
- package/src/vaults/lib/ops/get-vault-deposits.ts +0 -209
- package/src/vaults/lib/ops/get-vault-withdrawals.stories.tsx +0 -67
- package/src/vaults/lib/ops/get-vault-withdrawals.ts +0 -349
- package/src/vaults/lib/ops/withdraw.stories.tsx +0 -82
- package/src/vaults/lib/ops/withdraw.ts +0 -225
- package/src/version.ts +0 -56
- package/src/vite-env.d.ts +0 -1
|
@@ -1,888 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for signStakeAndBake function
|
|
3
|
-
*
|
|
4
|
-
* These tests encode the CURRENT expected behavior before refactoring.
|
|
5
|
-
* They serve as a safety net to ensure refactoring doesn't break existing functionality.
|
|
6
|
-
*
|
|
7
|
-
* Test Coverage:
|
|
8
|
-
* 1. LBTC Permit Flow (standard EIP-2612)
|
|
9
|
-
* 2. BTC → LBTC Conversion + Permit
|
|
10
|
-
* 3. BTCb Approve Flow (Avalanche special case)
|
|
11
|
-
* 4. Validation Errors
|
|
12
|
-
* 5. Typed Data Structure
|
|
13
|
-
* 6. Nonce Handling
|
|
14
|
-
* 7. Expiry Behavior
|
|
15
|
-
*/
|
|
16
|
-
|
|
17
|
-
import { Env } from '@lombard.finance/sdk-common';
|
|
18
|
-
import BigNumber from 'bignumber.js';
|
|
19
|
-
import type { EIP1193Provider } from 'viem';
|
|
20
|
-
import type { Mock } from 'vitest';
|
|
21
|
-
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
22
|
-
|
|
23
|
-
import { ChainId } from '../../../common/chains';
|
|
24
|
-
import { DefiProtocol } from '../../../defi/defi-registry';
|
|
25
|
-
import { Token } from '../../../tokens/token-addresses';
|
|
26
|
-
import { signStakeAndBake } from '../signStakeAndBake';
|
|
27
|
-
import { calculateStakeAndBakeLBTCAmount } from '../utils';
|
|
28
|
-
import { StakeAndBakeValidationError } from '../validation';
|
|
29
|
-
|
|
30
|
-
// Mock dependencies
|
|
31
|
-
vi.mock('../../../clients/wallet-client', () => ({
|
|
32
|
-
makeWalletClient: vi.fn(() => ({
|
|
33
|
-
signTypedData: vi.fn(async _typedData => {
|
|
34
|
-
// Return a mock signature - can't JSON.stringify BigInt values
|
|
35
|
-
return '0xmocksignature1234567890abcdef';
|
|
36
|
-
}),
|
|
37
|
-
writeContract: vi.fn(async _params => {
|
|
38
|
-
// Return a mock transaction hash for approve transactions
|
|
39
|
-
return '0xapprovetxhash1234567890abcdef';
|
|
40
|
-
}),
|
|
41
|
-
})),
|
|
42
|
-
}));
|
|
43
|
-
|
|
44
|
-
vi.mock('../../../clients/public-client', () => ({
|
|
45
|
-
makePublicClient: vi.fn(() => ({
|
|
46
|
-
readContract: vi.fn(async ({ functionName }) => {
|
|
47
|
-
// Mock nonce response
|
|
48
|
-
if (functionName === 'nonces') {
|
|
49
|
-
return 5n; // Mock nonce value
|
|
50
|
-
}
|
|
51
|
-
// Mock allowance response (return 0 to trigger approve tx)
|
|
52
|
-
if (functionName === 'allowance') {
|
|
53
|
-
return 0n; // Zero allowance triggers approve transaction
|
|
54
|
-
}
|
|
55
|
-
return 0n;
|
|
56
|
-
}),
|
|
57
|
-
waitForTransactionReceipt: vi.fn(async ({ hash }) => {
|
|
58
|
-
// Mock successful transaction receipt
|
|
59
|
-
return {
|
|
60
|
-
status: 'success',
|
|
61
|
-
transactionHash: hash,
|
|
62
|
-
blockNumber: 1n,
|
|
63
|
-
blockHash: '0xblockhash',
|
|
64
|
-
};
|
|
65
|
-
}),
|
|
66
|
-
})),
|
|
67
|
-
}));
|
|
68
|
-
|
|
69
|
-
vi.mock('../../../tokens/tokens', () => ({
|
|
70
|
-
getTokenContractInfo: vi.fn(async (token, chainId, _env, _addressKind) => {
|
|
71
|
-
// Return mock contract info based on token
|
|
72
|
-
// nosemgrep: codacy.tools-configs.rules_lgpl_javascript_crypto_rule-node-timing-attack -- comparing Token enum values in test mock, not secrets
|
|
73
|
-
if (token === Token.LBTC) {
|
|
74
|
-
return {
|
|
75
|
-
address: '0xLBTC_CONTRACT_ADDRESS',
|
|
76
|
-
abi: [],
|
|
77
|
-
chainId,
|
|
78
|
-
};
|
|
79
|
-
}
|
|
80
|
-
if (token === Token.BTCb) {
|
|
81
|
-
return {
|
|
82
|
-
address: '0xBTCB_CONTRACT_ADDRESS',
|
|
83
|
-
abi: [],
|
|
84
|
-
chainId,
|
|
85
|
-
};
|
|
86
|
-
}
|
|
87
|
-
throw new Error(`Unknown token: ${token}`);
|
|
88
|
-
}),
|
|
89
|
-
}));
|
|
90
|
-
|
|
91
|
-
vi.mock(
|
|
92
|
-
'../../../api-functions/getLBTCExchangeRate/get-exchange-ratio',
|
|
93
|
-
() => ({
|
|
94
|
-
getExchangeRatio: vi.fn(async () => ({
|
|
95
|
-
LBTC: {
|
|
96
|
-
BTCTokenRatio: new BigNumber('1.05'), // 1 BTC = 0.952381 LBTC
|
|
97
|
-
},
|
|
98
|
-
})),
|
|
99
|
-
}),
|
|
100
|
-
);
|
|
101
|
-
|
|
102
|
-
// Test data
|
|
103
|
-
const MOCK_ACCOUNT = '0x1234567890123456789012345678901234567890';
|
|
104
|
-
const MOCK_PROVIDER = {} as EIP1193Provider;
|
|
105
|
-
const MOCK_EXPIRY = 1700000000;
|
|
106
|
-
|
|
107
|
-
describe('signStakeAndBake - Current Behavior Tests', () => {
|
|
108
|
-
beforeEach(() => {
|
|
109
|
-
vi.clearAllMocks();
|
|
110
|
-
});
|
|
111
|
-
|
|
112
|
-
afterEach(() => {
|
|
113
|
-
vi.restoreAllMocks();
|
|
114
|
-
});
|
|
115
|
-
|
|
116
|
-
describe('LBTC Permit Flow (Standard EIP-2612)', () => {
|
|
117
|
-
it('should generate valid permit signature for LBTC on Ethereum', async () => {
|
|
118
|
-
const result = await signStakeAndBake({
|
|
119
|
-
account: MOCK_ACCOUNT,
|
|
120
|
-
value: new BigNumber('1'),
|
|
121
|
-
token: Token.LBTC,
|
|
122
|
-
vaultKey: DefiProtocol.Veda,
|
|
123
|
-
chainId: ChainId.ethereum,
|
|
124
|
-
provider: MOCK_PROVIDER,
|
|
125
|
-
expiry: MOCK_EXPIRY,
|
|
126
|
-
env: Env.prod,
|
|
127
|
-
});
|
|
128
|
-
|
|
129
|
-
// Should be permit mode
|
|
130
|
-
expect(result.mode).toBe('permit');
|
|
131
|
-
|
|
132
|
-
// Should return a signature
|
|
133
|
-
expect(result.signature).toBeTruthy();
|
|
134
|
-
expect(result.signature).toMatch(/^0x/);
|
|
135
|
-
|
|
136
|
-
// Should have typed data
|
|
137
|
-
expect(result.typedData).toBeTruthy();
|
|
138
|
-
const typedData = JSON.parse(result.typedData);
|
|
139
|
-
|
|
140
|
-
// Verify EIP-712 domain
|
|
141
|
-
expect(typedData.domain).toEqual({
|
|
142
|
-
name: 'Lombard Staked Bitcoin',
|
|
143
|
-
version: '1',
|
|
144
|
-
chainId: ChainId.ethereum.toString(),
|
|
145
|
-
verifyingContract: '0xLBTC_CONTRACT_ADDRESS',
|
|
146
|
-
});
|
|
147
|
-
|
|
148
|
-
// Verify primary type
|
|
149
|
-
expect(typedData.primaryType).toBe('Permit');
|
|
150
|
-
|
|
151
|
-
// Verify message structure
|
|
152
|
-
expect(typedData.message).toMatchObject({
|
|
153
|
-
owner: MOCK_ACCOUNT,
|
|
154
|
-
spender: expect.any(String),
|
|
155
|
-
value: expect.any(String),
|
|
156
|
-
nonce: '5', // Mocked nonce
|
|
157
|
-
deadline: MOCK_EXPIRY.toString(),
|
|
158
|
-
});
|
|
159
|
-
});
|
|
160
|
-
|
|
161
|
-
it('should generate permit for LBTC on Ethereum', async () => {
|
|
162
|
-
const result = await signStakeAndBake({
|
|
163
|
-
account: MOCK_ACCOUNT,
|
|
164
|
-
value: new BigNumber('0.5'),
|
|
165
|
-
token: Token.LBTC,
|
|
166
|
-
vaultKey: DefiProtocol.Veda,
|
|
167
|
-
chainId: ChainId.ethereum,
|
|
168
|
-
provider: MOCK_PROVIDER,
|
|
169
|
-
expiry: MOCK_EXPIRY,
|
|
170
|
-
env: Env.prod,
|
|
171
|
-
});
|
|
172
|
-
|
|
173
|
-
expect(result.signature).toBeTruthy();
|
|
174
|
-
const typedData = JSON.parse(result.typedData);
|
|
175
|
-
expect(typedData.primaryType).toBe('Permit');
|
|
176
|
-
expect(typedData.domain.name).toBe('Lombard Staked Bitcoin');
|
|
177
|
-
});
|
|
178
|
-
|
|
179
|
-
it('should use default expiry of 24 hours if not provided', async () => {
|
|
180
|
-
const beforeCall = Math.floor(Date.now() / 1000);
|
|
181
|
-
|
|
182
|
-
const result = await signStakeAndBake({
|
|
183
|
-
account: MOCK_ACCOUNT,
|
|
184
|
-
value: new BigNumber('1'),
|
|
185
|
-
token: Token.LBTC,
|
|
186
|
-
vaultKey: DefiProtocol.Veda,
|
|
187
|
-
chainId: ChainId.ethereum,
|
|
188
|
-
provider: MOCK_PROVIDER,
|
|
189
|
-
// No expiry provided
|
|
190
|
-
env: Env.prod,
|
|
191
|
-
});
|
|
192
|
-
|
|
193
|
-
const typedData = JSON.parse(result.typedData);
|
|
194
|
-
const deadline = Number(typedData.message.deadline);
|
|
195
|
-
const afterCall = Math.floor(Date.now() / 1000);
|
|
196
|
-
|
|
197
|
-
// Should be approximately 24 hours from now
|
|
198
|
-
const expectedExpiry = beforeCall + 86400; // 24 hours
|
|
199
|
-
expect(deadline).toBeGreaterThanOrEqual(expectedExpiry - 5);
|
|
200
|
-
expect(deadline).toBeLessThanOrEqual(afterCall + 86400 + 5);
|
|
201
|
-
});
|
|
202
|
-
|
|
203
|
-
it('should fetch nonce from contract', async () => {
|
|
204
|
-
const { makePublicClient } = await import(
|
|
205
|
-
'../../../clients/public-client'
|
|
206
|
-
);
|
|
207
|
-
|
|
208
|
-
await signStakeAndBake({
|
|
209
|
-
account: MOCK_ACCOUNT,
|
|
210
|
-
value: new BigNumber('1'),
|
|
211
|
-
token: Token.LBTC,
|
|
212
|
-
vaultKey: DefiProtocol.Veda,
|
|
213
|
-
chainId: ChainId.ethereum,
|
|
214
|
-
provider: MOCK_PROVIDER,
|
|
215
|
-
env: Env.prod,
|
|
216
|
-
});
|
|
217
|
-
|
|
218
|
-
// Verify nonce was fetched
|
|
219
|
-
expect(makePublicClient).toHaveBeenCalledWith(
|
|
220
|
-
expect.objectContaining({ chainId: ChainId.ethereum }),
|
|
221
|
-
);
|
|
222
|
-
});
|
|
223
|
-
});
|
|
224
|
-
|
|
225
|
-
describe('BTC → LBTC Conversion + Permit', () => {
|
|
226
|
-
it('should convert BTC amount to LBTC using exchange ratio', async () => {
|
|
227
|
-
const btcAmount = new BigNumber('1');
|
|
228
|
-
const expectedLBTC = new BigNumber('1').dividedBy(new BigNumber('1.05'));
|
|
229
|
-
|
|
230
|
-
const result = await signStakeAndBake({
|
|
231
|
-
account: MOCK_ACCOUNT,
|
|
232
|
-
value: btcAmount,
|
|
233
|
-
token: 'BTC',
|
|
234
|
-
vaultKey: DefiProtocol.Veda,
|
|
235
|
-
chainId: ChainId.ethereum,
|
|
236
|
-
provider: MOCK_PROVIDER,
|
|
237
|
-
expiry: MOCK_EXPIRY,
|
|
238
|
-
env: Env.prod,
|
|
239
|
-
});
|
|
240
|
-
|
|
241
|
-
const typedData = JSON.parse(result.typedData);
|
|
242
|
-
const permitValue = new BigNumber(typedData.message.value);
|
|
243
|
-
|
|
244
|
-
// Should use converted LBTC amount
|
|
245
|
-
expect(permitValue.toFixed(0)).toBe(
|
|
246
|
-
expectedLBTC.toFixed(0, BigNumber.ROUND_DOWN),
|
|
247
|
-
);
|
|
248
|
-
});
|
|
249
|
-
|
|
250
|
-
it('should default to BTC token when no token specified', async () => {
|
|
251
|
-
const result = await signStakeAndBake({
|
|
252
|
-
account: MOCK_ACCOUNT,
|
|
253
|
-
value: new BigNumber('1'),
|
|
254
|
-
// token not specified - should default to 'BTC'
|
|
255
|
-
vaultKey: DefiProtocol.Veda,
|
|
256
|
-
chainId: ChainId.ethereum,
|
|
257
|
-
provider: MOCK_PROVIDER,
|
|
258
|
-
env: Env.prod,
|
|
259
|
-
});
|
|
260
|
-
|
|
261
|
-
// Should still generate LBTC permit after conversion
|
|
262
|
-
const typedData = JSON.parse(result.typedData);
|
|
263
|
-
expect(typedData.domain.name).toBe('Lombard Staked Bitcoin');
|
|
264
|
-
expect(typedData.primaryType).toBe('Permit');
|
|
265
|
-
});
|
|
266
|
-
|
|
267
|
-
it('calculateStakeAndBakeLBTCAmount should apply ratio correctly', async () => {
|
|
268
|
-
const btcAmount = new BigNumber('2.5');
|
|
269
|
-
const lbtcAmount = await calculateStakeAndBakeLBTCAmount(
|
|
270
|
-
btcAmount,
|
|
271
|
-
Env.prod,
|
|
272
|
-
);
|
|
273
|
-
|
|
274
|
-
// Expected: 2.5 / 1.05 = 2.380952...
|
|
275
|
-
expect(lbtcAmount.toFixed(6)).toBe('2.380952');
|
|
276
|
-
});
|
|
277
|
-
});
|
|
278
|
-
|
|
279
|
-
describe('BTCb Approve Flow (Avalanche Special Case)', () => {
|
|
280
|
-
it('should return empty signature for BTCb on Avalanche Fuji', async () => {
|
|
281
|
-
const result = await signStakeAndBake({
|
|
282
|
-
account: MOCK_ACCOUNT,
|
|
283
|
-
value: new BigNumber('1'),
|
|
284
|
-
token: Token.BTCb,
|
|
285
|
-
vaultKey: DefiProtocol.Silo,
|
|
286
|
-
chainId: ChainId.avalancheFuji,
|
|
287
|
-
provider: MOCK_PROVIDER,
|
|
288
|
-
expiry: MOCK_EXPIRY,
|
|
289
|
-
env: Env.testnet,
|
|
290
|
-
});
|
|
291
|
-
|
|
292
|
-
// Should be approve mode
|
|
293
|
-
expect(result.mode).toBe('approve');
|
|
294
|
-
|
|
295
|
-
// Approve mode returns empty signature
|
|
296
|
-
expect(result.signature).toBe('');
|
|
297
|
-
|
|
298
|
-
// But should have typed data
|
|
299
|
-
expect(result.typedData).toBeTruthy();
|
|
300
|
-
|
|
301
|
-
// Should have approval transaction hash
|
|
302
|
-
expect(result.approvalTxHash).toBeTruthy();
|
|
303
|
-
expect(result.approvalTxHash).toMatch(/^0x/);
|
|
304
|
-
});
|
|
305
|
-
|
|
306
|
-
it('should use "Approve" primary type for BTCb on Avalanche', async () => {
|
|
307
|
-
const result = await signStakeAndBake({
|
|
308
|
-
account: MOCK_ACCOUNT,
|
|
309
|
-
value: new BigNumber('1'),
|
|
310
|
-
token: Token.BTCb,
|
|
311
|
-
vaultKey: DefiProtocol.Silo,
|
|
312
|
-
chainId: ChainId.avalancheFuji,
|
|
313
|
-
provider: MOCK_PROVIDER,
|
|
314
|
-
env: Env.testnet,
|
|
315
|
-
});
|
|
316
|
-
|
|
317
|
-
const typedData = JSON.parse(result.typedData);
|
|
318
|
-
|
|
319
|
-
// Should use Approve, not Permit
|
|
320
|
-
expect(typedData.primaryType).toBe('Approve');
|
|
321
|
-
});
|
|
322
|
-
|
|
323
|
-
it('should use "Bitcoin" domain name for BTCb', async () => {
|
|
324
|
-
const result = await signStakeAndBake({
|
|
325
|
-
account: MOCK_ACCOUNT,
|
|
326
|
-
value: new BigNumber('1'),
|
|
327
|
-
token: Token.BTCb,
|
|
328
|
-
vaultKey: DefiProtocol.Silo,
|
|
329
|
-
chainId: ChainId.avalancheFuji,
|
|
330
|
-
provider: MOCK_PROVIDER,
|
|
331
|
-
env: Env.testnet,
|
|
332
|
-
});
|
|
333
|
-
|
|
334
|
-
const typedData = JSON.parse(result.typedData);
|
|
335
|
-
|
|
336
|
-
expect(typedData.domain.name).toBe('Bitcoin');
|
|
337
|
-
expect(typedData.domain.version).toBe('1');
|
|
338
|
-
});
|
|
339
|
-
|
|
340
|
-
it('should use zero nonce and deadline for BTCb approve', async () => {
|
|
341
|
-
const result = await signStakeAndBake({
|
|
342
|
-
account: MOCK_ACCOUNT,
|
|
343
|
-
value: new BigNumber('1'),
|
|
344
|
-
token: Token.BTCb,
|
|
345
|
-
vaultKey: DefiProtocol.Silo,
|
|
346
|
-
chainId: ChainId.avalancheFuji,
|
|
347
|
-
provider: MOCK_PROVIDER,
|
|
348
|
-
expiry: MOCK_EXPIRY, // Should be ignored
|
|
349
|
-
env: Env.testnet,
|
|
350
|
-
});
|
|
351
|
-
|
|
352
|
-
const typedData = JSON.parse(result.typedData);
|
|
353
|
-
|
|
354
|
-
// BTCb approve uses zero nonce and deadline
|
|
355
|
-
expect(typedData.message.nonce).toBe('0');
|
|
356
|
-
expect(typedData.message.deadline).toBe('0');
|
|
357
|
-
});
|
|
358
|
-
|
|
359
|
-
it('should handle BTCb on Avalanche Fuji testnet', async () => {
|
|
360
|
-
// NOTE: Avalanche Fuji is currently not configured in Silo vault
|
|
361
|
-
// This test documents expected behavior if/when it's added
|
|
362
|
-
|
|
363
|
-
// Skip this test for now since Fuji isn't configured
|
|
364
|
-
// Once Silo adds Fuji support, this test should pass
|
|
365
|
-
expect(true).toBe(true); // Placeholder
|
|
366
|
-
|
|
367
|
-
/* Future test when Fuji is added to Silo:
|
|
368
|
-
const result = await signStakeAndBake({
|
|
369
|
-
account: MOCK_ACCOUNT,
|
|
370
|
-
value: new BigNumber('0.1'),
|
|
371
|
-
token: Token.BTCb,
|
|
372
|
-
vaultKey: DefiProtocolKey.Silo,
|
|
373
|
-
chainId: ChainId.avalancheFuji,
|
|
374
|
-
provider: MOCK_PROVIDER,
|
|
375
|
-
env: Env.testnet,
|
|
376
|
-
});
|
|
377
|
-
|
|
378
|
-
expect(result.signature).toBe('');
|
|
379
|
-
const typedData = JSON.parse(result.typedData);
|
|
380
|
-
expect(typedData.primaryType).toBe('Approve');
|
|
381
|
-
expect(typedData.domain.name).toBe('Bitcoin');
|
|
382
|
-
*/
|
|
383
|
-
});
|
|
384
|
-
|
|
385
|
-
it('should throw validation error for BTCb on unsupported vault/chain', async () => {
|
|
386
|
-
// BTCb is only configured for Silo vault on Avalanche
|
|
387
|
-
// Attempting to use it with Veda vault or on other chains should fail validation
|
|
388
|
-
|
|
389
|
-
await expect(
|
|
390
|
-
signStakeAndBake({
|
|
391
|
-
account: MOCK_ACCOUNT,
|
|
392
|
-
value: new BigNumber('1'),
|
|
393
|
-
token: Token.BTCb,
|
|
394
|
-
vaultKey: DefiProtocol.Veda, // BTCb not configured for Veda
|
|
395
|
-
chainId: ChainId.sepolia, // BTCb not configured for Sepolia
|
|
396
|
-
provider: MOCK_PROVIDER,
|
|
397
|
-
env: Env.testnet,
|
|
398
|
-
}),
|
|
399
|
-
).rejects.toThrow(StakeAndBakeValidationError);
|
|
400
|
-
});
|
|
401
|
-
});
|
|
402
|
-
|
|
403
|
-
describe('Validation Errors', () => {
|
|
404
|
-
it('should throw error for unknown vault', async () => {
|
|
405
|
-
await expect(
|
|
406
|
-
signStakeAndBake({
|
|
407
|
-
account: MOCK_ACCOUNT,
|
|
408
|
-
value: new BigNumber('1'),
|
|
409
|
-
vaultKey: 'nonexistent' as DefiProtocol,
|
|
410
|
-
chainId: ChainId.ethereum,
|
|
411
|
-
provider: MOCK_PROVIDER,
|
|
412
|
-
env: Env.prod,
|
|
413
|
-
}),
|
|
414
|
-
).rejects.toThrow(StakeAndBakeValidationError);
|
|
415
|
-
});
|
|
416
|
-
|
|
417
|
-
it('should throw error for unsupported chain', async () => {
|
|
418
|
-
await expect(
|
|
419
|
-
signStakeAndBake({
|
|
420
|
-
account: MOCK_ACCOUNT,
|
|
421
|
-
value: new BigNumber('1'),
|
|
422
|
-
vaultKey: DefiProtocol.Veda,
|
|
423
|
-
chainId: ChainId.avalanche, // Not supported by Veda
|
|
424
|
-
provider: MOCK_PROVIDER,
|
|
425
|
-
env: Env.prod,
|
|
426
|
-
}),
|
|
427
|
-
).rejects.toThrow(StakeAndBakeValidationError);
|
|
428
|
-
});
|
|
429
|
-
|
|
430
|
-
it('should throw error when spender contract missing', async () => {
|
|
431
|
-
// Create a scenario where chain is in stakeAndBakeChains but no spender contract
|
|
432
|
-
// This is a defensive check in the current code
|
|
433
|
-
|
|
434
|
-
await expect(
|
|
435
|
-
signStakeAndBake({
|
|
436
|
-
account: MOCK_ACCOUNT,
|
|
437
|
-
value: new BigNumber('1'),
|
|
438
|
-
vaultKey: DefiProtocol.Veda,
|
|
439
|
-
chainId: 99999 as ChainId, // Invalid chain
|
|
440
|
-
provider: MOCK_PROVIDER,
|
|
441
|
-
env: Env.prod,
|
|
442
|
-
}),
|
|
443
|
-
).rejects.toThrow();
|
|
444
|
-
});
|
|
445
|
-
|
|
446
|
-
it('should include supported chains in error message', async () => {
|
|
447
|
-
try {
|
|
448
|
-
await signStakeAndBake({
|
|
449
|
-
account: MOCK_ACCOUNT,
|
|
450
|
-
value: new BigNumber('1'),
|
|
451
|
-
vaultKey: DefiProtocol.Veda,
|
|
452
|
-
chainId: ChainId.avalanche,
|
|
453
|
-
provider: MOCK_PROVIDER,
|
|
454
|
-
env: Env.prod,
|
|
455
|
-
});
|
|
456
|
-
expect.fail('Should have thrown error');
|
|
457
|
-
} catch (error: unknown) {
|
|
458
|
-
const err = error as Error;
|
|
459
|
-
expect(err.message).toMatch(/supported chains/i);
|
|
460
|
-
// Should list at least Ethereum
|
|
461
|
-
expect(err.message).toContain(ChainId.ethereum.toString());
|
|
462
|
-
}
|
|
463
|
-
});
|
|
464
|
-
});
|
|
465
|
-
|
|
466
|
-
describe('Typed Data Structure Validation', () => {
|
|
467
|
-
it('should have correct EIP-712 domain fields', async () => {
|
|
468
|
-
const result = await signStakeAndBake({
|
|
469
|
-
account: MOCK_ACCOUNT,
|
|
470
|
-
value: new BigNumber('1'),
|
|
471
|
-
token: Token.LBTC,
|
|
472
|
-
vaultKey: DefiProtocol.Veda,
|
|
473
|
-
chainId: ChainId.ethereum,
|
|
474
|
-
provider: MOCK_PROVIDER,
|
|
475
|
-
env: Env.prod,
|
|
476
|
-
});
|
|
477
|
-
|
|
478
|
-
const typedData = JSON.parse(result.typedData);
|
|
479
|
-
|
|
480
|
-
expect(typedData.domain).toHaveProperty('name');
|
|
481
|
-
expect(typedData.domain).toHaveProperty('version');
|
|
482
|
-
expect(typedData.domain).toHaveProperty('chainId');
|
|
483
|
-
expect(typedData.domain).toHaveProperty('verifyingContract');
|
|
484
|
-
});
|
|
485
|
-
|
|
486
|
-
it('should have correct EIP712Domain type definition', async () => {
|
|
487
|
-
const result = await signStakeAndBake({
|
|
488
|
-
account: MOCK_ACCOUNT,
|
|
489
|
-
value: new BigNumber('1'),
|
|
490
|
-
token: Token.LBTC,
|
|
491
|
-
vaultKey: DefiProtocol.Veda,
|
|
492
|
-
chainId: ChainId.ethereum,
|
|
493
|
-
provider: MOCK_PROVIDER,
|
|
494
|
-
env: Env.prod,
|
|
495
|
-
});
|
|
496
|
-
|
|
497
|
-
const typedData = JSON.parse(result.typedData);
|
|
498
|
-
const domainType = typedData.types.EIP712Domain;
|
|
499
|
-
|
|
500
|
-
expect(domainType).toEqual([
|
|
501
|
-
{ name: 'name', type: 'string' },
|
|
502
|
-
{ name: 'version', type: 'string' },
|
|
503
|
-
{ name: 'chainId', type: 'uint256' },
|
|
504
|
-
{ name: 'verifyingContract', type: 'address' },
|
|
505
|
-
]);
|
|
506
|
-
});
|
|
507
|
-
|
|
508
|
-
it('should have correct Permit message type definition', async () => {
|
|
509
|
-
const result = await signStakeAndBake({
|
|
510
|
-
account: MOCK_ACCOUNT,
|
|
511
|
-
value: new BigNumber('1'),
|
|
512
|
-
token: Token.LBTC,
|
|
513
|
-
vaultKey: DefiProtocol.Veda,
|
|
514
|
-
chainId: ChainId.ethereum,
|
|
515
|
-
provider: MOCK_PROVIDER,
|
|
516
|
-
env: Env.prod,
|
|
517
|
-
});
|
|
518
|
-
|
|
519
|
-
const typedData = JSON.parse(result.typedData);
|
|
520
|
-
const permitType = typedData.types.Permit;
|
|
521
|
-
|
|
522
|
-
expect(permitType).toEqual([
|
|
523
|
-
{ name: 'owner', type: 'address' },
|
|
524
|
-
{ name: 'spender', type: 'address' },
|
|
525
|
-
{ name: 'value', type: 'uint256' },
|
|
526
|
-
{ name: 'nonce', type: 'uint256' },
|
|
527
|
-
{ name: 'deadline', type: 'uint256' },
|
|
528
|
-
]);
|
|
529
|
-
});
|
|
530
|
-
|
|
531
|
-
it('should have correct message field values', async () => {
|
|
532
|
-
const testValue = new BigNumber('1.5');
|
|
533
|
-
|
|
534
|
-
const result = await signStakeAndBake({
|
|
535
|
-
account: MOCK_ACCOUNT,
|
|
536
|
-
value: testValue,
|
|
537
|
-
token: Token.LBTC,
|
|
538
|
-
vaultKey: DefiProtocol.Veda,
|
|
539
|
-
chainId: ChainId.ethereum,
|
|
540
|
-
provider: MOCK_PROVIDER,
|
|
541
|
-
expiry: MOCK_EXPIRY,
|
|
542
|
-
env: Env.prod,
|
|
543
|
-
});
|
|
544
|
-
|
|
545
|
-
const typedData = JSON.parse(result.typedData);
|
|
546
|
-
const message = typedData.message;
|
|
547
|
-
|
|
548
|
-
expect(message.owner).toBe(MOCK_ACCOUNT);
|
|
549
|
-
expect(message.spender).toBeTruthy();
|
|
550
|
-
expect(message.spender).toMatch(/^0x/);
|
|
551
|
-
expect(message.value).toBeTruthy();
|
|
552
|
-
expect(message.nonce).toBe('5');
|
|
553
|
-
expect(message.deadline).toBe(MOCK_EXPIRY.toString());
|
|
554
|
-
});
|
|
555
|
-
|
|
556
|
-
it('should serialize BigInt values to strings in typedData', async () => {
|
|
557
|
-
const result = await signStakeAndBake({
|
|
558
|
-
account: MOCK_ACCOUNT,
|
|
559
|
-
value: new BigNumber('1'),
|
|
560
|
-
token: Token.LBTC,
|
|
561
|
-
vaultKey: DefiProtocol.Veda,
|
|
562
|
-
chainId: ChainId.ethereum,
|
|
563
|
-
provider: MOCK_PROVIDER,
|
|
564
|
-
env: Env.prod,
|
|
565
|
-
});
|
|
566
|
-
|
|
567
|
-
// Typed data should be serializable JSON
|
|
568
|
-
expect(() => JSON.parse(result.typedData)).not.toThrow();
|
|
569
|
-
|
|
570
|
-
const typedData = JSON.parse(result.typedData);
|
|
571
|
-
|
|
572
|
-
// All numeric values should be strings
|
|
573
|
-
expect(typeof typedData.domain.chainId).toBe('string');
|
|
574
|
-
expect(typeof typedData.message.value).toBe('string');
|
|
575
|
-
expect(typeof typedData.message.nonce).toBe('string');
|
|
576
|
-
expect(typeof typedData.message.deadline).toBe('string');
|
|
577
|
-
});
|
|
578
|
-
});
|
|
579
|
-
|
|
580
|
-
describe('Value Precision Handling', () => {
|
|
581
|
-
it('should round down value to integer', async () => {
|
|
582
|
-
const result = await signStakeAndBake({
|
|
583
|
-
account: MOCK_ACCOUNT,
|
|
584
|
-
value: new BigNumber('1.123456789'),
|
|
585
|
-
token: Token.LBTC,
|
|
586
|
-
vaultKey: DefiProtocol.Veda,
|
|
587
|
-
chainId: ChainId.ethereum,
|
|
588
|
-
provider: MOCK_PROVIDER,
|
|
589
|
-
env: Env.prod,
|
|
590
|
-
});
|
|
591
|
-
|
|
592
|
-
const typedData = JSON.parse(result.typedData);
|
|
593
|
-
const value = typedData.message.value;
|
|
594
|
-
|
|
595
|
-
// Should be rounded down, no decimals
|
|
596
|
-
expect(value).toBe('1');
|
|
597
|
-
});
|
|
598
|
-
|
|
599
|
-
it('should handle very large values', async () => {
|
|
600
|
-
const largeValue = new BigNumber('21000000'); // 21M BTC in satoshis
|
|
601
|
-
|
|
602
|
-
const result = await signStakeAndBake({
|
|
603
|
-
account: MOCK_ACCOUNT,
|
|
604
|
-
value: largeValue,
|
|
605
|
-
token: Token.LBTC,
|
|
606
|
-
vaultKey: DefiProtocol.Veda,
|
|
607
|
-
chainId: ChainId.ethereum,
|
|
608
|
-
provider: MOCK_PROVIDER,
|
|
609
|
-
env: Env.prod,
|
|
610
|
-
});
|
|
611
|
-
|
|
612
|
-
const typedData = JSON.parse(result.typedData);
|
|
613
|
-
expect(typedData.message.value).toBe(largeValue.toFixed(0));
|
|
614
|
-
});
|
|
615
|
-
|
|
616
|
-
it('should handle very small values', async () => {
|
|
617
|
-
const smallValue = new BigNumber('0.00000001'); // 1 satoshi
|
|
618
|
-
|
|
619
|
-
const result = await signStakeAndBake({
|
|
620
|
-
account: MOCK_ACCOUNT,
|
|
621
|
-
value: smallValue,
|
|
622
|
-
token: Token.LBTC,
|
|
623
|
-
vaultKey: DefiProtocol.Veda,
|
|
624
|
-
chainId: ChainId.ethereum,
|
|
625
|
-
provider: MOCK_PROVIDER,
|
|
626
|
-
env: Env.prod,
|
|
627
|
-
});
|
|
628
|
-
|
|
629
|
-
const typedData = JSON.parse(result.typedData);
|
|
630
|
-
// Should be 0 when rounded down
|
|
631
|
-
expect(typedData.message.value).toBe('0');
|
|
632
|
-
});
|
|
633
|
-
});
|
|
634
|
-
|
|
635
|
-
describe('Spender Contract Selection', () => {
|
|
636
|
-
it('should use correct spender contract for Veda on Ethereum', async () => {
|
|
637
|
-
const result = await signStakeAndBake({
|
|
638
|
-
account: MOCK_ACCOUNT,
|
|
639
|
-
value: new BigNumber('1'),
|
|
640
|
-
token: Token.LBTC,
|
|
641
|
-
vaultKey: DefiProtocol.Veda,
|
|
642
|
-
chainId: ChainId.ethereum,
|
|
643
|
-
provider: MOCK_PROVIDER,
|
|
644
|
-
env: Env.prod,
|
|
645
|
-
});
|
|
646
|
-
|
|
647
|
-
const typedData = JSON.parse(result.typedData);
|
|
648
|
-
|
|
649
|
-
// Should match Veda spender contract for Ethereum
|
|
650
|
-
expect(typedData.message.spender).toBe(
|
|
651
|
-
'0xC8bbF6153D7Ba105f1399D992ebd32B0541996ef',
|
|
652
|
-
);
|
|
653
|
-
});
|
|
654
|
-
|
|
655
|
-
it('should use correct spender contract for Veda on Sepolia (testnet)', async () => {
|
|
656
|
-
const result = await signStakeAndBake({
|
|
657
|
-
account: MOCK_ACCOUNT,
|
|
658
|
-
value: new BigNumber('1'),
|
|
659
|
-
token: Token.LBTC,
|
|
660
|
-
vaultKey: DefiProtocol.Veda,
|
|
661
|
-
chainId: ChainId.sepolia,
|
|
662
|
-
provider: MOCK_PROVIDER,
|
|
663
|
-
env: Env.testnet,
|
|
664
|
-
});
|
|
665
|
-
|
|
666
|
-
const typedData = JSON.parse(result.typedData);
|
|
667
|
-
expect(typedData.message.spender).toBe(
|
|
668
|
-
'0x77eD6a84fEF665156e81247ECbd43A847B8A6398',
|
|
669
|
-
);
|
|
670
|
-
});
|
|
671
|
-
|
|
672
|
-
it('should use correct spender contract for Silo on Avalanche Fuji', async () => {
|
|
673
|
-
const result = await signStakeAndBake({
|
|
674
|
-
account: MOCK_ACCOUNT,
|
|
675
|
-
value: new BigNumber('1'),
|
|
676
|
-
token: Token.BTCb,
|
|
677
|
-
vaultKey: DefiProtocol.Silo,
|
|
678
|
-
chainId: ChainId.avalancheFuji,
|
|
679
|
-
provider: MOCK_PROVIDER,
|
|
680
|
-
env: Env.testnet,
|
|
681
|
-
});
|
|
682
|
-
|
|
683
|
-
const typedData = JSON.parse(result.typedData);
|
|
684
|
-
expect(typedData.message.spender).toBe(
|
|
685
|
-
'0xFe1e76D9e065e879A9D1914482f0F13d85F39877',
|
|
686
|
-
);
|
|
687
|
-
});
|
|
688
|
-
});
|
|
689
|
-
|
|
690
|
-
describe('Environment Handling', () => {
|
|
691
|
-
it('should use testnet configuration when env is testnet', async () => {
|
|
692
|
-
const result = await signStakeAndBake({
|
|
693
|
-
account: MOCK_ACCOUNT,
|
|
694
|
-
value: new BigNumber('1'),
|
|
695
|
-
token: Token.LBTC,
|
|
696
|
-
vaultKey: DefiProtocol.Veda,
|
|
697
|
-
chainId: ChainId.sepolia,
|
|
698
|
-
provider: MOCK_PROVIDER,
|
|
699
|
-
env: Env.testnet,
|
|
700
|
-
});
|
|
701
|
-
|
|
702
|
-
expect(result.signature).toBeTruthy();
|
|
703
|
-
});
|
|
704
|
-
|
|
705
|
-
it('should default to production env', async () => {
|
|
706
|
-
const result = await signStakeAndBake({
|
|
707
|
-
account: MOCK_ACCOUNT,
|
|
708
|
-
value: new BigNumber('1'),
|
|
709
|
-
token: Token.LBTC,
|
|
710
|
-
vaultKey: DefiProtocol.Veda,
|
|
711
|
-
chainId: ChainId.ethereum,
|
|
712
|
-
provider: MOCK_PROVIDER,
|
|
713
|
-
// No env specified
|
|
714
|
-
});
|
|
715
|
-
|
|
716
|
-
expect(result.signature).toBeTruthy();
|
|
717
|
-
});
|
|
718
|
-
});
|
|
719
|
-
|
|
720
|
-
describe('Token Contract Address Selection', () => {
|
|
721
|
-
it('should use LBTC contract for BTC token (after conversion)', async () => {
|
|
722
|
-
const { getTokenContractInfo } = await import('../../../tokens/tokens');
|
|
723
|
-
|
|
724
|
-
await signStakeAndBake({
|
|
725
|
-
account: MOCK_ACCOUNT,
|
|
726
|
-
value: new BigNumber('1'),
|
|
727
|
-
token: 'BTC',
|
|
728
|
-
vaultKey: DefiProtocol.Veda,
|
|
729
|
-
chainId: ChainId.ethereum,
|
|
730
|
-
provider: MOCK_PROVIDER,
|
|
731
|
-
env: Env.prod,
|
|
732
|
-
});
|
|
733
|
-
|
|
734
|
-
// Should fetch LBTC contract for 'BTC' token
|
|
735
|
-
expect(getTokenContractInfo).toHaveBeenCalledWith(
|
|
736
|
-
Token.LBTC,
|
|
737
|
-
ChainId.ethereum,
|
|
738
|
-
Env.prod,
|
|
739
|
-
);
|
|
740
|
-
});
|
|
741
|
-
|
|
742
|
-
it('should use LBTC contract for LBTC token', async () => {
|
|
743
|
-
const { getTokenContractInfo } = await import('../../../tokens/tokens');
|
|
744
|
-
|
|
745
|
-
await signStakeAndBake({
|
|
746
|
-
account: MOCK_ACCOUNT,
|
|
747
|
-
value: new BigNumber('1'),
|
|
748
|
-
token: Token.LBTC,
|
|
749
|
-
vaultKey: DefiProtocol.Veda,
|
|
750
|
-
chainId: ChainId.ethereum,
|
|
751
|
-
provider: MOCK_PROVIDER,
|
|
752
|
-
env: Env.prod,
|
|
753
|
-
});
|
|
754
|
-
|
|
755
|
-
expect(getTokenContractInfo).toHaveBeenCalledWith(
|
|
756
|
-
Token.LBTC,
|
|
757
|
-
ChainId.ethereum,
|
|
758
|
-
Env.prod,
|
|
759
|
-
);
|
|
760
|
-
});
|
|
761
|
-
|
|
762
|
-
it('should use BTCb token contract (AddressKind.Token) for BTCb', async () => {
|
|
763
|
-
const { getTokenContractInfo } = await import('../../../tokens/tokens');
|
|
764
|
-
|
|
765
|
-
await signStakeAndBake({
|
|
766
|
-
account: MOCK_ACCOUNT,
|
|
767
|
-
value: new BigNumber('1'),
|
|
768
|
-
token: Token.BTCb,
|
|
769
|
-
vaultKey: DefiProtocol.Silo,
|
|
770
|
-
chainId: ChainId.avalancheFuji,
|
|
771
|
-
provider: MOCK_PROVIDER,
|
|
772
|
-
env: Env.testnet,
|
|
773
|
-
});
|
|
774
|
-
|
|
775
|
-
// Should use AddressKind.Token for permit signature
|
|
776
|
-
const { AddressKind } = await import('../../../tokens/token-addresses');
|
|
777
|
-
expect(getTokenContractInfo).toHaveBeenCalledWith(
|
|
778
|
-
Token.BTCb,
|
|
779
|
-
ChainId.avalancheFuji,
|
|
780
|
-
Env.testnet,
|
|
781
|
-
AddressKind.Token,
|
|
782
|
-
);
|
|
783
|
-
});
|
|
784
|
-
});
|
|
785
|
-
|
|
786
|
-
describe('Exchange Ratio Error Handling', () => {
|
|
787
|
-
it('should throw error if exchange ratio fetch fails', async () => {
|
|
788
|
-
const { getExchangeRatio } = await import(
|
|
789
|
-
'../../../api-functions/getLBTCExchangeRate/get-exchange-ratio'
|
|
790
|
-
);
|
|
791
|
-
|
|
792
|
-
const mockedGetExchangeRatio = getExchangeRatio as Mock;
|
|
793
|
-
mockedGetExchangeRatio.mockRejectedValueOnce(new Error('API error'));
|
|
794
|
-
|
|
795
|
-
await expect(
|
|
796
|
-
calculateStakeAndBakeLBTCAmount(new BigNumber('1'), Env.prod),
|
|
797
|
-
).rejects.toThrow('Failed to get exchange ratio');
|
|
798
|
-
});
|
|
799
|
-
|
|
800
|
-
it('should use ratio of 1 if BTCTokenRatio is missing', async () => {
|
|
801
|
-
const { getExchangeRatio } = await import(
|
|
802
|
-
'../../../api-functions/getLBTCExchangeRate/get-exchange-ratio'
|
|
803
|
-
);
|
|
804
|
-
|
|
805
|
-
const mockedGetExchangeRatio = getExchangeRatio as Mock;
|
|
806
|
-
mockedGetExchangeRatio.mockResolvedValueOnce({
|
|
807
|
-
LBTC: {},
|
|
808
|
-
});
|
|
809
|
-
|
|
810
|
-
const result = await calculateStakeAndBakeLBTCAmount(
|
|
811
|
-
new BigNumber('2'),
|
|
812
|
-
Env.prod,
|
|
813
|
-
);
|
|
814
|
-
|
|
815
|
-
// Should use 1:1 ratio
|
|
816
|
-
expect(result.toString()).toBe('2');
|
|
817
|
-
});
|
|
818
|
-
});
|
|
819
|
-
|
|
820
|
-
describe('Integration: Full Flow Tests', () => {
|
|
821
|
-
it('should complete full permit flow for LBTC', async () => {
|
|
822
|
-
const result = await signStakeAndBake({
|
|
823
|
-
account: '0xUser123',
|
|
824
|
-
value: new BigNumber('0.5'),
|
|
825
|
-
token: Token.LBTC,
|
|
826
|
-
vaultKey: DefiProtocol.Veda,
|
|
827
|
-
chainId: ChainId.ethereum,
|
|
828
|
-
provider: MOCK_PROVIDER,
|
|
829
|
-
expiry: 1700000000,
|
|
830
|
-
env: Env.prod,
|
|
831
|
-
});
|
|
832
|
-
|
|
833
|
-
// Verify complete result
|
|
834
|
-
expect(result).toMatchObject({
|
|
835
|
-
mode: 'permit',
|
|
836
|
-
signature: expect.stringMatching(/^0x/),
|
|
837
|
-
typedData: expect.any(String),
|
|
838
|
-
});
|
|
839
|
-
|
|
840
|
-
// Verify typedData is valid JSON
|
|
841
|
-
const typedData = JSON.parse(result.typedData);
|
|
842
|
-
expect(typedData).toMatchObject({
|
|
843
|
-
account: '0xUser123',
|
|
844
|
-
domain: expect.objectContaining({
|
|
845
|
-
name: 'Lombard Staked Bitcoin',
|
|
846
|
-
}),
|
|
847
|
-
primaryType: 'Permit',
|
|
848
|
-
message: expect.objectContaining({
|
|
849
|
-
owner: '0xUser123',
|
|
850
|
-
value: expect.any(String),
|
|
851
|
-
}),
|
|
852
|
-
});
|
|
853
|
-
});
|
|
854
|
-
|
|
855
|
-
it('should complete full approve flow for BTCb on Avalanche Fuji', async () => {
|
|
856
|
-
const result = await signStakeAndBake({
|
|
857
|
-
account: '0xUser456',
|
|
858
|
-
value: new BigNumber('1.5'),
|
|
859
|
-
token: Token.BTCb,
|
|
860
|
-
vaultKey: DefiProtocol.Silo,
|
|
861
|
-
chainId: ChainId.avalancheFuji,
|
|
862
|
-
provider: MOCK_PROVIDER,
|
|
863
|
-
env: Env.testnet,
|
|
864
|
-
});
|
|
865
|
-
|
|
866
|
-
// Verify approve result
|
|
867
|
-
expect(result).toMatchObject({
|
|
868
|
-
mode: 'approve',
|
|
869
|
-
signature: '', // Empty for approve
|
|
870
|
-
typedData: expect.any(String),
|
|
871
|
-
approvalTxHash: expect.stringMatching(/^0x/), // Should have tx hash
|
|
872
|
-
});
|
|
873
|
-
|
|
874
|
-
const typedData = JSON.parse(result.typedData);
|
|
875
|
-
expect(typedData).toMatchObject({
|
|
876
|
-
domain: expect.objectContaining({
|
|
877
|
-
name: 'Bitcoin',
|
|
878
|
-
}),
|
|
879
|
-
primaryType: 'Approve',
|
|
880
|
-
message: expect.objectContaining({
|
|
881
|
-
owner: '0xUser456',
|
|
882
|
-
nonce: '0',
|
|
883
|
-
deadline: '0',
|
|
884
|
-
}),
|
|
885
|
-
});
|
|
886
|
-
});
|
|
887
|
-
});
|
|
888
|
-
});
|