From 75ff32f71d5965acedc958a17780a8787fbae9b2 Mon Sep 17 00:00:00 2001 From: Tarun Khasnavis Date: Wed, 22 May 2024 14:30:48 -0700 Subject: [PATCH 01/10] adding bridging to the faucet drip call --- .../src/periphery/faucet/Faucet.sol | 23 ++++++++--- .../test/periphery/faucet/Faucet.t.sol | 41 +++++++++++++------ 2 files changed, 46 insertions(+), 18 deletions(-) diff --git a/packages/contracts-bedrock/src/periphery/faucet/Faucet.sol b/packages/contracts-bedrock/src/periphery/faucet/Faucet.sol index e23e6869c335..478dbf62195e 100644 --- a/packages/contracts-bedrock/src/periphery/faucet/Faucet.sol +++ b/packages/contracts-bedrock/src/periphery/faucet/Faucet.sol @@ -12,6 +12,11 @@ contract SafeSend { } } +interface IL1StandardBridge { + // Declare the depositETHTo function as it is defined in L1StandardBridge + function depositETHTo(address to, uint32 minGasLimit, bytes calldata extraData) external payable; +} + /// @title Faucet /// @notice Faucet contract that drips ETH to users. contract Faucet { @@ -20,7 +25,8 @@ contract Faucet { /// @param userId The id of the user that requested the drip. /// @param amount The amount of funds sent. /// @param recipient The recipient of the drip. - event Drip(string indexed authModule, bytes32 indexed userId, uint256 amount, address indexed recipient); + /// @param bridge The destination chain's bridge of the drip. + event Drip(string indexed authModule, bytes32 indexed userId, uint256 amount, address indexed recipient, address bridge); /// @notice Parameters for a drip. struct DripParameters { @@ -88,7 +94,8 @@ contract Faucet { /// @notice Drips ETH to a recipient account. /// @param _params Drip parameters. /// @param _auth Authentication parameters. - function drip(DripParameters memory _params, AuthParameters memory _auth) public { + /// @param _bridge Bridge address. + function drip(DripParameters memory _params, AuthParameters memory _auth, address _bridge) public { // Grab the module config once. ModuleConfig memory config = modules[_auth.module]; @@ -119,10 +126,16 @@ contract Faucet { // Mark the nonce as used. nonces[_auth.id][_params.nonce] = true; - // Execute a safe transfer of ETH to the recipient account. - new SafeSend{ value: config.amount }(_params.recipient); + if (_bridge == address(0)) { + // Use SafeSend if no bridge address is provided + new SafeSend{ value: config.amount }(_params.recipient); + } else { + // Execute a bridging of ETH to the recipient account. + IL1StandardBridge l1Bridge = IL1StandardBridge(_bridge); + l1Bridge.depositETHTo{value: config.amount}(_params.recipient, 200000, ""); + } - emit Drip(config.name, _auth.id, config.amount, _params.recipient); + emit Drip(config.name, _auth.id, config.amount, _params.recipient, _bridge); } /// @notice Returns the enable value of a given auth module. diff --git a/packages/contracts-bedrock/test/periphery/faucet/Faucet.t.sol b/packages/contracts-bedrock/test/periphery/faucet/Faucet.t.sol index a888a367c4e7..11c2b8895c56 100644 --- a/packages/contracts-bedrock/test/periphery/faucet/Faucet.t.sol +++ b/packages/contracts-bedrock/test/periphery/faucet/Faucet.t.sol @@ -13,6 +13,7 @@ contract Faucet_Initializer is Test { address internal faucetAuthAdmin; address internal nonAdmin; address internal fundsReceiver; + address internal bridgeAddress; uint256 internal faucetAuthAdminKey; uint256 internal nonAdminKey; uint256 internal startingTimestamp = 1000; @@ -31,6 +32,7 @@ contract Faucet_Initializer is Test { vm.warp(startingTimestamp); faucetContractAdmin = makeAddr("faucetContractAdmin"); fundsReceiver = makeAddr("fundsReceiver"); + bridgeAddress = makeAddr("bridgeAddr"); faucetAuthAdminKey = 0xB0B0B0B0; faucetAuthAdmin = vm.addr(faucetAuthAdminKey); @@ -120,7 +122,8 @@ contract FaucetTest is Faucet_Initializer { vm.prank(nonAdmin); faucet.drip( Faucet.DripParameters(payable(fundsReceiver), nonce), - Faucet.AuthParameters(optimistNftFam, keccak256(abi.encodePacked(fundsReceiver)), signature) + Faucet.AuthParameters(optimistNftFam, keccak256(abi.encodePacked(fundsReceiver)), signature), + bridgeAddress ); } @@ -142,7 +145,8 @@ contract FaucetTest is Faucet_Initializer { vm.expectRevert("Faucet: drip parameters could not be verified by security module"); faucet.drip( Faucet.DripParameters(payable(fundsReceiver), nonce), - Faucet.AuthParameters(optimistNftFam, keccak256(abi.encodePacked(fundsReceiver)), signature) + Faucet.AuthParameters(optimistNftFam, keccak256(abi.encodePacked(fundsReceiver)), signature), + bridgeAddress ); } @@ -164,7 +168,8 @@ contract FaucetTest is Faucet_Initializer { vm.prank(nonAdmin); faucet.drip( Faucet.DripParameters(payable(fundsReceiver), nonce), - Faucet.AuthParameters(optimistNftFam, keccak256(abi.encodePacked(fundsReceiver)), signature) + Faucet.AuthParameters(optimistNftFam, keccak256(abi.encodePacked(fundsReceiver)), signature), + bridgeAddress ); uint256 recipientBalanceAfter = address(fundsReceiver).balance; assertEq(recipientBalanceAfter - recipientBalanceBefore, 1 ether, "expect increase of 1 ether"); @@ -188,7 +193,8 @@ contract FaucetTest is Faucet_Initializer { vm.prank(nonAdmin); faucet.drip( Faucet.DripParameters(payable(fundsReceiver), nonce), - Faucet.AuthParameters(githubFam, keccak256(abi.encodePacked(fundsReceiver)), signature) + Faucet.AuthParameters(githubFam, keccak256(abi.encodePacked(fundsReceiver)), signature), + bridgeAddress ); uint256 recipientBalanceAfter = address(fundsReceiver).balance; assertEq(recipientBalanceAfter - recipientBalanceBefore, 0.05 ether, "expect increase of .05 ether"); @@ -214,7 +220,8 @@ contract FaucetTest is Faucet_Initializer { vm.prank(nonAdmin); faucet.drip( Faucet.DripParameters(payable(fundsReceiver), nonce), - Faucet.AuthParameters(githubFam, keccak256(abi.encodePacked(fundsReceiver)), signature) + Faucet.AuthParameters(githubFam, keccak256(abi.encodePacked(fundsReceiver)), signature), + bridgeAddress ); } @@ -235,7 +242,8 @@ contract FaucetTest is Faucet_Initializer { vm.startPrank(faucetContractAdmin); faucet.drip( Faucet.DripParameters(payable(fundsReceiver), nonce), - Faucet.AuthParameters(githubFam, keccak256(abi.encodePacked(fundsReceiver)), signature) + Faucet.AuthParameters(githubFam, keccak256(abi.encodePacked(fundsReceiver)), signature), + bridgeAddress ); faucet.configure(githubFam, Faucet.ModuleConfig("GithubModule", false, 1 days, 0.05 ether)); @@ -243,7 +251,8 @@ contract FaucetTest is Faucet_Initializer { vm.expectRevert("Faucet: provided auth module is not supported by this faucet"); faucet.drip( Faucet.DripParameters(payable(fundsReceiver), nonce), - Faucet.AuthParameters(githubFam, keccak256(abi.encodePacked(fundsReceiver)), signature) + Faucet.AuthParameters(githubFam, keccak256(abi.encodePacked(fundsReceiver)), signature), + bridgeAddress ); vm.stopPrank(); } @@ -265,13 +274,15 @@ contract FaucetTest is Faucet_Initializer { vm.startPrank(faucetContractAdmin); faucet.drip( Faucet.DripParameters(payable(fundsReceiver), nonce), - Faucet.AuthParameters(githubFam, keccak256(abi.encodePacked(fundsReceiver)), signature) + Faucet.AuthParameters(githubFam, keccak256(abi.encodePacked(fundsReceiver)), signature), + bridgeAddress ); vm.expectRevert("Faucet: nonce has already been used"); faucet.drip( Faucet.DripParameters(payable(fundsReceiver), nonce), - Faucet.AuthParameters(githubFam, keccak256(abi.encodePacked(fundsReceiver)), signature) + Faucet.AuthParameters(githubFam, keccak256(abi.encodePacked(fundsReceiver)), signature), + bridgeAddress ); vm.stopPrank(); } @@ -293,7 +304,8 @@ contract FaucetTest is Faucet_Initializer { vm.startPrank(faucetContractAdmin); faucet.drip( Faucet.DripParameters(payable(fundsReceiver), nonce0), - Faucet.AuthParameters(githubFam, keccak256(abi.encodePacked(fundsReceiver)), signature0) + Faucet.AuthParameters(githubFam, keccak256(abi.encodePacked(fundsReceiver)), signature0), + bridgeAddress ); bytes32 nonce1 = faucetHelper.consumeNonce(); @@ -311,7 +323,8 @@ contract FaucetTest is Faucet_Initializer { vm.expectRevert("Faucet: auth cannot be used yet because timeout has not elapsed"); faucet.drip( Faucet.DripParameters(payable(fundsReceiver), nonce1), - Faucet.AuthParameters(githubFam, keccak256(abi.encodePacked(fundsReceiver)), signature1) + Faucet.AuthParameters(githubFam, keccak256(abi.encodePacked(fundsReceiver)), signature1), + bridgeAddress ); vm.stopPrank(); } @@ -333,7 +346,8 @@ contract FaucetTest is Faucet_Initializer { vm.startPrank(faucetContractAdmin); faucet.drip( Faucet.DripParameters(payable(fundsReceiver), nonce0), - Faucet.AuthParameters(githubFam, keccak256(abi.encodePacked(fundsReceiver)), signature0) + Faucet.AuthParameters(githubFam, keccak256(abi.encodePacked(fundsReceiver)), signature0), + bridgeAddress ); bytes32 nonce1 = faucetHelper.consumeNonce(); @@ -351,7 +365,8 @@ contract FaucetTest is Faucet_Initializer { vm.warp(startingTimestamp + 1 days + 1 seconds); faucet.drip( Faucet.DripParameters(payable(fundsReceiver), nonce1), - Faucet.AuthParameters(githubFam, keccak256(abi.encodePacked(fundsReceiver)), signature1) + Faucet.AuthParameters(githubFam, keccak256(abi.encodePacked(fundsReceiver)), signature1), + bridgeAddress ); vm.stopPrank(); } From acb503a865bc2fb79614b8c9d674401f4b4a8b3c Mon Sep 17 00:00:00 2001 From: Tarun Khasnavis Date: Fri, 24 May 2024 15:41:27 -0700 Subject: [PATCH 02/10] updating the logic based on suggesstions --- .../src/periphery/faucet/Faucet.sol | 29 +++---- .../test/periphery/faucet/Faucet.t.sol | 85 ++++++++++--------- .../authmodules/AdminFaucetAuthModule.t.sol | 12 ++- 3 files changed, 64 insertions(+), 62 deletions(-) diff --git a/packages/contracts-bedrock/src/periphery/faucet/Faucet.sol b/packages/contracts-bedrock/src/periphery/faucet/Faucet.sol index 478dbf62195e..9266d00ed0f0 100644 --- a/packages/contracts-bedrock/src/periphery/faucet/Faucet.sol +++ b/packages/contracts-bedrock/src/periphery/faucet/Faucet.sol @@ -2,6 +2,7 @@ pragma solidity 0.8.15; import { IFaucetAuthModule } from "./authmodules/IFaucetAuthModule.sol"; +import { SafeCall } from "../../libraries/SafeCall.sol"; /// @title SafeSend /// @notice Sends ETH to a recipient account without triggering any code. @@ -12,11 +13,6 @@ contract SafeSend { } } -interface IL1StandardBridge { - // Declare the depositETHTo function as it is defined in L1StandardBridge - function depositETHTo(address to, uint32 minGasLimit, bytes calldata extraData) external payable; -} - /// @title Faucet /// @notice Faucet contract that drips ETH to users. contract Faucet { @@ -25,13 +21,14 @@ contract Faucet { /// @param userId The id of the user that requested the drip. /// @param amount The amount of funds sent. /// @param recipient The recipient of the drip. - /// @param bridge The destination chain's bridge of the drip. - event Drip(string indexed authModule, bytes32 indexed userId, uint256 amount, address indexed recipient, address bridge); + event Drip(string indexed authModule, bytes32 indexed userId, uint256 amount, address indexed recipient); /// @notice Parameters for a drip. struct DripParameters { address payable recipient; + bytes data; bytes32 nonce; + uint32 gasLimit; } /// @notice Parameters for authentication. @@ -94,8 +91,7 @@ contract Faucet { /// @notice Drips ETH to a recipient account. /// @param _params Drip parameters. /// @param _auth Authentication parameters. - /// @param _bridge Bridge address. - function drip(DripParameters memory _params, AuthParameters memory _auth, address _bridge) public { + function drip(DripParameters memory _params, AuthParameters memory _auth) public { // Grab the module config once. ModuleConfig memory config = modules[_auth.module]; @@ -120,22 +116,19 @@ contract Faucet { "Faucet: drip parameters could not be verified by security module" ); + // Verify recepient is not the faucet address. + require(_params.recipient != address(this), "Faucet: cannot drip to itself"); + // Set the next timestamp at which this auth id can be used. timeouts[_auth.module][_auth.id] = block.timestamp + config.ttl; // Mark the nonce as used. nonces[_auth.id][_params.nonce] = true; - if (_bridge == address(0)) { - // Use SafeSend if no bridge address is provided - new SafeSend{ value: config.amount }(_params.recipient); - } else { - // Execute a bridging of ETH to the recipient account. - IL1StandardBridge l1Bridge = IL1StandardBridge(_bridge); - l1Bridge.depositETHTo{value: config.amount}(_params.recipient, 200000, ""); - } + // Execute transfer of ETH to the recipient account. + SafeCall.call(_params.recipient, _params.gasLimit, config.amount, _params.data); - emit Drip(config.name, _auth.id, config.amount, _params.recipient, _bridge); + emit Drip(config.name, _auth.id, config.amount, _params.recipient); } /// @notice Returns the enable value of a given auth module. diff --git a/packages/contracts-bedrock/test/periphery/faucet/Faucet.t.sol b/packages/contracts-bedrock/test/periphery/faucet/Faucet.t.sol index 11c2b8895c56..a0ef75f28d55 100644 --- a/packages/contracts-bedrock/test/periphery/faucet/Faucet.t.sol +++ b/packages/contracts-bedrock/test/periphery/faucet/Faucet.t.sol @@ -13,7 +13,6 @@ contract Faucet_Initializer is Test { address internal faucetAuthAdmin; address internal nonAdmin; address internal fundsReceiver; - address internal bridgeAddress; uint256 internal faucetAuthAdminKey; uint256 internal nonAdminKey; uint256 internal startingTimestamp = 1000; @@ -32,7 +31,6 @@ contract Faucet_Initializer is Test { vm.warp(startingTimestamp); faucetContractAdmin = makeAddr("faucetContractAdmin"); fundsReceiver = makeAddr("fundsReceiver"); - bridgeAddress = makeAddr("bridgeAddr"); faucetAuthAdminKey = 0xB0B0B0B0; faucetAuthAdmin = vm.addr(faucetAuthAdminKey); @@ -108,6 +106,8 @@ contract FaucetTest is Faucet_Initializer { function test_authAdmin_drip_succeeds() external { _enableFaucetAuthModules(); bytes32 nonce = faucetHelper.consumeNonce(); + bytes memory data = "0x"; + uint32 gasLimit = 200000; bytes memory signature = issueProofWithEIP712Domain( faucetAuthAdminKey, bytes(optimistNftFamName), @@ -121,15 +121,16 @@ contract FaucetTest is Faucet_Initializer { vm.prank(nonAdmin); faucet.drip( - Faucet.DripParameters(payable(fundsReceiver), nonce), - Faucet.AuthParameters(optimistNftFam, keccak256(abi.encodePacked(fundsReceiver)), signature), - bridgeAddress + Faucet.DripParameters(payable(fundsReceiver), data, nonce, gasLimit), + Faucet.AuthParameters(optimistNftFam, keccak256(abi.encodePacked(fundsReceiver)), signature) ); } function test_nonAdmin_drip_fails() external { _enableFaucetAuthModules(); bytes32 nonce = faucetHelper.consumeNonce(); + bytes memory data = "0x"; + uint32 gasLimit = 200000; bytes memory signature = issueProofWithEIP712Domain( nonAdminKey, bytes(optimistNftFamName), @@ -144,15 +145,16 @@ contract FaucetTest is Faucet_Initializer { vm.prank(nonAdmin); vm.expectRevert("Faucet: drip parameters could not be verified by security module"); faucet.drip( - Faucet.DripParameters(payable(fundsReceiver), nonce), - Faucet.AuthParameters(optimistNftFam, keccak256(abi.encodePacked(fundsReceiver)), signature), - bridgeAddress + Faucet.DripParameters(payable(fundsReceiver), data, nonce, gasLimit), + Faucet.AuthParameters(optimistNftFam, keccak256(abi.encodePacked(fundsReceiver)), signature) ); } function test_drip_optimistNftSendsCorrectAmount_succeeds() external { _enableFaucetAuthModules(); bytes32 nonce = faucetHelper.consumeNonce(); + bytes memory data = "0x"; + uint32 gasLimit = 200000; bytes memory signature = issueProofWithEIP712Domain( faucetAuthAdminKey, bytes(optimistNftFamName), @@ -167,9 +169,8 @@ contract FaucetTest is Faucet_Initializer { uint256 recipientBalanceBefore = address(fundsReceiver).balance; vm.prank(nonAdmin); faucet.drip( - Faucet.DripParameters(payable(fundsReceiver), nonce), - Faucet.AuthParameters(optimistNftFam, keccak256(abi.encodePacked(fundsReceiver)), signature), - bridgeAddress + Faucet.DripParameters(payable(fundsReceiver), data, nonce, gasLimit), + Faucet.AuthParameters(optimistNftFam, keccak256(abi.encodePacked(fundsReceiver)), signature) ); uint256 recipientBalanceAfter = address(fundsReceiver).balance; assertEq(recipientBalanceAfter - recipientBalanceBefore, 1 ether, "expect increase of 1 ether"); @@ -178,6 +179,8 @@ contract FaucetTest is Faucet_Initializer { function test_drip_githubSendsCorrectAmount_succeeds() external { _enableFaucetAuthModules(); bytes32 nonce = faucetHelper.consumeNonce(); + bytes memory data = "0x"; + uint32 gasLimit = 200000; bytes memory signature = issueProofWithEIP712Domain( faucetAuthAdminKey, bytes(githubFamName), @@ -192,9 +195,8 @@ contract FaucetTest is Faucet_Initializer { uint256 recipientBalanceBefore = address(fundsReceiver).balance; vm.prank(nonAdmin); faucet.drip( - Faucet.DripParameters(payable(fundsReceiver), nonce), - Faucet.AuthParameters(githubFam, keccak256(abi.encodePacked(fundsReceiver)), signature), - bridgeAddress + Faucet.DripParameters(payable(fundsReceiver), data, nonce, gasLimit), + Faucet.AuthParameters(githubFam, keccak256(abi.encodePacked(fundsReceiver)), signature) ); uint256 recipientBalanceAfter = address(fundsReceiver).balance; assertEq(recipientBalanceAfter - recipientBalanceBefore, 0.05 ether, "expect increase of .05 ether"); @@ -203,6 +205,8 @@ contract FaucetTest is Faucet_Initializer { function test_drip_emitsEvent_succeeds() external { _enableFaucetAuthModules(); bytes32 nonce = faucetHelper.consumeNonce(); + bytes memory data = "0x"; + uint32 gasLimit = 200000; bytes memory signature = issueProofWithEIP712Domain( faucetAuthAdminKey, bytes(githubFamName), @@ -219,15 +223,16 @@ contract FaucetTest is Faucet_Initializer { vm.prank(nonAdmin); faucet.drip( - Faucet.DripParameters(payable(fundsReceiver), nonce), - Faucet.AuthParameters(githubFam, keccak256(abi.encodePacked(fundsReceiver)), signature), - bridgeAddress + Faucet.DripParameters(payable(fundsReceiver), data, nonce, gasLimit), + Faucet.AuthParameters(githubFam, keccak256(abi.encodePacked(fundsReceiver)), signature) ); } function test_drip_disabledModule_reverts() external { _enableFaucetAuthModules(); bytes32 nonce = faucetHelper.consumeNonce(); + bytes memory data = "0x"; + uint32 gasLimit = 200000; bytes memory signature = issueProofWithEIP712Domain( faucetAuthAdminKey, bytes(githubFamName), @@ -241,18 +246,16 @@ contract FaucetTest is Faucet_Initializer { vm.startPrank(faucetContractAdmin); faucet.drip( - Faucet.DripParameters(payable(fundsReceiver), nonce), - Faucet.AuthParameters(githubFam, keccak256(abi.encodePacked(fundsReceiver)), signature), - bridgeAddress + Faucet.DripParameters(payable(fundsReceiver), data, nonce, gasLimit), + Faucet.AuthParameters(githubFam, keccak256(abi.encodePacked(fundsReceiver)), signature) ); faucet.configure(githubFam, Faucet.ModuleConfig("GithubModule", false, 1 days, 0.05 ether)); vm.expectRevert("Faucet: provided auth module is not supported by this faucet"); faucet.drip( - Faucet.DripParameters(payable(fundsReceiver), nonce), - Faucet.AuthParameters(githubFam, keccak256(abi.encodePacked(fundsReceiver)), signature), - bridgeAddress + Faucet.DripParameters(payable(fundsReceiver), data, nonce, gasLimit), + Faucet.AuthParameters(githubFam, keccak256(abi.encodePacked(fundsReceiver)), signature) ); vm.stopPrank(); } @@ -260,6 +263,8 @@ contract FaucetTest is Faucet_Initializer { function test_drip_preventsReplayAttacks_succeeds() external { _enableFaucetAuthModules(); bytes32 nonce = faucetHelper.consumeNonce(); + bytes memory data = "0x"; + uint32 gasLimit = 200000; bytes memory signature = issueProofWithEIP712Domain( faucetAuthAdminKey, bytes(githubFamName), @@ -273,16 +278,14 @@ contract FaucetTest is Faucet_Initializer { vm.startPrank(faucetContractAdmin); faucet.drip( - Faucet.DripParameters(payable(fundsReceiver), nonce), - Faucet.AuthParameters(githubFam, keccak256(abi.encodePacked(fundsReceiver)), signature), - bridgeAddress + Faucet.DripParameters(payable(fundsReceiver), data, nonce, gasLimit), + Faucet.AuthParameters(githubFam, keccak256(abi.encodePacked(fundsReceiver)), signature) ); vm.expectRevert("Faucet: nonce has already been used"); faucet.drip( - Faucet.DripParameters(payable(fundsReceiver), nonce), - Faucet.AuthParameters(githubFam, keccak256(abi.encodePacked(fundsReceiver)), signature), - bridgeAddress + Faucet.DripParameters(payable(fundsReceiver), data, nonce, gasLimit), + Faucet.AuthParameters(githubFam, keccak256(abi.encodePacked(fundsReceiver)), signature) ); vm.stopPrank(); } @@ -290,6 +293,8 @@ contract FaucetTest is Faucet_Initializer { function test_drip_beforeTimeout_reverts() external { _enableFaucetAuthModules(); bytes32 nonce0 = faucetHelper.consumeNonce(); + bytes memory data = "0x"; + uint32 gasLimit = 200000; bytes memory signature0 = issueProofWithEIP712Domain( faucetAuthAdminKey, bytes(githubFamName), @@ -303,9 +308,8 @@ contract FaucetTest is Faucet_Initializer { vm.startPrank(faucetContractAdmin); faucet.drip( - Faucet.DripParameters(payable(fundsReceiver), nonce0), - Faucet.AuthParameters(githubFam, keccak256(abi.encodePacked(fundsReceiver)), signature0), - bridgeAddress + Faucet.DripParameters(payable(fundsReceiver), data, nonce0, gasLimit), + Faucet.AuthParameters(githubFam, keccak256(abi.encodePacked(fundsReceiver)), signature0) ); bytes32 nonce1 = faucetHelper.consumeNonce(); @@ -322,9 +326,8 @@ contract FaucetTest is Faucet_Initializer { vm.expectRevert("Faucet: auth cannot be used yet because timeout has not elapsed"); faucet.drip( - Faucet.DripParameters(payable(fundsReceiver), nonce1), - Faucet.AuthParameters(githubFam, keccak256(abi.encodePacked(fundsReceiver)), signature1), - bridgeAddress + Faucet.DripParameters(payable(fundsReceiver), data, nonce1, gasLimit), + Faucet.AuthParameters(githubFam, keccak256(abi.encodePacked(fundsReceiver)), signature1) ); vm.stopPrank(); } @@ -332,6 +335,8 @@ contract FaucetTest is Faucet_Initializer { function test_drip_afterTimeout_succeeds() external { _enableFaucetAuthModules(); bytes32 nonce0 = faucetHelper.consumeNonce(); + bytes memory data = "0x"; + uint32 gasLimit = 200000; bytes memory signature0 = issueProofWithEIP712Domain( faucetAuthAdminKey, bytes(githubFamName), @@ -345,9 +350,8 @@ contract FaucetTest is Faucet_Initializer { vm.startPrank(faucetContractAdmin); faucet.drip( - Faucet.DripParameters(payable(fundsReceiver), nonce0), - Faucet.AuthParameters(githubFam, keccak256(abi.encodePacked(fundsReceiver)), signature0), - bridgeAddress + Faucet.DripParameters(payable(fundsReceiver), data, nonce0, gasLimit), + Faucet.AuthParameters(githubFam, keccak256(abi.encodePacked(fundsReceiver)), signature0) ); bytes32 nonce1 = faucetHelper.consumeNonce(); @@ -364,9 +368,8 @@ contract FaucetTest is Faucet_Initializer { vm.warp(startingTimestamp + 1 days + 1 seconds); faucet.drip( - Faucet.DripParameters(payable(fundsReceiver), nonce1), - Faucet.AuthParameters(githubFam, keccak256(abi.encodePacked(fundsReceiver)), signature1), - bridgeAddress + Faucet.DripParameters(payable(fundsReceiver), data, nonce1, gasLimit), + Faucet.AuthParameters(githubFam, keccak256(abi.encodePacked(fundsReceiver)), signature1) ); vm.stopPrank(); } diff --git a/packages/contracts-bedrock/test/periphery/faucet/authmodules/AdminFaucetAuthModule.t.sol b/packages/contracts-bedrock/test/periphery/faucet/authmodules/AdminFaucetAuthModule.t.sol index 93a10329b452..18ba6b24fa7d 100644 --- a/packages/contracts-bedrock/test/periphery/faucet/authmodules/AdminFaucetAuthModule.t.sol +++ b/packages/contracts-bedrock/test/periphery/faucet/authmodules/AdminFaucetAuthModule.t.sol @@ -81,6 +81,8 @@ contract AdminFaucetAuthModuleTest is Test { /// @notice Assert that verify returns true for valid proofs signed by admins. function test_adminProof_verify_succeeds() external { bytes32 nonce = faucetHelper.consumeNonce(); + bytes memory data = "0x"; + uint32 gasLimit = 200000; address fundsReceiver = makeAddr("fundsReceiver"); bytes memory proof = issueProofWithEIP712Domain( adminKey, @@ -96,7 +98,7 @@ contract AdminFaucetAuthModuleTest is Test { vm.prank(nonAdmin); assertEq( adminFam.verify( - Faucet.DripParameters(payable(fundsReceiver), nonce), keccak256(abi.encodePacked(fundsReceiver)), proof + Faucet.DripParameters(payable(fundsReceiver), data, nonce, gasLimit), keccak256(abi.encodePacked(fundsReceiver)), proof ), true ); @@ -105,6 +107,8 @@ contract AdminFaucetAuthModuleTest is Test { /// @notice Assert that verify returns false for proofs signed by nonadmins. function test_nonAdminProof_verify_succeeds() external { bytes32 nonce = faucetHelper.consumeNonce(); + bytes memory data = "0x"; + uint32 gasLimit = 200000; address fundsReceiver = makeAddr("fundsReceiver"); bytes memory proof = issueProofWithEIP712Domain( nonAdminKey, @@ -120,7 +124,7 @@ contract AdminFaucetAuthModuleTest is Test { vm.prank(admin); assertEq( adminFam.verify( - Faucet.DripParameters(payable(fundsReceiver), nonce), keccak256(abi.encodePacked(fundsReceiver)), proof + Faucet.DripParameters(payable(fundsReceiver), data, nonce, gasLimit), keccak256(abi.encodePacked(fundsReceiver)), proof ), false ); @@ -130,6 +134,8 @@ contract AdminFaucetAuthModuleTest is Test { /// than the id in the call to verify. function test_proofWithWrongId_verify_succeeds() external { bytes32 nonce = faucetHelper.consumeNonce(); + bytes memory data = "0x"; + uint32 gasLimit = 200000; address fundsReceiver = makeAddr("fundsReceiver"); address randomAddress = makeAddr("randomAddress"); bytes memory proof = issueProofWithEIP712Domain( @@ -146,7 +152,7 @@ contract AdminFaucetAuthModuleTest is Test { vm.prank(admin); assertEq( adminFam.verify( - Faucet.DripParameters(payable(fundsReceiver), nonce), keccak256(abi.encodePacked(randomAddress)), proof + Faucet.DripParameters(payable(fundsReceiver), data, nonce, gasLimit), keccak256(abi.encodePacked(fundsReceiver)), proof ), false ); From 060b6f5e0805e2a36c0b124d7f617db7f3284df8 Mon Sep 17 00:00:00 2001 From: Tarun Khasnavis Date: Mon, 27 May 2024 22:46:57 -0700 Subject: [PATCH 03/10] adding changeset --- .changeset/cold-frogs-join.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/cold-frogs-join.md diff --git a/.changeset/cold-frogs-join.md b/.changeset/cold-frogs-join.md new file mode 100644 index 000000000000..e2b311c61081 --- /dev/null +++ b/.changeset/cold-frogs-join.md @@ -0,0 +1,5 @@ +--- +'@eth-optimism/contracts-bedrock': major +--- + +Updating Faucet contract to allow bridging for recieving funds on other chains From 215d76b556d6afb65eefc688477b86978124f5b0 Mon Sep 17 00:00:00 2001 From: Tarun Khasnavis Date: Tue, 28 May 2024 11:30:48 -0700 Subject: [PATCH 04/10] fixing ci issue --- .../periphery/faucet/authmodules/AdminFaucetAuthModule.t.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/contracts-bedrock/test/periphery/faucet/authmodules/AdminFaucetAuthModule.t.sol b/packages/contracts-bedrock/test/periphery/faucet/authmodules/AdminFaucetAuthModule.t.sol index 18ba6b24fa7d..86591271c94a 100644 --- a/packages/contracts-bedrock/test/periphery/faucet/authmodules/AdminFaucetAuthModule.t.sol +++ b/packages/contracts-bedrock/test/periphery/faucet/authmodules/AdminFaucetAuthModule.t.sol @@ -152,7 +152,7 @@ contract AdminFaucetAuthModuleTest is Test { vm.prank(admin); assertEq( adminFam.verify( - Faucet.DripParameters(payable(fundsReceiver), data, nonce, gasLimit), keccak256(abi.encodePacked(fundsReceiver)), proof + Faucet.DripParameters(payable(fundsReceiver), data, nonce, gasLimit), keccak256(abi.encodePacked(randomAddress)), proof ), false ); From 0c593eac681df30e7ce21c1d66cfdfff480d972a Mon Sep 17 00:00:00 2001 From: Tarun Khasnavis Date: Tue, 28 May 2024 11:48:20 -0700 Subject: [PATCH 05/10] update auth module tests --- .../periphery/faucet/authmodules/AdminFaucetAuthModule.t.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/contracts-bedrock/test/periphery/faucet/authmodules/AdminFaucetAuthModule.t.sol b/packages/contracts-bedrock/test/periphery/faucet/authmodules/AdminFaucetAuthModule.t.sol index 86591271c94a..b832d47116bd 100644 --- a/packages/contracts-bedrock/test/periphery/faucet/authmodules/AdminFaucetAuthModule.t.sol +++ b/packages/contracts-bedrock/test/periphery/faucet/authmodules/AdminFaucetAuthModule.t.sol @@ -98,7 +98,7 @@ contract AdminFaucetAuthModuleTest is Test { vm.prank(nonAdmin); assertEq( adminFam.verify( - Faucet.DripParameters(payable(fundsReceiver), data, nonce, gasLimit), keccak256(abi.encodePacked(fundsReceiver)), proof + Faucet.DripParameters(payable(fundsReceiver), data, nonce, gasLimit), keccak256(abi.encodePacked(randomAddress)), proof ), true ); @@ -124,7 +124,7 @@ contract AdminFaucetAuthModuleTest is Test { vm.prank(admin); assertEq( adminFam.verify( - Faucet.DripParameters(payable(fundsReceiver), data, nonce, gasLimit), keccak256(abi.encodePacked(fundsReceiver)), proof + Faucet.DripParameters(payable(fundsReceiver), data, nonce, gasLimit), keccak256(abi.encodePacked(randomAddress)), proof ), false ); From 1b2c4d33aaa81bfa92a108c4281565d99a7f3012 Mon Sep 17 00:00:00 2001 From: Tarun Khasnavis Date: Tue, 28 May 2024 12:44:50 -0700 Subject: [PATCH 06/10] final fix --- .../periphery/faucet/authmodules/AdminFaucetAuthModule.t.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/contracts-bedrock/test/periphery/faucet/authmodules/AdminFaucetAuthModule.t.sol b/packages/contracts-bedrock/test/periphery/faucet/authmodules/AdminFaucetAuthModule.t.sol index b832d47116bd..86591271c94a 100644 --- a/packages/contracts-bedrock/test/periphery/faucet/authmodules/AdminFaucetAuthModule.t.sol +++ b/packages/contracts-bedrock/test/periphery/faucet/authmodules/AdminFaucetAuthModule.t.sol @@ -98,7 +98,7 @@ contract AdminFaucetAuthModuleTest is Test { vm.prank(nonAdmin); assertEq( adminFam.verify( - Faucet.DripParameters(payable(fundsReceiver), data, nonce, gasLimit), keccak256(abi.encodePacked(randomAddress)), proof + Faucet.DripParameters(payable(fundsReceiver), data, nonce, gasLimit), keccak256(abi.encodePacked(fundsReceiver)), proof ), true ); @@ -124,7 +124,7 @@ contract AdminFaucetAuthModuleTest is Test { vm.prank(admin); assertEq( adminFam.verify( - Faucet.DripParameters(payable(fundsReceiver), data, nonce, gasLimit), keccak256(abi.encodePacked(randomAddress)), proof + Faucet.DripParameters(payable(fundsReceiver), data, nonce, gasLimit), keccak256(abi.encodePacked(fundsReceiver)), proof ), false ); From 6ac95f2e91e0a3d5210072a7865ee2946ecdecfb Mon Sep 17 00:00:00 2001 From: tre Date: Tue, 28 May 2024 15:26:25 -0700 Subject: [PATCH 07/10] lint fix --- .../faucet/authmodules/AdminFaucetAuthModule.t.sol | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/packages/contracts-bedrock/test/periphery/faucet/authmodules/AdminFaucetAuthModule.t.sol b/packages/contracts-bedrock/test/periphery/faucet/authmodules/AdminFaucetAuthModule.t.sol index 86591271c94a..408c091135a2 100644 --- a/packages/contracts-bedrock/test/periphery/faucet/authmodules/AdminFaucetAuthModule.t.sol +++ b/packages/contracts-bedrock/test/periphery/faucet/authmodules/AdminFaucetAuthModule.t.sol @@ -98,7 +98,9 @@ contract AdminFaucetAuthModuleTest is Test { vm.prank(nonAdmin); assertEq( adminFam.verify( - Faucet.DripParameters(payable(fundsReceiver), data, nonce, gasLimit), keccak256(abi.encodePacked(fundsReceiver)), proof + Faucet.DripParameters(payable(fundsReceiver), data, nonce, gasLimit), + keccak256(abi.encodePacked(fundsReceiver)), + proof ), true ); @@ -124,7 +126,9 @@ contract AdminFaucetAuthModuleTest is Test { vm.prank(admin); assertEq( adminFam.verify( - Faucet.DripParameters(payable(fundsReceiver), data, nonce, gasLimit), keccak256(abi.encodePacked(fundsReceiver)), proof + Faucet.DripParameters(payable(fundsReceiver), data, nonce, gasLimit), + keccak256(abi.encodePacked(fundsReceiver)), + proof ), false ); @@ -152,7 +156,9 @@ contract AdminFaucetAuthModuleTest is Test { vm.prank(admin); assertEq( adminFam.verify( - Faucet.DripParameters(payable(fundsReceiver), data, nonce, gasLimit), keccak256(abi.encodePacked(randomAddress)), proof + Faucet.DripParameters(payable(fundsReceiver), data, nonce, gasLimit), + keccak256(abi.encodePacked(randomAddress)), + proof ), false ); From 017d17b9874cd2bbf000146c8107ad70e7776a39 Mon Sep 17 00:00:00 2001 From: tre Date: Tue, 28 May 2024 15:50:13 -0700 Subject: [PATCH 08/10] update snapshots --- .../snapshots/abi/AdminFaucetAuthModule.json | 10 ++++++++++ packages/contracts-bedrock/snapshots/abi/Faucet.json | 10 ++++++++++ 2 files changed, 20 insertions(+) diff --git a/packages/contracts-bedrock/snapshots/abi/AdminFaucetAuthModule.json b/packages/contracts-bedrock/snapshots/abi/AdminFaucetAuthModule.json index 7c2112223259..fc0dbd595b1f 100644 --- a/packages/contracts-bedrock/snapshots/abi/AdminFaucetAuthModule.json +++ b/packages/contracts-bedrock/snapshots/abi/AdminFaucetAuthModule.json @@ -55,10 +55,20 @@ "name": "recipient", "type": "address" }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, { "internalType": "bytes32", "name": "nonce", "type": "bytes32" + }, + { + "internalType": "uint32", + "name": "gasLimit", + "type": "uint32" } ], "internalType": "struct Faucet.DripParameters", diff --git a/packages/contracts-bedrock/snapshots/abi/Faucet.json b/packages/contracts-bedrock/snapshots/abi/Faucet.json index f943faed8283..79cdc8315398 100644 --- a/packages/contracts-bedrock/snapshots/abi/Faucet.json +++ b/packages/contracts-bedrock/snapshots/abi/Faucet.json @@ -76,10 +76,20 @@ "name": "recipient", "type": "address" }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, { "internalType": "bytes32", "name": "nonce", "type": "bytes32" + }, + { + "internalType": "uint32", + "name": "gasLimit", + "type": "uint32" } ], "internalType": "struct Faucet.DripParameters", From 958ff1dac3e3c9c7f8796f342a5f6fe8d86ff131 Mon Sep 17 00:00:00 2001 From: tre Date: Tue, 28 May 2024 16:23:21 -0700 Subject: [PATCH 09/10] update changeset --- .changeset/brave-dingos-fold.md | 5 +++++ .changeset/cold-frogs-join.md | 5 ----- 2 files changed, 5 insertions(+), 5 deletions(-) create mode 100644 .changeset/brave-dingos-fold.md delete mode 100644 .changeset/cold-frogs-join.md diff --git a/.changeset/brave-dingos-fold.md b/.changeset/brave-dingos-fold.md new file mode 100644 index 000000000000..b0e7e086c7f5 --- /dev/null +++ b/.changeset/brave-dingos-fold.md @@ -0,0 +1,5 @@ +--- +'@eth-optimism/contracts-bedrock': minor +--- + +Add data field to faucet contract drip parameters diff --git a/.changeset/cold-frogs-join.md b/.changeset/cold-frogs-join.md deleted file mode 100644 index e2b311c61081..000000000000 --- a/.changeset/cold-frogs-join.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@eth-optimism/contracts-bedrock': major ---- - -Updating Faucet contract to allow bridging for recieving funds on other chains From 039d2fd8ff0ce6f9964a621326484925c798f2b7 Mon Sep 17 00:00:00 2001 From: tre Date: Tue, 28 May 2024 16:26:41 -0700 Subject: [PATCH 10/10] change to patch --- .changeset/{brave-dingos-fold.md => witty-pants-move.md} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename .changeset/{brave-dingos-fold.md => witty-pants-move.md} (59%) diff --git a/.changeset/brave-dingos-fold.md b/.changeset/witty-pants-move.md similarity index 59% rename from .changeset/brave-dingos-fold.md rename to .changeset/witty-pants-move.md index b0e7e086c7f5..aa85cb679e4e 100644 --- a/.changeset/brave-dingos-fold.md +++ b/.changeset/witty-pants-move.md @@ -1,5 +1,5 @@ --- -'@eth-optimism/contracts-bedrock': minor +'@eth-optimism/contracts-bedrock': patch --- Add data field to faucet contract drip parameters