Skip to content

Commit

Permalink
Mirror Bridge types in the integrator subpackage
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
lukasz-zimnoch committed Jan 31, 2024
1 parent 9efd0d0 commit 609b6fe
Show file tree
Hide file tree
Showing 3 changed files with 59 additions and 30 deletions.
43 changes: 38 additions & 5 deletions solidity/contracts/integrator/IBridge.sol
Original file line number Diff line number Diff line change
Expand Up @@ -15,24 +15,57 @@

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;

/// @dev See {Bridge#deposits}
function deposits(uint256 depositKey)
external
view
returns (Deposit.DepositRequest memory);
returns (IBridgeTypes.DepositRequest memory);

/// @dev See {Bridge#depositParameters}
function depositParameters()
Expand Down
23 changes: 11 additions & 12 deletions solidity/contracts/integrator/TBTCDepositorProxy.sol
Original file line number Diff line number Diff line change
Expand Up @@ -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";

Expand Down Expand Up @@ -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 = ...;
Expand Down Expand Up @@ -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
Expand All @@ -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");
Expand Down Expand Up @@ -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
);
Expand Down Expand Up @@ -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)
Expand Down
23 changes: 10 additions & 13 deletions solidity/contracts/test/TestTBTCDepositorProxy.sol
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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);
Expand All @@ -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
Expand All @@ -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
Expand All @@ -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];
}
Expand Down

0 comments on commit 609b6fe

Please sign in to comment.