Skip to content

Commit

Permalink
WIP - evaluating ProofDetail struct approach
Browse files Browse the repository at this point in the history
  • Loading branch information
parodime committed Sep 25, 2024
1 parent 1c5dd7d commit 5045835
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 24 deletions.
27 changes: 14 additions & 13 deletions packages/contracts-rfq/contracts/FastBridgeV2.sol
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@ contract FastBridgeV2 is Admin, IFastBridgeV2 {
/// @notice Minimum deadline period to relay a requested bridge transaction
uint256 public constant MIN_DEADLINE_PERIOD = 30 minutes;


/// @notice Status of the bridge tx on origin chain
mapping(bytes32 => BridgeTxDetails) public bridgeTxDetails;
/// @notice Whether bridge has been relayed on destination chain
Expand All @@ -34,16 +33,17 @@ contract FastBridgeV2 is Admin, IFastBridgeV2 {
// @dev the block the contract was deployed at
uint256 public immutable deployBlock;

function bridgeStatuses(bytes32 transactionId) public view returns (BridgeStatus status)
{
function bridgeStatuses(bytes32 transactionId) public view returns (BridgeStatus status) {
return bridgeTxDetails[transactionId].status;
}

function bridgeProofs(bytes32 transactionId) public view returns (BridgeProof memory proof)
{
return bridgeTxDetails[transactionId].proof;

function bridgeProofs(bytes32 transactionId) public view returns (BridgeProof memory proof) {
return BridgeProof({
timestamp: bridgeTxDetails[transactionId].proof.blockTimestamp,
relayer: bridgeTxDetails[transactionId].proof.relayer
});
}

constructor(address _owner) Admin(_owner) {
deployBlock = block.number;
}
Expand Down Expand Up @@ -186,7 +186,8 @@ contract FastBridgeV2 is Admin, IFastBridgeV2 {
// update bridge tx status given proof provided
if (bridgeTxDetails[transactionId].status != BridgeStatus.REQUESTED) revert StatusIncorrect();
bridgeTxDetails[transactionId].status = BridgeStatus.RELAYER_PROVED;
bridgeTxDetails[transactionId].proof = BridgeProof({timestamp: uint96(block.timestamp), relayer: relayer}); // overflow ok
bridgeTxDetails[transactionId].proof =
ProofDetail({blockTimestamp: uint40(block.timestamp), blockNumber: uint48(block.number), relayer: relayer}); // overflow ok

emit BridgeProofProvided(transactionId, relayer, destTxHash);
}
Expand All @@ -197,16 +198,16 @@ contract FastBridgeV2 is Admin, IFastBridgeV2 {
/// proof.timestamp < type(uint96).max via unchecked statement
/// @param proof The bridge proof
/// @return delta Time delta since proof submitted
function _timeSince(BridgeProof memory proof) internal view returns (uint256 delta) {
function _timeSince(ProofDetail memory proof) internal view returns (uint256 delta) {
unchecked {
delta = uint96(block.timestamp) - proof.timestamp;
delta = uint40(block.timestamp) - proof.blockTimestamp;
}
}

/// @inheritdoc IFastBridge
function canClaim(bytes32 transactionId, address relayer) external view returns (bool) {
if (bridgeTxDetails[transactionId].status != BridgeStatus.RELAYER_PROVED) revert StatusIncorrect();
BridgeProof memory proof = bridgeTxDetails[transactionId].proof;
ProofDetail memory proof = bridgeTxDetails[transactionId].proof;
if (proof.relayer != relayer) revert SenderIncorrect();
return _timeSince(proof) > DISPUTE_PERIOD;
}
Expand All @@ -224,7 +225,7 @@ contract FastBridgeV2 is Admin, IFastBridgeV2 {
// update bridge tx status if able to claim origin collateral
if (bridgeTxDetails[transactionId].status != BridgeStatus.RELAYER_PROVED) revert StatusIncorrect();

BridgeProof memory proof = bridgeTxDetails[transactionId].proof;
ProofDetail memory proof = bridgeTxDetails[transactionId].proof;

// if "to" is zero addr, permissionlessly send funds to proven relayer
if (to == address(0)) {
Expand Down
16 changes: 7 additions & 9 deletions packages/contracts-rfq/contracts/interfaces/IFastBridgeV2.sol
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ pragma solidity ^0.8.20;
import {IFastBridge} from "./IFastBridge.sol";

interface IFastBridgeV2 is IFastBridge {

/// @notice Relays destination side of bridge transaction by off-chain relayer
/// @param request The encoded bridge transaction to relay on destination chain
/// @param relayer The address of the relaying entity which should have control of the origin funds when claimed
Expand All @@ -20,12 +19,6 @@ interface IFastBridgeV2 is IFastBridge {
/// @param request The encoded bridge transaction to claim on origin chain
function claim(bytes memory request) external;







enum BridgeStatus {
NULL, // doesn't exist yet
REQUESTED,
Expand All @@ -34,12 +27,17 @@ interface IFastBridgeV2 is IFastBridge {
REFUNDED
}

struct ProofDetail {
uint40 blockTimestamp;
uint48 blockNumber;
address relayer;
}

struct BridgeTxDetails {
BridgeStatus status;
BridgeProof proof;
ProofDetail proof;
}


/// @notice Returns the status of a bridge transaction
/// @param transactionId The ID of the bridge transaction
/// @return The status of the bridge transaction
Expand Down
6 changes: 4 additions & 2 deletions packages/contracts-rfq/test/FastBridgeV2.Src.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -309,7 +309,8 @@ contract FastBridgeV2SrcTest is FastBridgeV2Test {
bridge({caller: userA, msgValue: 0, params: tokenParams});
expectBridgeProofProvided({txId: txId, relayer: relayerA, destTxHash: hex"01"});
prove({caller: relayerA, bridgeTx: tokenTx, destTxHash: hex"01"});
(uint96 timestamp, address relayer) = (fastBridge.bridgeProofs(txId).timestamp, fastBridge.bridgeProofs(txId).relayer);
(uint96 timestamp, address relayer) =
(fastBridge.bridgeProofs(txId).timestamp, fastBridge.bridgeProofs(txId).relayer);
assertEq(timestamp, block.timestamp);
assertEq(relayer, relayerA);
assertEq(srcToken.balanceOf(address(fastBridge)), INITIAL_PROTOCOL_FEES_TOKEN + tokenParams.originAmount);
Expand All @@ -323,7 +324,8 @@ contract FastBridgeV2SrcTest is FastBridgeV2Test {
bridge({caller: userA, msgValue: ethParams.originAmount, params: ethParams});
expectBridgeProofProvided({txId: txId, relayer: relayerA, destTxHash: hex"01"});
prove({caller: relayerA, bridgeTx: ethTx, destTxHash: hex"01"});
(uint96 timestamp, address relayer) = (fastBridge.bridgeProofs(txId).timestamp, fastBridge.bridgeProofs(txId).relayer);
(uint96 timestamp, address relayer) =
(fastBridge.bridgeProofs(txId).timestamp, fastBridge.bridgeProofs(txId).relayer);
assertEq(timestamp, block.timestamp);
assertEq(relayer, relayerA);
assertEq(address(fastBridge).balance, INITIAL_PROTOCOL_FEES_ETH + ethParams.originAmount);
Expand Down

0 comments on commit 5045835

Please sign in to comment.