feat: add L2YieldMessageService

This commit is contained in:
Andrea Franz
2025-06-11 11:28:38 +02:00
parent c39a921f7b
commit 667916e2ab
4 changed files with 92 additions and 3 deletions

View File

@@ -19,5 +19,6 @@ additional_compiler_profiles = [ { name = "london", evm_version = "london" } ]
# Specify EVM_VERSION restrictions for contract compilation
compilation_restrictions = [
{ paths = "./**/L2MessageService.sol", evm_version = "london" },
{ paths = "./**/L2YieldMessageService.sol", evm_version = "london" },
{ paths = "./**/TokenBridge.sol", evm_version = "london" },
]
]

View File

@@ -0,0 +1,56 @@
// SPDX-License-Identifier: AGPL-3.0
pragma solidity ^0.8.30;
import { L2MessageServiceBase } from "../../messaging/l2/L2MessageServiceBase.sol";
contract L2YieldMessageService is L2MessageServiceBase {
error L2YieldMessageService__InvalidValue();
/// @custom:oz-upgrades-unsafe-allow constructor
constructor() {
_disableInitializers();
}
/**
* @notice Initializes underlying message service dependencies.
* @param _rateLimitPeriod The period to rate limit against.
* @param _rateLimitAmount The limit allowed for withdrawing the period.
* @param _defaultAdmin The account to be given DEFAULT_ADMIN_ROLE on initialization.
* @param _roleAddresses The list of addresses to grant roles to.
* @param _pauseTypeRoles The list of pause type roles.
* @param _unpauseTypeRoles The list of unpause type roles.
*/
function initialize(
uint256 _rateLimitPeriod,
uint256 _rateLimitAmount,
address _defaultAdmin,
RoleAddress[] calldata _roleAddresses,
PauseTypeRole[] calldata _pauseTypeRoles,
PauseTypeRole[] calldata _unpauseTypeRoles
) external initializer {
__L2MessageService_init(
_rateLimitPeriod,
_rateLimitAmount,
_defaultAdmin,
_roleAddresses,
_pauseTypeRoles,
_unpauseTypeRoles
);
}
function claimMessage(
address _from,
address _to,
uint256 _fee,
uint256 _value,
address payable, // _feeRecipient
bytes calldata _calldata,
uint256 _nonce
) public override {
if (_value > 0) {
revert L2YieldMessageService__InvalidValue();
}
_claimMessage(_from, _to, _fee, _value, _calldata, _nonce);
}
}

View File

@@ -26,9 +26,7 @@ contract L1ETHBridgeTest is Test {
yieldManager = ETHYieldManagerMock(payable(bridge.yieldManager()));
l2ETHBridge = bridge.l2ETHBridge();
}
}
contract BridgeETHTest is L1ETHBridgeTest {
function test_RevertsIfYieldManagerIsNotSet() public {
vm.prank(deployer);
bridge.setYieldManager(address(0));

View File

@@ -0,0 +1,34 @@
// SPDX-License-Identifier: AGPL-3.0
pragma solidity ^0.8.30;
import { Test } from "forge-std/Test.sol";
import { L2MessageService } from "../../../../src/messaging/l2/L2MessageService.sol";
import { L2YieldMessageService } from "../../../../src/yield/bridge/L2YieldMessageService.sol";
import { ERC1967Proxy } from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol";
import { IPermissionsManager } from "../../../../src/security/access/interfaces/IPermissionsManager.sol";
import { IPauseManager } from "../../../../src/security/pausing/interfaces/IPauseManager.sol";
contract L2YieldMessageServiceTest is Test {
L2YieldMessageService yieldMessageService;
address defaultAdmin = makeAddr("defaultAdmin");
function setUp() public {
L2YieldMessageService implementation = new L2YieldMessageService();
bytes memory initializer = abi.encodeWithSelector(
L2MessageService.initialize.selector,
86400,
100 ether,
defaultAdmin,
new IPermissionsManager.RoleAddress[](0),
new IPauseManager.PauseTypeRole[](0),
new IPauseManager.PauseTypeRole[](0)
);
ERC1967Proxy proxy = new ERC1967Proxy(address(implementation), initializer);
yieldMessageService = L2YieldMessageService(address(proxy));
}
function test_RevertWhenValueIsGreaterThanZero() public {
vm.expectRevert("L2YieldMessageService__InvalidValue()");
yieldMessageService.claimMessage(makeAddr("from"), makeAddr("to"), 0, 1, payable(defaultAdmin), hex"00", 0);
}
}