diff --git a/contracts/src/v0.8/ccip/pools/GHO/diffs/UpgradeableBurnMintTokenPool_diff.md b/contracts/src/v0.8/ccip/pools/GHO/diffs/UpgradeableBurnMintTokenPool_diff.md index 05c3be4d06..066847e4f8 100644 --- a/contracts/src/v0.8/ccip/pools/GHO/diffs/UpgradeableBurnMintTokenPool_diff.md +++ b/contracts/src/v0.8/ccip/pools/GHO/diffs/UpgradeableBurnMintTokenPool_diff.md @@ -1,9 +1,9 @@ ```diff diff --git a/src/v0.8/ccip/pools/BurnMintTokenPool.sol b/src/v0.8/ccip/pools/GHO/UpgradeableBurnMintTokenPool.sol -index 9af0f22f4c..58be87812f 100644 +index 9af0f22f4c..a46ff915e5 100644 --- a/src/v0.8/ccip/pools/BurnMintTokenPool.sol +++ b/src/v0.8/ccip/pools/GHO/UpgradeableBurnMintTokenPool.sol -@@ -1,28 +1,55 @@ +@@ -1,28 +1,90 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.19; +pragma solidity ^0.8.0; @@ -16,15 +16,10 @@ index 9af0f22f4c..58be87812f 100644 -import {BurnMintTokenPoolAbstract} from "./BurnMintTokenPoolAbstract.sol"; +import {ITypeAndVersion} from "../../../shared/interfaces/ITypeAndVersion.sol"; +import {IBurnMintERC20} from "../../../shared/token/ERC20/IBurnMintERC20.sol"; - --/// @notice This pool mints and burns a 3rd-party token. --/// @dev Pool whitelisting mode is set in the constructor and cannot be modified later. --/// It either accepts any address as originalSender, or only accepts whitelisted originalSender. --/// The only way to change whitelisting mode is to deploy a new pool. --/// If that is expected, please make sure the token's burner/minter roles are adjustable. --contract BurnMintTokenPool is BurnMintTokenPoolAbstract, ITypeAndVersion { ++ +import {UpgradeableTokenPool} from "./UpgradeableTokenPool.sol"; +import {UpgradeableBurnMintTokenPoolAbstract} from "./UpgradeableBurnMintTokenPoolAbstract.sol"; ++import {RateLimiter} from "../../libraries/RateLimiter.sol"; + +import {IRouter} from "../../interfaces/IRouter.sol"; + @@ -35,8 +30,20 @@ index 9af0f22f4c..58be87812f 100644 +/// - Implementation of Initializable to allow upgrades +/// - Move of allowlist and router definition to initialization stage +contract UpgradeableBurnMintTokenPool is Initializable, UpgradeableBurnMintTokenPoolAbstract, ITypeAndVersion { ++ error Unauthorized(address caller); + +-/// @notice This pool mints and burns a 3rd-party token. +-/// @dev Pool whitelisting mode is set in the constructor and cannot be modified later. +-/// It either accepts any address as originalSender, or only accepts whitelisted originalSender. +-/// The only way to change whitelisting mode is to deploy a new pool. +-/// If that is expected, please make sure the token's burner/minter roles are adjustable. +-contract BurnMintTokenPool is BurnMintTokenPoolAbstract, ITypeAndVersion { string public constant override typeAndVersion = "BurnMintTokenPool 1.4.0"; ++ /// @notice The address of the rate limiter admin. ++ /// @dev Can be address(0) if none is configured. ++ address internal s_rateLimitAdmin; ++ + /// @dev Constructor + /// @param token The bridgeable token that is managed by this pool. + /// @param armProxy The address of the arm proxy @@ -71,6 +78,34 @@ index 9af0f22f4c..58be87812f 100644 + } + } + ++ /// @notice Sets the rate limiter admin address. ++ /// @dev Only callable by the owner. ++ /// @param rateLimitAdmin The new rate limiter admin address. ++ function setRateLimitAdmin(address rateLimitAdmin) external onlyOwner { ++ s_rateLimitAdmin = rateLimitAdmin; ++ } ++ ++ /// @notice Gets the rate limiter admin address. ++ function getRateLimitAdmin() external view returns (address) { ++ return s_rateLimitAdmin; ++ } ++ ++ /// @notice Sets the rate limiter admin address. ++ /// @dev Only callable by the owner or the rate limiter admin. NOTE: overwrites the normal ++ /// onlyAdmin check in the base implementation to also allow the rate limiter admin. ++ /// @param remoteChainSelector The remote chain selector for which the rate limits apply. ++ /// @param outboundConfig The new outbound rate limiter config. ++ /// @param inboundConfig The new inbound rate limiter config. ++ function setChainRateLimiterConfig( ++ uint64 remoteChainSelector, ++ RateLimiter.Config memory outboundConfig, ++ RateLimiter.Config memory inboundConfig ++ ) external override { ++ if (msg.sender != s_rateLimitAdmin && msg.sender != owner()) revert Unauthorized(msg.sender); ++ ++ _setRateLimitConfig(remoteChainSelector, outboundConfig, inboundConfig); ++ } ++ + /// @inheritdoc UpgradeableBurnMintTokenPoolAbstract function _burn(uint256 amount) internal virtual override { IBurnMintERC20(address(i_token)).burn(amount);