diff --git a/solidity/contracts/integrator/IBridge.sol b/solidity/contracts/integrator/IBridge.sol index 8af1866a8..ee3c673ef 100644 --- a/solidity/contracts/integrator/IBridge.sol +++ b/solidity/contracts/integrator/IBridge.sol @@ -15,16 +15,49 @@ pragma solidity ^0.8.0; -import "../bridge/BitcoinTx.sol"; -import "../bridge/Deposit.sol"; +/// @notice Namespace which groups all types relevant to the IBridge interface. +/// @dev This is a mirror of the real types used in the Bridge contract. +/// This way, the `integrator` subpackage does not need to import +/// anything from the `bridge` subpackage and explicitly depend on it. +/// This simplifies the dependency graph for integrators. +library IBridgeTypes { + /// @dev See bridge/BitcoinTx.sol#Info + struct BitcoinTxInfo { + bytes4 version; + bytes inputVector; + bytes outputVector; + bytes4 locktime; + } + + /// @dev See bridge/Deposit.sol#DepositRevealInfo + struct DepositRevealInfo { + uint32 fundingOutputIndex; + bytes8 blindingFactor; + bytes20 walletPubKeyHash; + bytes20 refundPubKeyHash; + bytes4 refundLocktime; + address vault; + } + + /// @dev See bridge/Deposit.sol#DepositRequest + struct DepositRequest { + address depositor; + uint64 amount; + uint32 revealedAt; + address vault; + uint64 treasuryFee; + uint32 sweptAt; + bytes32 extraData; + } +} /// @notice Interface of the Bridge contract. /// @dev See bridge/Bridge.sol interface IBridge { /// @dev See {Bridge#revealDepositWithExtraData} function revealDepositWithExtraData( - BitcoinTx.Info calldata fundingTx, - Deposit.DepositRevealInfo calldata reveal, + IBridgeTypes.BitcoinTxInfo calldata fundingTx, + IBridgeTypes.DepositRevealInfo calldata reveal, bytes32 extraData ) external; @@ -32,7 +65,7 @@ interface IBridge { function deposits(uint256 depositKey) external view - returns (Deposit.DepositRequest memory); + returns (IBridgeTypes.DepositRequest memory); /// @dev See {Bridge#depositParameters} function depositParameters() diff --git a/solidity/contracts/integrator/TBTCDepositorProxy.sol b/solidity/contracts/integrator/TBTCDepositorProxy.sol index 42b5be53a..ecb75de1b 100644 --- a/solidity/contracts/integrator/TBTCDepositorProxy.sol +++ b/solidity/contracts/integrator/TBTCDepositorProxy.sol @@ -17,9 +17,6 @@ pragma solidity ^0.8.0; import {BTCUtils} from "@keep-network/bitcoin-spv-sol/contracts/BTCUtils.sol"; -import "../bridge/BitcoinTx.sol"; -import "../bridge/Deposit.sol"; - import "./IBridge.sol"; import "./ITBTCVault.sol"; @@ -51,8 +48,8 @@ import "./ITBTCVault.sol"; /// } /// /// function startProcess( -/// BitcoinTx.Info calldata fundingTx, -/// Deposit.DepositRevealInfo calldata reveal +/// IBridgeTypes.BitcoinTxInfo calldata fundingTx, +/// IBridgeTypes.DepositRevealInfo calldata reveal /// ) external { /// // Embed necessary context as extra data. /// bytes32 extraData = ...; @@ -125,8 +122,8 @@ abstract contract TBTCDepositorProxy { } /// @notice Initializes a deposit by revealing it to the Bridge. - /// @param fundingTx Bitcoin funding transaction data, see `BitcoinTx.Info`. - /// @param reveal Deposit reveal data, see `Deposit.DepositRevealInfo` struct. + /// @param fundingTx Bitcoin funding transaction data, see `IBridgeTypes.BitcoinTxInfo`. + /// @param reveal Deposit reveal data, see `IBridgeTypes.DepositRevealInfo` struct. /// @param extraData 32-byte deposit extra data. /// @return depositKey Deposit key computed as /// `keccak256(fundingTxHash | reveal.fundingOutputIndex)`. This @@ -138,8 +135,8 @@ abstract contract TBTCDepositorProxy { /// function must be met. // slither-disable-next-line dead-code function _initializeDeposit( - BitcoinTx.Info calldata fundingTx, - Deposit.DepositRevealInfo calldata reveal, + IBridgeTypes.BitcoinTxInfo calldata fundingTx, + IBridgeTypes.DepositRevealInfo calldata reveal, bytes32 extraData ) internal returns (uint256) { require(reveal.vault == address(tbtcVault), "Vault address mismatch"); @@ -187,7 +184,9 @@ abstract contract TBTCDepositorProxy { { require(pendingDeposits[depositKey], "Deposit not initialized"); - Deposit.DepositRequest memory deposit = bridge.deposits(depositKey); + IBridgeTypes.DepositRequest memory deposit = bridge.deposits( + depositKey + ); (, uint64 finalizedAt) = tbtcVault.optimisticMintingRequests( depositKey ); @@ -289,10 +288,10 @@ abstract contract TBTCDepositorProxy { /// @notice Calculates the Bitcoin transaction hash for the given Bitcoin /// transaction data. - /// @param txInfo Bitcoin transaction data, see `BitcoinTx.Info` struct. + /// @param txInfo Bitcoin transaction data, see `IBridgeTypes.BitcoinTxInfo` struct. /// @return txHash Bitcoin transaction hash. // slither-disable-next-line dead-code - function _calculateBitcoinTxHash(BitcoinTx.Info calldata txInfo) + function _calculateBitcoinTxHash(IBridgeTypes.BitcoinTxInfo calldata txInfo) internal view returns (bytes32) diff --git a/solidity/contracts/test/TestTBTCDepositorProxy.sol b/solidity/contracts/test/TestTBTCDepositorProxy.sol index eb91477b4..dd611503c 100644 --- a/solidity/contracts/test/TestTBTCDepositorProxy.sol +++ b/solidity/contracts/test/TestTBTCDepositorProxy.sol @@ -4,12 +4,9 @@ pragma solidity ^0.8.0; import {BTCUtils} from "@keep-network/bitcoin-spv-sol/contracts/BTCUtils.sol"; -import {TBTCDepositorProxy} from "../integrator/TBTCDepositorProxy.sol"; -import {IBridge} from "../integrator/IBridge.sol"; -import {ITBTCVault} from "../integrator/ITBTCVault.sol"; - -import "../bridge/BitcoinTx.sol"; -import "../bridge/Deposit.sol"; +import "../integrator/TBTCDepositorProxy.sol"; +import "../integrator/IBridge.sol"; +import "../integrator/ITBTCVault.sol"; contract TestTBTCDepositorProxy is TBTCDepositorProxy { event InitializeDepositReturned(uint256 depositKey); @@ -21,8 +18,8 @@ contract TestTBTCDepositorProxy is TBTCDepositorProxy { } function initializeDepositPublic( - BitcoinTx.Info calldata fundingTx, - Deposit.DepositRevealInfo calldata reveal, + IBridgeTypes.BitcoinTxInfo calldata fundingTx, + IBridgeTypes.DepositRevealInfo calldata reveal, bytes32 extraData ) external { uint256 depositKey = _initializeDeposit(fundingTx, reveal, extraData); @@ -45,15 +42,15 @@ contract TestTBTCDepositorProxy is TBTCDepositorProxy { contract MockBridge is IBridge { using BTCUtils for bytes; - mapping(uint256 => Deposit.DepositRequest) internal _deposits; + mapping(uint256 => IBridgeTypes.DepositRequest) internal _deposits; uint64 internal _depositTxMaxFee = 1 * 1e7; // 0.1 BTC event DepositRevealed(uint256 depositKey); function revealDepositWithExtraData( - BitcoinTx.Info calldata fundingTx, - Deposit.DepositRevealInfo calldata reveal, + IBridgeTypes.BitcoinTxInfo calldata fundingTx, + IBridgeTypes.DepositRevealInfo calldata reveal, bytes32 extraData ) external { bytes32 fundingTxHash = abi @@ -76,7 +73,7 @@ contract MockBridge is IBridge { "Deposit already revealed" ); - Deposit.DepositRequest memory request; + IBridgeTypes.DepositRequest memory request; request.depositor = msg.sender; request.amount = uint64(10 * 1e8); // 10 BTC @@ -102,7 +99,7 @@ contract MockBridge is IBridge { function deposits(uint256 depositKey) external view - returns (Deposit.DepositRequest memory) + returns (IBridgeTypes.DepositRequest memory) { return _deposits[depositKey]; }