From 504583568284c8d6bfc4d8f1ba82575080c70728 Mon Sep 17 00:00:00 2001 From: parodime Date: Wed, 25 Sep 2024 05:35:39 -0400 Subject: [PATCH] WIP - evaluating ProofDetail struct approach --- .../contracts-rfq/contracts/FastBridgeV2.sol | 27 ++++++++++--------- .../contracts/interfaces/IFastBridgeV2.sol | 16 +++++------ .../contracts-rfq/test/FastBridgeV2.Src.t.sol | 6 +++-- 3 files changed, 25 insertions(+), 24 deletions(-) diff --git a/packages/contracts-rfq/contracts/FastBridgeV2.sol b/packages/contracts-rfq/contracts/FastBridgeV2.sol index 352b2df2bb..2d48f42ad0 100644 --- a/packages/contracts-rfq/contracts/FastBridgeV2.sol +++ b/packages/contracts-rfq/contracts/FastBridgeV2.sol @@ -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 @@ -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; } @@ -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); } @@ -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; } @@ -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)) { diff --git a/packages/contracts-rfq/contracts/interfaces/IFastBridgeV2.sol b/packages/contracts-rfq/contracts/interfaces/IFastBridgeV2.sol index 6fd419b23b..cf4b6ca6db 100644 --- a/packages/contracts-rfq/contracts/interfaces/IFastBridgeV2.sol +++ b/packages/contracts-rfq/contracts/interfaces/IFastBridgeV2.sol @@ -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 @@ -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, @@ -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 diff --git a/packages/contracts-rfq/test/FastBridgeV2.Src.t.sol b/packages/contracts-rfq/test/FastBridgeV2.Src.t.sol index 586b2b9691..4b565ca6b8 100644 --- a/packages/contracts-rfq/test/FastBridgeV2.Src.t.sol +++ b/packages/contracts-rfq/test/FastBridgeV2.Src.t.sol @@ -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); @@ -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);