From e35a529fdb7c39cbdd54530423d1e6e19dbc61c3 Mon Sep 17 00:00:00 2001 From: Josh Date: Wed, 4 Sep 2024 11:13:52 -0400 Subject: [PATCH 01/48] proof of concept v0 for token pool factory. Untested --- .../tokenAdminRegistry/TokenPoolFactory.sol | 126 ++++++++++++++++++ .../shared/util/DeterministicDeployer.sol | 36 +++++ 2 files changed, 162 insertions(+) create mode 100644 contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory.sol create mode 100644 contracts/src/v0.8/shared/util/DeterministicDeployer.sol diff --git a/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory.sol b/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory.sol new file mode 100644 index 0000000000..3bcfcbef53 --- /dev/null +++ b/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory.sol @@ -0,0 +1,126 @@ +pragma solidity ^0.8.24; + +import {OwnerIsCreator} from "../../shared/access/OwnerIsCreator.sol"; +import {DeterministicContractDeployer} from "../../shared/util/DeterministicDeployer.sol"; + +import {TokenAdminRegistry} from "./TokenAdminRegistry.sol"; + +import {RateLimiter} from "../libraries/RateLimiter.sol"; +import {TokenPool} from "../pools/TokenPool.sol"; + +import {ITokenAdminRegistry} from "../interfaces/ITokenAdminRegistry.sol"; + +import {BurnMintERC677} from "../../shared/token/ERC677/BurnMintERC677.sol"; +import {BurnMintTokenPool} from "../pools/BurnMintTokenPool.sol"; + +contract TokenPoolFactory is OwnerIsCreator { + using DeterministicContractDeployer for bytes; + + ITokenAdminRegistry internal immutable i_tokenAdminRegistry; + + error InvalidZeroAddress(); + + mapping(uint64 remoteChainSelector => address remotePoolFactory) internal s_remotePoolFactories; + + constructor(address tokenAdminRegistry) { + if (tokenAdminRegistry == address(0)) revert InvalidZeroAddress(); + + i_tokenAdminRegistry = ITokenAdminRegistry(tokenAdminRegistry); + } + + struct ExistingTokenPool { + uint64 remoteChainSelector; + bytes remotePoolAddress; + bytes remoteTokenAddress; + RateLimiter.Config outboundRateLimiterConfig; // Outbound rate limited config, meaning the rate limits for all of the onRamps for the given chain + RateLimiter.Config inboundRateLimiterConfig; // Inbound rate limited config, meaning the rate limits for all of the offRamps for the given chain + } + + struct Deployment { + BurnMintERC677 token; + BurnMintTokenPool pool; + } + + function createTokenPool( + address existingToken, + ExistingTokenPool[] memory remoteTokenPools, + /// @notice: init code and token args have been combined into one to prevent a stack too deep error + bytes calldata tokenPoolInitCode, + bytes calldata tokenInitCode, + bytes32 salt //TODO: Check that this is allowed for omni-chain deployments + ) public returns (address tokenAddress, address poolAddress) { + // If there is no existing ERC20-token, deploy a new one, else return the existing address + if (existingToken == address(0)) { + tokenAddress = tokenInitCode.deploy(salt); + } else { + tokenAddress = existingToken; + } + + // Ensure a unique deployment between senders even if the same input parameter is used + salt = keccak256(abi.encodePacked(salt, msg.sender)); + + // Deploy a new token pool locally + poolAddress = tokenPoolInitCode.deploy(salt); + + // Setup token roles + BurnMintERC677(tokenAddress).grantMintAndBurnRoles(poolAddress); + + _setTokenPool(tokenAddress, poolAddress); + + // Stack Scoping to reduce pressure on stack too deep + { + TokenPool.ChainUpdate[] memory chainUpdates = new TokenPool.ChainUpdate[](remoteTokenPools.length); + for (uint256 i = 0; i < remoteTokenPools.length; i++) { + address remoteFactoryAddress = s_remotePoolFactories[remoteTokenPools[i].remoteChainSelector]; + + chainUpdates[i] = TokenPool.ChainUpdate({ + remoteChainSelector: remoteTokenPools[i].remoteChainSelector, + allowed: true, + + // If an address is not passed, predict the address using the remote factory address. + remotePoolAddress: remoteTokenPools[i].remotePoolAddress.length == 0 + ? abi.encode(tokenPoolInitCode.predictAddressOfUndeployedContract(salt, remoteFactoryAddress)) + : remoteTokenPools[i].remotePoolAddress, + + remoteTokenAddress: remoteTokenPools[i].remoteTokenAddress.length == 0 + ? abi.encode(tokenInitCode.predictAddressOfUndeployedContract(salt, remoteFactoryAddress)) + : remoteTokenPools[i].remoteTokenAddress, + + outboundRateLimiterConfig: remoteTokenPools[i].outboundRateLimiterConfig, + inboundRateLimiterConfig: remoteTokenPools[i].inboundRateLimiterConfig + }); + } + + TokenPool(poolAddress).applyChainUpdates(chainUpdates); + } + + _releaseOwnership(tokenAddress, poolAddress); + } + + function _setTokenPool(address token, address pool) public { + // propose this factory as the admin for the token in the token admin registry + i_tokenAdminRegistry.proposeAdministrator(token, address(this)); + + // Accept the admin role by the token admin registry + i_tokenAdminRegistry.acceptAdminRole(token); + + // Set the pool address in the token admin registry + i_tokenAdminRegistry.setPool(token, pool); + } + + function _releaseOwnership(address token, address pool) public { + i_tokenAdminRegistry.transferAdminRole(token, msg.sender); + + OwnerIsCreator(token).transferOwnership(address(msg.sender)); // 1 step ownership transfer + OwnerIsCreator(pool).transferOwnership(address(msg.sender)); // 2 step ownership transfer + } + + // TODO: Update with struct and arrays and shit. PoC for now + function updateRemotePoolFactory(uint64 remoteChainSelector, address remotePoolFactory) public onlyOwner { + s_remotePoolFactories[remoteChainSelector] = remotePoolFactory; + } + + function getRemotePoolFactory(uint64 remoteChainSelector) public view returns (address) { + return s_remotePoolFactories[remoteChainSelector]; + } +} diff --git a/contracts/src/v0.8/shared/util/DeterministicDeployer.sol b/contracts/src/v0.8/shared/util/DeterministicDeployer.sol new file mode 100644 index 0000000000..b2a047c706 --- /dev/null +++ b/contracts/src/v0.8/shared/util/DeterministicDeployer.sol @@ -0,0 +1,36 @@ +pragma solidity ^0.8.0; + +/// @title Deterministic Deployer Library +/// @notice Library for deterministic contract deployment. +library DeterministicContractDeployer { + + error DeploymentFailed(); + + /// @notice Deploys a contract with a deterministically computed address. + /// @param salt A value to modify the deployment address. + /// @param initCode The bytecode of the contract to deploy. + /// @return contractAddress The address of the deployed contract. + function deploy(bytes memory initCode, bytes32 salt) internal returns (address contractAddress) { + assembly { + // create2(value, memoryAddress, size, salt) + contractAddress := create2(0, add(initCode, 0x20), mload(initCode), salt) + } + + if(contractAddress == address(0)) { + revert DeploymentFailed(); + } + } + + function predictAddressOfUndeployedContract( + bytes calldata initCode, + bytes32 salt, + address deployer + ) internal pure returns (address) { + // according to evm.codes, the below formula is used to predict the address of a contract + // address = keccak256(0xff + sender_address + salt + keccak256(initialisation_code))[12:] + bytes32 bytesValue = keccak256(abi.encodePacked(hex"ff", deployer, salt, initCode)); + + return address(uint160(uint256(bytesValue))); + } + +} \ No newline at end of file From 45c205ed835a0ec36f2bb879572b309fc564a483 Mon Sep 17 00:00:00 2001 From: Josh Date: Thu, 5 Sep 2024 12:04:53 -0400 Subject: [PATCH 02/48] cleanup and solhint fixes --- .../ccip/interfaces/ITokenAdminRegistry.sol | 18 +++++++++++ .../tokenAdminRegistry/TokenPoolFactory.sol | 32 +++++++++++-------- .../shared/util/DeterministicDeployer.sol | 6 ++-- 3 files changed, 41 insertions(+), 15 deletions(-) diff --git a/contracts/src/v0.8/ccip/interfaces/ITokenAdminRegistry.sol b/contracts/src/v0.8/ccip/interfaces/ITokenAdminRegistry.sol index 0e44122901..3cd620580e 100644 --- a/contracts/src/v0.8/ccip/interfaces/ITokenAdminRegistry.sol +++ b/contracts/src/v0.8/ccip/interfaces/ITokenAdminRegistry.sol @@ -9,4 +9,22 @@ interface ITokenAdminRegistry { /// @param localToken The token to register the administrator for. /// @param administrator The administrator to register. function proposeAdministrator(address localToken, address administrator) external; + + /// @notice Accepts the administrator role for a token. + /// @param localToken The token to accept the administrator role for. + /// @dev This function can only be called by the pending administrator. + function acceptAdminRole(address localToken) external; + + /// @notice Sets the pool for a token. Setting the pool to address(0) effectively delists the token + /// from CCIP. Setting the pool to any other address enables the token on CCIP. + /// @param localToken The token to set the pool for. + /// @param pool The pool to set for the token. + function setPool(address localToken, address pool) external; + + /// @notice Transfers the administrator role for a token to a new address with a 2-step process. + /// @param localToken The token to transfer the administrator role for. + /// @param newAdmin The address to transfer the administrator role to. Can be address(0) to cancel + /// a pending transfer. + /// @dev The new admin must call `acceptAdminRole` to accept the role. + function transferAdminRole(address localToken, address newAdmin) external; } diff --git a/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory.sol b/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory.sol index 3bcfcbef53..6c0bebc32f 100644 --- a/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory.sol +++ b/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory.sol @@ -3,8 +3,6 @@ pragma solidity ^0.8.24; import {OwnerIsCreator} from "../../shared/access/OwnerIsCreator.sol"; import {DeterministicContractDeployer} from "../../shared/util/DeterministicDeployer.sol"; -import {TokenAdminRegistry} from "./TokenAdminRegistry.sol"; - import {RateLimiter} from "../libraries/RateLimiter.sol"; import {TokenPool} from "../pools/TokenPool.sol"; @@ -18,6 +16,10 @@ contract TokenPoolFactory is OwnerIsCreator { ITokenAdminRegistry internal immutable i_tokenAdminRegistry; + event RemotePoolFactoryUpdated( + uint64 indexed remoteChainSelector, address existingFactory, address remotePoolFactory + ); + error InvalidZeroAddress(); mapping(uint64 remoteChainSelector => address remotePoolFactory) internal s_remotePoolFactories; @@ -47,11 +49,11 @@ contract TokenPoolFactory is OwnerIsCreator { /// @notice: init code and token args have been combined into one to prevent a stack too deep error bytes calldata tokenPoolInitCode, bytes calldata tokenInitCode, - bytes32 salt //TODO: Check that this is allowed for omni-chain deployments + bytes32 salt ) public returns (address tokenAddress, address poolAddress) { // If there is no existing ERC20-token, deploy a new one, else return the existing address if (existingToken == address(0)) { - tokenAddress = tokenInitCode.deploy(salt); + tokenAddress = tokenInitCode._deploy(salt); } else { tokenAddress = existingToken; } @@ -60,7 +62,7 @@ contract TokenPoolFactory is OwnerIsCreator { salt = keccak256(abi.encodePacked(salt, msg.sender)); // Deploy a new token pool locally - poolAddress = tokenPoolInitCode.deploy(salt); + poolAddress = tokenPoolInitCode._deploy(salt); // Setup token roles BurnMintERC677(tokenAddress).grantMintAndBurnRoles(poolAddress); @@ -76,16 +78,13 @@ contract TokenPoolFactory is OwnerIsCreator { chainUpdates[i] = TokenPool.ChainUpdate({ remoteChainSelector: remoteTokenPools[i].remoteChainSelector, allowed: true, - // If an address is not passed, predict the address using the remote factory address. remotePoolAddress: remoteTokenPools[i].remotePoolAddress.length == 0 - ? abi.encode(tokenPoolInitCode.predictAddressOfUndeployedContract(salt, remoteFactoryAddress)) + ? abi.encode(tokenPoolInitCode._predictAddressOfUndeployedContract(salt, remoteFactoryAddress)) : remoteTokenPools[i].remotePoolAddress, - remoteTokenAddress: remoteTokenPools[i].remoteTokenAddress.length == 0 - ? abi.encode(tokenInitCode.predictAddressOfUndeployedContract(salt, remoteFactoryAddress)) + ? abi.encode(tokenInitCode._predictAddressOfUndeployedContract(salt, remoteFactoryAddress)) : remoteTokenPools[i].remoteTokenAddress, - outboundRateLimiterConfig: remoteTokenPools[i].outboundRateLimiterConfig, inboundRateLimiterConfig: remoteTokenPools[i].inboundRateLimiterConfig }); @@ -95,9 +94,12 @@ contract TokenPoolFactory is OwnerIsCreator { } _releaseOwnership(tokenAddress, poolAddress); + + return (tokenAddress, poolAddress); } + - function _setTokenPool(address token, address pool) public { + function setTokenPool(address token, address pool) public { // propose this factory as the admin for the token in the token admin registry i_tokenAdminRegistry.proposeAdministrator(token, address(this)); @@ -108,7 +110,7 @@ contract TokenPoolFactory is OwnerIsCreator { i_tokenAdminRegistry.setPool(token, pool); } - function _releaseOwnership(address token, address pool) public { + function _releaseOwnership(address token, address pool) internal { i_tokenAdminRegistry.transferAdminRole(token, msg.sender); OwnerIsCreator(token).transferOwnership(address(msg.sender)); // 1 step ownership transfer @@ -117,10 +119,14 @@ contract TokenPoolFactory is OwnerIsCreator { // TODO: Update with struct and arrays and shit. PoC for now function updateRemotePoolFactory(uint64 remoteChainSelector, address remotePoolFactory) public onlyOwner { + address existingFactory = s_remotePoolFactories[remoteChainSelector]; + s_remotePoolFactories[remoteChainSelector] = remotePoolFactory; + + emit RemotePoolFactoryUpdated(remoteChainSelector, existingFactory, remotePoolFactory); } - function getRemotePoolFactory(uint64 remoteChainSelector) public view returns (address) { + function getRemotePoolFactory(uint64 remoteChainSelector) public view returns (address remoteFactory) { return s_remotePoolFactories[remoteChainSelector]; } } diff --git a/contracts/src/v0.8/shared/util/DeterministicDeployer.sol b/contracts/src/v0.8/shared/util/DeterministicDeployer.sol index b2a047c706..97ad7776dd 100644 --- a/contracts/src/v0.8/shared/util/DeterministicDeployer.sol +++ b/contracts/src/v0.8/shared/util/DeterministicDeployer.sol @@ -10,7 +10,7 @@ library DeterministicContractDeployer { /// @param salt A value to modify the deployment address. /// @param initCode The bytecode of the contract to deploy. /// @return contractAddress The address of the deployed contract. - function deploy(bytes memory initCode, bytes32 salt) internal returns (address contractAddress) { + function _deploy(bytes memory initCode, bytes32 salt) internal returns (address contractAddress) { assembly { // create2(value, memoryAddress, size, salt) contractAddress := create2(0, add(initCode, 0x20), mload(initCode), salt) @@ -19,9 +19,11 @@ library DeterministicContractDeployer { if(contractAddress == address(0)) { revert DeploymentFailed(); } + + return contractAddress; } - function predictAddressOfUndeployedContract( + function _predictAddressOfUndeployedContract( bytes calldata initCode, bytes32 salt, address deployer From 6b06dc7fac5b40dc180cecd668e81661439f91db Mon Sep 17 00:00:00 2001 From: Josh Date: Tue, 10 Sep 2024 12:16:53 -0400 Subject: [PATCH 03/48] Checkpoint a successful deployment workflow --- .../tokenAdminRegistry/TokenPoolFactory.t.sol | 93 ++++++++ .../tokenAdminRegistry/TokenPoolFactory.sol | 139 +++++++---- .../v0.8/shared/token/ERC20/BurnMintERC20.sol | 218 ++++++++++++++++++ ....sol => DeterministicContractDeployer.sol} | 5 +- 4 files changed, 410 insertions(+), 45 deletions(-) create mode 100644 contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol create mode 100644 contracts/src/v0.8/shared/token/ERC20/BurnMintERC20.sol rename contracts/src/v0.8/shared/util/{DeterministicDeployer.sol => DeterministicContractDeployer.sol} (94%) diff --git a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol new file mode 100644 index 0000000000..55d0f0c0dc --- /dev/null +++ b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol @@ -0,0 +1,93 @@ +pragma solidity ^0.8.24; + +import {IOwner} from "../../interfaces/IOwner.sol"; + +import {BurnMintTokenPool} from "../../pools/BurnMintTokenPool.sol"; +import {TokenPoolFactory} from "../../tokenAdminRegistry/TokenPoolFactory.sol"; + +import {TokenAdminRegistrySetup} from "./TokenAdminRegistry.t.sol"; +import {RegistryModuleOwnerCustom} from "../../tokenAdminRegistry/RegistryModuleOwnerCustom.sol"; + + +import {DeterministicContractDeployer} from "../../../shared/util/DeterministicContractDeployer.sol"; +import {OwnerIsCreator} from "../../../shared/access/OwnerIsCreator.sol"; +import {BurnMintERC20} from "../../../shared/token/ERC20/BurnMintERC20.sol"; + +contract TokenPoolFactorySetup is TokenAdminRegistrySetup { + TokenPoolFactory internal s_tokenPoolFactory; + RegistryModuleOwnerCustom internal s_registryModuleOwnerCustom; + + bytes internal s_poolInitCode; + bytes internal s_poolInitArgs; + + bytes32 internal constant s_salt = keccak256(abi.encode("FAKE_SALT")); + + address internal s_rmnProxy = address(0x1234); + + bytes internal s_tokenCreationParams; + bytes internal s_tokenInitCode; + + function setUp() public virtual override { + TokenAdminRegistrySetup.setUp(); + + s_registryModuleOwnerCustom = new RegistryModuleOwnerCustom(address(s_tokenAdminRegistry)); + s_tokenAdminRegistry.addRegistryModule(address(s_registryModuleOwnerCustom)); + + s_tokenPoolFactory = new TokenPoolFactory(address(s_tokenAdminRegistry), address(s_registryModuleOwnerCustom), s_rmnProxy, address(s_sourceRouter)); + + // Create Init Code for BurnMintERC20 TestToken with 18 decimals and supply cap of max uint256 value + s_tokenCreationParams = abi.encode("TestToken", "TT", 18, type(uint256).max); + s_tokenInitCode = abi.encodePacked(type(BurnMintERC20).creationCode, s_tokenCreationParams); + + s_poolInitCode = type(BurnMintTokenPool).creationCode; + + // Create Init Args for BurnMintTokenPool with no allowlist minus the token address + address[] memory allowlist = new address[](1); + allowlist[0] = OWNER; + s_poolInitArgs = abi.encode(allowlist, address(0x1234), s_sourceRouter); + + } +} + +contract TokenPoolFactoryTests is TokenPoolFactorySetup { + function test_createTokenPool_WithNoExistingTokenOnRemoteChain_Success() public { + vm.startPrank(OWNER); + + bytes32 dynamicSalt = keccak256(abi.encodePacked(s_salt, OWNER)); + + address predictedTokenAddress = DeterministicContractDeployer._predictAddressOfUndeployedContract( + s_tokenInitCode, dynamicSalt, address(s_tokenPoolFactory) + ); + + bytes memory predictedPoolCreationParams = abi.encode(predictedTokenAddress, new address[](0), s_rmnProxy, s_sourceRouter); + bytes memory predictedPoolInitCode = abi.encodePacked(s_poolInitCode, predictedPoolCreationParams); + address predictedPoolAddress = DeterministicContractDeployer._predictAddressOfUndeployedContract( + predictedPoolInitCode, dynamicSalt, address(s_tokenPoolFactory) + ); + + + (address tokenAddress, address poolAddress) = s_tokenPoolFactory.createTokenPool( + address(0), new TokenPoolFactory.ExistingTokenPool[](0), s_poolInitCode, s_tokenInitCode, s_salt + ); + + assertNotEq(address(0), tokenAddress, "Token Address should not be 0"); + assertNotEq(address(0), poolAddress, "Pool Address should not be 0"); + + assertEq(predictedTokenAddress, tokenAddress, "Token Address should have been predicted"); + assertEq(predictedPoolAddress, poolAddress, "Pool Address should have been predicted"); + + s_tokenAdminRegistry.acceptAdminRole(tokenAddress); + OwnerIsCreator(tokenAddress).acceptOwnership(); + OwnerIsCreator(poolAddress).acceptOwnership(); + + assertEq(poolAddress, s_tokenAdminRegistry.getPool(tokenAddress), "Token Pool should be set"); + assertEq(IOwner(tokenAddress).owner(), OWNER, "Token should be owned by the owner"); + assertEq(IOwner(poolAddress).owner(), OWNER, "Token should be owned by the owner"); + } + + function test_createTokenPool_WithExistingTokenOnRemoteChain_Success() public {} + + function test_createTokenPool_predictFutureAddress_Success() public {} + + function test_createTokenPool_RemotChainNotSupported_Revert() public {} +} diff --git a/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory.sol b/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory.sol index 6c0bebc32f..2532d41940 100644 --- a/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory.sol +++ b/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory.sol @@ -1,12 +1,13 @@ pragma solidity ^0.8.24; +import {ITokenAdminRegistry} from "../interfaces/ITokenAdminRegistry.sol"; + import {OwnerIsCreator} from "../../shared/access/OwnerIsCreator.sol"; -import {DeterministicContractDeployer} from "../../shared/util/DeterministicDeployer.sol"; +import {DeterministicContractDeployer} from "../../shared/util/DeterministicContractDeployer.sol"; import {RateLimiter} from "../libraries/RateLimiter.sol"; import {TokenPool} from "../pools/TokenPool.sol"; - -import {ITokenAdminRegistry} from "../interfaces/ITokenAdminRegistry.sol"; +import {RegistryModuleOwnerCustom} from "./RegistryModuleOwnerCustom.sol"; import {BurnMintERC677} from "../../shared/token/ERC677/BurnMintERC677.sol"; import {BurnMintTokenPool} from "../pools/BurnMintTokenPool.sol"; @@ -15,27 +16,41 @@ contract TokenPoolFactory is OwnerIsCreator { using DeterministicContractDeployer for bytes; ITokenAdminRegistry internal immutable i_tokenAdminRegistry; + RegistryModuleOwnerCustom internal immutable i_registryModuleOwnerCustom; + address internal immutable i_rmnProxy; + address internal immutable i_ccipRouter; - event RemotePoolFactoryUpdated( - uint64 indexed remoteChainSelector, address existingFactory, address remotePoolFactory + event RemoteChainConfigUpdated( + uint64 indexed remoteChainSelector, RemoteChainConfig remoteChainConfig ); error InvalidZeroAddress(); - mapping(uint64 remoteChainSelector => address remotePoolFactory) internal s_remotePoolFactories; + mapping(uint64 remoteChainSelector => RemoteChainConfig) internal s_remoteChainConfigs; - constructor(address tokenAdminRegistry) { - if (tokenAdminRegistry == address(0)) revert InvalidZeroAddress(); + constructor(address tokenAdminRegistry, address tokenAdminModule, address rmnProxy, address ccipRouter) { + if (tokenAdminRegistry == address(0) || rmnProxy == address(0)) revert InvalidZeroAddress(); i_tokenAdminRegistry = ITokenAdminRegistry(tokenAdminRegistry); + i_registryModuleOwnerCustom = RegistryModuleOwnerCustom(tokenAdminModule); + i_rmnProxy = rmnProxy; + i_ccipRouter = ccipRouter; } struct ExistingTokenPool { uint64 remoteChainSelector; bytes remotePoolAddress; bytes remoteTokenAddress; - RateLimiter.Config outboundRateLimiterConfig; // Outbound rate limited config, meaning the rate limits for all of the onRamps for the given chain - RateLimiter.Config inboundRateLimiterConfig; // Inbound rate limited config, meaning the rate limits for all of the offRamps for the given chain + RateLimiter.Config outboundRateLimiterConfig; // Outbound rate limited config, meaning the rate limits for all of + // the onRamps for the given chain + RateLimiter.Config inboundRateLimiterConfig; // Inbound rate limited config, meaning the rate limits for all of + // the offRamps for the given chain + } + + struct RemoteChainConfig { + address remotePoolFactory; + address remoteRouter; + address remoteRMNProxy; } struct Deployment { @@ -46,11 +61,15 @@ contract TokenPoolFactory is OwnerIsCreator { function createTokenPool( address existingToken, ExistingTokenPool[] memory remoteTokenPools, + /// @notice: init code and token args have been combined into one to prevent a stack too deep error - bytes calldata tokenPoolInitCode, + bytes memory tokenPoolInitCode, bytes calldata tokenInitCode, bytes32 salt ) public returns (address tokenAddress, address poolAddress) { + // Ensure a unique deployment between senders even if the same input parameter is used + salt = keccak256(abi.encodePacked(salt, msg.sender)); + // If there is no existing ERC20-token, deploy a new one, else return the existing address if (existingToken == address(0)) { tokenAddress = tokenInitCode._deploy(salt); @@ -58,50 +77,86 @@ contract TokenPoolFactory is OwnerIsCreator { tokenAddress = existingToken; } - // Ensure a unique deployment between senders even if the same input parameter is used - salt = keccak256(abi.encodePacked(salt, msg.sender)); - - // Deploy a new token pool locally - poolAddress = tokenPoolInitCode._deploy(salt); - - // Setup token roles + // Configure the token by granting the roles BurnMintERC677(tokenAddress).grantMintAndBurnRoles(poolAddress); - _setTokenPool(tokenAddress, poolAddress); + bytes memory tokenPoolInitArgs = abi.encode(tokenAddress, new address[](0), i_rmnProxy, i_ccipRouter); + tokenPoolInitCode = abi.encodePacked(tokenPoolInitCode, tokenPoolInitArgs); + poolAddress = tokenPoolInitCode._deploy(salt); // Stack Scoping to reduce pressure on stack too deep { TokenPool.ChainUpdate[] memory chainUpdates = new TokenPool.ChainUpdate[](remoteTokenPools.length); - for (uint256 i = 0; i < remoteTokenPools.length; i++) { - address remoteFactoryAddress = s_remotePoolFactories[remoteTokenPools[i].remoteChainSelector]; - chainUpdates[i] = TokenPool.ChainUpdate({ + // For Each remote chain in the remoteTokenPools array + for (uint256 i = 0; i < remoteTokenPools.length; i++) { + // Declaring the struct and updating remote addresses later in the function prevents stack too deep + TokenPool.ChainUpdate memory chainUpdate = TokenPool.ChainUpdate({ remoteChainSelector: remoteTokenPools[i].remoteChainSelector, allowed: true, - // If an address is not passed, predict the address using the remote factory address. - remotePoolAddress: remoteTokenPools[i].remotePoolAddress.length == 0 - ? abi.encode(tokenPoolInitCode._predictAddressOfUndeployedContract(salt, remoteFactoryAddress)) - : remoteTokenPools[i].remotePoolAddress, - remoteTokenAddress: remoteTokenPools[i].remoteTokenAddress.length == 0 - ? abi.encode(tokenInitCode._predictAddressOfUndeployedContract(salt, remoteFactoryAddress)) - : remoteTokenPools[i].remoteTokenAddress, + remotePoolAddress: "", + remoteTokenAddress: "", outboundRateLimiterConfig: remoteTokenPools[i].outboundRateLimiterConfig, inboundRateLimiterConfig: remoteTokenPools[i].inboundRateLimiterConfig }); + + // Get the address of the remote factory, caching the storage value in memory + RemoteChainConfig memory remoteChainConfig = s_remoteChainConfigs[remoteTokenPools[i].remoteChainSelector]; + + // If the user already has a remote token deployed, reuse the address, otherwise calculate the new address + // of the undeployed token on the destination chain + if (remoteTokenPools[i].remoteTokenAddress.length == 0) { + // Since the tokenInitCode doesn't require any dynamic parameters, and is already deployed, we can re-use + // the initCode used at the beginning of the function. + chainUpdate.remoteTokenAddress = + abi.encode(tokenInitCode._predictAddressOfUndeployedContract(salt, remoteChainConfig.remotePoolFactory)); + } else { + // If the user already has a remote token deployed, reuse the address + chainUpdate.remoteTokenAddress = remoteTokenPools[i].remoteTokenAddress; + } + + // If the user already has a remote pool deployed, reuse the address, otherwise calculate the new address + // of the undeployed pool on the destination chain + if (remoteTokenPools[i].remotePoolAddress.length == 0) { + // Generate the initCode that will be used on the remote chain. It is assumed that tokenInitCode + // will be the same on all chains. + + // Calculate the remote pool Args with an empty allowList, remote RMN, and Remote Router addresses + bytes memory remotePoolInitArgs = abi.encode( + chainUpdate.remoteTokenAddress, new address[](0), remoteChainConfig.remoteRMNProxy, remoteChainConfig.remoteRouter + ); + + // Combine the initCode with the initArgs to create the full initCode + bytes memory remotePoolInitcode = + abi.encodePacked(type(BurnMintTokenPool).creationCode, remotePoolInitArgs); + + // Predict the address of the undeployed contract on the destination chain + chainUpdate.remotePoolAddress = + abi.encode(remotePoolInitcode._predictAddressOfUndeployedContract(salt, remoteChainConfig.remotePoolFactory)); + } else { + // If the user already has a remote pool deployed, reuse the address + chainUpdate.remotePoolAddress = remoteTokenPools[i].remotePoolAddress; + } + + // Update the chainUpdate struct in the chainUpdates array + chainUpdates[i] = chainUpdate; } + // Setup token roles + _setTokenPool(tokenAddress, poolAddress); + + // Apply the chain updates to the token pool TokenPool(poolAddress).applyChainUpdates(chainUpdates); - } - _releaseOwnership(tokenAddress, poolAddress); + _releaseOwnership(tokenAddress, poolAddress); - return (tokenAddress, poolAddress); + return (tokenAddress, poolAddress); + } } - - function setTokenPool(address token, address pool) public { + function _setTokenPool(address token, address pool) public { // propose this factory as the admin for the token in the token admin registry - i_tokenAdminRegistry.proposeAdministrator(token, address(this)); + i_registryModuleOwnerCustom.registerAdminViaOwner(token); // Accept the admin role by the token admin registry i_tokenAdminRegistry.acceptAdminRole(token); @@ -117,16 +172,14 @@ contract TokenPoolFactory is OwnerIsCreator { OwnerIsCreator(pool).transferOwnership(address(msg.sender)); // 2 step ownership transfer } - // TODO: Update with struct and arrays and shit. PoC for now - function updateRemotePoolFactory(uint64 remoteChainSelector, address remotePoolFactory) public onlyOwner { - address existingFactory = s_remotePoolFactories[remoteChainSelector]; - - s_remotePoolFactories[remoteChainSelector] = remotePoolFactory; + // TODO: Update Event Maybe. + function updateRemoteChainConfig(uint64 remoteChainSelector, RemoteChainConfig calldata remoteConfig) public onlyOwner { + s_remoteChainConfigs[remoteChainSelector] = remoteConfig; - emit RemotePoolFactoryUpdated(remoteChainSelector, existingFactory, remotePoolFactory); + emit RemoteChainConfigUpdated(remoteChainSelector, remoteConfig); } - function getRemotePoolFactory(uint64 remoteChainSelector) public view returns (address remoteFactory) { - return s_remotePoolFactories[remoteChainSelector]; + function getRemoteChainConfig(uint64 remoteChainSelector) public view returns (RemoteChainConfig memory) { + return s_remoteChainConfigs[remoteChainSelector]; } } diff --git a/contracts/src/v0.8/shared/token/ERC20/BurnMintERC20.sol b/contracts/src/v0.8/shared/token/ERC20/BurnMintERC20.sol new file mode 100644 index 0000000000..6418b676ef --- /dev/null +++ b/contracts/src/v0.8/shared/token/ERC20/BurnMintERC20.sol @@ -0,0 +1,218 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IBurnMintERC20} from "../ERC20/IBurnMintERC20.sol"; + +import {OwnerIsCreator} from "../../access/OwnerIsCreator.sol"; + + +import {ERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/ERC20.sol"; +import {ERC20Burnable} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/extensions/ERC20Burnable.sol"; + + +import {EnumerableSet} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/structs/EnumerableSet.sol"; +import {IERC165} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/introspection/IERC165.sol"; +import {IERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol"; + +/// @notice A basic ERC20 compatible token contract with burn and minting roles. +/// @dev The total supply can be limited during deployment. +contract BurnMintERC20 is IBurnMintERC20, IERC165, ERC20Burnable, OwnerIsCreator { + using EnumerableSet for EnumerableSet.AddressSet; + + error SenderNotMinter(address sender); + error SenderNotBurner(address sender); + error MaxSupplyExceeded(uint256 supplyAfterMint); + + event MintAccessGranted(address indexed minter); + event BurnAccessGranted(address indexed burner); + event MintAccessRevoked(address indexed minter); + event BurnAccessRevoked(address indexed burner); + + // @dev the allowed minter addresses + EnumerableSet.AddressSet internal s_minters; + // @dev the allowed burner addresses + EnumerableSet.AddressSet internal s_burners; + + /// @dev The number of decimals for the token + uint8 internal immutable i_decimals; + + /// @dev The maximum supply of the token, 0 if unlimited + uint256 internal immutable i_maxSupply; + + constructor(string memory name, string memory symbol, uint8 decimals_, uint256 maxSupply_) ERC20(name, symbol) { + i_decimals = decimals_; + i_maxSupply = maxSupply_; + } + + function supportsInterface(bytes4 interfaceId) public pure virtual override returns (bool) { + return + interfaceId == type(IERC20).interfaceId || + interfaceId == type(IBurnMintERC20).interfaceId || + interfaceId == type(IERC165).interfaceId; + } + + // ================================================================ + // | ERC20 | + // ================================================================ + + /// @dev Returns the number of decimals used in its user representation. + function decimals() public view virtual override returns (uint8) { + return i_decimals; + } + + /// @dev Returns the max supply of the token, 0 if unlimited. + function maxSupply() public view virtual returns (uint256) { + return i_maxSupply; + } + + /// @dev Uses OZ ERC20 _transfer to disallow sending to address(0). + /// @dev Disallows sending to address(this) + function _transfer(address from, address to, uint256 amount) internal virtual override validAddress(to) { + super._transfer(from, to, amount); + } + + /// @dev Uses OZ ERC20 _approve to disallow approving for address(0). + /// @dev Disallows approving for address(this) + function _approve(address owner, address spender, uint256 amount) internal virtual override validAddress(spender) { + super._approve(owner, spender, amount); + } + + /// @dev Exists to be backwards compatible with the older naming convention. + function decreaseApproval(address spender, uint256 subtractedValue) external returns (bool success) { + return decreaseAllowance(spender, subtractedValue); + } + + /// @dev Exists to be backwards compatible with the older naming convention. + function increaseApproval(address spender, uint256 addedValue) external { + increaseAllowance(spender, addedValue); + } + + /// @notice Check if recipient is valid (not this contract address). + /// @param recipient the account we transfer/approve to. + /// @dev Reverts with an empty revert to be compatible with the existing link token when + /// the recipient is this contract address. + modifier validAddress(address recipient) virtual { + // solhint-disable-next-line reason-string, gas-custom-errors + if (recipient == address(this)) revert(); + _; + } + + // ================================================================ + // | Burning & minting | + // ================================================================ + + /// @inheritdoc ERC20Burnable + /// @dev Uses OZ ERC20 _burn to disallow burning from address(0). + /// @dev Decreases the total supply. + function burn(uint256 amount) public override(IBurnMintERC20, ERC20Burnable) onlyBurner { + super.burn(amount); + } + + /// @inheritdoc IBurnMintERC20 + /// @dev Alias for BurnFrom for compatibility with the older naming convention. + /// @dev Uses burnFrom for all validation & logic. + function burn(address account, uint256 amount) public virtual override { + burnFrom(account, amount); + } + + /// @inheritdoc ERC20Burnable + /// @dev Uses OZ ERC20 _burn to disallow burning from address(0). + /// @dev Decreases the total supply. + function burnFrom(address account, uint256 amount) public override(IBurnMintERC20, ERC20Burnable) onlyBurner { + super.burnFrom(account, amount); + } + + /// @inheritdoc IBurnMintERC20 + /// @dev Uses OZ ERC20 _mint to disallow minting to address(0). + /// @dev Disallows minting to address(this) + /// @dev Increases the total supply. + function mint(address account, uint256 amount) external override onlyMinter validAddress(account) { + if (i_maxSupply != 0 && totalSupply() + amount > i_maxSupply) revert MaxSupplyExceeded(totalSupply() + amount); + + _mint(account, amount); + } + + // ================================================================ + // | Roles | + // ================================================================ + + /// @notice grants both mint and burn roles to `burnAndMinter`. + /// @dev calls public functions so this function does not require + /// access controls. This is handled in the inner functions. + function grantMintAndBurnRoles(address burnAndMinter) external { + grantMintRole(burnAndMinter); + grantBurnRole(burnAndMinter); + } + + /// @notice Grants mint role to the given address. + /// @dev only the owner can call this function. + function grantMintRole(address minter) public onlyOwner { + if (s_minters.add(minter)) { + emit MintAccessGranted(minter); + } + } + + /// @notice Grants burn role to the given address. + /// @dev only the owner can call this function. + function grantBurnRole(address burner) public onlyOwner { + if (s_burners.add(burner)) { + emit BurnAccessGranted(burner); + } + } + + /// @notice Revokes mint role for the given address. + /// @dev only the owner can call this function. + function revokeMintRole(address minter) public onlyOwner { + if (s_minters.remove(minter)) { + emit MintAccessRevoked(minter); + } + } + + /// @notice Revokes burn role from the given address. + /// @dev only the owner can call this function + function revokeBurnRole(address burner) public onlyOwner { + if (s_burners.remove(burner)) { + emit BurnAccessRevoked(burner); + } + } + + /// @notice Returns all permissioned minters + function getMinters() public view returns (address[] memory) { + return s_minters.values(); + } + + /// @notice Returns all permissioned burners + function getBurners() public view returns (address[] memory) { + return s_burners.values(); + } + + // ================================================================ + // | Access | + // ================================================================ + + /// @notice Checks whether a given address is a minter for this token. + /// @return true if the address is allowed to mint. + function isMinter(address minter) public view returns (bool) { + return s_minters.contains(minter); + } + + /// @notice Checks whether a given address is a burner for this token. + /// @return true if the address is allowed to burn. + function isBurner(address burner) public view returns (bool) { + return s_burners.contains(burner); + } + + /// @notice Checks whether the msg.sender is a permissioned minter for this token + /// @dev Reverts with a SenderNotMinter if the check fails + modifier onlyMinter() { + if (!isMinter(msg.sender)) revert SenderNotMinter(msg.sender); + _; + } + + /// @notice Checks whether the msg.sender is a permissioned burner for this token + /// @dev Reverts with a SenderNotBurner if the check fails + modifier onlyBurner() { + if (!isBurner(msg.sender)) revert SenderNotBurner(msg.sender); + _; + } +} diff --git a/contracts/src/v0.8/shared/util/DeterministicDeployer.sol b/contracts/src/v0.8/shared/util/DeterministicContractDeployer.sol similarity index 94% rename from contracts/src/v0.8/shared/util/DeterministicDeployer.sol rename to contracts/src/v0.8/shared/util/DeterministicContractDeployer.sol index 97ad7776dd..77b2e43231 100644 --- a/contracts/src/v0.8/shared/util/DeterministicDeployer.sol +++ b/contracts/src/v0.8/shared/util/DeterministicContractDeployer.sol @@ -24,13 +24,14 @@ library DeterministicContractDeployer { } function _predictAddressOfUndeployedContract( - bytes calldata initCode, + bytes memory initCode, bytes32 salt, address deployer ) internal pure returns (address) { + // according to evm.codes, the below formula is used to predict the address of a contract // address = keccak256(0xff + sender_address + salt + keccak256(initialisation_code))[12:] - bytes32 bytesValue = keccak256(abi.encodePacked(hex"ff", deployer, salt, initCode)); + bytes32 bytesValue = keccak256(abi.encodePacked(hex"ff", deployer, salt, keccak256(initCode))); return address(uint160(uint256(bytesValue))); } From 034990c3bc4aff5b5a9a5befa7c307f623837fca Mon Sep 17 00:00:00 2001 From: Josh Date: Wed, 11 Sep 2024 12:17:45 -0400 Subject: [PATCH 04/48] Check in. Prediction mechanism working tentatively --- .../tokenAdminRegistry/TokenPoolFactory.t.sol | 95 +++++++++++++-- .../tokenAdminRegistry/TokenPoolFactory.sol | 115 ++++++++++++------ .../v0.8/shared/token/ERC20/BurnMintERC20.sol | 30 ++++- .../util/DeterministicContractDeployer.sol | 1 - 4 files changed, 190 insertions(+), 51 deletions(-) diff --git a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol index 55d0f0c0dc..1bb5933da6 100644 --- a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol +++ b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol @@ -3,16 +3,21 @@ pragma solidity ^0.8.24; import {IOwner} from "../../interfaces/IOwner.sol"; import {BurnMintTokenPool} from "../../pools/BurnMintTokenPool.sol"; +import {TokenPool} from "../../pools/TokenPool.sol"; import {TokenPoolFactory} from "../../tokenAdminRegistry/TokenPoolFactory.sol"; +import {TokenAdminRegistry} from "../../tokenAdminRegistry/TokenAdminRegistry.sol"; import {TokenAdminRegistrySetup} from "./TokenAdminRegistry.t.sol"; import {RegistryModuleOwnerCustom} from "../../tokenAdminRegistry/RegistryModuleOwnerCustom.sol"; +import {RateLimiter} from "../../libraries/RateLimiter.sol"; import {DeterministicContractDeployer} from "../../../shared/util/DeterministicContractDeployer.sol"; import {OwnerIsCreator} from "../../../shared/access/OwnerIsCreator.sol"; import {BurnMintERC20} from "../../../shared/token/ERC20/BurnMintERC20.sol"; +import {console2 as console} from "forge-std/console2.sol"; + contract TokenPoolFactorySetup is TokenAdminRegistrySetup { TokenPoolFactory internal s_tokenPoolFactory; RegistryModuleOwnerCustom internal s_registryModuleOwnerCustom; @@ -27,6 +32,8 @@ contract TokenPoolFactorySetup is TokenAdminRegistrySetup { bytes internal s_tokenCreationParams; bytes internal s_tokenInitCode; + uint256 public constant PREMINT_AMOUNT = 1e20; // 100 tokens in 18 decimals + function setUp() public virtual override { TokenAdminRegistrySetup.setUp(); @@ -36,7 +43,8 @@ contract TokenPoolFactorySetup is TokenAdminRegistrySetup { s_tokenPoolFactory = new TokenPoolFactory(address(s_tokenAdminRegistry), address(s_registryModuleOwnerCustom), s_rmnProxy, address(s_sourceRouter)); // Create Init Code for BurnMintERC20 TestToken with 18 decimals and supply cap of max uint256 value - s_tokenCreationParams = abi.encode("TestToken", "TT", 18, type(uint256).max); + s_tokenCreationParams = abi.encode("TestToken", "TT", 18, type(uint256).max, PREMINT_AMOUNT, OWNER); + s_tokenInitCode = abi.encodePacked(type(BurnMintERC20).creationCode, s_tokenCreationParams); s_poolInitCode = type(BurnMintTokenPool).creationCode; @@ -45,7 +53,6 @@ contract TokenPoolFactorySetup is TokenAdminRegistrySetup { address[] memory allowlist = new address[](1); allowlist[0] = OWNER; s_poolInitArgs = abi.encode(allowlist, address(0x1234), s_sourceRouter); - } } @@ -59,15 +66,17 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { s_tokenInitCode, dynamicSalt, address(s_tokenPoolFactory) ); - bytes memory predictedPoolCreationParams = abi.encode(predictedTokenAddress, new address[](0), s_rmnProxy, s_sourceRouter); - bytes memory predictedPoolInitCode = abi.encodePacked(s_poolInitCode, predictedPoolCreationParams); + // Create the constructor params for the predicted pool + bytes memory poolCreationParams = abi.encode(predictedTokenAddress, new address[](0), s_rmnProxy, s_sourceRouter); + + // Predict the address of the pool before we make the tx by using the init code and the params + bytes memory predictedPoolInitCode = abi.encodePacked(s_poolInitCode, poolCreationParams); address predictedPoolAddress = DeterministicContractDeployer._predictAddressOfUndeployedContract( predictedPoolInitCode, dynamicSalt, address(s_tokenPoolFactory) ); - - (address tokenAddress, address poolAddress) = s_tokenPoolFactory.createTokenPool( - address(0), new TokenPoolFactory.ExistingTokenPool[](0), s_poolInitCode, s_tokenInitCode, s_salt + (address tokenAddress, address poolAddress) = s_tokenPoolFactory.deployTokenAndTokenPool( + new TokenPoolFactory.ExistingTokenPool[](0), s_tokenInitCode, s_poolInitCode, poolCreationParams, s_salt ); assertNotEq(address(0), tokenAddress, "Token Address should not be 0"); @@ -85,7 +94,77 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { assertEq(IOwner(poolAddress).owner(), OWNER, "Token should be owned by the owner"); } - function test_createTokenPool_WithExistingTokenOnRemoteChain_Success() public {} + function test_createTokenPool_WithNoExistingRemoteContracts_predict_Success() public { + vm.startPrank(OWNER); + bytes32 dynamicSalt = keccak256(abi.encodePacked(s_salt, OWNER)); + + // We have to create a new factory, registry module, and token admin registry to simulate the other chain + TokenAdminRegistry newTokenAdminRegistry = new TokenAdminRegistry(); + RegistryModuleOwnerCustom newRegistryModule = new RegistryModuleOwnerCustom(address(newTokenAdminRegistry)); + + // We want to deploy a new factory and Owner Module. + TokenPoolFactory newTokenPoolFactory = new TokenPoolFactory(address(newTokenAdminRegistry), address(newRegistryModule), s_rmnProxy, address(s_destRouter)); + + newTokenAdminRegistry.addRegistryModule(address(newRegistryModule)); + + TokenPoolFactory.RemoteChainConfig memory remoteChainConfig = TokenPoolFactory.RemoteChainConfig( + address(newTokenPoolFactory), address(s_destRouter), address(s_rmnProxy) + ); + + // Add the new token Factory to the remote chain config and set it for the simulated destination chain + s_tokenPoolFactory.updateRemoteChainConfig(DEST_CHAIN_SELECTOR, remoteChainConfig); + + // Create an array of remote pools where nothing exists yet, but we want to predict the address for + // the new pool and token on DEST_CHAIN_SELECTOR + TokenPoolFactory.ExistingTokenPool[] memory remoteTokenPools = new TokenPoolFactory.ExistingTokenPool[](1); + + // The only field that matters is DEST_CHAIN_SELECTOR because we dont want any existing token pool or token + // on the remote chain + remoteTokenPools[0] = TokenPoolFactory.ExistingTokenPool( + DEST_CHAIN_SELECTOR, abi.encode(s_tokenPoolFactory.EMPTY_PARAMETER_FLAG()), abi.encode(s_tokenPoolFactory.EMPTY_PARAMETER_FLAG()), s_tokenInitCode, RateLimiter.Config(false, 0, 0), RateLimiter.Config(false, 0, 0) + ); + + // Predict the address of the token and pool on the DESTINATION chain + address predictedTokenAddress = DeterministicContractDeployer._predictAddressOfUndeployedContract( + s_tokenInitCode, dynamicSalt, address(newTokenPoolFactory) + ); + + // Since the remote chain information was provided, we should be able to get the information from the newly + // deployed token pool using the available getter functions + + (address tokenAddress, address poolAddress) = s_tokenPoolFactory.deployTokenAndTokenPool( + remoteTokenPools, s_tokenInitCode, s_poolInitCode, abi.encode(s_tokenPoolFactory.EMPTY_PARAMETER_FLAG()), s_salt + ); + + // Ensure that the remote Token was set to the one we predicted + assertEq(abi.encode(predictedTokenAddress), TokenPool(poolAddress).getRemoteToken(DEST_CHAIN_SELECTOR), "Token Address should have been predicted"); + + // Create the constructor params for the predicted pool + // The predictedTokenAddress is NOT abi-encoded since the raw evm-address + // is used in the constructor params + bytes memory predictedPoolCreationParams = abi.encode(predictedTokenAddress, new address[](0), s_rmnProxy, address(s_destRouter)); + + // Take the init code and concat the destination params to it, the initCode shouldn't change + bytes memory predictedPoolInitCode = abi.encodePacked(s_poolInitCode, predictedPoolCreationParams); + + // Predict the address of the pool on the DESTINATION chain + address predictedPoolAddress = DeterministicContractDeployer._predictAddressOfUndeployedContract( + predictedPoolInitCode, dynamicSalt, address(newTokenPoolFactory) + ); + + // Assert that the address set for the remote pool is the same as the predicted address + assertEq(abi.encode(predictedPoolAddress), TokenPool(poolAddress).getRemotePool(DEST_CHAIN_SELECTOR), "Pool Address should have been predicted"); + + // On the new token pool factory, representing a destination chain, + // deploy a new token and a new pool + (address newTokenAddress, address newPoolAddress) = newTokenPoolFactory.deployTokenAndTokenPool( + new TokenPoolFactory.ExistingTokenPool[](0), s_tokenInitCode, s_poolInitCode, abi.encode(s_tokenPoolFactory.EMPTY_PARAMETER_FLAG()), s_salt + ); + + assertEq(TokenPool(poolAddress).getRemotePool(DEST_CHAIN_SELECTOR), abi.encode(newPoolAddress), "New Pool Address should have been deployed correctly"); + + assertEq(TokenPool(poolAddress).getRemoteToken(DEST_CHAIN_SELECTOR), abi.encode(newTokenAddress), "New Token Address should have been deployed correctly"); + } function test_createTokenPool_predictFutureAddress_Success() public {} diff --git a/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory.sol b/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory.sol index 2532d41940..81eb0865cd 100644 --- a/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory.sol +++ b/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory.sol @@ -12,6 +12,8 @@ import {RegistryModuleOwnerCustom} from "./RegistryModuleOwnerCustom.sol"; import {BurnMintERC677} from "../../shared/token/ERC677/BurnMintERC677.sol"; import {BurnMintTokenPool} from "../pools/BurnMintTokenPool.sol"; +import {console2 as console} from "forge-std/console2.sol"; + contract TokenPoolFactory is OwnerIsCreator { using DeterministicContractDeployer for bytes; @@ -28,6 +30,8 @@ contract TokenPoolFactory is OwnerIsCreator { mapping(uint64 remoteChainSelector => RemoteChainConfig) internal s_remoteChainConfigs; + bytes4 public constant EMPTY_PARAMETER_FLAG = bytes4(keccak256("EMPTY_PARAMETER")); + constructor(address tokenAdminRegistry, address tokenAdminModule, address rmnProxy, address ccipRouter) { if (tokenAdminRegistry == address(0) || rmnProxy == address(0)) revert InvalidZeroAddress(); @@ -41,55 +45,82 @@ contract TokenPoolFactory is OwnerIsCreator { uint64 remoteChainSelector; bytes remotePoolAddress; bytes remoteTokenAddress; + bytes remoteTokenInitCode; RateLimiter.Config outboundRateLimiterConfig; // Outbound rate limited config, meaning the rate limits for all of // the onRamps for the given chain RateLimiter.Config inboundRateLimiterConfig; // Inbound rate limited config, meaning the rate limits for all of // the offRamps for the given chain } + /// @dev ORDERING IS CRITICAL IN PREDICTING ADDRESSES struct RemoteChainConfig { address remotePoolFactory; address remoteRouter; address remoteRMNProxy; } - struct Deployment { - BurnMintERC677 token; - BurnMintTokenPool pool; + function deployTokenAndTokenPool( + ExistingTokenPool[] memory remoteTokenPools, + bytes memory tokenInitCode, + bytes memory tokenPoolInitCode, + bytes memory tokenPoolInitArgs, + bytes32 salt + ) external returns (address tokenAddress, address poolAddress) { + // Ensure a unique deployment between senders even if the same input parameter is used + salt = keccak256(abi.encodePacked(salt, msg.sender)); + + address token = tokenInitCode._deploy(salt); + + return _createTokenPool(token, remoteTokenPools, tokenPoolInitCode, tokenPoolInitArgs, salt); } - function createTokenPool( - address existingToken, + function deployTokenPoolWithExistingToken( + address token, ExistingTokenPool[] memory remoteTokenPools, + bytes memory tokenInitCode, + bytes memory tokenPoolInitCode, + bytes memory tokenPoolInitArgs, + bytes32 salt + ) external returns (address tokenAddress, address poolAddress) { + // Ensure a unique deployment between senders even if the same input parameter is used + salt = keccak256(abi.encodePacked(salt, msg.sender)); + + return _createTokenPool(token, remoteTokenPools, tokenPoolInitCode, tokenPoolInitArgs, salt); + } - /// @notice: init code and token args have been combined into one to prevent a stack too deep error + function _createTokenPool( + address token, + ExistingTokenPool[] memory remoteTokenPools, bytes memory tokenPoolInitCode, - bytes calldata tokenInitCode, + bytes memory tokenPoolInitArgs, bytes32 salt - ) public returns (address tokenAddress, address poolAddress) { - // Ensure a unique deployment between senders even if the same input parameter is used - salt = keccak256(abi.encodePacked(salt, msg.sender)); + ) internal returns (address tokenAddress, address poolAddress) { - // If there is no existing ERC20-token, deploy a new one, else return the existing address - if (existingToken == address(0)) { - tokenAddress = tokenInitCode._deploy(salt); - } else { - tokenAddress = existingToken; + // If the user doesn't want to provide any special parameters which may be needed for the token pool + // then use the standard burn/mint token pool params. Since the user can provide custom token pool + // init code, they must also be able to provide custom constructor args. + if (bytes4(tokenPoolInitArgs) == EMPTY_PARAMETER_FLAG) { + tokenPoolInitArgs = abi.encode(token, new address[](0), i_rmnProxy, i_ccipRouter); } - // Configure the token by granting the roles - BurnMintERC677(tokenAddress).grantMintAndBurnRoles(poolAddress); + // Construct the code that will be depoyed from the initCode and the initArgs + bytes memory newtokenPoolInitCode = abi.encodePacked(tokenPoolInitCode, tokenPoolInitArgs); - bytes memory tokenPoolInitArgs = abi.encode(tokenAddress, new address[](0), i_rmnProxy, i_ccipRouter); - tokenPoolInitCode = abi.encodePacked(tokenPoolInitCode, tokenPoolInitArgs); - poolAddress = tokenPoolInitCode._deploy(salt); + // deploy the pool using the above + poolAddress = newtokenPoolInitCode._deploy(salt); // Stack Scoping to reduce pressure on stack too deep { + // Create an array of chain updates to apply to the token pool TokenPool.ChainUpdate[] memory chainUpdates = new TokenPool.ChainUpdate[](remoteTokenPools.length); // For Each remote chain in the remoteTokenPools array for (uint256 i = 0; i < remoteTokenPools.length; i++) { + + // The address of the remote token is needed later in the function as an address, not as + // bytes so we store it in memory here + address remoteTokenAddress; + // Declaring the struct and updating remote addresses later in the function prevents stack too deep TokenPool.ChainUpdate memory chainUpdate = TokenPool.ChainUpdate({ remoteChainSelector: remoteTokenPools[i].remoteChainSelector, @@ -103,27 +134,31 @@ contract TokenPoolFactory is OwnerIsCreator { // Get the address of the remote factory, caching the storage value in memory RemoteChainConfig memory remoteChainConfig = s_remoteChainConfigs[remoteTokenPools[i].remoteChainSelector]; - // If the user already has a remote token deployed, reuse the address, otherwise calculate the new address - // of the undeployed token on the destination chain - if (remoteTokenPools[i].remoteTokenAddress.length == 0) { - // Since the tokenInitCode doesn't require any dynamic parameters, and is already deployed, we can re-use - // the initCode used at the beginning of the function. - chainUpdate.remoteTokenAddress = - abi.encode(tokenInitCode._predictAddressOfUndeployedContract(salt, remoteChainConfig.remotePoolFactory)); + // If the user provides the empty parameter flag, then we need to predict the address of the token + // otherwise we can use the address provided by the user + if (bytes4(remoteTokenPools[i].remoteTokenAddress) == EMPTY_PARAMETER_FLAG) { + // The user must provide the initCode for the remote token, so we can predict its address correctly. It's provided in the remoteTokenInitCode field for the remoteTokenPool + remoteTokenAddress = remoteTokenPools[i].remoteTokenInitCode._predictAddressOfUndeployedContract(salt, remoteChainConfig.remotePoolFactory); + + // The library returns an EVM-compatible address but chainUpdate takes bytes so we encode it + chainUpdate.remoteTokenAddress = abi.encode(remoteTokenAddress); } else { - // If the user already has a remote token deployed, reuse the address + + // If the user already has a remote token deployed, reuse the address. We still need it as + // an address for later, so we store it in memory after decoding. + // NOTE: This assumes that the provided address can be decoded into an EVM address. + remoteTokenAddress = abi.decode(remoteTokenPools[i].remoteTokenAddress, (address)); chainUpdate.remoteTokenAddress = remoteTokenPools[i].remoteTokenAddress; } - // If the user already has a remote pool deployed, reuse the address, otherwise calculate the new address - // of the undeployed pool on the destination chain - if (remoteTokenPools[i].remotePoolAddress.length == 0) { + // If the user provides the empty parameter flag, then we need to predict the address of the pool + if (bytes4(remoteTokenPools[i].remotePoolAddress) == EMPTY_PARAMETER_FLAG) { // Generate the initCode that will be used on the remote chain. It is assumed that tokenInitCode - // will be the same on all chains. + // will be the same on all chains, so we can reuse it here. - // Calculate the remote pool Args with an empty allowList, remote RMN, and Remote Router addresses + // Calculate the remote pool Args with an empty allowList, remote RMN, and Remote Router addresses. Since the first constructor parameter is an EVM token address, we can use the remoteTokenAddress we acquired earlier. bytes memory remotePoolInitArgs = abi.encode( - chainUpdate.remoteTokenAddress, new address[](0), remoteChainConfig.remoteRMNProxy, remoteChainConfig.remoteRouter + remoteTokenAddress, new address[](0), remoteChainConfig.remoteRMNProxy, remoteChainConfig.remoteRouter ); // Combine the initCode with the initArgs to create the full initCode @@ -134,7 +169,7 @@ contract TokenPoolFactory is OwnerIsCreator { chainUpdate.remotePoolAddress = abi.encode(remotePoolInitcode._predictAddressOfUndeployedContract(salt, remoteChainConfig.remotePoolFactory)); } else { - // If the user already has a remote pool deployed, reuse the address + // If the user already has a remote pool deployed, reuse the address. chainUpdate.remotePoolAddress = remoteTokenPools[i].remotePoolAddress; } @@ -143,14 +178,16 @@ contract TokenPoolFactory is OwnerIsCreator { } // Setup token roles - _setTokenPool(tokenAddress, poolAddress); + _setTokenPool(token, poolAddress); // Apply the chain updates to the token pool TokenPool(poolAddress).applyChainUpdates(chainUpdates); - _releaseOwnership(tokenAddress, poolAddress); + // Release the ownership of the tokenAdminRegistry, the token, and the pool. + _releaseOwnership(token, poolAddress); - return (tokenAddress, poolAddress); + // TODO: Add more events + return (token, poolAddress); } } @@ -168,7 +205,7 @@ contract TokenPoolFactory is OwnerIsCreator { function _releaseOwnership(address token, address pool) internal { i_tokenAdminRegistry.transferAdminRole(token, msg.sender); - OwnerIsCreator(token).transferOwnership(address(msg.sender)); // 1 step ownership transfer + OwnerIsCreator(token).transferOwnership(address(msg.sender)); // 2 step ownership transfer OwnerIsCreator(pool).transferOwnership(address(msg.sender)); // 2 step ownership transfer } diff --git a/contracts/src/v0.8/shared/token/ERC20/BurnMintERC20.sol b/contracts/src/v0.8/shared/token/ERC20/BurnMintERC20.sol index 6418b676ef..dc8a4ea789 100644 --- a/contracts/src/v0.8/shared/token/ERC20/BurnMintERC20.sol +++ b/contracts/src/v0.8/shared/token/ERC20/BurnMintERC20.sol @@ -5,11 +5,9 @@ import {IBurnMintERC20} from "../ERC20/IBurnMintERC20.sol"; import {OwnerIsCreator} from "../../access/OwnerIsCreator.sol"; - import {ERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/ERC20.sol"; import {ERC20Burnable} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/extensions/ERC20Burnable.sol"; - import {EnumerableSet} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/structs/EnumerableSet.sol"; import {IERC165} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/introspection/IERC165.sol"; import {IERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol"; @@ -28,6 +26,8 @@ contract BurnMintERC20 is IBurnMintERC20, IERC165, ERC20Burnable, OwnerIsCreator event MintAccessRevoked(address indexed minter); event BurnAccessRevoked(address indexed burner); + event CCIPAdminTransferred(address indexed previousAdmin, address indexed newAdmin); + // @dev the allowed minter addresses EnumerableSet.AddressSet internal s_minters; // @dev the allowed burner addresses @@ -39,9 +39,21 @@ contract BurnMintERC20 is IBurnMintERC20, IERC165, ERC20Burnable, OwnerIsCreator /// @dev The maximum supply of the token, 0 if unlimited uint256 internal immutable i_maxSupply; - constructor(string memory name, string memory symbol, uint8 decimals_, uint256 maxSupply_) ERC20(name, symbol) { + address internal s_ccipAdmin; + + /// @dev A 1 step ownership transfer is performed here + constructor(string memory name, string memory symbol, uint8 decimals_, uint256 maxSupply_, uint256 preMint_, address newOwner_) ERC20(name, symbol) { i_decimals = decimals_; i_maxSupply = maxSupply_; + + s_ccipAdmin = newOwner_; + + // Mint the initial supply to the new Owner + _mint(newOwner_, preMint_); + + // Grant the deployer the minter and burner roles + grantMintRole(newOwner_); + grantBurnRole(newOwner_); } function supportsInterface(bytes4 interfaceId) public pure virtual override returns (bool) { @@ -186,6 +198,18 @@ contract BurnMintERC20 is IBurnMintERC20, IERC165, ERC20Burnable, OwnerIsCreator return s_burners.values(); } + function getCCIPAdmin() public view returns (address) { + return s_ccipAdmin; + } + + function setCCIPAdmin(address newAdmin) public onlyOwner { + address currentAdmin = s_ccipAdmin; + + s_ccipAdmin = newAdmin; + + emit CCIPAdminTransferred(currentAdmin, newAdmin); + } + // ================================================================ // | Access | // ================================================================ diff --git a/contracts/src/v0.8/shared/util/DeterministicContractDeployer.sol b/contracts/src/v0.8/shared/util/DeterministicContractDeployer.sol index 77b2e43231..2379f2c67b 100644 --- a/contracts/src/v0.8/shared/util/DeterministicContractDeployer.sol +++ b/contracts/src/v0.8/shared/util/DeterministicContractDeployer.sol @@ -28,7 +28,6 @@ library DeterministicContractDeployer { bytes32 salt, address deployer ) internal pure returns (address) { - // according to evm.codes, the below formula is used to predict the address of a contract // address = keccak256(0xff + sender_address + salt + keccak256(initialisation_code))[12:] bytes32 bytesValue = keccak256(abi.encodePacked(hex"ff", deployer, salt, keccak256(initCode))); From 986aeed10bdf1b2f230e475890156bdff52080f8 Mon Sep 17 00:00:00 2001 From: Josh Date: Wed, 11 Sep 2024 13:52:48 -0400 Subject: [PATCH 05/48] tests passing. Cleanup, Comments, and better formatting still needed --- .../tokenAdminRegistry/TokenPoolFactory.t.sol | 259 ++++++++++++++++-- .../tokenAdminRegistry/TokenPoolFactory.sol | 72 ++--- 2 files changed, 273 insertions(+), 58 deletions(-) diff --git a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol index 1bb5933da6..719181089d 100644 --- a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol +++ b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol @@ -4,17 +4,18 @@ import {IOwner} from "../../interfaces/IOwner.sol"; import {BurnMintTokenPool} from "../../pools/BurnMintTokenPool.sol"; import {TokenPool} from "../../pools/TokenPool.sol"; -import {TokenPoolFactory} from "../../tokenAdminRegistry/TokenPoolFactory.sol"; + import {TokenAdminRegistry} from "../../tokenAdminRegistry/TokenAdminRegistry.sol"; +import {TokenPoolFactory} from "../../tokenAdminRegistry/TokenPoolFactory.sol"; -import {TokenAdminRegistrySetup} from "./TokenAdminRegistry.t.sol"; import {RegistryModuleOwnerCustom} from "../../tokenAdminRegistry/RegistryModuleOwnerCustom.sol"; +import {TokenAdminRegistrySetup} from "./TokenAdminRegistry.t.sol"; import {RateLimiter} from "../../libraries/RateLimiter.sol"; -import {DeterministicContractDeployer} from "../../../shared/util/DeterministicContractDeployer.sol"; import {OwnerIsCreator} from "../../../shared/access/OwnerIsCreator.sol"; import {BurnMintERC20} from "../../../shared/token/ERC20/BurnMintERC20.sol"; +import {DeterministicContractDeployer} from "../../../shared/util/DeterministicContractDeployer.sol"; import {console2 as console} from "forge-std/console2.sol"; @@ -40,11 +41,13 @@ contract TokenPoolFactorySetup is TokenAdminRegistrySetup { s_registryModuleOwnerCustom = new RegistryModuleOwnerCustom(address(s_tokenAdminRegistry)); s_tokenAdminRegistry.addRegistryModule(address(s_registryModuleOwnerCustom)); - s_tokenPoolFactory = new TokenPoolFactory(address(s_tokenAdminRegistry), address(s_registryModuleOwnerCustom), s_rmnProxy, address(s_sourceRouter)); + s_tokenPoolFactory = new TokenPoolFactory( + address(s_tokenAdminRegistry), address(s_registryModuleOwnerCustom), s_rmnProxy, address(s_sourceRouter) + ); // Create Init Code for BurnMintERC20 TestToken with 18 decimals and supply cap of max uint256 value s_tokenCreationParams = abi.encode("TestToken", "TT", 18, type(uint256).max, PREMINT_AMOUNT, OWNER); - + s_tokenInitCode = abi.encodePacked(type(BurnMintERC20).creationCode, s_tokenCreationParams); s_poolInitCode = type(BurnMintTokenPool).creationCode; @@ -61,7 +64,7 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { vm.startPrank(OWNER); bytes32 dynamicSalt = keccak256(abi.encodePacked(s_salt, OWNER)); - + address predictedTokenAddress = DeterministicContractDeployer._predictAddressOfUndeployedContract( s_tokenInitCode, dynamicSalt, address(s_tokenPoolFactory) ); @@ -76,7 +79,7 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { ); (address tokenAddress, address poolAddress) = s_tokenPoolFactory.deployTokenAndTokenPool( - new TokenPoolFactory.ExistingTokenPool[](0), s_tokenInitCode, s_poolInitCode, poolCreationParams, s_salt + new TokenPoolFactory.ExistingTokenPool[](0), s_tokenInitCode, s_poolInitCode, poolCreationParams, s_salt ); assertNotEq(address(0), tokenAddress, "Token Address should not be 0"); @@ -103,13 +106,14 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { RegistryModuleOwnerCustom newRegistryModule = new RegistryModuleOwnerCustom(address(newTokenAdminRegistry)); // We want to deploy a new factory and Owner Module. - TokenPoolFactory newTokenPoolFactory = new TokenPoolFactory(address(newTokenAdminRegistry), address(newRegistryModule), s_rmnProxy, address(s_destRouter)); + TokenPoolFactory newTokenPoolFactory = new TokenPoolFactory( + address(newTokenAdminRegistry), address(newRegistryModule), s_rmnProxy, address(s_destRouter) + ); newTokenAdminRegistry.addRegistryModule(address(newRegistryModule)); - TokenPoolFactory.RemoteChainConfig memory remoteChainConfig = TokenPoolFactory.RemoteChainConfig( - address(newTokenPoolFactory), address(s_destRouter), address(s_rmnProxy) - ); + TokenPoolFactory.RemoteChainConfig memory remoteChainConfig = + TokenPoolFactory.RemoteChainConfig(address(newTokenPoolFactory), address(s_destRouter), address(s_rmnProxy)); // Add the new token Factory to the remote chain config and set it for the simulated destination chain s_tokenPoolFactory.updateRemoteChainConfig(DEST_CHAIN_SELECTOR, remoteChainConfig); @@ -121,10 +125,15 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { // The only field that matters is DEST_CHAIN_SELECTOR because we dont want any existing token pool or token // on the remote chain remoteTokenPools[0] = TokenPoolFactory.ExistingTokenPool( - DEST_CHAIN_SELECTOR, abi.encode(s_tokenPoolFactory.EMPTY_PARAMETER_FLAG()), abi.encode(s_tokenPoolFactory.EMPTY_PARAMETER_FLAG()), s_tokenInitCode, RateLimiter.Config(false, 0, 0), RateLimiter.Config(false, 0, 0) + DEST_CHAIN_SELECTOR, + abi.encode(s_tokenPoolFactory.EMPTY_PARAMETER_FLAG()), + abi.encode(s_tokenPoolFactory.EMPTY_PARAMETER_FLAG()), + s_tokenInitCode, + RateLimiter.Config(false, 0, 0), + RateLimiter.Config(false, 0, 0) ); - // Predict the address of the token and pool on the DESTINATION chain + // Predict the address of the token and pool on the DESTINATION chain address predictedTokenAddress = DeterministicContractDeployer._predictAddressOfUndeployedContract( s_tokenInitCode, dynamicSalt, address(newTokenPoolFactory) ); @@ -135,14 +144,19 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { (address tokenAddress, address poolAddress) = s_tokenPoolFactory.deployTokenAndTokenPool( remoteTokenPools, s_tokenInitCode, s_poolInitCode, abi.encode(s_tokenPoolFactory.EMPTY_PARAMETER_FLAG()), s_salt ); - + // Ensure that the remote Token was set to the one we predicted - assertEq(abi.encode(predictedTokenAddress), TokenPool(poolAddress).getRemoteToken(DEST_CHAIN_SELECTOR), "Token Address should have been predicted"); + assertEq( + abi.encode(predictedTokenAddress), + TokenPool(poolAddress).getRemoteToken(DEST_CHAIN_SELECTOR), + "Token Address should have been predicted" + ); // Create the constructor params for the predicted pool // The predictedTokenAddress is NOT abi-encoded since the raw evm-address // is used in the constructor params - bytes memory predictedPoolCreationParams = abi.encode(predictedTokenAddress, new address[](0), s_rmnProxy, address(s_destRouter)); + bytes memory predictedPoolCreationParams = + abi.encode(predictedTokenAddress, new address[](0), s_rmnProxy, address(s_destRouter)); // Take the init code and concat the destination params to it, the initCode shouldn't change bytes memory predictedPoolInitCode = abi.encodePacked(s_poolInitCode, predictedPoolCreationParams); @@ -153,20 +167,221 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { ); // Assert that the address set for the remote pool is the same as the predicted address - assertEq(abi.encode(predictedPoolAddress), TokenPool(poolAddress).getRemotePool(DEST_CHAIN_SELECTOR), "Pool Address should have been predicted"); + assertEq( + abi.encode(predictedPoolAddress), + TokenPool(poolAddress).getRemotePool(DEST_CHAIN_SELECTOR), + "Pool Address should have been predicted" + ); // On the new token pool factory, representing a destination chain, // deploy a new token and a new pool (address newTokenAddress, address newPoolAddress) = newTokenPoolFactory.deployTokenAndTokenPool( - new TokenPoolFactory.ExistingTokenPool[](0), s_tokenInitCode, s_poolInitCode, abi.encode(s_tokenPoolFactory.EMPTY_PARAMETER_FLAG()), s_salt + new TokenPoolFactory.ExistingTokenPool[](0), + s_tokenInitCode, + s_poolInitCode, + abi.encode(s_tokenPoolFactory.EMPTY_PARAMETER_FLAG()), + s_salt ); - assertEq(TokenPool(poolAddress).getRemotePool(DEST_CHAIN_SELECTOR), abi.encode(newPoolAddress), "New Pool Address should have been deployed correctly"); + assertEq( + TokenPool(poolAddress).getRemotePool(DEST_CHAIN_SELECTOR), + abi.encode(newPoolAddress), + "New Pool Address should have been deployed correctly" + ); - assertEq(TokenPool(poolAddress).getRemoteToken(DEST_CHAIN_SELECTOR), abi.encode(newTokenAddress), "New Token Address should have been deployed correctly"); + assertEq( + TokenPool(poolAddress).getRemoteToken(DEST_CHAIN_SELECTOR), + abi.encode(newTokenAddress), + "New Token Address should have been deployed correctly" + ); } - function test_createTokenPool_predictFutureAddress_Success() public {} + function test_createTokenPool_ExistingRemoteToken_AndPredictPool_Success() public { + vm.startPrank(OWNER); + bytes32 dynamicSalt = keccak256(abi.encodePacked(s_salt, OWNER)); + + BurnMintERC20 newRemoteToken = new BurnMintERC20("TestToken", "TT", 18, type(uint256).max, PREMINT_AMOUNT, OWNER); + + // We have to create a new factory, registry module, and token admin registry to simulate the other chain + + TokenAdminRegistry newTokenAdminRegistry = new TokenAdminRegistry(); + RegistryModuleOwnerCustom newRegistryModule = new RegistryModuleOwnerCustom(address(newTokenAdminRegistry)); + + // We want to deploy a new factory and Owner Module. + TokenPoolFactory newTokenPoolFactory = new TokenPoolFactory( + address(newTokenAdminRegistry), address(newRegistryModule), s_rmnProxy, address(s_destRouter) + ); + + newTokenAdminRegistry.addRegistryModule(address(newRegistryModule)); + + TokenPoolFactory.RemoteChainConfig memory remoteChainConfig = + TokenPoolFactory.RemoteChainConfig(address(newTokenPoolFactory), address(s_destRouter), address(s_rmnProxy)); + + // Add the new token Factory to the remote chain config and set it for the simulated destination chain + s_tokenPoolFactory.updateRemoteChainConfig(DEST_CHAIN_SELECTOR, remoteChainConfig); - function test_createTokenPool_RemotChainNotSupported_Revert() public {} + // Create an array of remote pools where nothing exists yet, but we want to predict the address for + // the new pool and token on DEST_CHAIN_SELECTOR + TokenPoolFactory.ExistingTokenPool[] memory remoteTokenPools = new TokenPoolFactory.ExistingTokenPool[](1); + + // The only field that matters is DEST_CHAIN_SELECTOR because we dont want any existing token pool or token + // on the remote chain + remoteTokenPools[0] = TokenPoolFactory.ExistingTokenPool( + DEST_CHAIN_SELECTOR, + abi.encode(s_tokenPoolFactory.EMPTY_PARAMETER_FLAG()), + abi.encode(address(newRemoteToken)), + s_tokenInitCode, + RateLimiter.Config(false, 0, 0), + RateLimiter.Config(false, 0, 0) + ); + + // Since the remote chain information was provided, we should be able to get the information from the newly + // deployed token pool using the available getter functions + (address tokenAddress, address poolAddress) = s_tokenPoolFactory.deployTokenAndTokenPool( + remoteTokenPools, s_tokenInitCode, s_poolInitCode, abi.encode(s_tokenPoolFactory.EMPTY_PARAMETER_FLAG()), s_salt + ); + + // Ensure that the remote Token was set to the one we predicted + assertEq( + abi.encode(address(newRemoteToken)), + TokenPool(poolAddress).getRemoteToken(DEST_CHAIN_SELECTOR), + "Token Address should have been predicted" + ); + + // Create the constructor params for the predicted pool + // The predictedTokenAddress is NOT abi-encoded since the raw evm-address + // is used in the constructor params + bytes memory predictedPoolCreationParams = + abi.encode(address(newRemoteToken), new address[](0), s_rmnProxy, address(s_destRouter)); + + // Take the init code and concat the destination params to it, the initCode shouldn't change + bytes memory predictedPoolInitCode = abi.encodePacked(s_poolInitCode, predictedPoolCreationParams); + + // Predict the address of the pool on the DESTINATION chain + address predictedPoolAddress = DeterministicContractDeployer._predictAddressOfUndeployedContract( + predictedPoolInitCode, dynamicSalt, address(newTokenPoolFactory) + ); + + // Assert that the address set for the remote pool is the same as the predicted address + assertEq( + abi.encode(predictedPoolAddress), + TokenPool(poolAddress).getRemotePool(DEST_CHAIN_SELECTOR), + "Pool Address should have been predicted" + ); + + // On the new token pool factory, representing a destination chain, + // deploy a new token and a new pool + (address newTokenAddress, address newPoolAddress) = newTokenPoolFactory.deployTokenPoolWithExistingToken( + address(newRemoteToken), + new TokenPoolFactory.ExistingTokenPool[](0), + s_tokenInitCode, + s_poolInitCode, + abi.encode(s_tokenPoolFactory.EMPTY_PARAMETER_FLAG()), + s_salt + ); + + assertEq( + abi.encode(newTokenAddress), + TokenPool(poolAddress).getRemoteToken(DEST_CHAIN_SELECTOR), + "Remote Token Address should have been set correctly" + ); + + assertEq( + newTokenAddress, + address(newRemoteToken), + "Remote Token Address returned should be the same as the one we deployed" + ); + + assertEq( + TokenPool(poolAddress).getRemotePool(DEST_CHAIN_SELECTOR), + abi.encode(newPoolAddress), + "New Pool Address should have been deployed correctly" + ); + } + + function test_createTokenPool_WithRemoteTokenAndRemotePool_Success() public { + vm.startPrank(OWNER); + + bytes32 dynamicSalt = keccak256(abi.encodePacked(s_salt, OWNER)); + + bytes memory RANDOM_TOKEN_ADDRESS = abi.encode(makeAddr("RANDOM_TOKEN")); + bytes memory RANDOM_POOL_ADDRESS = abi.encode(makeAddr("RANDOM_POOL")); + + address predictedTokenAddress = DeterministicContractDeployer._predictAddressOfUndeployedContract( + s_tokenInitCode, dynamicSalt, address(s_tokenPoolFactory) + ); + + // Create the constructor params for the predicted pool + bytes memory poolCreationParams = abi.encode(predictedTokenAddress, new address[](0), s_rmnProxy, s_sourceRouter); + + // Predict the address of the pool before we make the tx by using the init code and the params + bytes memory predictedPoolInitCode = abi.encodePacked(s_poolInitCode, poolCreationParams); + address predictedPoolAddress = DeterministicContractDeployer._predictAddressOfUndeployedContract( + predictedPoolInitCode, dynamicSalt, address(s_tokenPoolFactory) + ); + + // Create an array of remote pools with some fake addresses + TokenPoolFactory.ExistingTokenPool[] memory remoteTokenPools = new TokenPoolFactory.ExistingTokenPool[](1); + + remoteTokenPools[0] = TokenPoolFactory.ExistingTokenPool( + DEST_CHAIN_SELECTOR, + RANDOM_POOL_ADDRESS, + RANDOM_TOKEN_ADDRESS, + "", + RateLimiter.Config(false, 0, 0), + RateLimiter.Config(false, 0, 0) + ); + + (address tokenAddress, address poolAddress) = s_tokenPoolFactory.deployTokenAndTokenPool( + remoteTokenPools, s_tokenInitCode, s_poolInitCode, poolCreationParams, s_salt + ); + + assertNotEq(address(0), tokenAddress, "Token Address should not be 0"); + assertNotEq(address(0), poolAddress, "Pool Address should not be 0"); + + s_tokenAdminRegistry.acceptAdminRole(tokenAddress); + OwnerIsCreator(tokenAddress).acceptOwnership(); + OwnerIsCreator(poolAddress).acceptOwnership(); + + assertEq( + TokenPool(poolAddress).getRemoteToken(DEST_CHAIN_SELECTOR), + RANDOM_TOKEN_ADDRESS, + "Remote Token Address should have been set" + ); + + assertEq( + TokenPool(poolAddress).getRemotePool(DEST_CHAIN_SELECTOR), + RANDOM_POOL_ADDRESS, + "Remote Pool Address should have been set" + ); + + assertEq(poolAddress, s_tokenAdminRegistry.getPool(tokenAddress), "Token Pool should be set"); + + assertEq(IOwner(tokenAddress).owner(), OWNER, "Token should be owned by the owner"); + + assertEq(IOwner(poolAddress).owner(), OWNER, "Token should be owned by the owner"); + } + + function test_updateRemoteChainConfig_Success() public { + TokenPoolFactory.RemoteChainConfig memory remoteChainConfig = TokenPoolFactory.RemoteChainConfig({ + remotePoolFactory: address(0x1234), + remoteRouter: address(0x5678), + remoteRMNProxy: address(0x9abc) + }); + + s_tokenPoolFactory.updateRemoteChainConfig(DEST_CHAIN_SELECTOR, remoteChainConfig); + + TokenPoolFactory.RemoteChainConfig memory updatedRemoteChainConfig = + s_tokenPoolFactory.getRemoteChainConfig(DEST_CHAIN_SELECTOR); + + assertEq( + remoteChainConfig.remotePoolFactory, + updatedRemoteChainConfig.remotePoolFactory, + "Token Pool Factory should be set" + ); + + assertEq(remoteChainConfig.remoteRouter, updatedRemoteChainConfig.remoteRouter, "Router should be set"); + + assertEq(remoteChainConfig.remoteRMNProxy, updatedRemoteChainConfig.remoteRMNProxy, "RMN Proxy should be set"); + } } diff --git a/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory.sol b/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory.sol index 81eb0865cd..ad7e048a6e 100644 --- a/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory.sol +++ b/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory.sol @@ -22,9 +22,7 @@ contract TokenPoolFactory is OwnerIsCreator { address internal immutable i_rmnProxy; address internal immutable i_ccipRouter; - event RemoteChainConfigUpdated( - uint64 indexed remoteChainSelector, RemoteChainConfig remoteChainConfig - ); + event RemoteChainConfigUpdated(uint64 indexed remoteChainSelector, RemoteChainConfig remoteChainConfig); error InvalidZeroAddress(); @@ -61,7 +59,7 @@ contract TokenPoolFactory is OwnerIsCreator { function deployTokenAndTokenPool( ExistingTokenPool[] memory remoteTokenPools, - bytes memory tokenInitCode, + bytes memory tokenInitCode, bytes memory tokenPoolInitCode, bytes memory tokenPoolInitArgs, bytes32 salt @@ -71,36 +69,36 @@ contract TokenPoolFactory is OwnerIsCreator { address token = tokenInitCode._deploy(salt); - return _createTokenPool(token, remoteTokenPools, tokenPoolInitCode, tokenPoolInitArgs, salt); + return _createTokenPool(token, remoteTokenPools, tokenPoolInitCode, tokenPoolInitArgs, salt, false); } - function deployTokenPoolWithExistingToken( + function deployTokenPoolWithExistingToken( address token, ExistingTokenPool[] memory remoteTokenPools, - bytes memory tokenInitCode, + bytes memory tokenInitCode, bytes memory tokenPoolInitCode, bytes memory tokenPoolInitArgs, bytes32 salt - ) external returns (address tokenAddress, address poolAddress) { - // Ensure a unique deployment between senders even if the same input parameter is used - salt = keccak256(abi.encodePacked(salt, msg.sender)); + ) external returns (address tokenAddress, address poolAddress) { + // Ensure a unique deployment between senders even if the same input parameter is used + salt = keccak256(abi.encodePacked(salt, msg.sender)); - return _createTokenPool(token, remoteTokenPools, tokenPoolInitCode, tokenPoolInitArgs, salt); - } + return _createTokenPool(token, remoteTokenPools, tokenPoolInitCode, tokenPoolInitArgs, salt, true); + } function _createTokenPool( address token, ExistingTokenPool[] memory remoteTokenPools, bytes memory tokenPoolInitCode, bytes memory tokenPoolInitArgs, - bytes32 salt + bytes32 salt, + bool isExistingToken ) internal returns (address tokenAddress, address poolAddress) { - // If the user doesn't want to provide any special parameters which may be needed for the token pool // then use the standard burn/mint token pool params. Since the user can provide custom token pool // init code, they must also be able to provide custom constructor args. if (bytes4(tokenPoolInitArgs) == EMPTY_PARAMETER_FLAG) { - tokenPoolInitArgs = abi.encode(token, new address[](0), i_rmnProxy, i_ccipRouter); + tokenPoolInitArgs = abi.encode(token, new address[](0), i_rmnProxy, i_ccipRouter); } // Construct the code that will be depoyed from the initCode and the initArgs @@ -116,8 +114,7 @@ contract TokenPoolFactory is OwnerIsCreator { // For Each remote chain in the remoteTokenPools array for (uint256 i = 0; i < remoteTokenPools.length; i++) { - - // The address of the remote token is needed later in the function as an address, not as + // The address of the remote token is needed later in the function as an address, not as // bytes so we store it in memory here address remoteTokenAddress; @@ -138,16 +135,18 @@ contract TokenPoolFactory is OwnerIsCreator { // otherwise we can use the address provided by the user if (bytes4(remoteTokenPools[i].remoteTokenAddress) == EMPTY_PARAMETER_FLAG) { // The user must provide the initCode for the remote token, so we can predict its address correctly. It's provided in the remoteTokenInitCode field for the remoteTokenPool - remoteTokenAddress = remoteTokenPools[i].remoteTokenInitCode._predictAddressOfUndeployedContract(salt, remoteChainConfig.remotePoolFactory); + remoteTokenAddress = remoteTokenPools[i].remoteTokenInitCode._predictAddressOfUndeployedContract( + salt, remoteChainConfig.remotePoolFactory + ); // The library returns an EVM-compatible address but chainUpdate takes bytes so we encode it - chainUpdate.remoteTokenAddress = abi.encode(remoteTokenAddress); + chainUpdate.remoteTokenAddress = abi.encode(remoteTokenAddress); } else { - // If the user already has a remote token deployed, reuse the address. We still need it as // an address for later, so we store it in memory after decoding. // NOTE: This assumes that the provided address can be decoded into an EVM address. remoteTokenAddress = abi.decode(remoteTokenPools[i].remoteTokenAddress, (address)); + chainUpdate.remoteTokenAddress = remoteTokenPools[i].remoteTokenAddress; } @@ -155,19 +154,19 @@ contract TokenPoolFactory is OwnerIsCreator { if (bytes4(remoteTokenPools[i].remotePoolAddress) == EMPTY_PARAMETER_FLAG) { // Generate the initCode that will be used on the remote chain. It is assumed that tokenInitCode // will be the same on all chains, so we can reuse it here. - + // Calculate the remote pool Args with an empty allowList, remote RMN, and Remote Router addresses. Since the first constructor parameter is an EVM token address, we can use the remoteTokenAddress we acquired earlier. bytes memory remotePoolInitArgs = abi.encode( remoteTokenAddress, new address[](0), remoteChainConfig.remoteRMNProxy, remoteChainConfig.remoteRouter ); // Combine the initCode with the initArgs to create the full initCode - bytes memory remotePoolInitcode = - abi.encodePacked(type(BurnMintTokenPool).creationCode, remotePoolInitArgs); + bytes memory remotePoolInitcode = abi.encodePacked(type(BurnMintTokenPool).creationCode, remotePoolInitArgs); // Predict the address of the undeployed contract on the destination chain - chainUpdate.remotePoolAddress = - abi.encode(remotePoolInitcode._predictAddressOfUndeployedContract(salt, remoteChainConfig.remotePoolFactory)); + chainUpdate.remotePoolAddress = abi.encode( + remotePoolInitcode._predictAddressOfUndeployedContract(salt, remoteChainConfig.remotePoolFactory) + ); } else { // If the user already has a remote pool deployed, reuse the address. chainUpdate.remotePoolAddress = remoteTokenPools[i].remotePoolAddress; @@ -177,14 +176,18 @@ contract TokenPoolFactory is OwnerIsCreator { chainUpdates[i] = chainUpdate; } - // Setup token roles - _setTokenPool(token, poolAddress); + // If the token already exists, then this contract will not be the owner, + // and thus it will not be able to set the token pool or transfer ownership + // which must be done manually by the end user. + if (!isExistingToken) { + _setTokenPool(token, poolAddress); + OwnerIsCreator(token).transferOwnership(address(msg.sender)); // 2 step ownership transfer + } // Apply the chain updates to the token pool TokenPool(poolAddress).applyChainUpdates(chainUpdates); - // Release the ownership of the tokenAdminRegistry, the token, and the pool. - _releaseOwnership(token, poolAddress); + OwnerIsCreator(poolAddress).transferOwnership(address(msg.sender)); // 2 step ownership transfer // TODO: Add more events return (token, poolAddress); @@ -200,17 +203,14 @@ contract TokenPoolFactory is OwnerIsCreator { // Set the pool address in the token admin registry i_tokenAdminRegistry.setPool(token, pool); - } - function _releaseOwnership(address token, address pool) internal { i_tokenAdminRegistry.transferAdminRole(token, msg.sender); - - OwnerIsCreator(token).transferOwnership(address(msg.sender)); // 2 step ownership transfer - OwnerIsCreator(pool).transferOwnership(address(msg.sender)); // 2 step ownership transfer } - // TODO: Update Event Maybe. - function updateRemoteChainConfig(uint64 remoteChainSelector, RemoteChainConfig calldata remoteConfig) public onlyOwner { + function updateRemoteChainConfig( + uint64 remoteChainSelector, + RemoteChainConfig calldata remoteConfig + ) public onlyOwner { s_remoteChainConfigs[remoteChainSelector] = remoteConfig; emit RemoteChainConfigUpdated(remoteChainSelector, remoteConfig); From 47cae4bd9e8abde25b7cd663130705cc4fe6838a Mon Sep 17 00:00:00 2001 From: Josh Date: Fri, 13 Sep 2024 11:10:39 -0400 Subject: [PATCH 06/48] Cleanup and additional comments/natspec --- contracts/gas-snapshots/ccip.gas-snapshot | 6 + .../tokenAdminRegistry/TokenPoolFactory.t.sol | 81 ++-- .../tokenAdminRegistry/TokenPoolFactory.sol | 183 +++++---- .../test/token/ERC20/BurnMintERC20.t.sol | 362 ++++++++++++++++++ .../v0.8/shared/token/ERC20/BurnMintERC20.sol | 8 +- 5 files changed, 536 insertions(+), 104 deletions(-) create mode 100644 contracts/src/v0.8/shared/test/token/ERC20/BurnMintERC20.t.sol diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot index bf3f7a9f72..f470d43d53 100644 --- a/contracts/gas-snapshots/ccip.gas-snapshot +++ b/contracts/gas-snapshots/ccip.gas-snapshot @@ -943,6 +943,12 @@ TokenPoolAndProxy:test_lockOrBurn_lockRelease_Success() (gas: 6319594) TokenPoolAndProxy:test_setPreviousPool_Success() (gas: 3387124) TokenPoolAndProxyMigration:test_tokenPoolMigration_Success_1_2() (gas: 6916278) TokenPoolAndProxyMigration:test_tokenPoolMigration_Success_1_4() (gas: 7100303) +TokenPoolFactoryTests:test_TokenPoolFactory_Constructor_Revert() (gas: 4545462) +TokenPoolFactoryTests:test_createTokenPool_ExistingRemoteToken_AndPredictPool_Success() (gas: 16922060) +TokenPoolFactoryTests:test_createTokenPool_WithNoExistingRemoteContracts_predict_Success() (gas: 17197023) +TokenPoolFactoryTests:test_createTokenPool_WithNoExistingTokenOnRemoteChain_Success() (gas: 6281185) +TokenPoolFactoryTests:test_createTokenPool_WithRemoteTokenAndRemotePool_Success() (gas: 6428760) +TokenPoolFactoryTests:test_updateRemoteChainConfig_Success() (gas: 85581) TokenPoolWithAllowList_applyAllowListUpdates:test_AllowListNotEnabled_Revert() (gas: 2209837) TokenPoolWithAllowList_applyAllowListUpdates:test_OnlyOwner_Revert() (gas: 12089) TokenPoolWithAllowList_applyAllowListUpdates:test_SetAllowListSkipsZero_Success() (gas: 23324) diff --git a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol index 719181089d..9f01c09463 100644 --- a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol +++ b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol @@ -60,6 +60,14 @@ contract TokenPoolFactorySetup is TokenAdminRegistrySetup { } contract TokenPoolFactoryTests is TokenPoolFactorySetup { + function test_TokenPoolFactory_Constructor_Revert() public { + // Revert cause the tokenAdminRegistry is address(0) + vm.expectRevert(TokenPoolFactory.InvalidZeroAddress.selector); + new TokenPoolFactory(address(0), address(0), address(0), address(0)); + + new TokenPoolFactory(address(0xdeadbeef), address(0xdeadbeef), address(0xdeadbeef), address(0xdeadbeef)); + } + function test_createTokenPool_WithNoExistingTokenOnRemoteChain_Success() public { vm.startPrank(OWNER); @@ -79,7 +87,7 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { ); (address tokenAddress, address poolAddress) = s_tokenPoolFactory.deployTokenAndTokenPool( - new TokenPoolFactory.ExistingTokenPool[](0), s_tokenInitCode, s_poolInitCode, poolCreationParams, s_salt + new TokenPoolFactory.RemoteTokenPoolInfo[](0), s_tokenInitCode, s_poolInitCode, poolCreationParams, s_salt ); assertNotEq(address(0), tokenAddress, "Token Address should not be 0"); @@ -115,16 +123,22 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { TokenPoolFactory.RemoteChainConfig memory remoteChainConfig = TokenPoolFactory.RemoteChainConfig(address(newTokenPoolFactory), address(s_destRouter), address(s_rmnProxy)); + uint64[] memory chainIds = new uint64[](1); + chainIds[0] = DEST_CHAIN_SELECTOR; + + TokenPoolFactory.RemoteChainConfig[] memory remoteChainConfigs = new TokenPoolFactory.RemoteChainConfig[](1); + remoteChainConfigs[0] = remoteChainConfig; + // Add the new token Factory to the remote chain config and set it for the simulated destination chain - s_tokenPoolFactory.updateRemoteChainConfig(DEST_CHAIN_SELECTOR, remoteChainConfig); + s_tokenPoolFactory.updateRemoteChainConfig(chainIds, remoteChainConfigs); // Create an array of remote pools where nothing exists yet, but we want to predict the address for // the new pool and token on DEST_CHAIN_SELECTOR - TokenPoolFactory.ExistingTokenPool[] memory remoteTokenPools = new TokenPoolFactory.ExistingTokenPool[](1); + TokenPoolFactory.RemoteTokenPoolInfo[] memory remoteTokenPools = new TokenPoolFactory.RemoteTokenPoolInfo[](1); // The only field that matters is DEST_CHAIN_SELECTOR because we dont want any existing token pool or token // on the remote chain - remoteTokenPools[0] = TokenPoolFactory.ExistingTokenPool( + remoteTokenPools[0] = TokenPoolFactory.RemoteTokenPoolInfo( DEST_CHAIN_SELECTOR, abi.encode(s_tokenPoolFactory.EMPTY_PARAMETER_FLAG()), abi.encode(s_tokenPoolFactory.EMPTY_PARAMETER_FLAG()), @@ -140,8 +154,7 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { // Since the remote chain information was provided, we should be able to get the information from the newly // deployed token pool using the available getter functions - - (address tokenAddress, address poolAddress) = s_tokenPoolFactory.deployTokenAndTokenPool( + (, address poolAddress) = s_tokenPoolFactory.deployTokenAndTokenPool( remoteTokenPools, s_tokenInitCode, s_poolInitCode, abi.encode(s_tokenPoolFactory.EMPTY_PARAMETER_FLAG()), s_salt ); @@ -176,7 +189,7 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { // On the new token pool factory, representing a destination chain, // deploy a new token and a new pool (address newTokenAddress, address newPoolAddress) = newTokenPoolFactory.deployTokenAndTokenPool( - new TokenPoolFactory.ExistingTokenPool[](0), + new TokenPoolFactory.RemoteTokenPoolInfo[](0), s_tokenInitCode, s_poolInitCode, abi.encode(s_tokenPoolFactory.EMPTY_PARAMETER_FLAG()), @@ -214,19 +227,27 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { newTokenAdminRegistry.addRegistryModule(address(newRegistryModule)); - TokenPoolFactory.RemoteChainConfig memory remoteChainConfig = - TokenPoolFactory.RemoteChainConfig(address(newTokenPoolFactory), address(s_destRouter), address(s_rmnProxy)); + { + TokenPoolFactory.RemoteChainConfig memory remoteChainConfig = + TokenPoolFactory.RemoteChainConfig(address(newTokenPoolFactory), address(s_destRouter), address(s_rmnProxy)); - // Add the new token Factory to the remote chain config and set it for the simulated destination chain - s_tokenPoolFactory.updateRemoteChainConfig(DEST_CHAIN_SELECTOR, remoteChainConfig); + TokenPoolFactory.RemoteChainConfig[] memory remoteChainConfigs = new TokenPoolFactory.RemoteChainConfig[](1); + remoteChainConfigs[0] = remoteChainConfig; + + uint64[] memory chainIds = new uint64[](1); + chainIds[0] = DEST_CHAIN_SELECTOR; + + // Add the new token Factory to the remote chain config and set it for the simulated destination chain + s_tokenPoolFactory.updateRemoteChainConfig(chainIds, remoteChainConfigs); + } // Create an array of remote pools where nothing exists yet, but we want to predict the address for // the new pool and token on DEST_CHAIN_SELECTOR - TokenPoolFactory.ExistingTokenPool[] memory remoteTokenPools = new TokenPoolFactory.ExistingTokenPool[](1); + TokenPoolFactory.RemoteTokenPoolInfo[] memory remoteTokenPools = new TokenPoolFactory.RemoteTokenPoolInfo[](1); // The only field that matters is DEST_CHAIN_SELECTOR because we dont want any existing token pool or token // on the remote chain - remoteTokenPools[0] = TokenPoolFactory.ExistingTokenPool( + remoteTokenPools[0] = TokenPoolFactory.RemoteTokenPoolInfo( DEST_CHAIN_SELECTOR, abi.encode(s_tokenPoolFactory.EMPTY_PARAMETER_FLAG()), abi.encode(address(newRemoteToken)), @@ -241,6 +262,8 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { remoteTokenPools, s_tokenInitCode, s_poolInitCode, abi.encode(s_tokenPoolFactory.EMPTY_PARAMETER_FLAG()), s_salt ); + assertEq(address(TokenPool(poolAddress).getToken()), tokenAddress, "Token Address should have been set locally"); + // Ensure that the remote Token was set to the one we predicted assertEq( abi.encode(address(newRemoteToken)), @@ -271,27 +294,20 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { // On the new token pool factory, representing a destination chain, // deploy a new token and a new pool - (address newTokenAddress, address newPoolAddress) = newTokenPoolFactory.deployTokenPoolWithExistingToken( + address newPoolAddress = newTokenPoolFactory.deployTokenPoolWithExistingToken( address(newRemoteToken), - new TokenPoolFactory.ExistingTokenPool[](0), - s_tokenInitCode, + new TokenPoolFactory.RemoteTokenPoolInfo[](0), s_poolInitCode, abi.encode(s_tokenPoolFactory.EMPTY_PARAMETER_FLAG()), s_salt ); assertEq( - abi.encode(newTokenAddress), + abi.encode(newRemoteToken), TokenPool(poolAddress).getRemoteToken(DEST_CHAIN_SELECTOR), "Remote Token Address should have been set correctly" ); - assertEq( - newTokenAddress, - address(newRemoteToken), - "Remote Token Address returned should be the same as the one we deployed" - ); - assertEq( TokenPool(poolAddress).getRemotePool(DEST_CHAIN_SELECTOR), abi.encode(newPoolAddress), @@ -314,16 +330,10 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { // Create the constructor params for the predicted pool bytes memory poolCreationParams = abi.encode(predictedTokenAddress, new address[](0), s_rmnProxy, s_sourceRouter); - // Predict the address of the pool before we make the tx by using the init code and the params - bytes memory predictedPoolInitCode = abi.encodePacked(s_poolInitCode, poolCreationParams); - address predictedPoolAddress = DeterministicContractDeployer._predictAddressOfUndeployedContract( - predictedPoolInitCode, dynamicSalt, address(s_tokenPoolFactory) - ); - // Create an array of remote pools with some fake addresses - TokenPoolFactory.ExistingTokenPool[] memory remoteTokenPools = new TokenPoolFactory.ExistingTokenPool[](1); + TokenPoolFactory.RemoteTokenPoolInfo[] memory remoteTokenPools = new TokenPoolFactory.RemoteTokenPoolInfo[](1); - remoteTokenPools[0] = TokenPoolFactory.ExistingTokenPool( + remoteTokenPools[0] = TokenPoolFactory.RemoteTokenPoolInfo( DEST_CHAIN_SELECTOR, RANDOM_POOL_ADDRESS, RANDOM_TOKEN_ADDRESS, @@ -363,13 +373,20 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { } function test_updateRemoteChainConfig_Success() public { + uint64[] memory chainIds = new uint64[](1); + chainIds[0] = DEST_CHAIN_SELECTOR; + + TokenPoolFactory.RemoteChainConfig[] memory remoteChainConfigs = new TokenPoolFactory.RemoteChainConfig[](1); + TokenPoolFactory.RemoteChainConfig memory remoteChainConfig = TokenPoolFactory.RemoteChainConfig({ remotePoolFactory: address(0x1234), remoteRouter: address(0x5678), remoteRMNProxy: address(0x9abc) }); - s_tokenPoolFactory.updateRemoteChainConfig(DEST_CHAIN_SELECTOR, remoteChainConfig); + remoteChainConfigs[0] = remoteChainConfig; + + s_tokenPoolFactory.updateRemoteChainConfig(chainIds, remoteChainConfigs); TokenPoolFactory.RemoteChainConfig memory updatedRemoteChainConfig = s_tokenPoolFactory.getRemoteChainConfig(DEST_CHAIN_SELECTOR); diff --git a/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory.sol b/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory.sol index ad7e048a6e..0b901042a6 100644 --- a/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory.sol +++ b/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory.sol @@ -1,5 +1,6 @@ pragma solidity ^0.8.24; +import {ITypeAndVersion} from "../../shared/interfaces/ItypeAndVersion.sol"; import {ITokenAdminRegistry} from "../interfaces/ITokenAdminRegistry.sol"; import {OwnerIsCreator} from "../../shared/access/OwnerIsCreator.sol"; @@ -9,56 +10,54 @@ import {RateLimiter} from "../libraries/RateLimiter.sol"; import {TokenPool} from "../pools/TokenPool.sol"; import {RegistryModuleOwnerCustom} from "./RegistryModuleOwnerCustom.sol"; -import {BurnMintERC677} from "../../shared/token/ERC677/BurnMintERC677.sol"; import {BurnMintTokenPool} from "../pools/BurnMintTokenPool.sol"; -import {console2 as console} from "forge-std/console2.sol"; - -contract TokenPoolFactory is OwnerIsCreator { +contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { using DeterministicContractDeployer for bytes; - ITokenAdminRegistry internal immutable i_tokenAdminRegistry; - RegistryModuleOwnerCustom internal immutable i_registryModuleOwnerCustom; - address internal immutable i_rmnProxy; - address internal immutable i_ccipRouter; - event RemoteChainConfigUpdated(uint64 indexed remoteChainSelector, RemoteChainConfig remoteChainConfig); error InvalidZeroAddress(); - mapping(uint64 remoteChainSelector => RemoteChainConfig) internal s_remoteChainConfigs; - - bytes4 public constant EMPTY_PARAMETER_FLAG = bytes4(keccak256("EMPTY_PARAMETER")); - - constructor(address tokenAdminRegistry, address tokenAdminModule, address rmnProxy, address ccipRouter) { - if (tokenAdminRegistry == address(0) || rmnProxy == address(0)) revert InvalidZeroAddress(); - - i_tokenAdminRegistry = ITokenAdminRegistry(tokenAdminRegistry); - i_registryModuleOwnerCustom = RegistryModuleOwnerCustom(tokenAdminModule); - i_rmnProxy = rmnProxy; - i_ccipRouter = ccipRouter; - } - - struct ExistingTokenPool { + struct RemoteTokenPoolInfo { uint64 remoteChainSelector; bytes remotePoolAddress; bytes remoteTokenAddress; bytes remoteTokenInitCode; - RateLimiter.Config outboundRateLimiterConfig; // Outbound rate limited config, meaning the rate limits for all of - // the onRamps for the given chain - RateLimiter.Config inboundRateLimiterConfig; // Inbound rate limited config, meaning the rate limits for all of - // the offRamps for the given chain + RateLimiter.Config outboundRateLimiterConfig; + RateLimiter.Config inboundRateLimiterConfig; } - /// @dev ORDERING IS CRITICAL IN PREDICTING ADDRESSES struct RemoteChainConfig { address remotePoolFactory; address remoteRouter; address remoteRMNProxy; } + ITokenAdminRegistry internal immutable i_tokenAdminRegistry; + RegistryModuleOwnerCustom internal immutable i_registryModuleOwnerCustom; + + address internal immutable i_rmnProxy; + address internal immutable i_ccipRouter; + + // bytes4(keccak256("EMPTY_PARAMETER_FLAG")) + bytes4 public constant EMPTY_PARAMETER_FLAG = 0x8fc9a1e4; + + mapping(uint64 remoteChainSelector => RemoteChainConfig) internal s_remoteChainConfigs; + + constructor(address tokenAdminRegistry, address tokenAdminModule, address rmnProxy, address ccipRouter) { + if ( + tokenAdminRegistry == address(0) || rmnProxy == address(0) || rmnProxy == address(0) || ccipRouter == address(0) + ) revert InvalidZeroAddress(); + + i_tokenAdminRegistry = ITokenAdminRegistry(tokenAdminRegistry); + i_registryModuleOwnerCustom = RegistryModuleOwnerCustom(tokenAdminModule); + i_rmnProxy = rmnProxy; + i_ccipRouter = ccipRouter; + } + function deployTokenAndTokenPool( - ExistingTokenPool[] memory remoteTokenPools, + RemoteTokenPoolInfo[] memory remoteTokenPools, bytes memory tokenInitCode, bytes memory tokenPoolInitCode, bytes memory tokenPoolInitArgs, @@ -67,45 +66,79 @@ contract TokenPoolFactory is OwnerIsCreator { // Ensure a unique deployment between senders even if the same input parameter is used salt = keccak256(abi.encodePacked(salt, msg.sender)); + // Deploy the token address token = tokenInitCode._deploy(salt); - return _createTokenPool(token, remoteTokenPools, tokenPoolInitCode, tokenPoolInitArgs, salt, false); + // Deploy the token pool + poolAddress = _createTokenPool(token, remoteTokenPools, tokenPoolInitCode, tokenPoolInitArgs, salt); + + // Set the token pool in the token admin registry since this contract is the owner of the token and the pool + _setTokenPool(token, poolAddress); + + // Transfer the ownership of the token to the msg.sender. + // This is a 2 step process and must be accepted in a separate tx. + OwnerIsCreator(token).transferOwnership(address(msg.sender)); // 2 step ownership transfer + + return (token, poolAddress); } + /// @notice Deploys a token pool with an existing ERC20 token + /// @dev Since the token already exists, this contract is not the owner and therefore cannot configure the + /// token pool in the token admin registry in the same transaction. The user must invoke the calls to the + /// tokenAdminRegistry manually + /// @param token The address of the existing token to be used in the token pool + /// @param remoteTokenPools An array of remote token pools info to be used in the pool's applyChainUpdates function + /// @param tokenPoolInitCode The creation code for the token pool + /// @param tokenPoolInitArgs The arguments to be passed to the token pool's constructor and concatenated with the + /// initCode to be passed into the deployer function + /// @param salt The salt to be used in the create2 deployment of the token pool + /// @return poolAddress The address of the token pool that was deployed function deployTokenPoolWithExistingToken( address token, - ExistingTokenPool[] memory remoteTokenPools, - bytes memory tokenInitCode, + RemoteTokenPoolInfo[] memory remoteTokenPools, bytes memory tokenPoolInitCode, bytes memory tokenPoolInitArgs, bytes32 salt - ) external returns (address tokenAddress, address poolAddress) { + ) external returns (address poolAddress) { // Ensure a unique deployment between senders even if the same input parameter is used salt = keccak256(abi.encodePacked(salt, msg.sender)); - return _createTokenPool(token, remoteTokenPools, tokenPoolInitCode, tokenPoolInitArgs, salt, true); + // create the token pool and return the address + return _createTokenPool(token, remoteTokenPools, tokenPoolInitCode, tokenPoolInitArgs, salt); } + /// @notice Deploys a token pool with the given token information and remote token pools + /// @param token The token to be used in the token pool + /// @param remoteTokenPools An array of remote token pools info to be used in the pool's applyChainUpdates function + /// @param tokenPoolInitCode The creation code for the token pool + /// @param tokenPoolInitArgs The arguments to be passed to the token pool's constructor and concatenated with the + /// initCode to be passed into the deployer function + /// @param salt The salt to be used in the create2 deployment of the token pool + /// @return poolAddress The address of the token pool that was deployed function _createTokenPool( address token, - ExistingTokenPool[] memory remoteTokenPools, + RemoteTokenPoolInfo[] memory remoteTokenPools, bytes memory tokenPoolInitCode, bytes memory tokenPoolInitArgs, - bytes32 salt, - bool isExistingToken - ) internal returns (address tokenAddress, address poolAddress) { - // If the user doesn't want to provide any special parameters which may be needed for the token pool - // then use the standard burn/mint token pool params. Since the user can provide custom token pool - // init code, they must also be able to provide custom constructor args. + bytes32 salt + ) internal returns (address) { + // If the user doesn't want to provide any special parameters which may be neededfor a custom the token pool then + /// use the standard burn/mint token pool params. Since the user can provide custom token pool init code, + // they must also provide custom constructor args. if (bytes4(tokenPoolInitArgs) == EMPTY_PARAMETER_FLAG) { tokenPoolInitArgs = abi.encode(token, new address[](0), i_rmnProxy, i_ccipRouter); } - // Construct the code that will be depoyed from the initCode and the initArgs - bytes memory newtokenPoolInitCode = abi.encodePacked(tokenPoolInitCode, tokenPoolInitArgs); - // deploy the pool using the above - poolAddress = newtokenPoolInitCode._deploy(salt); + // Stack scoping to reduce pressure on stack too deep from the concatenated initCode and initArgs + address poolAddress; + { + // Construct the code that will be depoyed from the initCode and the initArgs + bytes memory newtokenPoolInitCode = abi.encodePacked(tokenPoolInitCode, tokenPoolInitArgs); + + // deploy the pool using the above + poolAddress = newtokenPoolInitCode._deploy(salt); + } // Stack Scoping to reduce pressure on stack too deep { @@ -131,10 +164,11 @@ contract TokenPoolFactory is OwnerIsCreator { // Get the address of the remote factory, caching the storage value in memory RemoteChainConfig memory remoteChainConfig = s_remoteChainConfigs[remoteTokenPools[i].remoteChainSelector]; - // If the user provides the empty parameter flag, then we need to predict the address of the token - // otherwise we can use the address provided by the user + // If the user provides the empty parameter flag, then the address of the token needs to be predicted + // otherwise the address provided is used. if (bytes4(remoteTokenPools[i].remoteTokenAddress) == EMPTY_PARAMETER_FLAG) { - // The user must provide the initCode for the remote token, so we can predict its address correctly. It's provided in the remoteTokenInitCode field for the remoteTokenPool + // The user must provide the initCode for the remote token, so we can predict its address correctly. It's + // provided in the remoteTokenInitCode field for the remoteTokenPool remoteTokenAddress = remoteTokenPools[i].remoteTokenInitCode._predictAddressOfUndeployedContract( salt, remoteChainConfig.remotePoolFactory ); @@ -144,18 +178,20 @@ contract TokenPoolFactory is OwnerIsCreator { } else { // If the user already has a remote token deployed, reuse the address. We still need it as // an address for later, so we store it in memory after decoding. - // NOTE: This assumes that the provided address can be decoded into an EVM address. + // This assumes that the provided address can be decoded into an EVM address. remoteTokenAddress = abi.decode(remoteTokenPools[i].remoteTokenAddress, (address)); chainUpdate.remoteTokenAddress = remoteTokenPools[i].remoteTokenAddress; } - // If the user provides the empty parameter flag, then we need to predict the address of the pool + // If the user provides the empty parameter flag, the address of the pool should be predicted if (bytes4(remoteTokenPools[i].remotePoolAddress) == EMPTY_PARAMETER_FLAG) { // Generate the initCode that will be used on the remote chain. It is assumed that tokenInitCode - // will be the same on all chains, so we can reuse it here. + // will be the same on all chains, so it can be reused here. - // Calculate the remote pool Args with an empty allowList, remote RMN, and Remote Router addresses. Since the first constructor parameter is an EVM token address, we can use the remoteTokenAddress we acquired earlier. + // Calculate the remote pool Args with an empty allowList, remote RMN, and Remote Router addresses. + // Since the first constructor parameter is an EVM token address, the remoteTokenAddress acquired earlier. + // can be used. bytes memory remotePoolInitArgs = abi.encode( remoteTokenAddress, new address[](0), remoteChainConfig.remoteRMNProxy, remoteChainConfig.remoteRouter ); @@ -176,25 +212,22 @@ contract TokenPoolFactory is OwnerIsCreator { chainUpdates[i] = chainUpdate; } - // If the token already exists, then this contract will not be the owner, - // and thus it will not be able to set the token pool or transfer ownership - // which must be done manually by the end user. - if (!isExistingToken) { - _setTokenPool(token, poolAddress); - OwnerIsCreator(token).transferOwnership(address(msg.sender)); // 2 step ownership transfer - } - // Apply the chain updates to the token pool TokenPool(poolAddress).applyChainUpdates(chainUpdates); + // Being the 2 step ownership transfer of the token pool to the msg.sender. OwnerIsCreator(poolAddress).transferOwnership(address(msg.sender)); // 2 step ownership transfer - // TODO: Add more events - return (token, poolAddress); + return poolAddress; } } - function _setTokenPool(address token, address pool) public { + /// @notice Sets the token pool address in the token admin registry for a newly deployed token pool. + /// @dev this function should only be called when the token is deployed by this contract as well, otherwise + /// the token pool will not be able to be set in the token admin registry, and this function will revert. + /// @param token The address of the token to set the pool for + /// @param pool The address of the pool to set in the token admin registry + function _setTokenPool(address token, address pool) internal { // propose this factory as the admin for the token in the token admin registry i_registryModuleOwnerCustom.registerAdminViaOwner(token); @@ -204,19 +237,31 @@ contract TokenPoolFactory is OwnerIsCreator { // Set the pool address in the token admin registry i_tokenAdminRegistry.setPool(token, pool); + // Transfer the admin role for the token pool back to the msg.sender. This is a 2 step process + // and must be accepted in a separate tx. i_tokenAdminRegistry.transferAdminRole(token, msg.sender); } function updateRemoteChainConfig( - uint64 remoteChainSelector, - RemoteChainConfig calldata remoteConfig - ) public onlyOwner { - s_remoteChainConfigs[remoteChainSelector] = remoteConfig; - - emit RemoteChainConfigUpdated(remoteChainSelector, remoteConfig); + uint64[] calldata remoteChainSelectors, + RemoteChainConfig[] calldata remoteConfigs + ) external onlyOwner { + for (uint256 i = 0; i < remoteChainSelectors.length; i++) { + s_remoteChainConfigs[remoteChainSelectors[i]] = remoteConfigs[i]; + emit RemoteChainConfigUpdated(remoteChainSelectors[i], remoteConfigs[i]); + } } + /// @notice Get the remote chain config for a given remote chain selector + /// @param remoteChainSelector The remote chain selector to get the config for + /// @return remoteChainConfig The remote chain config for the given remote chain selector function getRemoteChainConfig(uint64 remoteChainSelector) public view returns (RemoteChainConfig memory) { return s_remoteChainConfigs[remoteChainSelector]; } + + /// @notice Get the type and version of the contract + /// @return The type and version of the contract + function typeAndVersion() external pure returns (string memory) { + return "TokenPoolFactory 1.0.0-dev"; + } } diff --git a/contracts/src/v0.8/shared/test/token/ERC20/BurnMintERC20.t.sol b/contracts/src/v0.8/shared/test/token/ERC20/BurnMintERC20.t.sol new file mode 100644 index 0000000000..dabffdb985 --- /dev/null +++ b/contracts/src/v0.8/shared/test/token/ERC20/BurnMintERC20.t.sol @@ -0,0 +1,362 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.19; + +import {IBurnMintERC20} from "../../../token/ERC20/IBurnMintERC20.sol"; + +import {BaseTest} from "../../BaseTest.t.sol"; +import {BurnMintERC20} from "../../../token/ERC20/BurnMintERC20.sol"; + +import {IERC20} from "../../../../vendor/openzeppelin-solidity/v4.8.3/contracts/interfaces/IERC20.sol"; +import {IERC165} from "../../../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/introspection/IERC165.sol"; + +contract BurnMintERC20Setup is BaseTest { + event Transfer(address indexed from, address indexed to, uint256 value); + event MintAccessGranted(address indexed minter); + event BurnAccessGranted(address indexed burner); + event MintAccessRevoked(address indexed minter); + event BurnAccessRevoked(address indexed burner); + + BurnMintERC20 internal s_burnMintERC20; + + address internal s_mockPool = address(6243783892); + uint256 internal s_amount = 1e18; + uint256 internal s_maxSupply = 1e36; + + function setUp() public virtual override { + BaseTest.setUp(); + s_burnMintERC20 = new BurnMintERC20("Chainlink Token", "LINK", 18, s_maxSupply, 0, OWNER); + + // Set s_mockPool to be a burner and minter + s_burnMintERC20.grantMintAndBurnRoles(s_mockPool); + deal(address(s_burnMintERC20), OWNER, s_amount); + } +} + +contract BurnMintERC20_constructor is BurnMintERC20Setup { + function testConstructorSuccess() public { + string memory name = "Chainlink token v2"; + string memory symbol = "LINK2"; + uint8 decimals = 19; + uint256 maxSupply = 1e33; + s_burnMintERC20 = new BurnMintERC20(name, symbol, decimals, maxSupply, 0, OWNER); + + assertEq(name, s_burnMintERC20.name()); + assertEq(symbol, s_burnMintERC20.symbol()); + assertEq(decimals, s_burnMintERC20.decimals()); + assertEq(maxSupply, s_burnMintERC20.maxSupply()); + } +} + +contract BurnMintERC20_approve is BurnMintERC20Setup { + function testApproveSuccess() public { + uint256 balancePre = s_burnMintERC20.balanceOf(STRANGER); + uint256 sendingAmount = s_amount / 2; + + s_burnMintERC20.approve(STRANGER, sendingAmount); + + changePrank(STRANGER); + + s_burnMintERC20.transferFrom(OWNER, STRANGER, sendingAmount); + + assertEq(sendingAmount + balancePre, s_burnMintERC20.balanceOf(STRANGER)); + } + + // Reverts + + function testInvalidAddressReverts() public { + vm.expectRevert(); + + s_burnMintERC20.approve(address(s_burnMintERC20), s_amount); + } +} + +contract BurnMintERC20_transfer is BurnMintERC20Setup { + function testTransferSuccess() public { + uint256 balancePre = s_burnMintERC20.balanceOf(STRANGER); + uint256 sendingAmount = s_amount / 2; + + s_burnMintERC20.transfer(STRANGER, sendingAmount); + + assertEq(sendingAmount + balancePre, s_burnMintERC20.balanceOf(STRANGER)); + } + + // Reverts + + function testInvalidAddressReverts() public { + vm.expectRevert(); + + s_burnMintERC20.transfer(address(s_burnMintERC20), s_amount); + } +} + +contract BurnMintERC20_mint is BurnMintERC20Setup { + function testBasicMintSuccess() public { + uint256 balancePre = s_burnMintERC20.balanceOf(OWNER); + + s_burnMintERC20.grantMintAndBurnRoles(OWNER); + + vm.expectEmit(); + emit Transfer(address(0), OWNER, s_amount); + + s_burnMintERC20.mint(OWNER, s_amount); + + assertEq(balancePre + s_amount, s_burnMintERC20.balanceOf(OWNER)); + } + + // Revert + + function testSenderNotMinterReverts() public { + // Minter role was granted in the constructor, so we must revert it for the test to error + s_burnMintERC20.revokeMintRole(OWNER); + + vm.expectRevert(abi.encodeWithSelector(BurnMintERC20.SenderNotMinter.selector, OWNER)); + s_burnMintERC20.mint(STRANGER, 1e18); + } + + function testMaxSupplyExceededReverts() public { + changePrank(s_mockPool); + + // Mint max supply + s_burnMintERC20.mint(OWNER, s_burnMintERC20.maxSupply()); + + vm.expectRevert( + abi.encodeWithSelector(BurnMintERC20.MaxSupplyExceeded.selector, s_burnMintERC20.maxSupply() + 1) + ); + + // Attempt to mint 1 more than max supply + s_burnMintERC20.mint(OWNER, 1); + } +} + +contract BurnMintERC20_burn is BurnMintERC20Setup { + function testBasicBurnSuccess() public { + s_burnMintERC20.grantBurnRole(OWNER); + deal(address(s_burnMintERC20), OWNER, s_amount); + + vm.expectEmit(); + emit Transfer(OWNER, address(0), s_amount); + + s_burnMintERC20.burn(s_amount); + + assertEq(0, s_burnMintERC20.balanceOf(OWNER)); + } + + // Revert + + function testSenderNotBurnerReverts() public { + // Burner role was granted in the constructor, so we must revert it for the test to revert properly + s_burnMintERC20.revokeBurnRole(OWNER); + + vm.expectRevert(abi.encodeWithSelector(BurnMintERC20.SenderNotBurner.selector, OWNER)); + + s_burnMintERC20.burnFrom(OWNER, s_amount); + } + + function testExceedsBalanceReverts() public { + changePrank(s_mockPool); + + vm.expectRevert("ERC20: burn amount exceeds balance"); + + s_burnMintERC20.burn(s_amount * 2); + } + + function testBurnFromZeroAddressReverts() public { + s_burnMintERC20.grantBurnRole(address(0)); + changePrank(address(0)); + + vm.expectRevert("ERC20: burn from the zero address"); + + s_burnMintERC20.burn(0); + } +} + +contract BurnMintERC20_burnFromAlias is BurnMintERC20Setup { + function setUp() public virtual override { + BurnMintERC20Setup.setUp(); + } + + function testBurnFromSuccess() public { + s_burnMintERC20.approve(s_mockPool, s_amount); + + changePrank(s_mockPool); + + s_burnMintERC20.burn(OWNER, s_amount); + + assertEq(0, s_burnMintERC20.balanceOf(OWNER)); + } + + // Reverts + + function testSenderNotBurnerReverts() public { + // Burner role was granted in the constructor, so we must revert it for the test to revert properly + s_burnMintERC20.revokeBurnRole(OWNER); + + vm.expectRevert(abi.encodeWithSelector(BurnMintERC20.SenderNotBurner.selector, OWNER)); + + s_burnMintERC20.burn(OWNER, s_amount); + } + + function testInsufficientAllowanceReverts() public { + changePrank(s_mockPool); + + vm.expectRevert("ERC20: insufficient allowance"); + + s_burnMintERC20.burn(OWNER, s_amount); + } + + function testExceedsBalanceReverts() public { + s_burnMintERC20.approve(s_mockPool, s_amount * 2); + + changePrank(s_mockPool); + + vm.expectRevert("ERC20: burn amount exceeds balance"); + + s_burnMintERC20.burn(OWNER, s_amount * 2); + } +} + +contract BurnMintERC20_burnFrom is BurnMintERC20Setup { + function setUp() public virtual override { + BurnMintERC20Setup.setUp(); + } + + function testBurnFromSuccess() public { + s_burnMintERC20.approve(s_mockPool, s_amount); + + changePrank(s_mockPool); + + s_burnMintERC20.burnFrom(OWNER, s_amount); + + assertEq(0, s_burnMintERC20.balanceOf(OWNER)); + } + + // Reverts + + function testSenderNotBurnerReverts() public { + s_burnMintERC20.revokeBurnRole(OWNER); + + vm.expectRevert(abi.encodeWithSelector(BurnMintERC20.SenderNotBurner.selector, OWNER)); + + s_burnMintERC20.burnFrom(OWNER, s_amount); + } + + function testInsufficientAllowanceReverts() public { + changePrank(s_mockPool); + + vm.expectRevert("ERC20: insufficient allowance"); + + s_burnMintERC20.burnFrom(OWNER, s_amount); + } + + function testExceedsBalanceReverts() public { + s_burnMintERC20.approve(s_mockPool, s_amount * 2); + + changePrank(s_mockPool); + + vm.expectRevert("ERC20: burn amount exceeds balance"); + + s_burnMintERC20.burnFrom(OWNER, s_amount * 2); + } +} + +contract BurnMintERC20_grantRole is BurnMintERC20Setup { + function testGrantMintAccessSuccess() public { + assertFalse(s_burnMintERC20.isMinter(STRANGER)); + + vm.expectEmit(); + emit MintAccessGranted(STRANGER); + + s_burnMintERC20.grantMintAndBurnRoles(STRANGER); + + assertTrue(s_burnMintERC20.isMinter(STRANGER)); + + vm.expectEmit(); + emit MintAccessRevoked(STRANGER); + + s_burnMintERC20.revokeMintRole(STRANGER); + + assertFalse(s_burnMintERC20.isMinter(STRANGER)); + } + + function testGrantBurnAccessSuccess() public { + assertFalse(s_burnMintERC20.isBurner(STRANGER)); + + vm.expectEmit(); + emit BurnAccessGranted(STRANGER); + + s_burnMintERC20.grantBurnRole(STRANGER); + + assertTrue(s_burnMintERC20.isBurner(STRANGER)); + + vm.expectEmit(); + emit BurnAccessRevoked(STRANGER); + + s_burnMintERC20.revokeBurnRole(STRANGER); + + assertFalse(s_burnMintERC20.isBurner(STRANGER)); + } + + function testGrantManySuccess() public { + // These roles were granted in the constructor. It's easier to just revoke them and start fresh for the purpose + // of the test + s_burnMintERC20.revokeBurnRole(OWNER); + s_burnMintERC20.revokeMintRole(OWNER); + + uint256 numberOfPools = 10; + address[] memory permissionedAddresses = new address[](numberOfPools + 1); + permissionedAddresses[0] = s_mockPool; + + for (uint160 i = 0; i < numberOfPools; ++i) { + permissionedAddresses[i + 1] = address(i); + s_burnMintERC20.grantMintAndBurnRoles(address(i)); + } + + assertEq(permissionedAddresses, s_burnMintERC20.getBurners()); + assertEq(permissionedAddresses, s_burnMintERC20.getMinters()); + } +} + +contract BurnMintERC20_grantMintAndBurnRoles is BurnMintERC20Setup { + function testGrantMintAndBurnRolesSuccess() public { + assertFalse(s_burnMintERC20.isMinter(STRANGER)); + assertFalse(s_burnMintERC20.isBurner(STRANGER)); + + vm.expectEmit(); + emit MintAccessGranted(STRANGER); + vm.expectEmit(); + emit BurnAccessGranted(STRANGER); + + s_burnMintERC20.grantMintAndBurnRoles(STRANGER); + + assertTrue(s_burnMintERC20.isMinter(STRANGER)); + assertTrue(s_burnMintERC20.isBurner(STRANGER)); + } +} + +contract BurnMintERC20_decreaseApproval is BurnMintERC20Setup { + function testDecreaseApprovalSuccess() public { + s_burnMintERC20.approve(s_mockPool, s_amount); + uint256 allowance = s_burnMintERC20.allowance(OWNER, s_mockPool); + assertEq(allowance, s_amount); + s_burnMintERC20.decreaseApproval(s_mockPool, s_amount); + assertEq(s_burnMintERC20.allowance(OWNER, s_mockPool), allowance - s_amount); + } +} + +contract BurnMintERC20_increaseApproval is BurnMintERC20Setup { + function testIncreaseApprovalSuccess() public { + s_burnMintERC20.approve(s_mockPool, s_amount); + uint256 allowance = s_burnMintERC20.allowance(OWNER, s_mockPool); + assertEq(allowance, s_amount); + s_burnMintERC20.increaseApproval(s_mockPool, s_amount); + assertEq(s_burnMintERC20.allowance(OWNER, s_mockPool), allowance + s_amount); + } +} + +contract BurnMintERC20_supportsInterface is BurnMintERC20Setup { + function testConstructorSuccess() public view { + assertTrue(s_burnMintERC20.supportsInterface(type(IERC20).interfaceId)); + assertTrue(s_burnMintERC20.supportsInterface(type(IBurnMintERC20).interfaceId)); + assertTrue(s_burnMintERC20.supportsInterface(type(IERC165).interfaceId)); + } +} diff --git a/contracts/src/v0.8/shared/token/ERC20/BurnMintERC20.sol b/contracts/src/v0.8/shared/token/ERC20/BurnMintERC20.sol index dc8a4ea789..6aec305e9d 100644 --- a/contracts/src/v0.8/shared/token/ERC20/BurnMintERC20.sol +++ b/contracts/src/v0.8/shared/token/ERC20/BurnMintERC20.sol @@ -48,10 +48,12 @@ contract BurnMintERC20 is IBurnMintERC20, IERC165, ERC20Burnable, OwnerIsCreator s_ccipAdmin = newOwner_; - // Mint the initial supply to the new Owner - _mint(newOwner_, preMint_); + // Mint the initial supply to the new Owner, save gas by not calling if the mint amount is zero + if (preMint_ != 0) _mint(newOwner_, preMint_); - // Grant the deployer the minter and burner roles + // Grant the deployer the minter and burner roles. This contract is expected to be deployed by a factory + // contract that will transfer ownership to the correct address after deployment, so granting minting and burning + // privileges here saves the user gas by not requiring two transactions. grantMintRole(newOwner_); grantBurnRole(newOwner_); } From 10c5c6674b7a3badd2a8aef2c812a6e47f25fd3a Mon Sep 17 00:00:00 2001 From: Josh Date: Fri, 13 Sep 2024 11:23:07 -0400 Subject: [PATCH 07/48] cleanup shared token files --- .../test/token/ERC20/BurnMintERC20.t.sol | 6 ++-- .../v0.8/shared/token/ERC20/BurnMintERC20.sol | 35 ++++++++++++------- .../util/DeterministicContractDeployer.sol | 17 +++++---- 3 files changed, 36 insertions(+), 22 deletions(-) diff --git a/contracts/src/v0.8/shared/test/token/ERC20/BurnMintERC20.t.sol b/contracts/src/v0.8/shared/test/token/ERC20/BurnMintERC20.t.sol index dabffdb985..964e918168 100644 --- a/contracts/src/v0.8/shared/test/token/ERC20/BurnMintERC20.t.sol +++ b/contracts/src/v0.8/shared/test/token/ERC20/BurnMintERC20.t.sol @@ -3,8 +3,8 @@ pragma solidity 0.8.19; import {IBurnMintERC20} from "../../../token/ERC20/IBurnMintERC20.sol"; -import {BaseTest} from "../../BaseTest.t.sol"; import {BurnMintERC20} from "../../../token/ERC20/BurnMintERC20.sol"; +import {BaseTest} from "../../BaseTest.t.sol"; import {IERC20} from "../../../../vendor/openzeppelin-solidity/v4.8.3/contracts/interfaces/IERC20.sol"; import {IERC165} from "../../../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/introspection/IERC165.sol"; @@ -119,9 +119,7 @@ contract BurnMintERC20_mint is BurnMintERC20Setup { // Mint max supply s_burnMintERC20.mint(OWNER, s_burnMintERC20.maxSupply()); - vm.expectRevert( - abi.encodeWithSelector(BurnMintERC20.MaxSupplyExceeded.selector, s_burnMintERC20.maxSupply() + 1) - ); + vm.expectRevert(abi.encodeWithSelector(BurnMintERC20.MaxSupplyExceeded.selector, s_burnMintERC20.maxSupply() + 1)); // Attempt to mint 1 more than max supply s_burnMintERC20.mint(OWNER, 1); diff --git a/contracts/src/v0.8/shared/token/ERC20/BurnMintERC20.sol b/contracts/src/v0.8/shared/token/ERC20/BurnMintERC20.sol index 6aec305e9d..ab6dcaf43f 100644 --- a/contracts/src/v0.8/shared/token/ERC20/BurnMintERC20.sol +++ b/contracts/src/v0.8/shared/token/ERC20/BurnMintERC20.sol @@ -6,11 +6,12 @@ import {IBurnMintERC20} from "../ERC20/IBurnMintERC20.sol"; import {OwnerIsCreator} from "../../access/OwnerIsCreator.sol"; import {ERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/ERC20.sol"; -import {ERC20Burnable} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/extensions/ERC20Burnable.sol"; +import {ERC20Burnable} from + "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/extensions/ERC20Burnable.sol"; -import {EnumerableSet} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/structs/EnumerableSet.sol"; -import {IERC165} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/introspection/IERC165.sol"; import {IERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol"; +import {IERC165} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/introspection/IERC165.sol"; +import {EnumerableSet} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/structs/EnumerableSet.sol"; /// @notice A basic ERC20 compatible token contract with burn and minting roles. /// @dev The total supply can be limited during deployment. @@ -39,30 +40,36 @@ contract BurnMintERC20 is IBurnMintERC20, IERC165, ERC20Burnable, OwnerIsCreator /// @dev The maximum supply of the token, 0 if unlimited uint256 internal immutable i_maxSupply; + /// @dev the CCIPAdmin can be used to register with the CCIP token admin registry, but has no other special powers, + /// and can only be transferred by the owner. address internal s_ccipAdmin; - /// @dev A 1 step ownership transfer is performed here - constructor(string memory name, string memory symbol, uint8 decimals_, uint256 maxSupply_, uint256 preMint_, address newOwner_) ERC20(name, symbol) { + constructor( + string memory name, + string memory symbol, + uint8 decimals_, + uint256 maxSupply_, + uint256 preMint_, + address newOwner_ + ) ERC20(name, symbol) { i_decimals = decimals_; i_maxSupply = maxSupply_; s_ccipAdmin = newOwner_; - // Mint the initial supply to the new Owner, save gas by not calling if the mint amount is zero + // Mint the initial supply to the new Owner, saving gas by not calling if the mint amount is zero if (preMint_ != 0) _mint(newOwner_, preMint_); // Grant the deployer the minter and burner roles. This contract is expected to be deployed by a factory // contract that will transfer ownership to the correct address after deployment, so granting minting and burning - // privileges here saves the user gas by not requiring two transactions. + // privileges here saves gas by not requiring two transactions. grantMintRole(newOwner_); grantBurnRole(newOwner_); } function supportsInterface(bytes4 interfaceId) public pure virtual override returns (bool) { - return - interfaceId == type(IERC20).interfaceId || - interfaceId == type(IBurnMintERC20).interfaceId || - interfaceId == type(IERC165).interfaceId; + return interfaceId == type(IERC20).interfaceId || interfaceId == type(IBurnMintERC20).interfaceId + || interfaceId == type(IERC165).interfaceId; } // ================================================================ @@ -200,13 +207,17 @@ contract BurnMintERC20 is IBurnMintERC20, IERC165, ERC20Burnable, OwnerIsCreator return s_burners.values(); } + /// @notice Returns the current CCIPAdmin function getCCIPAdmin() public view returns (address) { return s_ccipAdmin; } + /// @notice Transfers the CCIPAdmin role to a new address + /// @dev only the owner can call this function, NOT the current ccipAdmin, and 1-step ownership transfer is used + /// @param newAdmin The address to transfer the CCIPAdmin role to function setCCIPAdmin(address newAdmin) public onlyOwner { address currentAdmin = s_ccipAdmin; - + s_ccipAdmin = newAdmin; emit CCIPAdminTransferred(currentAdmin, newAdmin); diff --git a/contracts/src/v0.8/shared/util/DeterministicContractDeployer.sol b/contracts/src/v0.8/shared/util/DeterministicContractDeployer.sol index 2379f2c67b..f75e51d077 100644 --- a/contracts/src/v0.8/shared/util/DeterministicContractDeployer.sol +++ b/contracts/src/v0.8/shared/util/DeterministicContractDeployer.sol @@ -3,7 +3,6 @@ pragma solidity ^0.8.0; /// @title Deterministic Deployer Library /// @notice Library for deterministic contract deployment. library DeterministicContractDeployer { - error DeploymentFailed(); /// @notice Deploys a contract with a deterministically computed address. @@ -16,23 +15,29 @@ library DeterministicContractDeployer { contractAddress := create2(0, add(initCode, 0x20), mload(initCode), salt) } - if(contractAddress == address(0)) { + // When deploying with assembly, a revert will not occur if the deployment fails, so manual checks are needed + if (contractAddress == address(0)) { revert DeploymentFailed(); } return contractAddress; } - function _predictAddressOfUndeployedContract( + /// @notice Predicts the address of a contract that would be deployed with create2 and the given parameters. + /// @param initCode The bytecode of the contract to deploy, with constructor arguments already appended + /// @param salt A value to used with create2 to result in a unique the deployment address. + /// @param deployer The address of the account that will deploy the contract. + /// @return address The predicted address of the contract. + function _predictAddressOfUndeployedContract( bytes memory initCode, bytes32 salt, address deployer ) internal pure returns (address) { - // according to evm.codes, the below formula is used to predict the address of a contract + // Current EVM specs use following formula is used to decide contract addresses when deployed with create2 // address = keccak256(0xff + sender_address + salt + keccak256(initialisation_code))[12:] bytes32 bytesValue = keccak256(abi.encodePacked(hex"ff", deployer, salt, keccak256(initCode))); + // Return the left 20 bytes of the 32 byte hash, which is the address of the contract return address(uint160(uint256(bytesValue))); } - -} \ No newline at end of file +} From f4847a4be08b00051407c8bcbe56ec91d0366f1d Mon Sep 17 00:00:00 2001 From: Josh Date: Fri, 13 Sep 2024 11:36:02 -0400 Subject: [PATCH 08/48] snapshot and compilation fix --- contracts/gas-snapshots/ccip.gas-snapshot | 6 ++++++ .../src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory.sol | 3 +-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot index 98071286f6..562f8937f8 100644 --- a/contracts/gas-snapshots/ccip.gas-snapshot +++ b/contracts/gas-snapshots/ccip.gas-snapshot @@ -944,6 +944,12 @@ TokenPoolAndProxy:test_lockOrBurn_lockRelease_Success() (gas: 5793243) TokenPoolAndProxy:test_setPreviousPool_Success() (gas: 3070731) TokenPoolAndProxyMigration:test_tokenPoolMigration_Success_1_2() (gas: 6434780) TokenPoolAndProxyMigration:test_tokenPoolMigration_Success_1_4() (gas: 6634919) +TokenPoolFactoryTests:test_TokenPoolFactory_Constructor_Revert() (gas: 4159890) +TokenPoolFactoryTests:test_createTokenPool_ExistingRemoteToken_AndPredictPool_Success() (gas: 15494300) +TokenPoolFactoryTests:test_createTokenPool_WithNoExistingRemoteContracts_predict_Success() (gas: 15762046) +TokenPoolFactoryTests:test_createTokenPool_WithNoExistingTokenOnRemoteChain_Success() (gas: 5762358) +TokenPoolFactoryTests:test_createTokenPool_WithRemoteTokenAndRemotePool_Success() (gas: 5917665) +TokenPoolFactoryTests:test_updateRemoteChainConfig_Success() (gas: 85746) TokenPoolWithAllowList_applyAllowListUpdates:test_AllowListNotEnabled_Revert() (gas: 1979949) TokenPoolWithAllowList_applyAllowListUpdates:test_OnlyOwner_Revert() (gas: 12107) TokenPoolWithAllowList_applyAllowListUpdates:test_SetAllowListSkipsZero_Success() (gas: 23476) diff --git a/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory.sol b/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory.sol index 0b901042a6..410786158d 100644 --- a/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory.sol +++ b/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory.sol @@ -1,6 +1,6 @@ pragma solidity ^0.8.24; -import {ITypeAndVersion} from "../../shared/interfaces/ItypeAndVersion.sol"; +import {ITypeAndVersion} from "../../shared/interfaces/ITypeAndVersion.sol"; import {ITokenAdminRegistry} from "../interfaces/ITokenAdminRegistry.sol"; import {OwnerIsCreator} from "../../shared/access/OwnerIsCreator.sol"; @@ -129,7 +129,6 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { tokenPoolInitArgs = abi.encode(token, new address[](0), i_rmnProxy, i_ccipRouter); } - // Stack scoping to reduce pressure on stack too deep from the concatenated initCode and initArgs address poolAddress; { From 05df3b3e9aab978323fbe97aa36aef19a865e2fd Mon Sep 17 00:00:00 2001 From: Josh Date: Fri, 13 Sep 2024 11:51:05 -0400 Subject: [PATCH 09/48] update shared snapshot file for burnMintERC20 file --- contracts/gas-snapshots/shared.gas-snapshot | 31 +++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/contracts/gas-snapshots/shared.gas-snapshot b/contracts/gas-snapshots/shared.gas-snapshot index 0848baa098..f4b071612b 100644 --- a/contracts/gas-snapshots/shared.gas-snapshot +++ b/contracts/gas-snapshots/shared.gas-snapshot @@ -7,6 +7,33 @@ AuthorizedCallers_applyAuthorizedCallerUpdates:test_SkipRemove_Success() (gas: 3 AuthorizedCallers_applyAuthorizedCallerUpdates:test_ZeroAddressNotAllowed_Revert() (gas: 64473) AuthorizedCallers_constructor:test_ZeroAddressNotAllowed_Revert() (gas: 64473) AuthorizedCallers_constructor:test_constructor_Success() (gas: 720513) +BurnMintERC20_approve:testApproveSuccess() (gas: 55477) +BurnMintERC20_approve:testInvalidAddressReverts() (gas: 10663) +BurnMintERC20_burn:testBasicBurnSuccess() (gas: 135064) +BurnMintERC20_burn:testBurnFromZeroAddressReverts() (gas: 47201) +BurnMintERC20_burn:testExceedsBalanceReverts() (gas: 21819) +BurnMintERC20_burn:testSenderNotBurnerReverts() (gas: 32182) +BurnMintERC20_burnFrom:testBurnFromSuccess() (gas: 57957) +BurnMintERC20_burnFrom:testExceedsBalanceReverts() (gas: 35916) +BurnMintERC20_burnFrom:testInsufficientAllowanceReverts() (gas: 21914) +BurnMintERC20_burnFrom:testSenderNotBurnerReverts() (gas: 32182) +BurnMintERC20_burnFromAlias:testBurnFromSuccess() (gas: 57932) +BurnMintERC20_burnFromAlias:testExceedsBalanceReverts() (gas: 35880) +BurnMintERC20_burnFromAlias:testInsufficientAllowanceReverts() (gas: 21869) +BurnMintERC20_burnFromAlias:testSenderNotBurnerReverts() (gas: 32137) +BurnMintERC20_constructor:testConstructorSuccess() (gas: 1722070) +BurnMintERC20_decreaseApproval:testDecreaseApprovalSuccess() (gas: 31123) +BurnMintERC20_grantMintAndBurnRoles:testGrantMintAndBurnRolesSuccess() (gas: 121170) +BurnMintERC20_grantRole:testGrantBurnAccessSuccess() (gas: 53407) +BurnMintERC20_grantRole:testGrantManySuccess() (gas: 957680) +BurnMintERC20_grantRole:testGrantMintAccessSuccess() (gas: 94200) +BurnMintERC20_increaseApproval:testIncreaseApprovalSuccess() (gas: 44121) +BurnMintERC20_mint:testBasicMintSuccess() (gas: 52689) +BurnMintERC20_mint:testMaxSupplyExceededReverts() (gas: 50429) +BurnMintERC20_mint:testSenderNotMinterReverts() (gas: 30039) +BurnMintERC20_supportsInterface:testConstructorSuccess() (gas: 11072) +BurnMintERC20_transfer:testInvalidAddressReverts() (gas: 10661) +BurnMintERC20_transfer:testTransferSuccess() (gas: 42277) BurnMintERC677_approve:testApproveSuccess() (gas: 55512) BurnMintERC677_approve:testInvalidAddressReverts() (gas: 10663) BurnMintERC677_burn:testBasicBurnSuccess() (gas: 173939) @@ -39,10 +66,10 @@ CallWithExactGas__callWithExactGas:test_CallWithExactGasSafeReturnDataExactGas() CallWithExactGas__callWithExactGas:test_NoContractReverts() (gas: 11559) CallWithExactGas__callWithExactGas:test_NoGasForCallExactCheckReverts() (gas: 15788) CallWithExactGas__callWithExactGas:test_NotEnoughGasForCallReverts() (gas: 16241) -CallWithExactGas__callWithExactGas:test_callWithExactGasSuccess(bytes,bytes4) (runs: 257, μ: 15767, ~: 15719) +CallWithExactGas__callWithExactGas:test_callWithExactGasSuccess(bytes,bytes4) (runs: 257, μ: 15766, ~: 15719) CallWithExactGas__callWithExactGasEvenIfTargetIsNoContract:test_CallWithExactGasEvenIfTargetIsNoContractExactGasSuccess() (gas: 20116) CallWithExactGas__callWithExactGasEvenIfTargetIsNoContract:test_CallWithExactGasEvenIfTargetIsNoContractReceiverErrorSuccess() (gas: 67721) -CallWithExactGas__callWithExactGasEvenIfTargetIsNoContract:test_CallWithExactGasEvenIfTargetIsNoContractSuccess(bytes,bytes4) (runs: 257, μ: 16277, ~: 16229) +CallWithExactGas__callWithExactGasEvenIfTargetIsNoContract:test_CallWithExactGasEvenIfTargetIsNoContractSuccess(bytes,bytes4) (runs: 257, μ: 16276, ~: 16229) CallWithExactGas__callWithExactGasEvenIfTargetIsNoContract:test_NoContractSuccess() (gas: 12962) CallWithExactGas__callWithExactGasEvenIfTargetIsNoContract:test_NoGasForCallExactCheckReturnFalseSuccess() (gas: 13005) CallWithExactGas__callWithExactGasEvenIfTargetIsNoContract:test_NotEnoughGasForCallReturnsFalseSuccess() (gas: 13317) From 9e0b93cb8b53d7b3dd461040de08f3aa0259870d Mon Sep 17 00:00:00 2001 From: Josh Date: Tue, 17 Sep 2024 11:39:32 -0400 Subject: [PATCH 10/48] linter --- contracts/src/v0.8/shared/token/ERC20/BurnMintERC20.sol | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/contracts/src/v0.8/shared/token/ERC20/BurnMintERC20.sol b/contracts/src/v0.8/shared/token/ERC20/BurnMintERC20.sol index ab6dcaf43f..a89d421635 100644 --- a/contracts/src/v0.8/shared/token/ERC20/BurnMintERC20.sol +++ b/contracts/src/v0.8/shared/token/ERC20/BurnMintERC20.sol @@ -6,8 +6,7 @@ import {IBurnMintERC20} from "../ERC20/IBurnMintERC20.sol"; import {OwnerIsCreator} from "../../access/OwnerIsCreator.sol"; import {ERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/ERC20.sol"; -import {ERC20Burnable} from - "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/extensions/ERC20Burnable.sol"; +import {ERC20Burnable} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/extensions/ERC20Burnable.sol"; import {IERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol"; import {IERC165} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/introspection/IERC165.sol"; @@ -68,8 +67,10 @@ contract BurnMintERC20 is IBurnMintERC20, IERC165, ERC20Burnable, OwnerIsCreator } function supportsInterface(bytes4 interfaceId) public pure virtual override returns (bool) { - return interfaceId == type(IERC20).interfaceId || interfaceId == type(IBurnMintERC20).interfaceId - || interfaceId == type(IERC165).interfaceId; + return + interfaceId == type(IERC20).interfaceId || + interfaceId == type(IBurnMintERC20).interfaceId || + interfaceId == type(IERC165).interfaceId; } // ================================================================ From bdccab97c627f5151e3e979c7dae4acbdfdd1e64 Mon Sep 17 00:00:00 2001 From: Josh Date: Tue, 17 Sep 2024 12:40:50 -0400 Subject: [PATCH 11/48] stack cleanup, add Create2, OZ library, comment fixes, etc. --- .../tokenAdminRegistry/TokenPoolFactory.t.sol | 65 ++++++------ .../tokenAdminRegistry/TokenPoolFactory.sol | 98 +++++++++---------- .../v0.8/shared/token/ERC20/BurnMintERC20.sol | 5 +- .../util/DeterministicContractDeployer.sol | 43 -------- 4 files changed, 87 insertions(+), 124 deletions(-) delete mode 100644 contracts/src/v0.8/shared/util/DeterministicContractDeployer.sol diff --git a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol index 9f01c09463..a834427c05 100644 --- a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol +++ b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol @@ -15,18 +15,19 @@ import {RateLimiter} from "../../libraries/RateLimiter.sol"; import {OwnerIsCreator} from "../../../shared/access/OwnerIsCreator.sol"; import {BurnMintERC20} from "../../../shared/token/ERC20/BurnMintERC20.sol"; -import {DeterministicContractDeployer} from "../../../shared/util/DeterministicContractDeployer.sol"; -import {console2 as console} from "forge-std/console2.sol"; +import {Create2} from "../../../vendor/openzeppelin-solidity/v5.0.2/contracts/utils/Create2.sol"; contract TokenPoolFactorySetup is TokenAdminRegistrySetup { + using Create2 for bytes32; + TokenPoolFactory internal s_tokenPoolFactory; RegistryModuleOwnerCustom internal s_registryModuleOwnerCustom; bytes internal s_poolInitCode; bytes internal s_poolInitArgs; - bytes32 internal constant s_salt = keccak256(abi.encode("FAKE_SALT")); + bytes32 internal constant FAKE_SALT = keccak256(abi.encode("FAKE_SALT")); address internal s_rmnProxy = address(0x1234); @@ -60,6 +61,8 @@ contract TokenPoolFactorySetup is TokenAdminRegistrySetup { } contract TokenPoolFactoryTests is TokenPoolFactorySetup { + using Create2 for bytes32; + function test_TokenPoolFactory_Constructor_Revert() public { // Revert cause the tokenAdminRegistry is address(0) vm.expectRevert(TokenPoolFactory.InvalidZeroAddress.selector); @@ -71,10 +74,10 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { function test_createTokenPool_WithNoExistingTokenOnRemoteChain_Success() public { vm.startPrank(OWNER); - bytes32 dynamicSalt = keccak256(abi.encodePacked(s_salt, OWNER)); + bytes32 dynamicSalt = keccak256(abi.encodePacked(FAKE_SALT, OWNER)); - address predictedTokenAddress = DeterministicContractDeployer._predictAddressOfUndeployedContract( - s_tokenInitCode, dynamicSalt, address(s_tokenPoolFactory) + address predictedTokenAddress = Create2.computeAddress(dynamicSalt, + keccak256(s_tokenInitCode), address(s_tokenPoolFactory) ); // Create the constructor params for the predicted pool @@ -82,12 +85,13 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { // Predict the address of the pool before we make the tx by using the init code and the params bytes memory predictedPoolInitCode = abi.encodePacked(s_poolInitCode, poolCreationParams); - address predictedPoolAddress = DeterministicContractDeployer._predictAddressOfUndeployedContract( - predictedPoolInitCode, dynamicSalt, address(s_tokenPoolFactory) + + address predictedPoolAddress = dynamicSalt.computeAddress( + keccak256(predictedPoolInitCode), address(s_tokenPoolFactory) ); (address tokenAddress, address poolAddress) = s_tokenPoolFactory.deployTokenAndTokenPool( - new TokenPoolFactory.RemoteTokenPoolInfo[](0), s_tokenInitCode, s_poolInitCode, poolCreationParams, s_salt + new TokenPoolFactory.RemoteTokenPoolInfo[](0), s_tokenInitCode, s_poolInitCode, poolCreationParams, FAKE_SALT ); assertNotEq(address(0), tokenAddress, "Token Address should not be 0"); @@ -107,7 +111,7 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { function test_createTokenPool_WithNoExistingRemoteContracts_predict_Success() public { vm.startPrank(OWNER); - bytes32 dynamicSalt = keccak256(abi.encodePacked(s_salt, OWNER)); + bytes32 dynamicSalt = keccak256(abi.encodePacked(FAKE_SALT, OWNER)); // We have to create a new factory, registry module, and token admin registry to simulate the other chain TokenAdminRegistry newTokenAdminRegistry = new TokenAdminRegistry(); @@ -143,19 +147,22 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { abi.encode(s_tokenPoolFactory.EMPTY_PARAMETER_FLAG()), abi.encode(s_tokenPoolFactory.EMPTY_PARAMETER_FLAG()), s_tokenInitCode, - RateLimiter.Config(false, 0, 0), RateLimiter.Config(false, 0, 0) ); // Predict the address of the token and pool on the DESTINATION chain - address predictedTokenAddress = DeterministicContractDeployer._predictAddressOfUndeployedContract( - s_tokenInitCode, dynamicSalt, address(newTokenPoolFactory) + address predictedTokenAddress = dynamicSalt.computeAddress( + keccak256(s_tokenInitCode), address(newTokenPoolFactory) ); // Since the remote chain information was provided, we should be able to get the information from the newly // deployed token pool using the available getter functions (, address poolAddress) = s_tokenPoolFactory.deployTokenAndTokenPool( - remoteTokenPools, s_tokenInitCode, s_poolInitCode, abi.encode(s_tokenPoolFactory.EMPTY_PARAMETER_FLAG()), s_salt + remoteTokenPools, + s_tokenInitCode, + s_poolInitCode, + abi.encode(s_tokenPoolFactory.EMPTY_PARAMETER_FLAG()), + FAKE_SALT ); // Ensure that the remote Token was set to the one we predicted @@ -175,8 +182,8 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { bytes memory predictedPoolInitCode = abi.encodePacked(s_poolInitCode, predictedPoolCreationParams); // Predict the address of the pool on the DESTINATION chain - address predictedPoolAddress = DeterministicContractDeployer._predictAddressOfUndeployedContract( - predictedPoolInitCode, dynamicSalt, address(newTokenPoolFactory) + address predictedPoolAddress = dynamicSalt.computeAddress( + keccak256(predictedPoolInitCode), address(newTokenPoolFactory) ); // Assert that the address set for the remote pool is the same as the predicted address @@ -193,7 +200,7 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { s_tokenInitCode, s_poolInitCode, abi.encode(s_tokenPoolFactory.EMPTY_PARAMETER_FLAG()), - s_salt + FAKE_SALT ); assertEq( @@ -211,7 +218,7 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { function test_createTokenPool_ExistingRemoteToken_AndPredictPool_Success() public { vm.startPrank(OWNER); - bytes32 dynamicSalt = keccak256(abi.encodePacked(s_salt, OWNER)); + bytes32 dynamicSalt = keccak256(abi.encodePacked(FAKE_SALT, OWNER)); BurnMintERC20 newRemoteToken = new BurnMintERC20("TestToken", "TT", 18, type(uint256).max, PREMINT_AMOUNT, OWNER); @@ -252,14 +259,17 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { abi.encode(s_tokenPoolFactory.EMPTY_PARAMETER_FLAG()), abi.encode(address(newRemoteToken)), s_tokenInitCode, - RateLimiter.Config(false, 0, 0), RateLimiter.Config(false, 0, 0) ); // Since the remote chain information was provided, we should be able to get the information from the newly // deployed token pool using the available getter functions (address tokenAddress, address poolAddress) = s_tokenPoolFactory.deployTokenAndTokenPool( - remoteTokenPools, s_tokenInitCode, s_poolInitCode, abi.encode(s_tokenPoolFactory.EMPTY_PARAMETER_FLAG()), s_salt + remoteTokenPools, + s_tokenInitCode, + s_poolInitCode, + abi.encode(s_tokenPoolFactory.EMPTY_PARAMETER_FLAG()), + FAKE_SALT ); assertEq(address(TokenPool(poolAddress).getToken()), tokenAddress, "Token Address should have been set locally"); @@ -281,8 +291,8 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { bytes memory predictedPoolInitCode = abi.encodePacked(s_poolInitCode, predictedPoolCreationParams); // Predict the address of the pool on the DESTINATION chain - address predictedPoolAddress = DeterministicContractDeployer._predictAddressOfUndeployedContract( - predictedPoolInitCode, dynamicSalt, address(newTokenPoolFactory) + address predictedPoolAddress = dynamicSalt.computeAddress( + keccak256(predictedPoolInitCode), address(newTokenPoolFactory) ); // Assert that the address set for the remote pool is the same as the predicted address @@ -299,7 +309,7 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { new TokenPoolFactory.RemoteTokenPoolInfo[](0), s_poolInitCode, abi.encode(s_tokenPoolFactory.EMPTY_PARAMETER_FLAG()), - s_salt + FAKE_SALT ); assertEq( @@ -318,13 +328,13 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { function test_createTokenPool_WithRemoteTokenAndRemotePool_Success() public { vm.startPrank(OWNER); - bytes32 dynamicSalt = keccak256(abi.encodePacked(s_salt, OWNER)); + bytes32 dynamicSalt = keccak256(abi.encodePacked(FAKE_SALT, OWNER)); bytes memory RANDOM_TOKEN_ADDRESS = abi.encode(makeAddr("RANDOM_TOKEN")); bytes memory RANDOM_POOL_ADDRESS = abi.encode(makeAddr("RANDOM_POOL")); - address predictedTokenAddress = DeterministicContractDeployer._predictAddressOfUndeployedContract( - s_tokenInitCode, dynamicSalt, address(s_tokenPoolFactory) + address predictedTokenAddress = dynamicSalt.computeAddress( + keccak256(s_tokenInitCode), address(s_tokenPoolFactory) ); // Create the constructor params for the predicted pool @@ -338,12 +348,11 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { RANDOM_POOL_ADDRESS, RANDOM_TOKEN_ADDRESS, "", - RateLimiter.Config(false, 0, 0), RateLimiter.Config(false, 0, 0) ); (address tokenAddress, address poolAddress) = s_tokenPoolFactory.deployTokenAndTokenPool( - remoteTokenPools, s_tokenInitCode, s_poolInitCode, poolCreationParams, s_salt + remoteTokenPools, s_tokenInitCode, s_poolInitCode, poolCreationParams, FAKE_SALT ); assertNotEq(address(0), tokenAddress, "Token Address should not be 0"); diff --git a/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory.sol b/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory.sol index 410786158d..91d400b285 100644 --- a/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory.sol +++ b/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory.sol @@ -2,46 +2,57 @@ pragma solidity ^0.8.24; import {ITypeAndVersion} from "../../shared/interfaces/ITypeAndVersion.sol"; import {ITokenAdminRegistry} from "../interfaces/ITokenAdminRegistry.sol"; +import {IOwnable} from "../../shared/interfaces/IOwnable.sol"; import {OwnerIsCreator} from "../../shared/access/OwnerIsCreator.sol"; -import {DeterministicContractDeployer} from "../../shared/util/DeterministicContractDeployer.sol"; - import {RateLimiter} from "../libraries/RateLimiter.sol"; +import {BurnMintTokenPool} from "../pools/BurnMintTokenPool.sol"; import {TokenPool} from "../pools/TokenPool.sol"; import {RegistryModuleOwnerCustom} from "./RegistryModuleOwnerCustom.sol"; -import {BurnMintTokenPool} from "../pools/BurnMintTokenPool.sol"; +import {Create2} from "../../vendor/openzeppelin-solidity/v5.0.2/contracts/utils/Create2.sol"; contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { - using DeterministicContractDeployer for bytes; + using Create2 for bytes32; event RemoteChainConfigUpdated(uint64 indexed remoteChainSelector, RemoteChainConfig remoteChainConfig); error InvalidZeroAddress(); struct RemoteTokenPoolInfo { - uint64 remoteChainSelector; - bytes remotePoolAddress; - bytes remoteTokenAddress; - bytes remoteTokenInitCode; - RateLimiter.Config outboundRateLimiterConfig; - RateLimiter.Config inboundRateLimiterConfig; - } + uint64 remoteChainSelector; // The CCIP specific selector for the remote chain + bytes remotePoolAddress; // The address of the remote pool to either deploy or use as is. If + // the empty parameter flag is provided, the address will be predicted + bytes remoteTokenAddress; // The address of the remote token to either deploy or use as is + // If the empty parameter flag is provided, the address will be predicted + + bytes remoteTokenInitCode; // The init code for the remote token if it needs to be deployed + // and includes all the constructor params already appended + + RateLimiter.Config outboundRateLimiterConfig; // The rate limiter config for token messages to be used in the pool. + // The specified rate limit will also be applied to the token pool's inbound messages as well. + + /* solhint-disable gas-struct-packing */ struct RemoteChainConfig { address remotePoolFactory; + /// The factory contract on the remote chain address remoteRouter; + /// The router contract on the remote chain address remoteRMNProxy; + /// The RMNProxy contract on the remote chain } + /* solhint-enable gas-struct-packing */ + ITokenAdminRegistry internal immutable i_tokenAdminRegistry; RegistryModuleOwnerCustom internal immutable i_registryModuleOwnerCustom; - address internal immutable i_rmnProxy; - address internal immutable i_ccipRouter; + address private immutable i_rmnProxy; + address private immutable i_ccipRouter; - // bytes4(keccak256("EMPTY_PARAMETER_FLAG")) - bytes4 public constant EMPTY_PARAMETER_FLAG = 0x8fc9a1e4; + bytes4 public constant EMPTY_PARAMETER_FLAG = bytes4(keccak256("EMPTY_PARAMETER_FLAG")); + string public constant typeAndVersion = "TokenPoolFactory 1.0.0-dev"; mapping(uint64 remoteChainSelector => RemoteChainConfig) internal s_remoteChainConfigs; @@ -57,9 +68,9 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { } function deployTokenAndTokenPool( - RemoteTokenPoolInfo[] memory remoteTokenPools, + RemoteTokenPoolInfo[] calldata remoteTokenPools, bytes memory tokenInitCode, - bytes memory tokenPoolInitCode, + bytes calldata tokenPoolInitCode, bytes memory tokenPoolInitArgs, bytes32 salt ) external returns (address tokenAddress, address poolAddress) { @@ -67,13 +78,13 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { salt = keccak256(abi.encodePacked(salt, msg.sender)); // Deploy the token - address token = tokenInitCode._deploy(salt); + address token = Create2.deploy(0, salt, tokenInitCode); // Deploy the token pool poolAddress = _createTokenPool(token, remoteTokenPools, tokenPoolInitCode, tokenPoolInitArgs, salt); - // Set the token pool in the token admin registry since this contract is the owner of the token and the pool - _setTokenPool(token, poolAddress); + // Set the token pool for token in the token admin registry since this contract is the token and pool owner + _setTokenPoolInTokenAdminRegistry(token, poolAddress); // Transfer the ownership of the token to the msg.sender. // This is a 2 step process and must be accepted in a separate tx. @@ -95,8 +106,8 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { /// @return poolAddress The address of the token pool that was deployed function deployTokenPoolWithExistingToken( address token, - RemoteTokenPoolInfo[] memory remoteTokenPools, - bytes memory tokenPoolInitCode, + RemoteTokenPoolInfo[] calldata remoteTokenPools, + bytes calldata tokenPoolInitCode, bytes memory tokenPoolInitArgs, bytes32 salt ) external returns (address poolAddress) { @@ -117,8 +128,8 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { /// @return poolAddress The address of the token pool that was deployed function _createTokenPool( address token, - RemoteTokenPoolInfo[] memory remoteTokenPools, - bytes memory tokenPoolInitCode, + RemoteTokenPoolInfo[] calldata remoteTokenPools, + bytes calldata tokenPoolInitCode, bytes memory tokenPoolInitArgs, bytes32 salt ) internal returns (address) { @@ -129,15 +140,8 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { tokenPoolInitArgs = abi.encode(token, new address[](0), i_rmnProxy, i_ccipRouter); } - // Stack scoping to reduce pressure on stack too deep from the concatenated initCode and initArgs - address poolAddress; - { - // Construct the code that will be depoyed from the initCode and the initArgs - bytes memory newtokenPoolInitCode = abi.encodePacked(tokenPoolInitCode, tokenPoolInitArgs); - - // deploy the pool using the above - poolAddress = newtokenPoolInitCode._deploy(salt); - } + // Construct the code that will be deployed from the initCode and the initArgs + address poolAddress = Create2.deploy(0, salt, abi.encodePacked(tokenPoolInitCode, tokenPoolInitArgs)); // Stack Scoping to reduce pressure on stack too deep { @@ -157,7 +161,7 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { remotePoolAddress: "", remoteTokenAddress: "", outboundRateLimiterConfig: remoteTokenPools[i].outboundRateLimiterConfig, - inboundRateLimiterConfig: remoteTokenPools[i].inboundRateLimiterConfig + inboundRateLimiterConfig: remoteTokenPools[i].outboundRateLimiterConfig }); // Get the address of the remote factory, caching the storage value in memory @@ -168,9 +172,8 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { if (bytes4(remoteTokenPools[i].remoteTokenAddress) == EMPTY_PARAMETER_FLAG) { // The user must provide the initCode for the remote token, so we can predict its address correctly. It's // provided in the remoteTokenInitCode field for the remoteTokenPool - remoteTokenAddress = remoteTokenPools[i].remoteTokenInitCode._predictAddressOfUndeployedContract( - salt, remoteChainConfig.remotePoolFactory - ); + + remoteTokenAddress = salt.computeAddress(keccak256(remoteTokenPools[i].remoteTokenInitCode), remoteChainConfig.remotePoolFactory); // The library returns an EVM-compatible address but chainUpdate takes bytes so we encode it chainUpdate.remoteTokenAddress = abi.encode(remoteTokenAddress); @@ -191,17 +194,18 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { // Calculate the remote pool Args with an empty allowList, remote RMN, and Remote Router addresses. // Since the first constructor parameter is an EVM token address, the remoteTokenAddress acquired earlier. // can be used. - bytes memory remotePoolInitArgs = abi.encode( - remoteTokenAddress, new address[](0), remoteChainConfig.remoteRMNProxy, remoteChainConfig.remoteRouter - ); // Combine the initCode with the initArgs to create the full initCode - bytes memory remotePoolInitcode = abi.encodePacked(type(BurnMintTokenPool).creationCode, remotePoolInitArgs); + bytes memory remotePoolInitcode = abi.encodePacked(type(BurnMintTokenPool).creationCode, abi.encode( + remoteTokenAddress, new address[](0), remoteChainConfig.remoteRMNProxy, remoteChainConfig.remoteRouter)); // Predict the address of the undeployed contract on the destination chain chainUpdate.remotePoolAddress = abi.encode( - remotePoolInitcode._predictAddressOfUndeployedContract(salt, remoteChainConfig.remotePoolFactory) + salt.computeAddress(keccak256(remotePoolInitcode), remoteChainConfig.remotePoolFactory) ); + + chainUpdate.remotePoolAddress = abi.encode(salt.computeAddress(keccak256(remotePoolInitcode), remoteChainConfig.remotePoolFactory)); + } else { // If the user already has a remote pool deployed, reuse the address. chainUpdate.remotePoolAddress = remoteTokenPools[i].remotePoolAddress; @@ -215,7 +219,7 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { TokenPool(poolAddress).applyChainUpdates(chainUpdates); // Being the 2 step ownership transfer of the token pool to the msg.sender. - OwnerIsCreator(poolAddress).transferOwnership(address(msg.sender)); // 2 step ownership transfer + IOwnable(poolAddress).transferOwnership(address(msg.sender)); // 2 step ownership transfer return poolAddress; } @@ -226,7 +230,7 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { /// the token pool will not be able to be set in the token admin registry, and this function will revert. /// @param token The address of the token to set the pool for /// @param pool The address of the pool to set in the token admin registry - function _setTokenPool(address token, address pool) internal { + function _setTokenPoolInTokenAdminRegistry(address token, address pool) internal { // propose this factory as the admin for the token in the token admin registry i_registryModuleOwnerCustom.registerAdminViaOwner(token); @@ -257,10 +261,4 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { function getRemoteChainConfig(uint64 remoteChainSelector) public view returns (RemoteChainConfig memory) { return s_remoteChainConfigs[remoteChainSelector]; } - - /// @notice Get the type and version of the contract - /// @return The type and version of the contract - function typeAndVersion() external pure returns (string memory) { - return "TokenPoolFactory 1.0.0-dev"; - } } diff --git a/contracts/src/v0.8/shared/token/ERC20/BurnMintERC20.sol b/contracts/src/v0.8/shared/token/ERC20/BurnMintERC20.sol index a89d421635..2da8122ef6 100644 --- a/contracts/src/v0.8/shared/token/ERC20/BurnMintERC20.sol +++ b/contracts/src/v0.8/shared/token/ERC20/BurnMintERC20.sol @@ -7,7 +7,6 @@ import {OwnerIsCreator} from "../../access/OwnerIsCreator.sol"; import {ERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/ERC20.sol"; import {ERC20Burnable} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/extensions/ERC20Burnable.sol"; - import {IERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol"; import {IERC165} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/introspection/IERC165.sol"; import {EnumerableSet} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/structs/EnumerableSet.sol"; @@ -214,8 +213,8 @@ contract BurnMintERC20 is IBurnMintERC20, IERC165, ERC20Burnable, OwnerIsCreator } /// @notice Transfers the CCIPAdmin role to a new address - /// @dev only the owner can call this function, NOT the current ccipAdmin, and 1-step ownership transfer is used - /// @param newAdmin The address to transfer the CCIPAdmin role to + /// @dev only the owner can call this function, NOT the current ccipAdmin, and 1-step ownership transfer is used. + /// @param newAdmin The address to transfer the CCIPAdmin role to. Set to address(0) is a valid way to revoke the role function setCCIPAdmin(address newAdmin) public onlyOwner { address currentAdmin = s_ccipAdmin; diff --git a/contracts/src/v0.8/shared/util/DeterministicContractDeployer.sol b/contracts/src/v0.8/shared/util/DeterministicContractDeployer.sol deleted file mode 100644 index f75e51d077..0000000000 --- a/contracts/src/v0.8/shared/util/DeterministicContractDeployer.sol +++ /dev/null @@ -1,43 +0,0 @@ -pragma solidity ^0.8.0; - -/// @title Deterministic Deployer Library -/// @notice Library for deterministic contract deployment. -library DeterministicContractDeployer { - error DeploymentFailed(); - - /// @notice Deploys a contract with a deterministically computed address. - /// @param salt A value to modify the deployment address. - /// @param initCode The bytecode of the contract to deploy. - /// @return contractAddress The address of the deployed contract. - function _deploy(bytes memory initCode, bytes32 salt) internal returns (address contractAddress) { - assembly { - // create2(value, memoryAddress, size, salt) - contractAddress := create2(0, add(initCode, 0x20), mload(initCode), salt) - } - - // When deploying with assembly, a revert will not occur if the deployment fails, so manual checks are needed - if (contractAddress == address(0)) { - revert DeploymentFailed(); - } - - return contractAddress; - } - - /// @notice Predicts the address of a contract that would be deployed with create2 and the given parameters. - /// @param initCode The bytecode of the contract to deploy, with constructor arguments already appended - /// @param salt A value to used with create2 to result in a unique the deployment address. - /// @param deployer The address of the account that will deploy the contract. - /// @return address The predicted address of the contract. - function _predictAddressOfUndeployedContract( - bytes memory initCode, - bytes32 salt, - address deployer - ) internal pure returns (address) { - // Current EVM specs use following formula is used to decide contract addresses when deployed with create2 - // address = keccak256(0xff + sender_address + salt + keccak256(initialisation_code))[12:] - bytes32 bytesValue = keccak256(abi.encodePacked(hex"ff", deployer, salt, keccak256(initCode))); - - // Return the left 20 bytes of the 32 byte hash, which is the address of the contract - return address(uint160(uint256(bytesValue))); - } -} From 30eef8500706a815f3dfe6303f0e7e2712f7c0d6 Mon Sep 17 00:00:00 2001 From: Josh Date: Tue, 17 Sep 2024 12:48:24 -0400 Subject: [PATCH 12/48] ccip-precommit --- contracts/gas-snapshots/ccip.gas-snapshot | 12 +++---- .../tokenAdminRegistry/TokenPoolFactory.t.sol | 34 ++++++------------- .../tokenAdminRegistry/TokenPoolFactory.sol | 33 +++++++++--------- 3 files changed, 34 insertions(+), 45 deletions(-) diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot index 562f8937f8..5c8625ba0a 100644 --- a/contracts/gas-snapshots/ccip.gas-snapshot +++ b/contracts/gas-snapshots/ccip.gas-snapshot @@ -944,12 +944,12 @@ TokenPoolAndProxy:test_lockOrBurn_lockRelease_Success() (gas: 5793243) TokenPoolAndProxy:test_setPreviousPool_Success() (gas: 3070731) TokenPoolAndProxyMigration:test_tokenPoolMigration_Success_1_2() (gas: 6434780) TokenPoolAndProxyMigration:test_tokenPoolMigration_Success_1_4() (gas: 6634919) -TokenPoolFactoryTests:test_TokenPoolFactory_Constructor_Revert() (gas: 4159890) -TokenPoolFactoryTests:test_createTokenPool_ExistingRemoteToken_AndPredictPool_Success() (gas: 15494300) -TokenPoolFactoryTests:test_createTokenPool_WithNoExistingRemoteContracts_predict_Success() (gas: 15762046) -TokenPoolFactoryTests:test_createTokenPool_WithNoExistingTokenOnRemoteChain_Success() (gas: 5762358) -TokenPoolFactoryTests:test_createTokenPool_WithRemoteTokenAndRemotePool_Success() (gas: 5917665) -TokenPoolFactoryTests:test_updateRemoteChainConfig_Success() (gas: 85746) +TokenPoolFactoryTests:test_TokenPoolFactory_Constructor_Revert() (gas: 4213251) +TokenPoolFactoryTests:test_createTokenPool_ExistingRemoteToken_AndPredictPool_Success() (gas: 15481114) +TokenPoolFactoryTests:test_createTokenPool_WithNoExistingRemoteContracts_predict_Success() (gas: 15751119) +TokenPoolFactoryTests:test_createTokenPool_WithNoExistingTokenOnRemoteChain_Success() (gas: 5732888) +TokenPoolFactoryTests:test_createTokenPool_WithRemoteTokenAndRemotePool_Success() (gas: 5888865) +TokenPoolFactoryTests:test_updateRemoteChainConfig_Success() (gas: 85691) TokenPoolWithAllowList_applyAllowListUpdates:test_AllowListNotEnabled_Revert() (gas: 1979949) TokenPoolWithAllowList_applyAllowListUpdates:test_OnlyOwner_Revert() (gas: 12107) TokenPoolWithAllowList_applyAllowListUpdates:test_SetAllowListSkipsZero_Success() (gas: 23476) diff --git a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol index a834427c05..4bdfb0d0b2 100644 --- a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol +++ b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol @@ -76,9 +76,8 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { bytes32 dynamicSalt = keccak256(abi.encodePacked(FAKE_SALT, OWNER)); - address predictedTokenAddress = Create2.computeAddress(dynamicSalt, - keccak256(s_tokenInitCode), address(s_tokenPoolFactory) - ); + address predictedTokenAddress = + Create2.computeAddress(dynamicSalt, keccak256(s_tokenInitCode), address(s_tokenPoolFactory)); // Create the constructor params for the predicted pool bytes memory poolCreationParams = abi.encode(predictedTokenAddress, new address[](0), s_rmnProxy, s_sourceRouter); @@ -86,9 +85,8 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { // Predict the address of the pool before we make the tx by using the init code and the params bytes memory predictedPoolInitCode = abi.encodePacked(s_poolInitCode, poolCreationParams); - address predictedPoolAddress = dynamicSalt.computeAddress( - keccak256(predictedPoolInitCode), address(s_tokenPoolFactory) - ); + address predictedPoolAddress = + dynamicSalt.computeAddress(keccak256(predictedPoolInitCode), address(s_tokenPoolFactory)); (address tokenAddress, address poolAddress) = s_tokenPoolFactory.deployTokenAndTokenPool( new TokenPoolFactory.RemoteTokenPoolInfo[](0), s_tokenInitCode, s_poolInitCode, poolCreationParams, FAKE_SALT @@ -151,9 +149,7 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { ); // Predict the address of the token and pool on the DESTINATION chain - address predictedTokenAddress = dynamicSalt.computeAddress( - keccak256(s_tokenInitCode), address(newTokenPoolFactory) - ); + address predictedTokenAddress = dynamicSalt.computeAddress(keccak256(s_tokenInitCode), address(newTokenPoolFactory)); // Since the remote chain information was provided, we should be able to get the information from the newly // deployed token pool using the available getter functions @@ -182,9 +178,8 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { bytes memory predictedPoolInitCode = abi.encodePacked(s_poolInitCode, predictedPoolCreationParams); // Predict the address of the pool on the DESTINATION chain - address predictedPoolAddress = dynamicSalt.computeAddress( - keccak256(predictedPoolInitCode), address(newTokenPoolFactory) - ); + address predictedPoolAddress = + dynamicSalt.computeAddress(keccak256(predictedPoolInitCode), address(newTokenPoolFactory)); // Assert that the address set for the remote pool is the same as the predicted address assertEq( @@ -291,9 +286,8 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { bytes memory predictedPoolInitCode = abi.encodePacked(s_poolInitCode, predictedPoolCreationParams); // Predict the address of the pool on the DESTINATION chain - address predictedPoolAddress = dynamicSalt.computeAddress( - keccak256(predictedPoolInitCode), address(newTokenPoolFactory) - ); + address predictedPoolAddress = + dynamicSalt.computeAddress(keccak256(predictedPoolInitCode), address(newTokenPoolFactory)); // Assert that the address set for the remote pool is the same as the predicted address assertEq( @@ -333,9 +327,7 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { bytes memory RANDOM_TOKEN_ADDRESS = abi.encode(makeAddr("RANDOM_TOKEN")); bytes memory RANDOM_POOL_ADDRESS = abi.encode(makeAddr("RANDOM_POOL")); - address predictedTokenAddress = dynamicSalt.computeAddress( - keccak256(s_tokenInitCode), address(s_tokenPoolFactory) - ); + address predictedTokenAddress = dynamicSalt.computeAddress(keccak256(s_tokenInitCode), address(s_tokenPoolFactory)); // Create the constructor params for the predicted pool bytes memory poolCreationParams = abi.encode(predictedTokenAddress, new address[](0), s_rmnProxy, s_sourceRouter); @@ -344,11 +336,7 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { TokenPoolFactory.RemoteTokenPoolInfo[] memory remoteTokenPools = new TokenPoolFactory.RemoteTokenPoolInfo[](1); remoteTokenPools[0] = TokenPoolFactory.RemoteTokenPoolInfo( - DEST_CHAIN_SELECTOR, - RANDOM_POOL_ADDRESS, - RANDOM_TOKEN_ADDRESS, - "", - RateLimiter.Config(false, 0, 0) + DEST_CHAIN_SELECTOR, RANDOM_POOL_ADDRESS, RANDOM_TOKEN_ADDRESS, "", RateLimiter.Config(false, 0, 0) ); (address tokenAddress, address poolAddress) = s_tokenPoolFactory.deployTokenAndTokenPool( diff --git a/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory.sol b/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory.sol index 91d400b285..3f043a6cec 100644 --- a/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory.sol +++ b/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory.sol @@ -1,8 +1,8 @@ pragma solidity ^0.8.24; +import {IOwnable} from "../../shared/interfaces/IOwnable.sol"; import {ITypeAndVersion} from "../../shared/interfaces/ITypeAndVersion.sol"; import {ITokenAdminRegistry} from "../interfaces/ITokenAdminRegistry.sol"; -import {IOwnable} from "../../shared/interfaces/IOwnable.sol"; import {OwnerIsCreator} from "../../shared/access/OwnerIsCreator.sol"; import {RateLimiter} from "../libraries/RateLimiter.sol"; @@ -21,17 +21,15 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { struct RemoteTokenPoolInfo { uint64 remoteChainSelector; // The CCIP specific selector for the remote chain - bytes remotePoolAddress; // The address of the remote pool to either deploy or use as is. If // the empty parameter flag is provided, the address will be predicted bytes remoteTokenAddress; // The address of the remote token to either deploy or use as is // If the empty parameter flag is provided, the address will be predicted - bytes remoteTokenInitCode; // The init code for the remote token if it needs to be deployed // and includes all the constructor params already appended - - RateLimiter.Config outboundRateLimiterConfig; // The rate limiter config for token messages to be used in the pool. + RateLimiter.Config outboundRateLimiterConfig; // The rate limiter config for token messages to be used in the pool. // The specified rate limit will also be applied to the token pool's inbound messages as well. + } /* solhint-disable gas-struct-packing */ struct RemoteChainConfig { @@ -40,11 +38,10 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { address remoteRouter; /// The router contract on the remote chain address remoteRMNProxy; - /// The RMNProxy contract on the remote chain } + /// The RMNProxy contract on the remote chain /* solhint-enable gas-struct-packing */ - ITokenAdminRegistry internal immutable i_tokenAdminRegistry; RegistryModuleOwnerCustom internal immutable i_registryModuleOwnerCustom; @@ -172,8 +169,9 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { if (bytes4(remoteTokenPools[i].remoteTokenAddress) == EMPTY_PARAMETER_FLAG) { // The user must provide the initCode for the remote token, so we can predict its address correctly. It's // provided in the remoteTokenInitCode field for the remoteTokenPool - - remoteTokenAddress = salt.computeAddress(keccak256(remoteTokenPools[i].remoteTokenInitCode), remoteChainConfig.remotePoolFactory); + + remoteTokenAddress = + salt.computeAddress(keccak256(remoteTokenPools[i].remoteTokenInitCode), remoteChainConfig.remotePoolFactory); // The library returns an EVM-compatible address but chainUpdate takes bytes so we encode it chainUpdate.remoteTokenAddress = abi.encode(remoteTokenAddress); @@ -196,16 +194,19 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { // can be used. // Combine the initCode with the initArgs to create the full initCode - bytes memory remotePoolInitcode = abi.encodePacked(type(BurnMintTokenPool).creationCode, abi.encode( - remoteTokenAddress, new address[](0), remoteChainConfig.remoteRMNProxy, remoteChainConfig.remoteRouter)); - - // Predict the address of the undeployed contract on the destination chain - chainUpdate.remotePoolAddress = abi.encode( - salt.computeAddress(keccak256(remotePoolInitcode), remoteChainConfig.remotePoolFactory) + bytes memory remotePoolInitcode = abi.encodePacked( + type(BurnMintTokenPool).creationCode, + abi.encode( + remoteTokenAddress, new address[](0), remoteChainConfig.remoteRMNProxy, remoteChainConfig.remoteRouter + ) ); - chainUpdate.remotePoolAddress = abi.encode(salt.computeAddress(keccak256(remotePoolInitcode), remoteChainConfig.remotePoolFactory)); + // Predict the address of the undeployed contract on the destination chain + chainUpdate.remotePoolAddress = + abi.encode(salt.computeAddress(keccak256(remotePoolInitcode), remoteChainConfig.remotePoolFactory)); + chainUpdate.remotePoolAddress = + abi.encode(salt.computeAddress(keccak256(remotePoolInitcode), remoteChainConfig.remotePoolFactory)); } else { // If the user already has a remote pool deployed, reuse the address. chainUpdate.remotePoolAddress = remoteTokenPools[i].remotePoolAddress; From 2faa130d684ca59fa3989aa13b0f3e61fbf85836 Mon Sep 17 00:00:00 2001 From: Josh Date: Tue, 17 Sep 2024 13:19:07 -0400 Subject: [PATCH 13/48] add missing vendor files --- .../v5.0.2/contracts/utils/Create2.sol | 92 +++++++++++++++++++ .../v5.0.2/contracts/utils/Errors.sol | 31 +++++++ 2 files changed, 123 insertions(+) create mode 100644 contracts/src/v0.8/vendor/openzeppelin-solidity/v5.0.2/contracts/utils/Create2.sol create mode 100644 contracts/src/v0.8/vendor/openzeppelin-solidity/v5.0.2/contracts/utils/Errors.sol diff --git a/contracts/src/v0.8/vendor/openzeppelin-solidity/v5.0.2/contracts/utils/Create2.sol b/contracts/src/v0.8/vendor/openzeppelin-solidity/v5.0.2/contracts/utils/Create2.sol new file mode 100644 index 0000000000..fe0a6edd56 --- /dev/null +++ b/contracts/src/v0.8/vendor/openzeppelin-solidity/v5.0.2/contracts/utils/Create2.sol @@ -0,0 +1,92 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (utils/Create2.sol) + +pragma solidity ^0.8.20; + +import {Errors} from "./Errors.sol"; + +/** + * @dev Helper to make usage of the `CREATE2` EVM opcode easier and safer. + * `CREATE2` can be used to compute in advance the address where a smart + * contract will be deployed, which allows for interesting new mechanisms known + * as 'counterfactual interactions'. + * + * See the https://eips.ethereum.org/EIPS/eip-1014#motivation[EIP] for more + * information. + */ +library Create2 { + /** + * @dev There's no code to deploy. + */ + error Create2EmptyBytecode(); + + /** + * @dev Deploys a contract using `CREATE2`. The address where the contract + * will be deployed can be known in advance via {computeAddress}. + * + * The bytecode for a contract can be obtained from Solidity with + * `type(contractName).creationCode`. + * + * Requirements: + * + * - `bytecode` must not be empty. + * - `salt` must have not been used for `bytecode` already. + * - the factory must have a balance of at least `amount`. + * - if `amount` is non-zero, `bytecode` must have a `payable` constructor. + */ + function deploy(uint256 amount, bytes32 salt, bytes memory bytecode) internal returns (address addr) { + if (address(this).balance < amount) { + revert Errors.InsufficientBalance(address(this).balance, amount); + } + if (bytecode.length == 0) { + revert Create2EmptyBytecode(); + } + assembly ("memory-safe") { + addr := create2(amount, add(bytecode, 0x20), mload(bytecode), salt) + // if no address was created, and returndata is not empty, bubble revert + if and(iszero(addr), not(iszero(returndatasize()))) { + let p := mload(0x40) + returndatacopy(p, 0, returndatasize()) + revert(p, returndatasize()) + } + } + if (addr == address(0)) { + revert Errors.FailedDeployment(); + } + } + + /** + * @dev Returns the address where a contract will be stored if deployed via {deploy}. Any change in the + * `bytecodeHash` or `salt` will result in a new destination address. + */ + function computeAddress(bytes32 salt, bytes32 bytecodeHash) internal view returns (address) { + return computeAddress(salt, bytecodeHash, address(this)); + } + + /** + * @dev Returns the address where a contract will be stored if deployed via {deploy} from a contract located at + * `deployer`. If `deployer` is this contract's address, returns the same value as {computeAddress}. + */ + function computeAddress(bytes32 salt, bytes32 bytecodeHash, address deployer) internal pure returns (address addr) { + assembly ("memory-safe") { + let ptr := mload(0x40) // Get free memory pointer + + // | | ↓ ptr ... ↓ ptr + 0x0B (start) ... ↓ ptr + 0x20 ... ↓ ptr + 0x40 ... | + // |-------------------|---------------------------------------------------------------------------| + // | bytecodeHash | CCCCCCCCCCCCC...CC | + // | salt | BBBBBBBBBBBBB...BB | + // | deployer | 000000...0000AAAAAAAAAAAAAAAAAAA...AA | + // | 0xFF | FF | + // |-------------------|---------------------------------------------------------------------------| + // | memory | 000000...00FFAAAAAAAAAAAAAAAAAAA...AABBBBBBBBBBBBB...BBCCCCCCCCCCCCC...CC | + // | keccak(start, 85) | ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ | + + mstore(add(ptr, 0x40), bytecodeHash) + mstore(add(ptr, 0x20), salt) + mstore(ptr, deployer) // Right-aligned with 12 preceding garbage bytes + let start := add(ptr, 0x0b) // The hashed data starts at the final garbage byte which we will set to 0xff + mstore8(start, 0xff) + addr := and(keccak256(start, 85), 0xffffffffffffffffffffffffffffffffffffffff) + } + } +} \ No newline at end of file diff --git a/contracts/src/v0.8/vendor/openzeppelin-solidity/v5.0.2/contracts/utils/Errors.sol b/contracts/src/v0.8/vendor/openzeppelin-solidity/v5.0.2/contracts/utils/Errors.sol new file mode 100644 index 0000000000..cb8833b46e --- /dev/null +++ b/contracts/src/v0.8/vendor/openzeppelin-solidity/v5.0.2/contracts/utils/Errors.sol @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.20; + +/** + * @dev Collection of common custom errors used in multiple contracts + * + * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library. + * It is recommended to avoid relying on the error API for critical functionality. + */ +library Errors { + /** + * @dev The ETH balance of the account is not enough to perform the operation. + */ + error InsufficientBalance(uint256 balance, uint256 needed); + + /** + * @dev A call to an address target failed. The target may have reverted. + */ + error FailedCall(); + + /** + * @dev The deployment failed. + */ + error FailedDeployment(); + + /** + * @dev A necessary precompile is missing. + */ + error MissingPrecompile(address); +} \ No newline at end of file From 9f76e1bff949a417bcf9cabab19cce009e24b71a Mon Sep 17 00:00:00 2001 From: Josh Date: Tue, 17 Sep 2024 13:23:11 -0400 Subject: [PATCH 14/48] burn mint formatting --- contracts/src/v0.8/shared/token/ERC20/BurnMintERC20.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/src/v0.8/shared/token/ERC20/BurnMintERC20.sol b/contracts/src/v0.8/shared/token/ERC20/BurnMintERC20.sol index 2da8122ef6..eb0b5f7a27 100644 --- a/contracts/src/v0.8/shared/token/ERC20/BurnMintERC20.sol +++ b/contracts/src/v0.8/shared/token/ERC20/BurnMintERC20.sol @@ -213,7 +213,7 @@ contract BurnMintERC20 is IBurnMintERC20, IERC165, ERC20Burnable, OwnerIsCreator } /// @notice Transfers the CCIPAdmin role to a new address - /// @dev only the owner can call this function, NOT the current ccipAdmin, and 1-step ownership transfer is used. + /// @dev only the owner can call this function, NOT the current ccipAdmin, and 1-step ownership transfer is used. /// @param newAdmin The address to transfer the CCIPAdmin role to. Set to address(0) is a valid way to revoke the role function setCCIPAdmin(address newAdmin) public onlyOwner { address currentAdmin = s_ccipAdmin; From 65395df42209ca5927f09964c7c2ee2bc828b8ba Mon Sep 17 00:00:00 2001 From: Josh Date: Wed, 18 Sep 2024 12:12:48 -0400 Subject: [PATCH 15/48] gas optimizations and formatting cleanup --- contracts/gas-snapshots/ccip.gas-snapshot | 12 +- .../tokenAdminRegistry/TokenPoolFactory.t.sol | 71 +++--- .../tokenAdminRegistry/TokenPoolFactory.sol | 234 +++++++++--------- .../v0.8/shared/token/ERC20/BurnMintERC20.sol | 12 +- 4 files changed, 164 insertions(+), 165 deletions(-) diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot index 5c8625ba0a..fc35df84ff 100644 --- a/contracts/gas-snapshots/ccip.gas-snapshot +++ b/contracts/gas-snapshots/ccip.gas-snapshot @@ -944,12 +944,12 @@ TokenPoolAndProxy:test_lockOrBurn_lockRelease_Success() (gas: 5793243) TokenPoolAndProxy:test_setPreviousPool_Success() (gas: 3070731) TokenPoolAndProxyMigration:test_tokenPoolMigration_Success_1_2() (gas: 6434780) TokenPoolAndProxyMigration:test_tokenPoolMigration_Success_1_4() (gas: 6634919) -TokenPoolFactoryTests:test_TokenPoolFactory_Constructor_Revert() (gas: 4213251) -TokenPoolFactoryTests:test_createTokenPool_ExistingRemoteToken_AndPredictPool_Success() (gas: 15481114) -TokenPoolFactoryTests:test_createTokenPool_WithNoExistingRemoteContracts_predict_Success() (gas: 15751119) -TokenPoolFactoryTests:test_createTokenPool_WithNoExistingTokenOnRemoteChain_Success() (gas: 5732888) -TokenPoolFactoryTests:test_createTokenPool_WithRemoteTokenAndRemotePool_Success() (gas: 5888865) -TokenPoolFactoryTests:test_updateRemoteChainConfig_Success() (gas: 85691) +TokenPoolFactoryTests:test_TokenPoolFactory_Constructor_Revert() (gas: 4141230) +TokenPoolFactoryTests:test_createTokenPool_ExistingRemoteToken_AndPredictPool_Success() (gas: 15409035) +TokenPoolFactoryTests:test_createTokenPool_WithNoExistingRemoteContracts_predict_Success() (gas: 15678921) +TokenPoolFactoryTests:test_createTokenPool_WithNoExistingTokenOnRemoteChain_Success() (gas: 5732921) +TokenPoolFactoryTests:test_createTokenPool_WithRemoteTokenAndRemotePool_Success() (gas: 5887061) +TokenPoolFactoryTests:test_updateRemoteChainConfig_Success() (gas: 86259) TokenPoolWithAllowList_applyAllowListUpdates:test_AllowListNotEnabled_Revert() (gas: 1979949) TokenPoolWithAllowList_applyAllowListUpdates:test_OnlyOwner_Revert() (gas: 12107) TokenPoolWithAllowList_applyAllowListUpdates:test_SetAllowListSkipsZero_Success() (gas: 23476) diff --git a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol index 4bdfb0d0b2..f40af2d0a1 100644 --- a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol +++ b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol @@ -125,14 +125,17 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { TokenPoolFactory.RemoteChainConfig memory remoteChainConfig = TokenPoolFactory.RemoteChainConfig(address(newTokenPoolFactory), address(s_destRouter), address(s_rmnProxy)); - uint64[] memory chainIds = new uint64[](1); - chainIds[0] = DEST_CHAIN_SELECTOR; + { + TokenPoolFactory.RemoteChainConfig[] memory remoteChainConfigs = new TokenPoolFactory.RemoteChainConfig[](1); + remoteChainConfigs[0] = remoteChainConfig; - TokenPoolFactory.RemoteChainConfig[] memory remoteChainConfigs = new TokenPoolFactory.RemoteChainConfig[](1); - remoteChainConfigs[0] = remoteChainConfig; + TokenPoolFactory.RemoteChainConfigUpdate[] memory remoteChainConfigUpdates = + new TokenPoolFactory.RemoteChainConfigUpdate[](1); + remoteChainConfigUpdates[0] = TokenPoolFactory.RemoteChainConfigUpdate(DEST_CHAIN_SELECTOR, remoteChainConfig); - // Add the new token Factory to the remote chain config and set it for the simulated destination chain - s_tokenPoolFactory.updateRemoteChainConfig(chainIds, remoteChainConfigs); + // Add the new token Factory to the remote chain config and set it for the simulated destination chain + s_tokenPoolFactory.updateRemoteChainConfig(remoteChainConfigUpdates); + } // Create an array of remote pools where nothing exists yet, but we want to predict the address for // the new pool and token on DEST_CHAIN_SELECTOR @@ -168,25 +171,27 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { "Token Address should have been predicted" ); - // Create the constructor params for the predicted pool - // The predictedTokenAddress is NOT abi-encoded since the raw evm-address - // is used in the constructor params - bytes memory predictedPoolCreationParams = - abi.encode(predictedTokenAddress, new address[](0), s_rmnProxy, address(s_destRouter)); - - // Take the init code and concat the destination params to it, the initCode shouldn't change - bytes memory predictedPoolInitCode = abi.encodePacked(s_poolInitCode, predictedPoolCreationParams); - - // Predict the address of the pool on the DESTINATION chain - address predictedPoolAddress = - dynamicSalt.computeAddress(keccak256(predictedPoolInitCode), address(newTokenPoolFactory)); - - // Assert that the address set for the remote pool is the same as the predicted address - assertEq( - abi.encode(predictedPoolAddress), - TokenPool(poolAddress).getRemotePool(DEST_CHAIN_SELECTOR), - "Pool Address should have been predicted" - ); + { + // Create the constructor params for the predicted pool + // The predictedTokenAddress is NOT abi-encoded since the raw evm-address + // is used in the constructor params + bytes memory predictedPoolCreationParams = + abi.encode(predictedTokenAddress, new address[](0), s_rmnProxy, address(s_destRouter)); + + // Take the init code and concat the destination params to it, the initCode shouldn't change + bytes memory predictedPoolInitCode = abi.encodePacked(s_poolInitCode, predictedPoolCreationParams); + + // Predict the address of the pool on the DESTINATION chain + address predictedPoolAddress = + dynamicSalt.computeAddress(keccak256(predictedPoolInitCode), address(newTokenPoolFactory)); + + // Assert that the address set for the remote pool is the same as the predicted address + assertEq( + abi.encode(predictedPoolAddress), + TokenPool(poolAddress).getRemotePool(DEST_CHAIN_SELECTOR), + "Pool Address should have been predicted" + ); + } // On the new token pool factory, representing a destination chain, // deploy a new token and a new pool @@ -236,11 +241,12 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { TokenPoolFactory.RemoteChainConfig[] memory remoteChainConfigs = new TokenPoolFactory.RemoteChainConfig[](1); remoteChainConfigs[0] = remoteChainConfig; - uint64[] memory chainIds = new uint64[](1); - chainIds[0] = DEST_CHAIN_SELECTOR; + TokenPoolFactory.RemoteChainConfigUpdate[] memory remoteChainConfigUpdates = + new TokenPoolFactory.RemoteChainConfigUpdate[](1); + remoteChainConfigUpdates[0] = TokenPoolFactory.RemoteChainConfigUpdate(DEST_CHAIN_SELECTOR, remoteChainConfig); // Add the new token Factory to the remote chain config and set it for the simulated destination chain - s_tokenPoolFactory.updateRemoteChainConfig(chainIds, remoteChainConfigs); + s_tokenPoolFactory.updateRemoteChainConfig(remoteChainConfigUpdates); } // Create an array of remote pools where nothing exists yet, but we want to predict the address for @@ -370,9 +376,6 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { } function test_updateRemoteChainConfig_Success() public { - uint64[] memory chainIds = new uint64[](1); - chainIds[0] = DEST_CHAIN_SELECTOR; - TokenPoolFactory.RemoteChainConfig[] memory remoteChainConfigs = new TokenPoolFactory.RemoteChainConfig[](1); TokenPoolFactory.RemoteChainConfig memory remoteChainConfig = TokenPoolFactory.RemoteChainConfig({ @@ -383,7 +386,11 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { remoteChainConfigs[0] = remoteChainConfig; - s_tokenPoolFactory.updateRemoteChainConfig(chainIds, remoteChainConfigs); + TokenPoolFactory.RemoteChainConfigUpdate[] memory remoteChainConfigUpdates = + new TokenPoolFactory.RemoteChainConfigUpdate[](1); + remoteChainConfigUpdates[0] = TokenPoolFactory.RemoteChainConfigUpdate(DEST_CHAIN_SELECTOR, remoteChainConfig); + + s_tokenPoolFactory.updateRemoteChainConfig(remoteChainConfigUpdates); TokenPoolFactory.RemoteChainConfig memory updatedRemoteChainConfig = s_tokenPoolFactory.getRemoteChainConfig(DEST_CHAIN_SELECTOR); diff --git a/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory.sol b/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory.sol index 3f043a6cec..fc671c31d0 100644 --- a/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory.sol +++ b/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory.sol @@ -21,26 +21,34 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { struct RemoteTokenPoolInfo { uint64 remoteChainSelector; // The CCIP specific selector for the remote chain - bytes remotePoolAddress; // The address of the remote pool to either deploy or use as is. If - // the empty parameter flag is provided, the address will be predicted - bytes remoteTokenAddress; // The address of the remote token to either deploy or use as is - // If the empty parameter flag is provided, the address will be predicted - bytes remoteTokenInitCode; // The init code for the remote token if it needs to be deployed - // and includes all the constructor params already appended - RateLimiter.Config outboundRateLimiterConfig; // The rate limiter config for token messages to be used in the pool. - // The specified rate limit will also be applied to the token pool's inbound messages as well. + // The address of the remote pool to either deploy or use as is. If + // the empty parameter flag is provided, the address will be predicted + bytes remotePoolAddress; + // The address of the remote token to either deploy or use as is + // If the empty parameter flag is provided, the address will be predicted + bytes remoteTokenAddress; + // The init code for the remote token if it needs to be deployed + // and includes all the constructor params already appended + bytes remoteTokenInitCode; + // The rate limiter config for token messages to be used in the pool. + // The specified rate limit will also be applied to the token pool's inbound messages as well. + RateLimiter.Config rateLimiterConfig; } - /* solhint-disable gas-struct-packing */ + // solhint-disable-next-line gas-struct-packing struct RemoteChainConfig { - address remotePoolFactory; - /// The factory contract on the remote chain - address remoteRouter; - /// The router contract on the remote chain - address remoteRMNProxy; + address remotePoolFactory; // The factory contract on the remote chain + address remoteRouter; // The router contract on the remote chain + address remoteRMNProxy; // The RMNProxy contract on the remote chain } - /// The RMNProxy contract on the remote chain - /* solhint-enable gas-struct-packing */ + + struct RemoteChainConfigUpdate { + uint64 remoteChainSelector; + RemoteChainConfig remoteChainConfig; + } + + bytes4 public constant EMPTY_PARAMETER_FLAG = bytes4(keccak256("EMPTY_PARAMETER_FLAG")); + string public constant typeAndVersion = "TokenPoolFactory 1.0.0-dev"; ITokenAdminRegistry internal immutable i_tokenAdminRegistry; RegistryModuleOwnerCustom internal immutable i_registryModuleOwnerCustom; @@ -48,9 +56,6 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { address private immutable i_rmnProxy; address private immutable i_ccipRouter; - bytes4 public constant EMPTY_PARAMETER_FLAG = bytes4(keccak256("EMPTY_PARAMETER_FLAG")); - string public constant typeAndVersion = "TokenPoolFactory 1.0.0-dev"; - mapping(uint64 remoteChainSelector => RemoteChainConfig) internal s_remoteChainConfigs; constructor(address tokenAdminRegistry, address tokenAdminModule, address rmnProxy, address ccipRouter) { @@ -64,13 +69,17 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { i_ccipRouter = ccipRouter; } + // ================================================================ + // | Top-Level Deployment | + // ================================================================ + function deployTokenAndTokenPool( RemoteTokenPoolInfo[] calldata remoteTokenPools, bytes memory tokenInitCode, bytes calldata tokenPoolInitCode, bytes memory tokenPoolInitArgs, bytes32 salt - ) external returns (address tokenAddress, address poolAddress) { + ) external returns (address, address) { // Ensure a unique deployment between senders even if the same input parameter is used salt = keccak256(abi.encodePacked(salt, msg.sender)); @@ -78,16 +87,16 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { address token = Create2.deploy(0, salt, tokenInitCode); // Deploy the token pool - poolAddress = _createTokenPool(token, remoteTokenPools, tokenPoolInitCode, tokenPoolInitArgs, salt); + address pool = _createTokenPool(token, remoteTokenPools, tokenPoolInitCode, tokenPoolInitArgs, salt); // Set the token pool for token in the token admin registry since this contract is the token and pool owner - _setTokenPoolInTokenAdminRegistry(token, poolAddress); + _setTokenPoolInTokenAdminRegistry(token, pool); // Transfer the ownership of the token to the msg.sender. // This is a 2 step process and must be accepted in a separate tx. - OwnerIsCreator(token).transferOwnership(address(msg.sender)); // 2 step ownership transfer + IOwnable(token).transferOwnership(msg.sender); - return (token, poolAddress); + return (token, pool); } /// @notice Deploys a token pool with an existing ERC20 token @@ -115,6 +124,10 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { return _createTokenPool(token, remoteTokenPools, tokenPoolInitCode, tokenPoolInitArgs, salt); } + // ================================================================ + // | Pool Deployment/Configuration | + // ================================================================ + /// @notice Deploys a token pool with the given token information and remote token pools /// @param token The token to be used in the token pool /// @param remoteTokenPools An array of remote token pools info to be used in the pool's applyChainUpdates function @@ -130,100 +143,74 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { bytes memory tokenPoolInitArgs, bytes32 salt ) internal returns (address) { - // If the user doesn't want to provide any special parameters which may be neededfor a custom the token pool then - /// use the standard burn/mint token pool params. Since the user can provide custom token pool init code, - // they must also provide custom constructor args. - if (bytes4(tokenPoolInitArgs) == EMPTY_PARAMETER_FLAG) { - tokenPoolInitArgs = abi.encode(token, new address[](0), i_rmnProxy, i_ccipRouter); - } + // Create an array of chain updates to apply to the token pool + TokenPool.ChainUpdate[] memory chainUpdates = new TokenPool.ChainUpdate[](remoteTokenPools.length); + + for (uint256 i = 0; i < remoteTokenPools.length; i++) { + RemoteTokenPoolInfo memory remoteTokenPool = remoteTokenPools[i]; + RemoteChainConfig memory remoteChainConfig = s_remoteChainConfigs[remoteTokenPool.remoteChainSelector]; + + // If the user provides the empty parameter flag, then the address of the token needs to be predicted + // otherwise the address provided is used. + if (bytes4(remoteTokenPool.remoteTokenAddress) == EMPTY_PARAMETER_FLAG) { + // The user must provide the initCode for the remote token, so we can predict its address correctly. It's + // provided in the remoteTokenInitCode field for the remoteTokenPool + remoteTokenPool.remoteTokenAddress = abi.encode( + salt.computeAddress(keccak256(remoteTokenPool.remoteTokenInitCode), remoteChainConfig.remotePoolFactory) + ); + } - // Construct the code that will be deployed from the initCode and the initArgs - address poolAddress = Create2.deploy(0, salt, abi.encodePacked(tokenPoolInitCode, tokenPoolInitArgs)); + // If the user provides the empty parameter flag, the address of the pool should be predicted + if (bytes4(remoteTokenPool.remotePoolAddress) == EMPTY_PARAMETER_FLAG) { + // Generate the initCode that will be used on the remote chain. It is assumed that tokenInitCode + // will be the same on all chains, so it can be reused here. - // Stack Scoping to reduce pressure on stack too deep - { - // Create an array of chain updates to apply to the token pool - TokenPool.ChainUpdate[] memory chainUpdates = new TokenPool.ChainUpdate[](remoteTokenPools.length); - - // For Each remote chain in the remoteTokenPools array - for (uint256 i = 0; i < remoteTokenPools.length; i++) { - // The address of the remote token is needed later in the function as an address, not as - // bytes so we store it in memory here - address remoteTokenAddress; - - // Declaring the struct and updating remote addresses later in the function prevents stack too deep - TokenPool.ChainUpdate memory chainUpdate = TokenPool.ChainUpdate({ - remoteChainSelector: remoteTokenPools[i].remoteChainSelector, - allowed: true, - remotePoolAddress: "", - remoteTokenAddress: "", - outboundRateLimiterConfig: remoteTokenPools[i].outboundRateLimiterConfig, - inboundRateLimiterConfig: remoteTokenPools[i].outboundRateLimiterConfig - }); - - // Get the address of the remote factory, caching the storage value in memory - RemoteChainConfig memory remoteChainConfig = s_remoteChainConfigs[remoteTokenPools[i].remoteChainSelector]; - - // If the user provides the empty parameter flag, then the address of the token needs to be predicted - // otherwise the address provided is used. - if (bytes4(remoteTokenPools[i].remoteTokenAddress) == EMPTY_PARAMETER_FLAG) { - // The user must provide the initCode for the remote token, so we can predict its address correctly. It's - // provided in the remoteTokenInitCode field for the remoteTokenPool - - remoteTokenAddress = - salt.computeAddress(keccak256(remoteTokenPools[i].remoteTokenInitCode), remoteChainConfig.remotePoolFactory); - - // The library returns an EVM-compatible address but chainUpdate takes bytes so we encode it - chainUpdate.remoteTokenAddress = abi.encode(remoteTokenAddress); - } else { - // If the user already has a remote token deployed, reuse the address. We still need it as - // an address for later, so we store it in memory after decoding. - // This assumes that the provided address can be decoded into an EVM address. - remoteTokenAddress = abi.decode(remoteTokenPools[i].remoteTokenAddress, (address)); - - chainUpdate.remoteTokenAddress = remoteTokenPools[i].remoteTokenAddress; - } - - // If the user provides the empty parameter flag, the address of the pool should be predicted - if (bytes4(remoteTokenPools[i].remotePoolAddress) == EMPTY_PARAMETER_FLAG) { - // Generate the initCode that will be used on the remote chain. It is assumed that tokenInitCode - // will be the same on all chains, so it can be reused here. - - // Calculate the remote pool Args with an empty allowList, remote RMN, and Remote Router addresses. - // Since the first constructor parameter is an EVM token address, the remoteTokenAddress acquired earlier. - // can be used. - - // Combine the initCode with the initArgs to create the full initCode - bytes memory remotePoolInitcode = abi.encodePacked( + // Combine the initCode with the initArgs to create the full initCode + bytes32 remotePoolInitcode = keccak256( + bytes.concat( type(BurnMintTokenPool).creationCode, + // Calculate the remote pool Args with an empty allowList, remote RMN, and Remote Router addresses. abi.encode( - remoteTokenAddress, new address[](0), remoteChainConfig.remoteRMNProxy, remoteChainConfig.remoteRouter + abi.decode(remoteTokenPool.remoteTokenAddress, (address)), + new address[](0), + remoteChainConfig.remoteRMNProxy, + remoteChainConfig.remoteRouter ) - ); + ) + ); - // Predict the address of the undeployed contract on the destination chain - chainUpdate.remotePoolAddress = - abi.encode(salt.computeAddress(keccak256(remotePoolInitcode), remoteChainConfig.remotePoolFactory)); + // Predict the address of the undeployed contract on the destination chain + remoteTokenPool.remotePoolAddress = + abi.encode(salt.computeAddress(remotePoolInitcode, remoteChainConfig.remotePoolFactory)); + } - chainUpdate.remotePoolAddress = - abi.encode(salt.computeAddress(keccak256(remotePoolInitcode), remoteChainConfig.remotePoolFactory)); - } else { - // If the user already has a remote pool deployed, reuse the address. - chainUpdate.remotePoolAddress = remoteTokenPools[i].remotePoolAddress; - } + chainUpdates[i] = TokenPool.ChainUpdate({ + remoteChainSelector: remoteTokenPool.remoteChainSelector, + allowed: true, + remotePoolAddress: remoteTokenPool.remotePoolAddress, + remoteTokenAddress: remoteTokenPool.remoteTokenAddress, + outboundRateLimiterConfig: remoteTokenPool.rateLimiterConfig, + inboundRateLimiterConfig: remoteTokenPool.rateLimiterConfig + }); + } - // Update the chainUpdate struct in the chainUpdates array - chainUpdates[i] = chainUpdate; - } + // If the user doesn't want to provide any special parameters which may be needed for a custom the token pool then + /// use the standard burn/mint token pool params. Since the user can provide custom token pool init code, + // they must also provide custom constructor args. + if (bytes4(tokenPoolInitArgs) == EMPTY_PARAMETER_FLAG) { + tokenPoolInitArgs = abi.encode(token, new address[](0), i_rmnProxy, i_ccipRouter); + } - // Apply the chain updates to the token pool - TokenPool(poolAddress).applyChainUpdates(chainUpdates); + // Construct the code that will be deployed from the initCode and the initArgs + address poolAddress = Create2.deploy(0, salt, abi.encodePacked(tokenPoolInitCode, tokenPoolInitArgs)); - // Being the 2 step ownership transfer of the token pool to the msg.sender. - IOwnable(poolAddress).transferOwnership(address(msg.sender)); // 2 step ownership transfer + // Apply the chain updates to the token pool + TokenPool(poolAddress).applyChainUpdates(chainUpdates); - return poolAddress; - } + // Begin the 2 step ownership transfer of the token pool to the msg.sender. + IOwnable(poolAddress).transferOwnership(address(msg.sender)); // 2 step ownership transfer + + return poolAddress; } /// @notice Sets the token pool address in the token admin registry for a newly deployed token pool. @@ -232,27 +219,32 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { /// @param token The address of the token to set the pool for /// @param pool The address of the pool to set in the token admin registry function _setTokenPoolInTokenAdminRegistry(address token, address pool) internal { - // propose this factory as the admin for the token in the token admin registry i_registryModuleOwnerCustom.registerAdminViaOwner(token); - - // Accept the admin role by the token admin registry i_tokenAdminRegistry.acceptAdminRole(token); - - // Set the pool address in the token admin registry i_tokenAdminRegistry.setPool(token, pool); - // Transfer the admin role for the token pool back to the msg.sender. This is a 2 step process - // and must be accepted in a separate tx. + // Begin the 2 admin transfer process which must be accepted in a separate tx. i_tokenAdminRegistry.transferAdminRole(token, msg.sender); } - function updateRemoteChainConfig( - uint64[] calldata remoteChainSelectors, - RemoteChainConfig[] calldata remoteConfigs - ) external onlyOwner { - for (uint256 i = 0; i < remoteChainSelectors.length; i++) { - s_remoteChainConfigs[remoteChainSelectors[i]] = remoteConfigs[i]; - emit RemoteChainConfigUpdated(remoteChainSelectors[i], remoteConfigs[i]); + // ================================================================ + // | Remote Chain Configuration | + // ================================================================ + + /// @notice Updates the remote chain config for the given remote chain selector + /// @param remoteChainConfigs An array of remote chain configs to update + /// @dev The function may only be called by the contract owner. + function updateRemoteChainConfig(RemoteChainConfigUpdate[] calldata remoteChainConfigs) external onlyOwner { + for (uint256 i = 0; i < remoteChainConfigs.length; ++i) { + RemoteChainConfig memory remoteConfig = remoteChainConfigs[i].remoteChainConfig; + + if ( + remoteChainConfigs[i].remoteChainSelector == 0 || remoteConfig.remotePoolFactory == address(0) + || remoteConfig.remoteRouter == address(0) || remoteConfig.remoteRMNProxy == address(0) + ) revert InvalidZeroAddress(); + + s_remoteChainConfigs[remoteChainConfigs[i].remoteChainSelector] = remoteChainConfigs[i].remoteChainConfig; + emit RemoteChainConfigUpdated(remoteChainConfigs[i].remoteChainSelector, remoteConfig); } } diff --git a/contracts/src/v0.8/shared/token/ERC20/BurnMintERC20.sol b/contracts/src/v0.8/shared/token/ERC20/BurnMintERC20.sol index eb0b5f7a27..585372af4c 100644 --- a/contracts/src/v0.8/shared/token/ERC20/BurnMintERC20.sol +++ b/contracts/src/v0.8/shared/token/ERC20/BurnMintERC20.sol @@ -27,11 +27,6 @@ contract BurnMintERC20 is IBurnMintERC20, IERC165, ERC20Burnable, OwnerIsCreator event CCIPAdminTransferred(address indexed previousAdmin, address indexed newAdmin); - // @dev the allowed minter addresses - EnumerableSet.AddressSet internal s_minters; - // @dev the allowed burner addresses - EnumerableSet.AddressSet internal s_burners; - /// @dev The number of decimals for the token uint8 internal immutable i_decimals; @@ -42,6 +37,11 @@ contract BurnMintERC20 is IBurnMintERC20, IERC165, ERC20Burnable, OwnerIsCreator /// and can only be transferred by the owner. address internal s_ccipAdmin; + /// @dev the allowed minter addresses + EnumerableSet.AddressSet internal s_minters; + /// @dev the allowed burner addresses + EnumerableSet.AddressSet internal s_burners; + constructor( string memory name, string memory symbol, @@ -214,7 +214,7 @@ contract BurnMintERC20 is IBurnMintERC20, IERC165, ERC20Burnable, OwnerIsCreator /// @notice Transfers the CCIPAdmin role to a new address /// @dev only the owner can call this function, NOT the current ccipAdmin, and 1-step ownership transfer is used. - /// @param newAdmin The address to transfer the CCIPAdmin role to. Set to address(0) is a valid way to revoke the role + /// @param newAdmin The address to transfer the CCIPAdmin role to. Setting to address(0) is a valid way to revoke the role function setCCIPAdmin(address newAdmin) public onlyOwner { address currentAdmin = s_ccipAdmin; From 83086468ad6d3b2e105036059ade838df9641f64 Mon Sep 17 00:00:00 2001 From: Josh Date: Fri, 20 Sep 2024 10:39:39 -0400 Subject: [PATCH 16/48] snapshot update --- contracts/gas-snapshots/ccip.gas-snapshot | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot index 9477f0aca6..41cf370200 100644 --- a/contracts/gas-snapshots/ccip.gas-snapshot +++ b/contracts/gas-snapshots/ccip.gas-snapshot @@ -975,8 +975,8 @@ TokenPoolAndProxyMigration:test_tokenPoolMigration_Success_1_4() (gas: 6634934) TokenPoolFactoryTests:test_TokenPoolFactory_Constructor_Revert() (gas: 4141230) TokenPoolFactoryTests:test_createTokenPool_ExistingRemoteToken_AndPredictPool_Success() (gas: 15409035) TokenPoolFactoryTests:test_createTokenPool_WithNoExistingRemoteContracts_predict_Success() (gas: 15678921) -TokenPoolFactoryTests:test_createTokenPool_WithNoExistingTokenOnRemoteChain_Success() (gas: 5732921) -TokenPoolFactoryTests:test_createTokenPool_WithRemoteTokenAndRemotePool_Success() (gas: 5887061) +TokenPoolFactoryTests:test_createTokenPool_WithNoExistingTokenOnRemoteChain_Success() (gas: 5732918) +TokenPoolFactoryTests:test_createTokenPool_WithRemoteTokenAndRemotePool_Success() (gas: 5887058) TokenPoolFactoryTests:test_updateRemoteChainConfig_Success() (gas: 86259) TokenPoolWithAllowList_applyAllowListUpdates:test_AllowListNotEnabled_Revert() (gas: 1979943) TokenPoolWithAllowList_applyAllowListUpdates:test_OnlyOwner_Revert() (gas: 12113) From ddef2dbbbe785667d44bed5e4ce907355b6be1b9 Mon Sep 17 00:00:00 2001 From: Josh Date: Mon, 23 Sep 2024 10:39:34 -0400 Subject: [PATCH 17/48] quality cleanup --- contracts/gas-snapshots/ccip.gas-snapshot | 8 ++++---- contracts/gas-snapshots/shared.gas-snapshot | 4 ++-- .../ccip/tokenAdminRegistry/TokenPoolFactory.sol | 16 ++++++++-------- .../v0.8/shared/token/ERC20/BurnMintERC20.sol | 16 ++++++++++++++-- 4 files changed, 28 insertions(+), 16 deletions(-) diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot index 41cf370200..7a241e9cb0 100644 --- a/contracts/gas-snapshots/ccip.gas-snapshot +++ b/contracts/gas-snapshots/ccip.gas-snapshot @@ -973,10 +973,10 @@ TokenPoolAndProxy:test_setPreviousPool_Success() (gas: 3070731) TokenPoolAndProxyMigration:test_tokenPoolMigration_Success_1_2() (gas: 6434801) TokenPoolAndProxyMigration:test_tokenPoolMigration_Success_1_4() (gas: 6634934) TokenPoolFactoryTests:test_TokenPoolFactory_Constructor_Revert() (gas: 4141230) -TokenPoolFactoryTests:test_createTokenPool_ExistingRemoteToken_AndPredictPool_Success() (gas: 15409035) -TokenPoolFactoryTests:test_createTokenPool_WithNoExistingRemoteContracts_predict_Success() (gas: 15678921) -TokenPoolFactoryTests:test_createTokenPool_WithNoExistingTokenOnRemoteChain_Success() (gas: 5732918) -TokenPoolFactoryTests:test_createTokenPool_WithRemoteTokenAndRemotePool_Success() (gas: 5887058) +TokenPoolFactoryTests:test_createTokenPool_ExistingRemoteToken_AndPredictPool_Success() (gas: 15422302) +TokenPoolFactoryTests:test_createTokenPool_WithNoExistingRemoteContracts_predict_Success() (gas: 15692550) +TokenPoolFactoryTests:test_createTokenPool_WithNoExistingTokenOnRemoteChain_Success() (gas: 5740699) +TokenPoolFactoryTests:test_createTokenPool_WithRemoteTokenAndRemotePool_Success() (gas: 5894838) TokenPoolFactoryTests:test_updateRemoteChainConfig_Success() (gas: 86259) TokenPoolWithAllowList_applyAllowListUpdates:test_AllowListNotEnabled_Revert() (gas: 1979943) TokenPoolWithAllowList_applyAllowListUpdates:test_OnlyOwner_Revert() (gas: 12113) diff --git a/contracts/gas-snapshots/shared.gas-snapshot b/contracts/gas-snapshots/shared.gas-snapshot index f4b071612b..70b9ccc982 100644 --- a/contracts/gas-snapshots/shared.gas-snapshot +++ b/contracts/gas-snapshots/shared.gas-snapshot @@ -21,7 +21,7 @@ BurnMintERC20_burnFromAlias:testBurnFromSuccess() (gas: 57932) BurnMintERC20_burnFromAlias:testExceedsBalanceReverts() (gas: 35880) BurnMintERC20_burnFromAlias:testInsufficientAllowanceReverts() (gas: 21869) BurnMintERC20_burnFromAlias:testSenderNotBurnerReverts() (gas: 32137) -BurnMintERC20_constructor:testConstructorSuccess() (gas: 1722070) +BurnMintERC20_constructor:testConstructorSuccess() (gas: 1737298) BurnMintERC20_decreaseApproval:testDecreaseApprovalSuccess() (gas: 31123) BurnMintERC20_grantMintAndBurnRoles:testGrantMintAndBurnRolesSuccess() (gas: 121170) BurnMintERC20_grantRole:testGrantBurnAccessSuccess() (gas: 53407) @@ -31,7 +31,7 @@ BurnMintERC20_increaseApproval:testIncreaseApprovalSuccess() (gas: 44121) BurnMintERC20_mint:testBasicMintSuccess() (gas: 52689) BurnMintERC20_mint:testMaxSupplyExceededReverts() (gas: 50429) BurnMintERC20_mint:testSenderNotMinterReverts() (gas: 30039) -BurnMintERC20_supportsInterface:testConstructorSuccess() (gas: 11072) +BurnMintERC20_supportsInterface:testConstructorSuccess() (gas: 11123) BurnMintERC20_transfer:testInvalidAddressReverts() (gas: 10661) BurnMintERC20_transfer:testTransferSuccess() (gas: 42277) BurnMintERC677_approve:testApproveSuccess() (gas: 55512) diff --git a/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory.sol b/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory.sol index fc671c31d0..8b6612a1a1 100644 --- a/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory.sol +++ b/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory.sol @@ -56,7 +56,7 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { address private immutable i_rmnProxy; address private immutable i_ccipRouter; - mapping(uint64 remoteChainSelector => RemoteChainConfig) internal s_remoteChainConfigs; + mapping(uint64 remoteChainSelector => RemoteChainConfig remoteConfig) internal s_remoteChainConfigs; constructor(address tokenAdminRegistry, address tokenAdminModule, address rmnProxy, address ccipRouter) { if ( @@ -92,8 +92,7 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { // Set the token pool for token in the token admin registry since this contract is the token and pool owner _setTokenPoolInTokenAdminRegistry(token, pool); - // Transfer the ownership of the token to the msg.sender. - // This is a 2 step process and must be accepted in a separate tx. + // Begin the 2 step ownership transfer of the newly deployed token to the msg.sender IOwnable(token).transferOwnership(msg.sender); return (token, pool); @@ -153,7 +152,7 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { // If the user provides the empty parameter flag, then the address of the token needs to be predicted // otherwise the address provided is used. if (bytes4(remoteTokenPool.remoteTokenAddress) == EMPTY_PARAMETER_FLAG) { - // The user must provide the initCode for the remote token, so we can predict its address correctly. It's + // The user must provide the initCode for the remote token, so its address can be predicted correctly. It's // provided in the remoteTokenInitCode field for the remoteTokenPool remoteTokenPool.remoteTokenAddress = abi.encode( salt.computeAddress(keccak256(remoteTokenPool.remoteTokenInitCode), remoteChainConfig.remotePoolFactory) @@ -165,7 +164,7 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { // Generate the initCode that will be used on the remote chain. It is assumed that tokenInitCode // will be the same on all chains, so it can be reused here. - // Combine the initCode with the initArgs to create the full initCode + // Combine the initCode with the initArgs to create the full deployment code bytes32 remotePoolInitcode = keccak256( bytes.concat( type(BurnMintTokenPool).creationCode, @@ -179,7 +178,7 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { ) ); - // Predict the address of the undeployed contract on the destination chain + // Abi encode the computed remote address so it can be used as bytes in the chain update remoteTokenPool.remotePoolAddress = abi.encode(salt.computeAddress(remotePoolInitcode, remoteChainConfig.remotePoolFactory)); } @@ -195,13 +194,13 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { } // If the user doesn't want to provide any special parameters which may be needed for a custom the token pool then - /// use the standard burn/mint token pool params. Since the user can provide custom token pool init code, + // use the standard burn/mint token pool params. Since the user can provide custom token pool init code, // they must also provide custom constructor args. if (bytes4(tokenPoolInitArgs) == EMPTY_PARAMETER_FLAG) { tokenPoolInitArgs = abi.encode(token, new address[](0), i_rmnProxy, i_ccipRouter); } - // Construct the code that will be deployed from the initCode and the initArgs + // Construct the deployment code from the initCode and the initArgs and then deploy address poolAddress = Create2.deploy(0, salt, abi.encodePacked(tokenPoolInitCode, tokenPoolInitArgs)); // Apply the chain updates to the token pool @@ -238,6 +237,7 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { for (uint256 i = 0; i < remoteChainConfigs.length; ++i) { RemoteChainConfig memory remoteConfig = remoteChainConfigs[i].remoteChainConfig; + // Zero address validation check if ( remoteChainConfigs[i].remoteChainSelector == 0 || remoteConfig.remotePoolFactory == address(0) || remoteConfig.remoteRouter == address(0) || remoteConfig.remoteRMNProxy == address(0) diff --git a/contracts/src/v0.8/shared/token/ERC20/BurnMintERC20.sol b/contracts/src/v0.8/shared/token/ERC20/BurnMintERC20.sol index 585372af4c..82f1e3cfe1 100644 --- a/contracts/src/v0.8/shared/token/ERC20/BurnMintERC20.sol +++ b/contracts/src/v0.8/shared/token/ERC20/BurnMintERC20.sol @@ -2,6 +2,7 @@ pragma solidity ^0.8.0; import {IBurnMintERC20} from "../ERC20/IBurnMintERC20.sol"; +import {IOwnable} from "../../interfaces/IOwnable.sol"; import {OwnerIsCreator} from "../../access/OwnerIsCreator.sol"; @@ -69,7 +70,8 @@ contract BurnMintERC20 is IBurnMintERC20, IERC165, ERC20Burnable, OwnerIsCreator return interfaceId == type(IERC20).interfaceId || interfaceId == type(IBurnMintERC20).interfaceId || - interfaceId == type(IERC165).interfaceId; + interfaceId == type(IERC165).interfaceId || + interfaceId == type(IOwnable).interfaceId; } // ================================================================ @@ -99,11 +101,16 @@ contract BurnMintERC20 is IBurnMintERC20, IERC165, ERC20Burnable, OwnerIsCreator } /// @dev Exists to be backwards compatible with the older naming convention. + /// @param spender the account being approved to spend on the users' behalf. + /// @param subtractedValue the amount being removed from the approval. + /// @return success Bool to return if the approval was successfully decreased. function decreaseApproval(address spender, uint256 subtractedValue) external returns (bool success) { return decreaseAllowance(spender, subtractedValue); } /// @dev Exists to be backwards compatible with the older naming convention. + /// @param spender the account being approved to spend on the users' behalf. + /// @param addedValue the amount being added to the approval. function increaseApproval(address spender, uint256 addedValue) external { increaseAllowance(spender, addedValue); } @@ -132,6 +139,7 @@ contract BurnMintERC20 is IBurnMintERC20, IERC165, ERC20Burnable, OwnerIsCreator /// @inheritdoc IBurnMintERC20 /// @dev Alias for BurnFrom for compatibility with the older naming convention. /// @dev Uses burnFrom for all validation & logic. + function burn(address account, uint256 amount) public virtual override { burnFrom(account, amount); } @@ -175,6 +183,7 @@ contract BurnMintERC20 is IBurnMintERC20, IERC165, ERC20Burnable, OwnerIsCreator /// @notice Grants burn role to the given address. /// @dev only the owner can call this function. + /// @param burner the address to grant the burner role to function grantBurnRole(address burner) public onlyOwner { if (s_burners.add(burner)) { emit BurnAccessGranted(burner); @@ -183,6 +192,7 @@ contract BurnMintERC20 is IBurnMintERC20, IERC165, ERC20Burnable, OwnerIsCreator /// @notice Revokes mint role for the given address. /// @dev only the owner can call this function. + /// @param minter the address to revoke the mint role from. function revokeMintRole(address minter) public onlyOwner { if (s_minters.remove(minter)) { emit MintAccessRevoked(minter); @@ -191,6 +201,7 @@ contract BurnMintERC20 is IBurnMintERC20, IERC165, ERC20Burnable, OwnerIsCreator /// @notice Revokes burn role from the given address. /// @dev only the owner can call this function + /// @param burner the address to revoke the burner role from function revokeBurnRole(address burner) public onlyOwner { if (s_burners.remove(burner)) { emit BurnAccessRevoked(burner); @@ -214,7 +225,8 @@ contract BurnMintERC20 is IBurnMintERC20, IERC165, ERC20Burnable, OwnerIsCreator /// @notice Transfers the CCIPAdmin role to a new address /// @dev only the owner can call this function, NOT the current ccipAdmin, and 1-step ownership transfer is used. - /// @param newAdmin The address to transfer the CCIPAdmin role to. Setting to address(0) is a valid way to revoke the role + /// @param newAdmin The address to transfer the CCIPAdmin role to. Setting to address(0) is a valid way to revoke + /// the role function setCCIPAdmin(address newAdmin) public onlyOwner { address currentAdmin = s_ccipAdmin; From 6dd38d9a732450ec9fe2b94f60d824cdd10ca154 Mon Sep 17 00:00:00 2001 From: Josh Date: Mon, 23 Sep 2024 10:45:15 -0400 Subject: [PATCH 18/48] linter fix --- contracts/src/v0.8/shared/token/ERC20/BurnMintERC20.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/src/v0.8/shared/token/ERC20/BurnMintERC20.sol b/contracts/src/v0.8/shared/token/ERC20/BurnMintERC20.sol index 82f1e3cfe1..41d71c6f16 100644 --- a/contracts/src/v0.8/shared/token/ERC20/BurnMintERC20.sol +++ b/contracts/src/v0.8/shared/token/ERC20/BurnMintERC20.sol @@ -225,7 +225,7 @@ contract BurnMintERC20 is IBurnMintERC20, IERC165, ERC20Burnable, OwnerIsCreator /// @notice Transfers the CCIPAdmin role to a new address /// @dev only the owner can call this function, NOT the current ccipAdmin, and 1-step ownership transfer is used. - /// @param newAdmin The address to transfer the CCIPAdmin role to. Setting to address(0) is a valid way to revoke + /// @param newAdmin The address to transfer the CCIPAdmin role to. Setting to address(0) is a valid way to revoke /// the role function setCCIPAdmin(address newAdmin) public onlyOwner { address currentAdmin = s_ccipAdmin; From edc5c27898fe87fd940ac252e6d2fe7c159edca7 Mon Sep 17 00:00:00 2001 From: Josh Date: Tue, 24 Sep 2024 11:40:36 -0400 Subject: [PATCH 19/48] revert empty parameter flag to the empty byte string --- contracts/gas-snapshots/ccip.gas-snapshot | 266 +++++++++--------- .../tokenAdminRegistry/TokenPoolFactory.t.sol | 42 +-- .../tokenAdminRegistry/TokenPoolFactory.sol | 13 +- 3 files changed, 148 insertions(+), 173 deletions(-) diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot index 15a592adc9..7a67cf7098 100644 --- a/contracts/gas-snapshots/ccip.gas-snapshot +++ b/contracts/gas-snapshots/ccip.gas-snapshot @@ -1,10 +1,10 @@ -ARMProxyStandaloneTest:test_ARMCallEmptyContractRevert() (gas: 19675) -ARMProxyStandaloneTest:test_Constructor() (gas: 310043) -ARMProxyStandaloneTest:test_SetARM() (gas: 16587) -ARMProxyStandaloneTest:test_SetARMzero() (gas: 11297) -ARMProxyTest:test_ARMCallRevertReasonForwarded() (gas: 47898) -ARMProxyTest:test_ARMIsBlessed_Success() (gas: 36363) -ARMProxyTest:test_ARMIsCursed_Success() (gas: 49851) +ARMProxyStandaloneTest:test_ARMCallEmptyContractRevert() (gas: 20673) +ARMProxyStandaloneTest:test_Constructor() (gas: 543485) +ARMProxyStandaloneTest:test_SetARM() (gas: 18216) +ARMProxyStandaloneTest:test_SetARMzero() (gas: 12144) +ARMProxyTest:test_ARMCallRevertReasonForwarded() (gas: 49764) +ARMProxyTest:test_ARMIsBlessed_Success() (gas: 39781) +ARMProxyTest:test_ARMIsCursed_Success() (gas: 51846) AggregateTokenLimiter_constructor:test_Constructor_Success() (gas: 27118) AggregateTokenLimiter_getTokenBucket:test_GetTokenBucket_Success() (gas: 19871) AggregateTokenLimiter_getTokenBucket:test_Refill_Success() (gas: 41586) @@ -306,27 +306,27 @@ EVM2EVMOnRamp_withdrawNonLinkFees:test_NonOwnerOrAdmin_Revert() (gas: 15353) EVM2EVMOnRamp_withdrawNonLinkFees:test_SettlingBalance_Success() (gas: 272851) EVM2EVMOnRamp_withdrawNonLinkFees:test_WithdrawNonLinkFees_Success() (gas: 53566) EVM2EVMOnRamp_withdrawNonLinkFees:test_WithdrawToZeroAddress_Revert() (gas: 12875) -EtherSenderReceiverTest_ccipReceive:test_ccipReceive_fallbackToWethTransfer() (gas: 96907) -EtherSenderReceiverTest_ccipReceive:test_ccipReceive_happyPath() (gas: 49775) -EtherSenderReceiverTest_ccipReceive:test_ccipReceive_wrongToken() (gas: 17435) -EtherSenderReceiverTest_ccipReceive:test_ccipReceive_wrongTokenAmount() (gas: 15728) -EtherSenderReceiverTest_ccipSend:test_ccipSend_reverts_insufficientFee_feeToken() (gas: 99909) -EtherSenderReceiverTest_ccipSend:test_ccipSend_reverts_insufficientFee_native() (gas: 76138) -EtherSenderReceiverTest_ccipSend:test_ccipSend_reverts_insufficientFee_weth() (gas: 99931) -EtherSenderReceiverTest_ccipSend:test_ccipSend_success_feeToken() (gas: 145010) -EtherSenderReceiverTest_ccipSend:test_ccipSend_success_native() (gas: 80373) -EtherSenderReceiverTest_ccipSend:test_ccipSend_success_nativeExcess() (gas: 80560) -EtherSenderReceiverTest_ccipSend:test_ccipSend_success_weth() (gas: 96064) -EtherSenderReceiverTest_constructor:test_constructor() (gas: 17553) -EtherSenderReceiverTest_getFee:test_getFee() (gas: 27346) -EtherSenderReceiverTest_validateFeeToken:test_validateFeeToken_reverts_feeToken_tokenAmountNotEqualToMsgValue() (gas: 20375) -EtherSenderReceiverTest_validateFeeToken:test_validateFeeToken_valid_feeToken() (gas: 16724) -EtherSenderReceiverTest_validateFeeToken:test_validateFeeToken_valid_native() (gas: 16657) -EtherSenderReceiverTest_validatedMessage:test_validatedMessage_dataOverwrittenToMsgSender() (gas: 25457) -EtherSenderReceiverTest_validatedMessage:test_validatedMessage_emptyDataOverwrittenToMsgSender() (gas: 25307) -EtherSenderReceiverTest_validatedMessage:test_validatedMessage_invalidTokenAmounts() (gas: 17925) -EtherSenderReceiverTest_validatedMessage:test_validatedMessage_tokenOverwrittenToWeth() (gas: 25329) -EtherSenderReceiverTest_validatedMessage:test_validatedMessage_validMessage_extraArgs() (gas: 26370) +EtherSenderReceiverTest_ccipReceive:test_ccipReceive_fallbackToWethTransfer() (gas: 103814) +EtherSenderReceiverTest_ccipReceive:test_ccipReceive_happyPath() (gas: 54732) +EtherSenderReceiverTest_ccipReceive:test_ccipReceive_wrongToken() (gas: 21881) +EtherSenderReceiverTest_ccipReceive:test_ccipReceive_wrongTokenAmount() (gas: 20674) +EtherSenderReceiverTest_ccipSend:test_ccipSend_reverts_insufficientFee_feeToken() (gas: 116467) +EtherSenderReceiverTest_ccipSend:test_ccipSend_reverts_insufficientFee_native() (gas: 91360) +EtherSenderReceiverTest_ccipSend:test_ccipSend_reverts_insufficientFee_weth() (gas: 116371) +EtherSenderReceiverTest_ccipSend:test_ccipSend_success_feeToken() (gas: 167929) +EtherSenderReceiverTest_ccipSend:test_ccipSend_success_native() (gas: 98200) +EtherSenderReceiverTest_ccipSend:test_ccipSend_success_nativeExcess() (gas: 98574) +EtherSenderReceiverTest_ccipSend:test_ccipSend_success_weth() (gas: 117880) +EtherSenderReceiverTest_constructor:test_constructor() (gas: 19659) +EtherSenderReceiverTest_getFee:test_getFee() (gas: 41207) +EtherSenderReceiverTest_validateFeeToken:test_validateFeeToken_reverts_feeToken_tokenAmountNotEqualToMsgValue() (gas: 22872) +EtherSenderReceiverTest_validateFeeToken:test_validateFeeToken_valid_feeToken() (gas: 18390) +EtherSenderReceiverTest_validateFeeToken:test_validateFeeToken_valid_native() (gas: 18420) +EtherSenderReceiverTest_validatedMessage:test_validatedMessage_dataOverwrittenToMsgSender() (gas: 34950) +EtherSenderReceiverTest_validatedMessage:test_validatedMessage_emptyDataOverwrittenToMsgSender() (gas: 34697) +EtherSenderReceiverTest_validatedMessage:test_validatedMessage_invalidTokenAmounts() (gas: 23796) +EtherSenderReceiverTest_validatedMessage:test_validatedMessage_tokenOverwrittenToWeth() (gas: 34674) +EtherSenderReceiverTest_validatedMessage:test_validatedMessage_validMessage_extraArgs() (gas: 36305) FeeQuoter_applyDestChainConfigUpdates:test_InvalidChainFamilySelector_Revert() (gas: 16686) FeeQuoter_applyDestChainConfigUpdates:test_InvalidDestChainConfigDestChainSelectorEqZero_Revert() (gas: 16588) FeeQuoter_applyDestChainConfigUpdates:test_applyDestChainConfigUpdatesDefaultTxGasLimitEqZero_Revert() (gas: 16630) @@ -484,11 +484,11 @@ LockReleaseTokenPool_withdrawalLiquidity:test_InsufficientLiquidity_Revert() (ga LockReleaseTokenPool_withdrawalLiquidity:test_Unauthorized_Revert() (gas: 11464) LockRelease_setRateLimitAdmin:test_SetRateLimitAdmin_Revert() (gas: 11054) LockRelease_setRateLimitAdmin:test_SetRateLimitAdmin_Success() (gas: 35060) -MerkleMultiProofTest:test_CVE_2023_34459() (gas: 5478) -MerkleMultiProofTest:test_EmptyLeaf_Revert() (gas: 3585) -MerkleMultiProofTest:test_MerkleRoot256() (gas: 394891) -MerkleMultiProofTest:test_MerkleRootSingleLeaf_Success() (gas: 3661) -MerkleMultiProofTest:test_SpecSync_gas() (gas: 34129) +MerkleMultiProofTest:test_CVE_2023_34459() (gas: 6372) +MerkleMultiProofTest:test_EmptyLeaf_Revert() (gas: 4019) +MerkleMultiProofTest:test_MerkleRoot256() (gas: 668330) +MerkleMultiProofTest:test_MerkleRootSingleLeaf_Success() (gas: 4074) +MerkleMultiProofTest:test_SpecSync_gas() (gas: 49338) MockRouterTest:test_ccipSendWithInsufficientNativeTokens_Revert() (gas: 34037) MockRouterTest:test_ccipSendWithInvalidMsgValue_Revert() (gas: 60842) MockRouterTest:test_ccipSendWithLinkFeeTokenAndValidMsgValue_Success() (gas: 126576) @@ -596,31 +596,31 @@ NonceManager_applyPreviousRampsUpdates:test_PreviousRampAlreadySetOnRamp_Revert( NonceManager_applyPreviousRampsUpdates:test_SingleRampUpdate() (gas: 66666) NonceManager_applyPreviousRampsUpdates:test_ZeroInput() (gas: 12070) NonceManager_typeAndVersion:test_typeAndVersion() (gas: 9705) -OCR2BaseNoChecks_setOCR2Config:test_FMustBePositive_Revert() (gas: 12210) -OCR2BaseNoChecks_setOCR2Config:test_RepeatAddress_Revert() (gas: 42431) -OCR2BaseNoChecks_setOCR2Config:test_SetConfigSuccess_gas() (gas: 84597) -OCR2BaseNoChecks_setOCR2Config:test_TooManyTransmitter_Revert() (gas: 38177) -OCR2BaseNoChecks_setOCR2Config:test_TransmitterCannotBeZeroAddress_Revert() (gas: 24308) -OCR2BaseNoChecks_transmit:test_ConfigDigestMismatch_Revert() (gas: 17499) -OCR2BaseNoChecks_transmit:test_ForkedChain_Revert() (gas: 26798) -OCR2BaseNoChecks_transmit:test_TransmitSuccess_gas() (gas: 27499) -OCR2BaseNoChecks_transmit:test_UnAuthorizedTransmitter_Revert() (gas: 21335) -OCR2Base_setOCR2Config:test_FMustBePositive_Revert() (gas: 12216) -OCR2Base_setOCR2Config:test_FTooHigh_Revert() (gas: 12372) -OCR2Base_setOCR2Config:test_OracleOutOfRegister_Revert() (gas: 14919) -OCR2Base_setOCR2Config:test_RepeatAddress_Revert() (gas: 45469) -OCR2Base_setOCR2Config:test_SetConfigSuccess_gas() (gas: 155220) -OCR2Base_setOCR2Config:test_SingerCannotBeZeroAddress_Revert() (gas: 24425) -OCR2Base_setOCR2Config:test_TooManySigners_Revert() (gas: 20535) -OCR2Base_setOCR2Config:test_TransmitterCannotBeZeroAddress_Revert() (gas: 47316) -OCR2Base_transmit:test_ConfigDigestMismatch_Revert() (gas: 19668) -OCR2Base_transmit:test_ForkedChain_Revert() (gas: 37749) -OCR2Base_transmit:test_NonUniqueSignature_Revert() (gas: 55360) -OCR2Base_transmit:test_SignatureOutOfRegistration_Revert() (gas: 20989) -OCR2Base_transmit:test_Transmit2SignersSuccess_gas() (gas: 51689) -OCR2Base_transmit:test_UnAuthorizedTransmitter_Revert() (gas: 23511) -OCR2Base_transmit:test_UnauthorizedSigner_Revert() (gas: 39707) -OCR2Base_transmit:test_WrongNumberOfSignatures_Revert() (gas: 20584) +OCR2BaseNoChecks_setOCR2Config:test_FMustBePositive_Revert() (gas: 15443) +OCR2BaseNoChecks_setOCR2Config:test_RepeatAddress_Revert() (gas: 48841) +OCR2BaseNoChecks_setOCR2Config:test_SetConfigSuccess_gas() (gas: 97138) +OCR2BaseNoChecks_setOCR2Config:test_TooManyTransmitter_Revert() (gas: 75615) +OCR2BaseNoChecks_setOCR2Config:test_TransmitterCannotBeZeroAddress_Revert() (gas: 32515) +OCR2BaseNoChecks_transmit:test_ConfigDigestMismatch_Revert() (gas: 20081) +OCR2BaseNoChecks_transmit:test_ForkedChain_Revert() (gas: 29888) +OCR2BaseNoChecks_transmit:test_TransmitSuccess_gas() (gas: 30530) +OCR2BaseNoChecks_transmit:test_UnAuthorizedTransmitter_Revert() (gas: 25249) +OCR2Base_setOCR2Config:test_FMustBePositive_Revert() (gas: 15449) +OCR2Base_setOCR2Config:test_FTooHigh_Revert() (gas: 15725) +OCR2Base_setOCR2Config:test_OracleOutOfRegister_Revert() (gas: 21647) +OCR2Base_setOCR2Config:test_RepeatAddress_Revert() (gas: 56234) +OCR2Base_setOCR2Config:test_SetConfigSuccess_gas() (gas: 169648) +OCR2Base_setOCR2Config:test_SingerCannotBeZeroAddress_Revert() (gas: 32751) +OCR2Base_setOCR2Config:test_TooManySigners_Revert() (gas: 34759) +OCR2Base_setOCR2Config:test_TransmitterCannotBeZeroAddress_Revert() (gas: 55992) +OCR2Base_transmit:test_ConfigDigestMismatch_Revert() (gas: 22520) +OCR2Base_transmit:test_ForkedChain_Revert() (gas: 42561) +OCR2Base_transmit:test_NonUniqueSignature_Revert() (gas: 62252) +OCR2Base_transmit:test_SignatureOutOfRegistration_Revert() (gas: 24538) +OCR2Base_transmit:test_Transmit2SignersSuccess_gas() (gas: 58490) +OCR2Base_transmit:test_UnAuthorizedTransmitter_Revert() (gas: 27448) +OCR2Base_transmit:test_UnauthorizedSigner_Revert() (gas: 45597) +OCR2Base_transmit:test_WrongNumberOfSignatures_Revert() (gas: 23593) OffRamp_afterOC3ConfigSet:test_afterOCR3ConfigSet_SignatureVerificationDisabled_Revert() (gas: 5656596) OffRamp_applySourceChainConfigUpdates:test_AddMultipleChains_Success() (gas: 469391) OffRamp_applySourceChainConfigUpdates:test_AddNewChain_Success() (gas: 99637) @@ -831,76 +831,76 @@ RMNRemote_verify_withConfigSet:test_verify_ThresholdNotMet_reverts() (gas: 15300 RMNRemote_verify_withConfigSet:test_verify_UnexpectedSigner_reverts() (gas: 387667) RMNRemote_verify_withConfigSet:test_verify_minSignersIsZero_success() (gas: 184524) RMNRemote_verify_withConfigSet:test_verify_success() (gas: 68207) -RMN_constructor:test_Constructor_Success() (gas: 48994) -RMN_getRecordedCurseRelatedOps:test_OpsPostDeployment() (gas: 19732) -RMN_lazyVoteToCurseUpdate_Benchmark:test_VoteToCurseLazilyRetain3VotersUponConfigChange_gas() (gas: 152296) -RMN_ownerUnbless:test_Unbless_Success() (gas: 74936) -RMN_ownerUnvoteToCurse:test_CanBlessAndCurseAfterGlobalCurseIsLifted() (gas: 471829) -RMN_ownerUnvoteToCurse:test_IsIdempotent() (gas: 398492) -RMN_ownerUnvoteToCurse:test_NonOwner_Revert() (gas: 18723) -RMN_ownerUnvoteToCurse:test_OwnerUnvoteToCurseSuccess_gas() (gas: 358084) -RMN_ownerUnvoteToCurse:test_UnknownVoter_Revert() (gas: 33190) -RMN_ownerUnvoteToCurse_Benchmark:test_OwnerUnvoteToCurse_1Voter_LiftsCurse_gas() (gas: 262408) -RMN_permaBlessing:test_PermaBlessing() (gas: 202777) -RMN_setConfig:test_BlessVoterIsZeroAddress_Revert() (gas: 15500) -RMN_setConfig:test_EitherThresholdIsZero_Revert() (gas: 21107) -RMN_setConfig:test_NonOwner_Revert() (gas: 14725) -RMN_setConfig:test_RepeatedAddress_Revert() (gas: 18219) -RMN_setConfig:test_SetConfigSuccess_gas() (gas: 104154) -RMN_setConfig:test_TotalWeightsSmallerThanEachThreshold_Revert() (gas: 30185) -RMN_setConfig:test_VoteToBlessByEjectedVoter_Revert() (gas: 130461) -RMN_setConfig:test_VotersLengthIsZero_Revert() (gas: 12149) -RMN_setConfig:test_WeightIsZeroAddress_Revert() (gas: 15740) -RMN_setConfig_Benchmark_1:test_SetConfig_7Voters_gas() (gas: 659600) -RMN_setConfig_Benchmark_2:test_ResetConfig_7Voters_gas() (gas: 212652) -RMN_unvoteToCurse:test_InvalidCursesHash() (gas: 26430) -RMN_unvoteToCurse:test_OwnerSkips() (gas: 33831) -RMN_unvoteToCurse:test_OwnerSucceeds() (gas: 64005) -RMN_unvoteToCurse:test_UnauthorizedVoter() (gas: 47715) -RMN_unvoteToCurse:test_ValidCursesHash() (gas: 61145) -RMN_unvoteToCurse:test_VotersCantLiftCurseButOwnerCan() (gas: 629190) -RMN_voteToBless:test_Curse_Revert() (gas: 473408) -RMN_voteToBless:test_IsAlreadyBlessed_Revert() (gas: 115435) -RMN_voteToBless:test_RootSuccess() (gas: 558661) -RMN_voteToBless:test_SenderAlreadyVoted_Revert() (gas: 97234) -RMN_voteToBless:test_UnauthorizedVoter_Revert() (gas: 17126) -RMN_voteToBless_Benchmark:test_1RootSuccess_gas() (gas: 44718) -RMN_voteToBless_Benchmark:test_3RootSuccess_gas() (gas: 98694) -RMN_voteToBless_Benchmark:test_5RootSuccess_gas() (gas: 152608) -RMN_voteToBless_Blessed_Benchmark:test_1RootSuccessBecameBlessed_gas() (gas: 29682) -RMN_voteToBless_Blessed_Benchmark:test_1RootSuccess_gas() (gas: 27628) -RMN_voteToBless_Blessed_Benchmark:test_3RootSuccess_gas() (gas: 81626) -RMN_voteToBless_Blessed_Benchmark:test_5RootSuccess_gas() (gas: 135518) -RMN_voteToCurse:test_CurseOnlyWhenThresholdReached_Success() (gas: 1651170) -RMN_voteToCurse:test_EmptySubjects_Revert() (gas: 14061) -RMN_voteToCurse:test_EvenIfAlreadyCursed_Success() (gas: 535124) -RMN_voteToCurse:test_OwnerCanCurseAndUncurse() (gas: 400060) -RMN_voteToCurse:test_RepeatedSubject_Revert() (gas: 144405) -RMN_voteToCurse:test_ReusedCurseId_Revert() (gas: 146972) -RMN_voteToCurse:test_UnauthorizedVoter_Revert() (gas: 12666) -RMN_voteToCurse:test_VoteToCurse_NoCurse_Success() (gas: 187556) -RMN_voteToCurse:test_VoteToCurse_YesCurse_Success() (gas: 473079) -RMN_voteToCurse_2:test_VotesAreDroppedIfSubjectIsNotCursedDuringConfigChange() (gas: 371083) -RMN_voteToCurse_2:test_VotesAreRetainedIfSubjectIsCursedDuringConfigChange() (gas: 1154362) -RMN_voteToCurse_Benchmark_1:test_VoteToCurse_NewSubject_NewVoter_NoCurse_gas() (gas: 141118) -RMN_voteToCurse_Benchmark_1:test_VoteToCurse_NewSubject_NewVoter_YesCurse_gas() (gas: 165258) -RMN_voteToCurse_Benchmark_2:test_VoteToCurse_OldSubject_NewVoter_NoCurse_gas() (gas: 121437) -RMN_voteToCurse_Benchmark_2:test_VoteToCurse_OldSubject_OldVoter_NoCurse_gas() (gas: 98373) -RMN_voteToCurse_Benchmark_3:test_VoteToCurse_OldSubject_NewVoter_YesCurse_gas() (gas: 145784) -RateLimiter_constructor:test_Constructor_Success() (gas: 19734) -RateLimiter_consume:test_AggregateValueMaxCapacityExceeded_Revert() (gas: 16042) -RateLimiter_consume:test_AggregateValueRateLimitReached_Revert() (gas: 22390) -RateLimiter_consume:test_ConsumeAggregateValue_Success() (gas: 31518) -RateLimiter_consume:test_ConsumeTokens_Success() (gas: 20381) -RateLimiter_consume:test_ConsumeUnlimited_Success() (gas: 40687) -RateLimiter_consume:test_ConsumingMoreThanUint128_Revert() (gas: 15822) -RateLimiter_consume:test_RateLimitReachedOverConsecutiveBlocks_Revert() (gas: 25798) -RateLimiter_consume:test_Refill_Success() (gas: 37444) -RateLimiter_consume:test_TokenMaxCapacityExceeded_Revert() (gas: 18388) -RateLimiter_consume:test_TokenRateLimitReached_Revert() (gas: 24886) -RateLimiter_currentTokenBucketState:test_CurrentTokenBucketState_Success() (gas: 38944) -RateLimiter_currentTokenBucketState:test_Refill_Success() (gas: 46849) -RateLimiter_setTokenBucketConfig:test_SetRateLimiterConfig_Success() (gas: 38506) +RMN_constructor:test_Constructor_Success() (gas: 63037) +RMN_getRecordedCurseRelatedOps:test_OpsPostDeployment() (gas: 24609) +RMN_lazyVoteToCurseUpdate_Benchmark:test_VoteToCurseLazilyRetain3VotersUponConfigChange_gas() (gas: 159340) +RMN_ownerUnbless:test_Unbless_Success() (gas: 103665) +RMN_ownerUnvoteToCurse:test_CanBlessAndCurseAfterGlobalCurseIsLifted() (gas: 527240) +RMN_ownerUnvoteToCurse:test_IsIdempotent() (gas: 461028) +RMN_ownerUnvoteToCurse:test_NonOwner_Revert() (gas: 25696) +RMN_ownerUnvoteToCurse:test_OwnerUnvoteToCurseSuccess_gas() (gas: 402269) +RMN_ownerUnvoteToCurse:test_UnknownVoter_Revert() (gas: 37341) +RMN_ownerUnvoteToCurse_Benchmark:test_OwnerUnvoteToCurse_1Voter_LiftsCurse_gas() (gas: 310729) +RMN_permaBlessing:test_PermaBlessing() (gas: 234032) +RMN_setConfig:test_BlessVoterIsZeroAddress_Revert() (gas: 19944) +RMN_setConfig:test_EitherThresholdIsZero_Revert() (gas: 29093) +RMN_setConfig:test_NonOwner_Revert() (gas: 19180) +RMN_setConfig:test_RepeatedAddress_Revert() (gas: 24182) +RMN_setConfig:test_SetConfigSuccess_gas() (gas: 121383) +RMN_setConfig:test_TotalWeightsSmallerThanEachThreshold_Revert() (gas: 42230) +RMN_setConfig:test_VoteToBlessByEjectedVoter_Revert() (gas: 150092) +RMN_setConfig:test_VotersLengthIsZero_Revert() (gas: 13777) +RMN_setConfig:test_WeightIsZeroAddress_Revert() (gas: 20193) +RMN_setConfig_Benchmark_1:test_SetConfig_7Voters_gas() (gas: 699447) +RMN_setConfig_Benchmark_2:test_ResetConfig_7Voters_gas() (gas: 262912) +RMN_unvoteToCurse:test_InvalidCursesHash() (gas: 29467) +RMN_unvoteToCurse:test_OwnerSkips() (gas: 38039) +RMN_unvoteToCurse:test_OwnerSucceeds() (gas: 69773) +RMN_unvoteToCurse:test_UnauthorizedVoter() (gas: 59241) +RMN_unvoteToCurse:test_ValidCursesHash() (gas: 66142) +RMN_unvoteToCurse:test_VotersCantLiftCurseButOwnerCan() (gas: 729679) +RMN_voteToBless:test_Curse_Revert() (gas: 496801) +RMN_voteToBless:test_IsAlreadyBlessed_Revert() (gas: 147850) +RMN_voteToBless:test_RootSuccess() (gas: 745652) +RMN_voteToBless:test_SenderAlreadyVoted_Revert() (gas: 123496) +RMN_voteToBless:test_UnauthorizedVoter_Revert() (gas: 19508) +RMN_voteToBless_Benchmark:test_1RootSuccess_gas() (gas: 49435) +RMN_voteToBless_Benchmark:test_3RootSuccess_gas() (gas: 110271) +RMN_voteToBless_Benchmark:test_5RootSuccess_gas() (gas: 171045) +RMN_voteToBless_Blessed_Benchmark:test_1RootSuccessBecameBlessed_gas() (gas: 34790) +RMN_voteToBless_Blessed_Benchmark:test_1RootSuccess_gas() (gas: 32338) +RMN_voteToBless_Blessed_Benchmark:test_3RootSuccess_gas() (gas: 93196) +RMN_voteToBless_Blessed_Benchmark:test_5RootSuccess_gas() (gas: 153948) +RMN_voteToCurse:test_CurseOnlyWhenThresholdReached_Success() (gas: 1748779) +RMN_voteToCurse:test_EmptySubjects_Revert() (gas: 15996) +RMN_voteToCurse:test_EvenIfAlreadyCursed_Success() (gas: 564086) +RMN_voteToCurse:test_OwnerCanCurseAndUncurse() (gas: 471086) +RMN_voteToCurse:test_RepeatedSubject_Revert() (gas: 151480) +RMN_voteToCurse:test_ReusedCurseId_Revert() (gas: 155411) +RMN_voteToCurse:test_UnauthorizedVoter_Revert() (gas: 14537) +RMN_voteToCurse:test_VoteToCurse_NoCurse_Success() (gas: 203894) +RMN_voteToCurse:test_VoteToCurse_YesCurse_Success() (gas: 495649) +RMN_voteToCurse_2:test_VotesAreDroppedIfSubjectIsNotCursedDuringConfigChange() (gas: 417003) +RMN_voteToCurse_2:test_VotesAreRetainedIfSubjectIsCursedDuringConfigChange() (gas: 1339323) +RMN_voteToCurse_Benchmark_1:test_VoteToCurse_NewSubject_NewVoter_NoCurse_gas() (gas: 146898) +RMN_voteToCurse_Benchmark_1:test_VoteToCurse_NewSubject_NewVoter_YesCurse_gas() (gas: 171152) +RMN_voteToCurse_Benchmark_2:test_VoteToCurse_OldSubject_NewVoter_NoCurse_gas() (gas: 126446) +RMN_voteToCurse_Benchmark_2:test_VoteToCurse_OldSubject_OldVoter_NoCurse_gas() (gas: 102691) +RMN_voteToCurse_Benchmark_3:test_VoteToCurse_OldSubject_NewVoter_YesCurse_gas() (gas: 151187) +RateLimiter_constructor:test_Constructor_Success() (gas: 22964) +RateLimiter_consume:test_AggregateValueMaxCapacityExceeded_Revert() (gas: 19839) +RateLimiter_consume:test_AggregateValueRateLimitReached_Revert() (gas: 28311) +RateLimiter_consume:test_ConsumeAggregateValue_Success() (gas: 39405) +RateLimiter_consume:test_ConsumeTokens_Success() (gas: 21919) +RateLimiter_consume:test_ConsumeUnlimited_Success() (gas: 57402) +RateLimiter_consume:test_ConsumingMoreThanUint128_Revert() (gas: 19531) +RateLimiter_consume:test_RateLimitReachedOverConsecutiveBlocks_Revert() (gas: 33020) +RateLimiter_consume:test_Refill_Success() (gas: 48170) +RateLimiter_consume:test_TokenMaxCapacityExceeded_Revert() (gas: 22450) +RateLimiter_consume:test_TokenRateLimitReached_Revert() (gas: 31057) +RateLimiter_currentTokenBucketState:test_CurrentTokenBucketState_Success() (gas: 49681) +RateLimiter_currentTokenBucketState:test_Refill_Success() (gas: 63750) +RateLimiter_setTokenBucketConfig:test_SetRateLimiterConfig_Success() (gas: 48188) RegistryModuleOwnerCustom_constructor:test_constructor_Revert() (gas: 36033) RegistryModuleOwnerCustom_registerAdminViaGetCCIPAdmin:test_registerAdminViaGetCCIPAdmin_Revert() (gas: 19739) RegistryModuleOwnerCustom_registerAdminViaGetCCIPAdmin:test_registerAdminViaGetCCIPAdmin_Success() (gas: 130086) @@ -972,11 +972,11 @@ TokenPoolAndProxy:test_lockOrBurn_lockRelease_Success() (gas: 5793246) TokenPoolAndProxy:test_setPreviousPool_Success() (gas: 3070731) TokenPoolAndProxyMigration:test_tokenPoolMigration_Success_1_2() (gas: 6434801) TokenPoolAndProxyMigration:test_tokenPoolMigration_Success_1_4() (gas: 6634934) -TokenPoolFactoryTests:test_TokenPoolFactory_Constructor_Revert() (gas: 4141230) -TokenPoolFactoryTests:test_createTokenPool_ExistingRemoteToken_AndPredictPool_Success() (gas: 15422302) -TokenPoolFactoryTests:test_createTokenPool_WithNoExistingRemoteContracts_predict_Success() (gas: 15692550) -TokenPoolFactoryTests:test_createTokenPool_WithNoExistingTokenOnRemoteChain_Success() (gas: 5740699) -TokenPoolFactoryTests:test_createTokenPool_WithRemoteTokenAndRemotePool_Success() (gas: 5894838) +TokenPoolFactoryTests:test_TokenPoolFactory_Constructor_Revert() (gas: 4118758) +TokenPoolFactoryTests:test_createTokenPool_ExistingRemoteToken_AndPredictPool_Success() (gas: 15396183) +TokenPoolFactoryTests:test_createTokenPool_WithNoExistingRemoteContracts_predict_Success() (gas: 15665428) +TokenPoolFactoryTests:test_createTokenPool_WithNoExistingTokenOnRemoteChain_Success() (gas: 5740557) +TokenPoolFactoryTests:test_createTokenPool_WithRemoteTokenAndRemotePool_Success() (gas: 5894400) TokenPoolFactoryTests:test_updateRemoteChainConfig_Success() (gas: 86259) TokenPoolWithAllowList_applyAllowListUpdates:test_AllowListNotEnabled_Revert() (gas: 1979943) TokenPoolWithAllowList_applyAllowListUpdates:test_OnlyOwner_Revert() (gas: 12113) diff --git a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol index f40af2d0a1..a309713d2d 100644 --- a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol +++ b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol @@ -144,11 +144,7 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { // The only field that matters is DEST_CHAIN_SELECTOR because we dont want any existing token pool or token // on the remote chain remoteTokenPools[0] = TokenPoolFactory.RemoteTokenPoolInfo( - DEST_CHAIN_SELECTOR, - abi.encode(s_tokenPoolFactory.EMPTY_PARAMETER_FLAG()), - abi.encode(s_tokenPoolFactory.EMPTY_PARAMETER_FLAG()), - s_tokenInitCode, - RateLimiter.Config(false, 0, 0) + DEST_CHAIN_SELECTOR, "", "", s_tokenInitCode, RateLimiter.Config(false, 0, 0) ); // Predict the address of the token and pool on the DESTINATION chain @@ -156,13 +152,8 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { // Since the remote chain information was provided, we should be able to get the information from the newly // deployed token pool using the available getter functions - (, address poolAddress) = s_tokenPoolFactory.deployTokenAndTokenPool( - remoteTokenPools, - s_tokenInitCode, - s_poolInitCode, - abi.encode(s_tokenPoolFactory.EMPTY_PARAMETER_FLAG()), - FAKE_SALT - ); + (, address poolAddress) = + s_tokenPoolFactory.deployTokenAndTokenPool(remoteTokenPools, s_tokenInitCode, s_poolInitCode, "", FAKE_SALT); // Ensure that the remote Token was set to the one we predicted assertEq( @@ -196,11 +187,7 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { // On the new token pool factory, representing a destination chain, // deploy a new token and a new pool (address newTokenAddress, address newPoolAddress) = newTokenPoolFactory.deployTokenAndTokenPool( - new TokenPoolFactory.RemoteTokenPoolInfo[](0), - s_tokenInitCode, - s_poolInitCode, - abi.encode(s_tokenPoolFactory.EMPTY_PARAMETER_FLAG()), - FAKE_SALT + new TokenPoolFactory.RemoteTokenPoolInfo[](0), s_tokenInitCode, s_poolInitCode, "", FAKE_SALT ); assertEq( @@ -256,22 +243,13 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { // The only field that matters is DEST_CHAIN_SELECTOR because we dont want any existing token pool or token // on the remote chain remoteTokenPools[0] = TokenPoolFactory.RemoteTokenPoolInfo( - DEST_CHAIN_SELECTOR, - abi.encode(s_tokenPoolFactory.EMPTY_PARAMETER_FLAG()), - abi.encode(address(newRemoteToken)), - s_tokenInitCode, - RateLimiter.Config(false, 0, 0) + DEST_CHAIN_SELECTOR, "", abi.encode(address(newRemoteToken)), s_tokenInitCode, RateLimiter.Config(false, 0, 0) ); // Since the remote chain information was provided, we should be able to get the information from the newly // deployed token pool using the available getter functions - (address tokenAddress, address poolAddress) = s_tokenPoolFactory.deployTokenAndTokenPool( - remoteTokenPools, - s_tokenInitCode, - s_poolInitCode, - abi.encode(s_tokenPoolFactory.EMPTY_PARAMETER_FLAG()), - FAKE_SALT - ); + (address tokenAddress, address poolAddress) = + s_tokenPoolFactory.deployTokenAndTokenPool(remoteTokenPools, s_tokenInitCode, s_poolInitCode, "", FAKE_SALT); assertEq(address(TokenPool(poolAddress).getToken()), tokenAddress, "Token Address should have been set locally"); @@ -305,11 +283,7 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { // On the new token pool factory, representing a destination chain, // deploy a new token and a new pool address newPoolAddress = newTokenPoolFactory.deployTokenPoolWithExistingToken( - address(newRemoteToken), - new TokenPoolFactory.RemoteTokenPoolInfo[](0), - s_poolInitCode, - abi.encode(s_tokenPoolFactory.EMPTY_PARAMETER_FLAG()), - FAKE_SALT + address(newRemoteToken), new TokenPoolFactory.RemoteTokenPoolInfo[](0), s_poolInitCode, "", FAKE_SALT ); assertEq( diff --git a/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory.sol b/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory.sol index 8b6612a1a1..13bf738eb9 100644 --- a/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory.sol +++ b/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory.sol @@ -149,9 +149,9 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { RemoteTokenPoolInfo memory remoteTokenPool = remoteTokenPools[i]; RemoteChainConfig memory remoteChainConfig = s_remoteChainConfigs[remoteTokenPool.remoteChainSelector]; - // If the user provides the empty parameter flag, then the address of the token needs to be predicted - // otherwise the address provided is used. - if (bytes4(remoteTokenPool.remoteTokenAddress) == EMPTY_PARAMETER_FLAG) { + // If the user provides an empty byte string, indicated no token has already been deployed, + // then the address of the token needs to be predicted. Otherwise the address provided will be used. + if (remoteTokenPool.remoteTokenAddress.length == 0) { // The user must provide the initCode for the remote token, so its address can be predicted correctly. It's // provided in the remoteTokenInitCode field for the remoteTokenPool remoteTokenPool.remoteTokenAddress = abi.encode( @@ -159,8 +159,9 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { ); } - // If the user provides the empty parameter flag, the address of the pool should be predicted - if (bytes4(remoteTokenPool.remotePoolAddress) == EMPTY_PARAMETER_FLAG) { + // If the user provides an empty byte string parameter, indicating the pool has not been deployed yet, + // the address of the pool should be predicted. Otherwise use the provided address. + if (remoteTokenPool.remotePoolAddress.length == 0) { // Generate the initCode that will be used on the remote chain. It is assumed that tokenInitCode // will be the same on all chains, so it can be reused here. @@ -196,7 +197,7 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { // If the user doesn't want to provide any special parameters which may be needed for a custom the token pool then // use the standard burn/mint token pool params. Since the user can provide custom token pool init code, // they must also provide custom constructor args. - if (bytes4(tokenPoolInitArgs) == EMPTY_PARAMETER_FLAG) { + if (tokenPoolInitArgs.length == 0) { tokenPoolInitArgs = abi.encode(token, new address[](0), i_rmnProxy, i_ccipRouter); } From 2ee8c295a2e5965d51bb258542781563820e113e Mon Sep 17 00:00:00 2001 From: Josh Date: Tue, 24 Sep 2024 12:58:15 -0400 Subject: [PATCH 20/48] gas snapshot fix --- contracts/gas-snapshots/ccip.gas-snapshot | 256 +++++++++++----------- 1 file changed, 128 insertions(+), 128 deletions(-) diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot index 7a67cf7098..f1900effc2 100644 --- a/contracts/gas-snapshots/ccip.gas-snapshot +++ b/contracts/gas-snapshots/ccip.gas-snapshot @@ -1,10 +1,10 @@ -ARMProxyStandaloneTest:test_ARMCallEmptyContractRevert() (gas: 20673) -ARMProxyStandaloneTest:test_Constructor() (gas: 543485) -ARMProxyStandaloneTest:test_SetARM() (gas: 18216) -ARMProxyStandaloneTest:test_SetARMzero() (gas: 12144) -ARMProxyTest:test_ARMCallRevertReasonForwarded() (gas: 49764) -ARMProxyTest:test_ARMIsBlessed_Success() (gas: 39781) -ARMProxyTest:test_ARMIsCursed_Success() (gas: 51846) +ARMProxyStandaloneTest:test_ARMCallEmptyContractRevert() (gas: 19675) +ARMProxyStandaloneTest:test_Constructor() (gas: 310043) +ARMProxyStandaloneTest:test_SetARM() (gas: 16587) +ARMProxyStandaloneTest:test_SetARMzero() (gas: 11297) +ARMProxyTest:test_ARMCallRevertReasonForwarded() (gas: 47898) +ARMProxyTest:test_ARMIsBlessed_Success() (gas: 36363) +ARMProxyTest:test_ARMIsCursed_Success() (gas: 49851) AggregateTokenLimiter_constructor:test_Constructor_Success() (gas: 27118) AggregateTokenLimiter_getTokenBucket:test_GetTokenBucket_Success() (gas: 19871) AggregateTokenLimiter_getTokenBucket:test_Refill_Success() (gas: 41586) @@ -306,27 +306,27 @@ EVM2EVMOnRamp_withdrawNonLinkFees:test_NonOwnerOrAdmin_Revert() (gas: 15353) EVM2EVMOnRamp_withdrawNonLinkFees:test_SettlingBalance_Success() (gas: 272851) EVM2EVMOnRamp_withdrawNonLinkFees:test_WithdrawNonLinkFees_Success() (gas: 53566) EVM2EVMOnRamp_withdrawNonLinkFees:test_WithdrawToZeroAddress_Revert() (gas: 12875) -EtherSenderReceiverTest_ccipReceive:test_ccipReceive_fallbackToWethTransfer() (gas: 103814) -EtherSenderReceiverTest_ccipReceive:test_ccipReceive_happyPath() (gas: 54732) -EtherSenderReceiverTest_ccipReceive:test_ccipReceive_wrongToken() (gas: 21881) -EtherSenderReceiverTest_ccipReceive:test_ccipReceive_wrongTokenAmount() (gas: 20674) -EtherSenderReceiverTest_ccipSend:test_ccipSend_reverts_insufficientFee_feeToken() (gas: 116467) -EtherSenderReceiverTest_ccipSend:test_ccipSend_reverts_insufficientFee_native() (gas: 91360) -EtherSenderReceiverTest_ccipSend:test_ccipSend_reverts_insufficientFee_weth() (gas: 116371) -EtherSenderReceiverTest_ccipSend:test_ccipSend_success_feeToken() (gas: 167929) -EtherSenderReceiverTest_ccipSend:test_ccipSend_success_native() (gas: 98200) -EtherSenderReceiverTest_ccipSend:test_ccipSend_success_nativeExcess() (gas: 98574) -EtherSenderReceiverTest_ccipSend:test_ccipSend_success_weth() (gas: 117880) -EtherSenderReceiverTest_constructor:test_constructor() (gas: 19659) -EtherSenderReceiverTest_getFee:test_getFee() (gas: 41207) -EtherSenderReceiverTest_validateFeeToken:test_validateFeeToken_reverts_feeToken_tokenAmountNotEqualToMsgValue() (gas: 22872) -EtherSenderReceiverTest_validateFeeToken:test_validateFeeToken_valid_feeToken() (gas: 18390) -EtherSenderReceiverTest_validateFeeToken:test_validateFeeToken_valid_native() (gas: 18420) -EtherSenderReceiverTest_validatedMessage:test_validatedMessage_dataOverwrittenToMsgSender() (gas: 34950) -EtherSenderReceiverTest_validatedMessage:test_validatedMessage_emptyDataOverwrittenToMsgSender() (gas: 34697) -EtherSenderReceiverTest_validatedMessage:test_validatedMessage_invalidTokenAmounts() (gas: 23796) -EtherSenderReceiverTest_validatedMessage:test_validatedMessage_tokenOverwrittenToWeth() (gas: 34674) -EtherSenderReceiverTest_validatedMessage:test_validatedMessage_validMessage_extraArgs() (gas: 36305) +EtherSenderReceiverTest_ccipReceive:test_ccipReceive_fallbackToWethTransfer() (gas: 96907) +EtherSenderReceiverTest_ccipReceive:test_ccipReceive_happyPath() (gas: 49775) +EtherSenderReceiverTest_ccipReceive:test_ccipReceive_wrongToken() (gas: 17435) +EtherSenderReceiverTest_ccipReceive:test_ccipReceive_wrongTokenAmount() (gas: 15728) +EtherSenderReceiverTest_ccipSend:test_ccipSend_reverts_insufficientFee_feeToken() (gas: 99909) +EtherSenderReceiverTest_ccipSend:test_ccipSend_reverts_insufficientFee_native() (gas: 76138) +EtherSenderReceiverTest_ccipSend:test_ccipSend_reverts_insufficientFee_weth() (gas: 99931) +EtherSenderReceiverTest_ccipSend:test_ccipSend_success_feeToken() (gas: 145010) +EtherSenderReceiverTest_ccipSend:test_ccipSend_success_native() (gas: 80373) +EtherSenderReceiverTest_ccipSend:test_ccipSend_success_nativeExcess() (gas: 80560) +EtherSenderReceiverTest_ccipSend:test_ccipSend_success_weth() (gas: 96064) +EtherSenderReceiverTest_constructor:test_constructor() (gas: 17553) +EtherSenderReceiverTest_getFee:test_getFee() (gas: 27346) +EtherSenderReceiverTest_validateFeeToken:test_validateFeeToken_reverts_feeToken_tokenAmountNotEqualToMsgValue() (gas: 20375) +EtherSenderReceiverTest_validateFeeToken:test_validateFeeToken_valid_feeToken() (gas: 16724) +EtherSenderReceiverTest_validateFeeToken:test_validateFeeToken_valid_native() (gas: 16657) +EtherSenderReceiverTest_validatedMessage:test_validatedMessage_dataOverwrittenToMsgSender() (gas: 25457) +EtherSenderReceiverTest_validatedMessage:test_validatedMessage_emptyDataOverwrittenToMsgSender() (gas: 25307) +EtherSenderReceiverTest_validatedMessage:test_validatedMessage_invalidTokenAmounts() (gas: 17925) +EtherSenderReceiverTest_validatedMessage:test_validatedMessage_tokenOverwrittenToWeth() (gas: 25329) +EtherSenderReceiverTest_validatedMessage:test_validatedMessage_validMessage_extraArgs() (gas: 26370) FeeQuoter_applyDestChainConfigUpdates:test_InvalidChainFamilySelector_Revert() (gas: 16686) FeeQuoter_applyDestChainConfigUpdates:test_InvalidDestChainConfigDestChainSelectorEqZero_Revert() (gas: 16588) FeeQuoter_applyDestChainConfigUpdates:test_applyDestChainConfigUpdatesDefaultTxGasLimitEqZero_Revert() (gas: 16630) @@ -484,11 +484,11 @@ LockReleaseTokenPool_withdrawalLiquidity:test_InsufficientLiquidity_Revert() (ga LockReleaseTokenPool_withdrawalLiquidity:test_Unauthorized_Revert() (gas: 11464) LockRelease_setRateLimitAdmin:test_SetRateLimitAdmin_Revert() (gas: 11054) LockRelease_setRateLimitAdmin:test_SetRateLimitAdmin_Success() (gas: 35060) -MerkleMultiProofTest:test_CVE_2023_34459() (gas: 6372) -MerkleMultiProofTest:test_EmptyLeaf_Revert() (gas: 4019) -MerkleMultiProofTest:test_MerkleRoot256() (gas: 668330) -MerkleMultiProofTest:test_MerkleRootSingleLeaf_Success() (gas: 4074) -MerkleMultiProofTest:test_SpecSync_gas() (gas: 49338) +MerkleMultiProofTest:test_CVE_2023_34459() (gas: 5478) +MerkleMultiProofTest:test_EmptyLeaf_Revert() (gas: 3585) +MerkleMultiProofTest:test_MerkleRoot256() (gas: 394891) +MerkleMultiProofTest:test_MerkleRootSingleLeaf_Success() (gas: 3661) +MerkleMultiProofTest:test_SpecSync_gas() (gas: 34129) MockRouterTest:test_ccipSendWithInsufficientNativeTokens_Revert() (gas: 34037) MockRouterTest:test_ccipSendWithInvalidMsgValue_Revert() (gas: 60842) MockRouterTest:test_ccipSendWithLinkFeeTokenAndValidMsgValue_Success() (gas: 126576) @@ -596,31 +596,31 @@ NonceManager_applyPreviousRampsUpdates:test_PreviousRampAlreadySetOnRamp_Revert( NonceManager_applyPreviousRampsUpdates:test_SingleRampUpdate() (gas: 66666) NonceManager_applyPreviousRampsUpdates:test_ZeroInput() (gas: 12070) NonceManager_typeAndVersion:test_typeAndVersion() (gas: 9705) -OCR2BaseNoChecks_setOCR2Config:test_FMustBePositive_Revert() (gas: 15443) -OCR2BaseNoChecks_setOCR2Config:test_RepeatAddress_Revert() (gas: 48841) -OCR2BaseNoChecks_setOCR2Config:test_SetConfigSuccess_gas() (gas: 97138) -OCR2BaseNoChecks_setOCR2Config:test_TooManyTransmitter_Revert() (gas: 75615) -OCR2BaseNoChecks_setOCR2Config:test_TransmitterCannotBeZeroAddress_Revert() (gas: 32515) -OCR2BaseNoChecks_transmit:test_ConfigDigestMismatch_Revert() (gas: 20081) -OCR2BaseNoChecks_transmit:test_ForkedChain_Revert() (gas: 29888) -OCR2BaseNoChecks_transmit:test_TransmitSuccess_gas() (gas: 30530) -OCR2BaseNoChecks_transmit:test_UnAuthorizedTransmitter_Revert() (gas: 25249) -OCR2Base_setOCR2Config:test_FMustBePositive_Revert() (gas: 15449) -OCR2Base_setOCR2Config:test_FTooHigh_Revert() (gas: 15725) -OCR2Base_setOCR2Config:test_OracleOutOfRegister_Revert() (gas: 21647) -OCR2Base_setOCR2Config:test_RepeatAddress_Revert() (gas: 56234) -OCR2Base_setOCR2Config:test_SetConfigSuccess_gas() (gas: 169648) -OCR2Base_setOCR2Config:test_SingerCannotBeZeroAddress_Revert() (gas: 32751) -OCR2Base_setOCR2Config:test_TooManySigners_Revert() (gas: 34759) -OCR2Base_setOCR2Config:test_TransmitterCannotBeZeroAddress_Revert() (gas: 55992) -OCR2Base_transmit:test_ConfigDigestMismatch_Revert() (gas: 22520) -OCR2Base_transmit:test_ForkedChain_Revert() (gas: 42561) -OCR2Base_transmit:test_NonUniqueSignature_Revert() (gas: 62252) -OCR2Base_transmit:test_SignatureOutOfRegistration_Revert() (gas: 24538) -OCR2Base_transmit:test_Transmit2SignersSuccess_gas() (gas: 58490) -OCR2Base_transmit:test_UnAuthorizedTransmitter_Revert() (gas: 27448) -OCR2Base_transmit:test_UnauthorizedSigner_Revert() (gas: 45597) -OCR2Base_transmit:test_WrongNumberOfSignatures_Revert() (gas: 23593) +OCR2BaseNoChecks_setOCR2Config:test_FMustBePositive_Revert() (gas: 12210) +OCR2BaseNoChecks_setOCR2Config:test_RepeatAddress_Revert() (gas: 42431) +OCR2BaseNoChecks_setOCR2Config:test_SetConfigSuccess_gas() (gas: 84597) +OCR2BaseNoChecks_setOCR2Config:test_TooManyTransmitter_Revert() (gas: 38177) +OCR2BaseNoChecks_setOCR2Config:test_TransmitterCannotBeZeroAddress_Revert() (gas: 24308) +OCR2BaseNoChecks_transmit:test_ConfigDigestMismatch_Revert() (gas: 17499) +OCR2BaseNoChecks_transmit:test_ForkedChain_Revert() (gas: 26798) +OCR2BaseNoChecks_transmit:test_TransmitSuccess_gas() (gas: 27499) +OCR2BaseNoChecks_transmit:test_UnAuthorizedTransmitter_Revert() (gas: 21335) +OCR2Base_setOCR2Config:test_FMustBePositive_Revert() (gas: 12216) +OCR2Base_setOCR2Config:test_FTooHigh_Revert() (gas: 12372) +OCR2Base_setOCR2Config:test_OracleOutOfRegister_Revert() (gas: 14919) +OCR2Base_setOCR2Config:test_RepeatAddress_Revert() (gas: 45469) +OCR2Base_setOCR2Config:test_SetConfigSuccess_gas() (gas: 155220) +OCR2Base_setOCR2Config:test_SingerCannotBeZeroAddress_Revert() (gas: 24425) +OCR2Base_setOCR2Config:test_TooManySigners_Revert() (gas: 20535) +OCR2Base_setOCR2Config:test_TransmitterCannotBeZeroAddress_Revert() (gas: 47316) +OCR2Base_transmit:test_ConfigDigestMismatch_Revert() (gas: 19668) +OCR2Base_transmit:test_ForkedChain_Revert() (gas: 37749) +OCR2Base_transmit:test_NonUniqueSignature_Revert() (gas: 55360) +OCR2Base_transmit:test_SignatureOutOfRegistration_Revert() (gas: 20989) +OCR2Base_transmit:test_Transmit2SignersSuccess_gas() (gas: 51689) +OCR2Base_transmit:test_UnAuthorizedTransmitter_Revert() (gas: 23511) +OCR2Base_transmit:test_UnauthorizedSigner_Revert() (gas: 39707) +OCR2Base_transmit:test_WrongNumberOfSignatures_Revert() (gas: 20584) OffRamp_afterOC3ConfigSet:test_afterOCR3ConfigSet_SignatureVerificationDisabled_Revert() (gas: 5656596) OffRamp_applySourceChainConfigUpdates:test_AddMultipleChains_Success() (gas: 469391) OffRamp_applySourceChainConfigUpdates:test_AddNewChain_Success() (gas: 99637) @@ -831,76 +831,76 @@ RMNRemote_verify_withConfigSet:test_verify_ThresholdNotMet_reverts() (gas: 15300 RMNRemote_verify_withConfigSet:test_verify_UnexpectedSigner_reverts() (gas: 387667) RMNRemote_verify_withConfigSet:test_verify_minSignersIsZero_success() (gas: 184524) RMNRemote_verify_withConfigSet:test_verify_success() (gas: 68207) -RMN_constructor:test_Constructor_Success() (gas: 63037) -RMN_getRecordedCurseRelatedOps:test_OpsPostDeployment() (gas: 24609) -RMN_lazyVoteToCurseUpdate_Benchmark:test_VoteToCurseLazilyRetain3VotersUponConfigChange_gas() (gas: 159340) -RMN_ownerUnbless:test_Unbless_Success() (gas: 103665) -RMN_ownerUnvoteToCurse:test_CanBlessAndCurseAfterGlobalCurseIsLifted() (gas: 527240) -RMN_ownerUnvoteToCurse:test_IsIdempotent() (gas: 461028) -RMN_ownerUnvoteToCurse:test_NonOwner_Revert() (gas: 25696) -RMN_ownerUnvoteToCurse:test_OwnerUnvoteToCurseSuccess_gas() (gas: 402269) -RMN_ownerUnvoteToCurse:test_UnknownVoter_Revert() (gas: 37341) -RMN_ownerUnvoteToCurse_Benchmark:test_OwnerUnvoteToCurse_1Voter_LiftsCurse_gas() (gas: 310729) -RMN_permaBlessing:test_PermaBlessing() (gas: 234032) -RMN_setConfig:test_BlessVoterIsZeroAddress_Revert() (gas: 19944) -RMN_setConfig:test_EitherThresholdIsZero_Revert() (gas: 29093) -RMN_setConfig:test_NonOwner_Revert() (gas: 19180) -RMN_setConfig:test_RepeatedAddress_Revert() (gas: 24182) -RMN_setConfig:test_SetConfigSuccess_gas() (gas: 121383) -RMN_setConfig:test_TotalWeightsSmallerThanEachThreshold_Revert() (gas: 42230) -RMN_setConfig:test_VoteToBlessByEjectedVoter_Revert() (gas: 150092) -RMN_setConfig:test_VotersLengthIsZero_Revert() (gas: 13777) -RMN_setConfig:test_WeightIsZeroAddress_Revert() (gas: 20193) -RMN_setConfig_Benchmark_1:test_SetConfig_7Voters_gas() (gas: 699447) -RMN_setConfig_Benchmark_2:test_ResetConfig_7Voters_gas() (gas: 262912) -RMN_unvoteToCurse:test_InvalidCursesHash() (gas: 29467) -RMN_unvoteToCurse:test_OwnerSkips() (gas: 38039) -RMN_unvoteToCurse:test_OwnerSucceeds() (gas: 69773) -RMN_unvoteToCurse:test_UnauthorizedVoter() (gas: 59241) -RMN_unvoteToCurse:test_ValidCursesHash() (gas: 66142) -RMN_unvoteToCurse:test_VotersCantLiftCurseButOwnerCan() (gas: 729679) -RMN_voteToBless:test_Curse_Revert() (gas: 496801) -RMN_voteToBless:test_IsAlreadyBlessed_Revert() (gas: 147850) -RMN_voteToBless:test_RootSuccess() (gas: 745652) -RMN_voteToBless:test_SenderAlreadyVoted_Revert() (gas: 123496) -RMN_voteToBless:test_UnauthorizedVoter_Revert() (gas: 19508) -RMN_voteToBless_Benchmark:test_1RootSuccess_gas() (gas: 49435) -RMN_voteToBless_Benchmark:test_3RootSuccess_gas() (gas: 110271) -RMN_voteToBless_Benchmark:test_5RootSuccess_gas() (gas: 171045) -RMN_voteToBless_Blessed_Benchmark:test_1RootSuccessBecameBlessed_gas() (gas: 34790) -RMN_voteToBless_Blessed_Benchmark:test_1RootSuccess_gas() (gas: 32338) -RMN_voteToBless_Blessed_Benchmark:test_3RootSuccess_gas() (gas: 93196) -RMN_voteToBless_Blessed_Benchmark:test_5RootSuccess_gas() (gas: 153948) -RMN_voteToCurse:test_CurseOnlyWhenThresholdReached_Success() (gas: 1748779) -RMN_voteToCurse:test_EmptySubjects_Revert() (gas: 15996) -RMN_voteToCurse:test_EvenIfAlreadyCursed_Success() (gas: 564086) -RMN_voteToCurse:test_OwnerCanCurseAndUncurse() (gas: 471086) -RMN_voteToCurse:test_RepeatedSubject_Revert() (gas: 151480) -RMN_voteToCurse:test_ReusedCurseId_Revert() (gas: 155411) -RMN_voteToCurse:test_UnauthorizedVoter_Revert() (gas: 14537) -RMN_voteToCurse:test_VoteToCurse_NoCurse_Success() (gas: 203894) -RMN_voteToCurse:test_VoteToCurse_YesCurse_Success() (gas: 495649) -RMN_voteToCurse_2:test_VotesAreDroppedIfSubjectIsNotCursedDuringConfigChange() (gas: 417003) -RMN_voteToCurse_2:test_VotesAreRetainedIfSubjectIsCursedDuringConfigChange() (gas: 1339323) -RMN_voteToCurse_Benchmark_1:test_VoteToCurse_NewSubject_NewVoter_NoCurse_gas() (gas: 146898) -RMN_voteToCurse_Benchmark_1:test_VoteToCurse_NewSubject_NewVoter_YesCurse_gas() (gas: 171152) -RMN_voteToCurse_Benchmark_2:test_VoteToCurse_OldSubject_NewVoter_NoCurse_gas() (gas: 126446) -RMN_voteToCurse_Benchmark_2:test_VoteToCurse_OldSubject_OldVoter_NoCurse_gas() (gas: 102691) -RMN_voteToCurse_Benchmark_3:test_VoteToCurse_OldSubject_NewVoter_YesCurse_gas() (gas: 151187) -RateLimiter_constructor:test_Constructor_Success() (gas: 22964) -RateLimiter_consume:test_AggregateValueMaxCapacityExceeded_Revert() (gas: 19839) -RateLimiter_consume:test_AggregateValueRateLimitReached_Revert() (gas: 28311) -RateLimiter_consume:test_ConsumeAggregateValue_Success() (gas: 39405) -RateLimiter_consume:test_ConsumeTokens_Success() (gas: 21919) -RateLimiter_consume:test_ConsumeUnlimited_Success() (gas: 57402) -RateLimiter_consume:test_ConsumingMoreThanUint128_Revert() (gas: 19531) -RateLimiter_consume:test_RateLimitReachedOverConsecutiveBlocks_Revert() (gas: 33020) -RateLimiter_consume:test_Refill_Success() (gas: 48170) -RateLimiter_consume:test_TokenMaxCapacityExceeded_Revert() (gas: 22450) -RateLimiter_consume:test_TokenRateLimitReached_Revert() (gas: 31057) -RateLimiter_currentTokenBucketState:test_CurrentTokenBucketState_Success() (gas: 49681) -RateLimiter_currentTokenBucketState:test_Refill_Success() (gas: 63750) -RateLimiter_setTokenBucketConfig:test_SetRateLimiterConfig_Success() (gas: 48188) +RMN_constructor:test_Constructor_Success() (gas: 48994) +RMN_getRecordedCurseRelatedOps:test_OpsPostDeployment() (gas: 19732) +RMN_lazyVoteToCurseUpdate_Benchmark:test_VoteToCurseLazilyRetain3VotersUponConfigChange_gas() (gas: 152296) +RMN_ownerUnbless:test_Unbless_Success() (gas: 74936) +RMN_ownerUnvoteToCurse:test_CanBlessAndCurseAfterGlobalCurseIsLifted() (gas: 471829) +RMN_ownerUnvoteToCurse:test_IsIdempotent() (gas: 398492) +RMN_ownerUnvoteToCurse:test_NonOwner_Revert() (gas: 18723) +RMN_ownerUnvoteToCurse:test_OwnerUnvoteToCurseSuccess_gas() (gas: 358084) +RMN_ownerUnvoteToCurse:test_UnknownVoter_Revert() (gas: 33190) +RMN_ownerUnvoteToCurse_Benchmark:test_OwnerUnvoteToCurse_1Voter_LiftsCurse_gas() (gas: 262408) +RMN_permaBlessing:test_PermaBlessing() (gas: 202777) +RMN_setConfig:test_BlessVoterIsZeroAddress_Revert() (gas: 15500) +RMN_setConfig:test_EitherThresholdIsZero_Revert() (gas: 21107) +RMN_setConfig:test_NonOwner_Revert() (gas: 14725) +RMN_setConfig:test_RepeatedAddress_Revert() (gas: 18219) +RMN_setConfig:test_SetConfigSuccess_gas() (gas: 104154) +RMN_setConfig:test_TotalWeightsSmallerThanEachThreshold_Revert() (gas: 30185) +RMN_setConfig:test_VoteToBlessByEjectedVoter_Revert() (gas: 130461) +RMN_setConfig:test_VotersLengthIsZero_Revert() (gas: 12149) +RMN_setConfig:test_WeightIsZeroAddress_Revert() (gas: 15740) +RMN_setConfig_Benchmark_1:test_SetConfig_7Voters_gas() (gas: 659600) +RMN_setConfig_Benchmark_2:test_ResetConfig_7Voters_gas() (gas: 212652) +RMN_unvoteToCurse:test_InvalidCursesHash() (gas: 26430) +RMN_unvoteToCurse:test_OwnerSkips() (gas: 33831) +RMN_unvoteToCurse:test_OwnerSucceeds() (gas: 64005) +RMN_unvoteToCurse:test_UnauthorizedVoter() (gas: 47715) +RMN_unvoteToCurse:test_ValidCursesHash() (gas: 61145) +RMN_unvoteToCurse:test_VotersCantLiftCurseButOwnerCan() (gas: 629190) +RMN_voteToBless:test_Curse_Revert() (gas: 473408) +RMN_voteToBless:test_IsAlreadyBlessed_Revert() (gas: 115435) +RMN_voteToBless:test_RootSuccess() (gas: 558661) +RMN_voteToBless:test_SenderAlreadyVoted_Revert() (gas: 97234) +RMN_voteToBless:test_UnauthorizedVoter_Revert() (gas: 17126) +RMN_voteToBless_Benchmark:test_1RootSuccess_gas() (gas: 44718) +RMN_voteToBless_Benchmark:test_3RootSuccess_gas() (gas: 98694) +RMN_voteToBless_Benchmark:test_5RootSuccess_gas() (gas: 152608) +RMN_voteToBless_Blessed_Benchmark:test_1RootSuccessBecameBlessed_gas() (gas: 29682) +RMN_voteToBless_Blessed_Benchmark:test_1RootSuccess_gas() (gas: 27628) +RMN_voteToBless_Blessed_Benchmark:test_3RootSuccess_gas() (gas: 81626) +RMN_voteToBless_Blessed_Benchmark:test_5RootSuccess_gas() (gas: 135518) +RMN_voteToCurse:test_CurseOnlyWhenThresholdReached_Success() (gas: 1651170) +RMN_voteToCurse:test_EmptySubjects_Revert() (gas: 14061) +RMN_voteToCurse:test_EvenIfAlreadyCursed_Success() (gas: 535124) +RMN_voteToCurse:test_OwnerCanCurseAndUncurse() (gas: 400060) +RMN_voteToCurse:test_RepeatedSubject_Revert() (gas: 144405) +RMN_voteToCurse:test_ReusedCurseId_Revert() (gas: 146972) +RMN_voteToCurse:test_UnauthorizedVoter_Revert() (gas: 12666) +RMN_voteToCurse:test_VoteToCurse_NoCurse_Success() (gas: 187556) +RMN_voteToCurse:test_VoteToCurse_YesCurse_Success() (gas: 473079) +RMN_voteToCurse_2:test_VotesAreDroppedIfSubjectIsNotCursedDuringConfigChange() (gas: 371083) +RMN_voteToCurse_2:test_VotesAreRetainedIfSubjectIsCursedDuringConfigChange() (gas: 1154362) +RMN_voteToCurse_Benchmark_1:test_VoteToCurse_NewSubject_NewVoter_NoCurse_gas() (gas: 141118) +RMN_voteToCurse_Benchmark_1:test_VoteToCurse_NewSubject_NewVoter_YesCurse_gas() (gas: 165258) +RMN_voteToCurse_Benchmark_2:test_VoteToCurse_OldSubject_NewVoter_NoCurse_gas() (gas: 121437) +RMN_voteToCurse_Benchmark_2:test_VoteToCurse_OldSubject_OldVoter_NoCurse_gas() (gas: 98373) +RMN_voteToCurse_Benchmark_3:test_VoteToCurse_OldSubject_NewVoter_YesCurse_gas() (gas: 145784) +RateLimiter_constructor:test_Constructor_Success() (gas: 19734) +RateLimiter_consume:test_AggregateValueMaxCapacityExceeded_Revert() (gas: 16042) +RateLimiter_consume:test_AggregateValueRateLimitReached_Revert() (gas: 22390) +RateLimiter_consume:test_ConsumeAggregateValue_Success() (gas: 31518) +RateLimiter_consume:test_ConsumeTokens_Success() (gas: 20381) +RateLimiter_consume:test_ConsumeUnlimited_Success() (gas: 40687) +RateLimiter_consume:test_ConsumingMoreThanUint128_Revert() (gas: 15822) +RateLimiter_consume:test_RateLimitReachedOverConsecutiveBlocks_Revert() (gas: 25798) +RateLimiter_consume:test_Refill_Success() (gas: 37444) +RateLimiter_consume:test_TokenMaxCapacityExceeded_Revert() (gas: 18388) +RateLimiter_consume:test_TokenRateLimitReached_Revert() (gas: 24886) +RateLimiter_currentTokenBucketState:test_CurrentTokenBucketState_Success() (gas: 38944) +RateLimiter_currentTokenBucketState:test_Refill_Success() (gas: 46849) +RateLimiter_setTokenBucketConfig:test_SetRateLimiterConfig_Success() (gas: 38506) RegistryModuleOwnerCustom_constructor:test_constructor_Revert() (gas: 36033) RegistryModuleOwnerCustom_registerAdminViaGetCCIPAdmin:test_registerAdminViaGetCCIPAdmin_Revert() (gas: 19739) RegistryModuleOwnerCustom_registerAdminViaGetCCIPAdmin:test_registerAdminViaGetCCIPAdmin_Success() (gas: 130086) From 0f22eb0e291a1a6e08bfefbe1b441faca51762c0 Mon Sep 17 00:00:00 2001 From: Josh Date: Wed, 25 Sep 2024 13:18:13 -0400 Subject: [PATCH 21/48] refactor BurnMintERC677 to inherit from BurnMintERC20 --- contracts/gas-snapshots/ccip.gas-snapshot | 264 +++++++++--------- contracts/gas-snapshots/shared.gas-snapshot | 66 ++--- .../test/helpers/BurnMintERC677Helper.sol | 6 +- .../ccip/test/legacy/TokenPoolAndProxy.t.sol | 9 +- .../tokenAdminRegistry/TokenPoolFactory.t.sol | 43 +-- .../FactoryBurnMintERC20.sol | 31 ++ .../tokenAdminRegistry/TokenPoolFactory.sol | 31 +- .../test/token/ERC20/BurnMintERC20.t.sol | 6 +- .../test/token/ERC677/BurnMintERC677.t.sol | 11 +- .../token/ERC677/OpStackBurnMintERC677.t.sol | 6 +- .../v0.8/shared/token/ERC20/BurnMintERC20.sol | 18 +- .../shared/token/ERC677/BurnMintERC677.sol | 212 +------------- 12 files changed, 276 insertions(+), 427 deletions(-) create mode 100644 contracts/src/v0.8/ccip/tokenAdminRegistry/FactoryBurnMintERC20.sol diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot index f1900effc2..cc2c1825c0 100644 --- a/contracts/gas-snapshots/ccip.gas-snapshot +++ b/contracts/gas-snapshots/ccip.gas-snapshot @@ -20,21 +20,21 @@ AggregateTokenLimiter_setRateLimiterConfig:test_OnlyOnlyCallableByAdminOrOwner_R AggregateTokenLimiter_setRateLimiterConfig:test_Owner_Success() (gas: 30393) AggregateTokenLimiter_setRateLimiterConfig:test_TokenLimitAdmin_Success() (gas: 32407) BurnFromMintTokenPool_lockOrBurn:test_ChainNotAllowed_Revert() (gas: 28842) -BurnFromMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 55271) -BurnFromMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 244024) +BurnFromMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 55227) +BurnFromMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 243952) BurnFromMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 24166) BurnMintTokenPool_lockOrBurn:test_ChainNotAllowed_Revert() (gas: 27609) -BurnMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 55271) -BurnMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 241912) +BurnMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 55227) +BurnMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 241788) BurnMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 17851) BurnMintTokenPool_releaseOrMint:test_ChainNotAllowed_Revert() (gas: 28805) -BurnMintTokenPool_releaseOrMint:test_PoolMintNotHealthy_Revert() (gas: 56253) -BurnMintTokenPool_releaseOrMint:test_PoolMint_Success() (gas: 112391) +BurnMintTokenPool_releaseOrMint:test_PoolMintNotHealthy_Revert() (gas: 56209) +BurnMintTokenPool_releaseOrMint:test_PoolMint_Success() (gas: 112369) BurnWithFromMintTokenPool_lockOrBurn:test_ChainNotAllowed_Revert() (gas: 28842) -BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 55271) -BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 244050) +BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 55227) +BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 243927) BurnWithFromMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 24170) -CCIPClientExample_sanity:test_ImmutableExamples_Success() (gas: 2052431) +CCIPClientExample_sanity:test_ImmutableExamples_Success() (gas: 2052233) CCIPConfigSetup:test_getCapabilityConfiguration_Success() (gas: 9508) CCIPConfig_ConfigStateMachine:test__computeConfigDigest_Success() (gas: 83274) CCIPConfig_ConfigStateMachine:test__computeNewConfigWithMeta_InitToRunning_Success() (gas: 354656) @@ -120,30 +120,30 @@ CommitStore_verify:test_Blessed_Success() (gas: 96581) CommitStore_verify:test_NotBlessed_Success() (gas: 61473) CommitStore_verify:test_Paused_Revert() (gas: 18568) CommitStore_verify:test_TooManyLeaves_Revert() (gas: 36848) -DefensiveExampleTest:test_HappyPath_Success() (gas: 200200) -DefensiveExampleTest:test_Recovery() (gas: 424479) -E2E:test_E2E_3MessagesSuccess_gas() (gas: 1106985) +DefensiveExampleTest:test_HappyPath_Success() (gas: 200130) +DefensiveExampleTest:test_Recovery() (gas: 424338) +E2E:test_E2E_3MessagesSuccess_gas() (gas: 1106787) EVM2EVMOffRamp__releaseOrMintToken:test__releaseOrMintToken_NotACompatiblePool_Revert() (gas: 38322) -EVM2EVMOffRamp__releaseOrMintToken:test__releaseOrMintToken_Success() (gas: 104438) -EVM2EVMOffRamp__releaseOrMintToken:test__releaseOrMintToken_TokenHandlingError_transfer_Revert() (gas: 86026) +EVM2EVMOffRamp__releaseOrMintToken:test__releaseOrMintToken_Success() (gas: 104372) +EVM2EVMOffRamp__releaseOrMintToken:test__releaseOrMintToken_TokenHandlingError_transfer_Revert() (gas: 86004) EVM2EVMOffRamp__releaseOrMintToken:test_releaseOrMintToken_InvalidDataLength_Revert() (gas: 37365) -EVM2EVMOffRamp__releaseOrMintToken:test_releaseOrMintToken_ReleaseOrMintBalanceMismatch_Revert() (gas: 95013) +EVM2EVMOffRamp__releaseOrMintToken:test_releaseOrMintToken_ReleaseOrMintBalanceMismatch_Revert() (gas: 95035) EVM2EVMOffRamp__releaseOrMintToken:test_releaseOrMintToken_TokenHandlingError_BalanceOf_Revert() (gas: 40341) EVM2EVMOffRamp__releaseOrMintToken:test_releaseOrMintToken_skip_ReleaseOrMintBalanceMismatch_if_pool_Revert() (gas: 87189) -EVM2EVMOffRamp__releaseOrMintTokens:test_OverValueWithARLOff_Success() (gas: 381594) -EVM2EVMOffRamp__releaseOrMintTokens:test_PriceNotFoundForToken_Reverts() (gas: 140568) -EVM2EVMOffRamp__releaseOrMintTokens:test_RateLimitErrors_Reverts() (gas: 798833) -EVM2EVMOffRamp__releaseOrMintTokens:test_TokenHandlingError_Reverts() (gas: 178400) +EVM2EVMOffRamp__releaseOrMintTokens:test_OverValueWithARLOff_Success() (gas: 381462) +EVM2EVMOffRamp__releaseOrMintTokens:test_PriceNotFoundForToken_Reverts() (gas: 140546) +EVM2EVMOffRamp__releaseOrMintTokens:test_RateLimitErrors_Reverts() (gas: 798613) +EVM2EVMOffRamp__releaseOrMintTokens:test_TokenHandlingError_Reverts() (gas: 178356) EVM2EVMOffRamp__releaseOrMintTokens:test__releaseOrMintTokens_NotACompatiblePool_Reverts() (gas: 29681) -EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_InvalidDataLengthReturnData_Revert() (gas: 67146) +EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_InvalidDataLengthReturnData_Revert() (gas: 67124) EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_InvalidEVMAddress_Revert() (gas: 43605) -EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_Success() (gas: 208068) -EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_destDenominatedDecimals_Success() (gas: 219365) +EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_Success() (gas: 207958) +EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_destDenominatedDecimals_Success() (gas: 219299) EVM2EVMOffRamp__report:test_Report_Success() (gas: 127774) -EVM2EVMOffRamp__trialExecute:test_RateLimitError_Success() (gas: 237406) -EVM2EVMOffRamp__trialExecute:test_TokenHandlingErrorIsCaught_Success() (gas: 246039) -EVM2EVMOffRamp__trialExecute:test_TokenPoolIsNotAContract_Success() (gas: 329283) -EVM2EVMOffRamp__trialExecute:test_trialExecute_Success() (gas: 310166) +EVM2EVMOffRamp__trialExecute:test_RateLimitError_Success() (gas: 237362) +EVM2EVMOffRamp__trialExecute:test_TokenHandlingErrorIsCaught_Success() (gas: 245951) +EVM2EVMOffRamp__trialExecute:test_TokenPoolIsNotAContract_Success() (gas: 329217) +EVM2EVMOffRamp__trialExecute:test_trialExecute_Success() (gas: 310056) EVM2EVMOffRamp_ccipReceive:test_Reverts() (gas: 17048) EVM2EVMOffRamp_constructor:test_CommitStoreAlreadyInUse_Revert() (gas: 153120) EVM2EVMOffRamp_constructor:test_Constructor_Success() (gas: 5212732) @@ -151,7 +151,7 @@ EVM2EVMOffRamp_constructor:test_ZeroOnRampAddress_Revert() (gas: 143845) EVM2EVMOffRamp_execute:test_EmptyReport_Revert() (gas: 21507) EVM2EVMOffRamp_execute:test_InvalidMessageId_Revert() (gas: 36936) EVM2EVMOffRamp_execute:test_InvalidSourceChain_Revert() (gas: 52324) -EVM2EVMOffRamp_execute:test_InvalidSourcePoolAddress_Success() (gas: 473387) +EVM2EVMOffRamp_execute:test_InvalidSourcePoolAddress_Success() (gas: 473299) EVM2EVMOffRamp_execute:test_ManualExecutionNotYetEnabled_Revert() (gas: 48346) EVM2EVMOffRamp_execute:test_MessageTooLarge_Revert() (gas: 153019) EVM2EVMOffRamp_execute:test_Paused_Revert() (gas: 103946) @@ -162,25 +162,25 @@ EVM2EVMOffRamp_execute:test_SingleMessageNoTokensUnordered_Success() (gas: 16011 EVM2EVMOffRamp_execute:test_SingleMessageNoTokens_Success() (gas: 175497) EVM2EVMOffRamp_execute:test_SingleMessageToNonCCIPReceiver_Success() (gas: 237901) EVM2EVMOffRamp_execute:test_SingleMessagesNoTokensSuccess_gas() (gas: 115048) -EVM2EVMOffRamp_execute:test_SkippedIncorrectNonceStillExecutes_Success() (gas: 406606) +EVM2EVMOffRamp_execute:test_SkippedIncorrectNonceStillExecutes_Success() (gas: 406540) EVM2EVMOffRamp_execute:test_SkippedIncorrectNonce_Success() (gas: 54774) EVM2EVMOffRamp_execute:test_StrictUntouchedToSuccess_Success() (gas: 132556) EVM2EVMOffRamp_execute:test_TokenDataMismatch_Revert() (gas: 52786) -EVM2EVMOffRamp_execute:test_TwoMessagesWithTokensAndGE_Success() (gas: 564471) -EVM2EVMOffRamp_execute:test_TwoMessagesWithTokensSuccess_gas() (gas: 494719) +EVM2EVMOffRamp_execute:test_TwoMessagesWithTokensAndGE_Success() (gas: 564339) +EVM2EVMOffRamp_execute:test_TwoMessagesWithTokensSuccess_gas() (gas: 494587) EVM2EVMOffRamp_execute:test_UnexpectedTokenData_Revert() (gas: 35887) -EVM2EVMOffRamp_execute:test_Unhealthy_Revert() (gas: 546333) +EVM2EVMOffRamp_execute:test_Unhealthy_Revert() (gas: 546201) EVM2EVMOffRamp_execute:test_UnsupportedNumberOfTokens_Revert() (gas: 65298) EVM2EVMOffRamp_execute:test__execute_SkippedAlreadyExecutedMessageUnordered_Success() (gas: 124107) EVM2EVMOffRamp_execute:test__execute_SkippedAlreadyExecutedMessage_Success() (gas: 144365) EVM2EVMOffRamp_execute:test_execute_RouterYULCall_Success() (gas: 394187) EVM2EVMOffRamp_executeSingleMessage:test_MessageSender_Revert() (gas: 18685) -EVM2EVMOffRamp_executeSingleMessage:test_NonContractWithTokens_Success() (gas: 275257) +EVM2EVMOffRamp_executeSingleMessage:test_NonContractWithTokens_Success() (gas: 275191) EVM2EVMOffRamp_executeSingleMessage:test_NonContract_Success() (gas: 18815) -EVM2EVMOffRamp_executeSingleMessage:test_TokenHandlingError_Revert() (gas: 223182) +EVM2EVMOffRamp_executeSingleMessage:test_TokenHandlingError_Revert() (gas: 223138) EVM2EVMOffRamp_executeSingleMessage:test_ZeroGasDONExecution_Revert() (gas: 48391) EVM2EVMOffRamp_executeSingleMessage:test_executeSingleMessage_NoTokens_Success() (gas: 47823) -EVM2EVMOffRamp_executeSingleMessage:test_executeSingleMessage_WithTokens_Success() (gas: 311554) +EVM2EVMOffRamp_executeSingleMessage:test_executeSingleMessage_WithTokens_Success() (gas: 311488) EVM2EVMOffRamp_executeSingleMessage:test_executeSingleMessage_ZeroGasZeroData_Success() (gas: 70839) EVM2EVMOffRamp_execute_upgrade:test_V2NonceNewSenderStartsAtZero_Success() (gas: 232136) EVM2EVMOffRamp_execute_upgrade:test_V2NonceStartsAtV1Nonce_Success() (gas: 281170) @@ -194,13 +194,13 @@ EVM2EVMOffRamp_manuallyExecute:test_ManualExecFailedTx_Revert() (gas: 188280) EVM2EVMOffRamp_manuallyExecute:test_ManualExecForkedChain_Revert() (gas: 27574) EVM2EVMOffRamp_manuallyExecute:test_ManualExecGasLimitMismatch_Revert() (gas: 46457) EVM2EVMOffRamp_manuallyExecute:test_ManualExecInvalidGasLimit_Revert() (gas: 27948) -EVM2EVMOffRamp_manuallyExecute:test_ManualExecWithMultipleMessagesAndSourceTokens_Success() (gas: 531330) -EVM2EVMOffRamp_manuallyExecute:test_ManualExecWithSourceTokens_Success() (gas: 344463) +EVM2EVMOffRamp_manuallyExecute:test_ManualExecWithMultipleMessagesAndSourceTokens_Success() (gas: 531198) +EVM2EVMOffRamp_manuallyExecute:test_ManualExecWithSourceTokens_Success() (gas: 344397) EVM2EVMOffRamp_manuallyExecute:test_ManualExec_Success() (gas: 189760) -EVM2EVMOffRamp_manuallyExecute:test_ReentrancyManualExecuteFails_Success() (gas: 2195128) -EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_DestinationGasAmountCountMismatch_Revert() (gas: 362054) +EVM2EVMOffRamp_manuallyExecute:test_ReentrancyManualExecuteFails_Success() (gas: 2195062) +EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_DestinationGasAmountCountMismatch_Revert() (gas: 361988) EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_DoesNotRevertIfUntouched_Success() (gas: 145457) -EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_InvalidTokenGasOverride_Revert() (gas: 365283) +EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_InvalidTokenGasOverride_Revert() (gas: 365217) EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_LowGasLimitManualExec_Success() (gas: 450711) EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_WithGasOverride_Success() (gas: 192223) EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_WithInvalidReceiverExecutionGasOverride_Revert() (gas: 155387) @@ -235,15 +235,15 @@ EVM2EVMOnRamp_forwardFromRouter:test_Permissions_Revert() (gas: 25757) EVM2EVMOnRamp_forwardFromRouter:test_PriceNotFoundForToken_Revert() (gas: 57722) EVM2EVMOnRamp_forwardFromRouter:test_ShouldIncrementNonceOnlyOnOrdered_Success() (gas: 182247) EVM2EVMOnRamp_forwardFromRouter:test_ShouldIncrementSeqNumAndNonce_Success() (gas: 180718) -EVM2EVMOnRamp_forwardFromRouter:test_ShouldStoreNonLinkFees() (gas: 133236) -EVM2EVMOnRamp_forwardFromRouter:test_SourceTokenDataTooLarge_Revert() (gas: 3573653) +EVM2EVMOnRamp_forwardFromRouter:test_ShouldStoreNonLinkFees() (gas: 133214) +EVM2EVMOnRamp_forwardFromRouter:test_SourceTokenDataTooLarge_Revert() (gas: 3573565) EVM2EVMOnRamp_forwardFromRouter:test_TooManyTokens_Revert() (gas: 30472) EVM2EVMOnRamp_forwardFromRouter:test_Unhealthy_Revert() (gas: 43480) EVM2EVMOnRamp_forwardFromRouter:test_UnsupportedToken_Revert() (gas: 110111) EVM2EVMOnRamp_forwardFromRouter:test_ZeroAddressReceiver_Revert() (gas: 316020) -EVM2EVMOnRamp_forwardFromRouter:test_forwardFromRouter_ShouldStoreLinkFees_Success() (gas: 113033) +EVM2EVMOnRamp_forwardFromRouter:test_forwardFromRouter_ShouldStoreLinkFees_Success() (gas: 113011) EVM2EVMOnRamp_forwardFromRouter:test_forwardFromRouter_UnsupportedToken_Revert() (gas: 72824) -EVM2EVMOnRamp_forwardFromRouter:test_forwardFromRouter_correctSourceTokenData_Success() (gas: 714726) +EVM2EVMOnRamp_forwardFromRouter:test_forwardFromRouter_correctSourceTokenData_Success() (gas: 714506) EVM2EVMOnRamp_forwardFromRouter_upgrade:test_V2NonceNewSenderStartsAtZero_Success() (gas: 148808) EVM2EVMOnRamp_forwardFromRouter_upgrade:test_V2NonceStartsAtV1Nonce_Success() (gas: 192679) EVM2EVMOnRamp_forwardFromRouter_upgrade:test_V2SenderNoncesReadsPreviousRamp_Success() (gas: 123243) @@ -272,14 +272,14 @@ EVM2EVMOnRamp_getTokenTransferCost:test_UnsupportedToken_Revert() (gas: 21353) EVM2EVMOnRamp_getTokenTransferCost:test_ZeroAmountTokenTransferChargesMinFeeAndGas_Success() (gas: 28382) EVM2EVMOnRamp_getTokenTransferCost:test_ZeroFeeConfigChargesMinFee_Success() (gas: 38899) EVM2EVMOnRamp_getTokenTransferCost:test__getTokenTransferCost_selfServeUsesDefaults_Success() (gas: 29674) -EVM2EVMOnRamp_linkAvailableForPayment:test_InsufficientLinkBalance_Success() (gas: 32756) -EVM2EVMOnRamp_linkAvailableForPayment:test_LinkAvailableForPayment_Success() (gas: 135247) -EVM2EVMOnRamp_payNops:test_AdminPayNops_Success() (gas: 143660) -EVM2EVMOnRamp_payNops:test_InsufficientBalance_Revert() (gas: 29196) -EVM2EVMOnRamp_payNops:test_NoFeesToPay_Revert() (gas: 127718) -EVM2EVMOnRamp_payNops:test_NoNopsToPay_Revert() (gas: 133580) -EVM2EVMOnRamp_payNops:test_NopPayNops_Success() (gas: 146947) -EVM2EVMOnRamp_payNops:test_OwnerPayNops_Success() (gas: 141522) +EVM2EVMOnRamp_linkAvailableForPayment:test_InsufficientLinkBalance_Success() (gas: 32734) +EVM2EVMOnRamp_linkAvailableForPayment:test_LinkAvailableForPayment_Success() (gas: 135225) +EVM2EVMOnRamp_payNops:test_AdminPayNops_Success() (gas: 143638) +EVM2EVMOnRamp_payNops:test_InsufficientBalance_Revert() (gas: 29174) +EVM2EVMOnRamp_payNops:test_NoFeesToPay_Revert() (gas: 127762) +EVM2EVMOnRamp_payNops:test_NoNopsToPay_Revert() (gas: 133615) +EVM2EVMOnRamp_payNops:test_NopPayNops_Success() (gas: 146925) +EVM2EVMOnRamp_payNops:test_OwnerPayNops_Success() (gas: 141500) EVM2EVMOnRamp_payNops:test_PayNopsSuccessAfterSetNops() (gas: 298719) EVM2EVMOnRamp_payNops:test_WrongPermissions_Revert() (gas: 15378) EVM2EVMOnRamp_setDynamicConfig:test_SetConfigInvalidConfig_Revert() (gas: 42524) @@ -289,10 +289,10 @@ EVM2EVMOnRamp_setFeeTokenConfig:test_OnlyCallableByOwnerOrAdmin_Revert() (gas: 1 EVM2EVMOnRamp_setFeeTokenConfig:test_SetFeeTokenConfigByAdmin_Success() (gas: 16497) EVM2EVMOnRamp_setFeeTokenConfig:test_SetFeeTokenConfig_Success() (gas: 14036) EVM2EVMOnRamp_setNops:test_AdminCanSetNops_Success() (gas: 61872) -EVM2EVMOnRamp_setNops:test_IncludesPayment_Success() (gas: 470835) +EVM2EVMOnRamp_setNops:test_IncludesPayment_Success() (gas: 470769) EVM2EVMOnRamp_setNops:test_LinkTokenCannotBeNop_Revert() (gas: 57370) EVM2EVMOnRamp_setNops:test_NonOwnerOrAdmin_Revert() (gas: 14779) -EVM2EVMOnRamp_setNops:test_NotEnoughFundsForPayout_Revert() (gas: 85200) +EVM2EVMOnRamp_setNops:test_NotEnoughFundsForPayout_Revert() (gas: 85178) EVM2EVMOnRamp_setNops:test_SetNopsRemovesOldNopsCompletely_Success() (gas: 60868) EVM2EVMOnRamp_setNops:test_SetNops_Success() (gas: 174097) EVM2EVMOnRamp_setNops:test_TooManyNops_Revert() (gas: 193503) @@ -301,10 +301,10 @@ EVM2EVMOnRamp_setTokenTransferFeeConfig:test__setTokenTransferFeeConfig_InvalidD EVM2EVMOnRamp_setTokenTransferFeeConfig:test__setTokenTransferFeeConfig_OnlyCallableByOwnerOrAdmin_Revert() (gas: 14427) EVM2EVMOnRamp_setTokenTransferFeeConfig:test__setTokenTransferFeeConfig_Success() (gas: 85487) EVM2EVMOnRamp_setTokenTransferFeeConfig:test__setTokenTransferFeeConfig_byAdmin_Success() (gas: 17468) -EVM2EVMOnRamp_withdrawNonLinkFees:test_LinkBalanceNotSettled_Revert() (gas: 83617) +EVM2EVMOnRamp_withdrawNonLinkFees:test_LinkBalanceNotSettled_Revert() (gas: 83595) EVM2EVMOnRamp_withdrawNonLinkFees:test_NonOwnerOrAdmin_Revert() (gas: 15353) -EVM2EVMOnRamp_withdrawNonLinkFees:test_SettlingBalance_Success() (gas: 272851) -EVM2EVMOnRamp_withdrawNonLinkFees:test_WithdrawNonLinkFees_Success() (gas: 53566) +EVM2EVMOnRamp_withdrawNonLinkFees:test_SettlingBalance_Success() (gas: 272728) +EVM2EVMOnRamp_withdrawNonLinkFees:test_WithdrawNonLinkFees_Success() (gas: 53500) EVM2EVMOnRamp_withdrawNonLinkFees:test_WithdrawToZeroAddress_Revert() (gas: 12875) EtherSenderReceiverTest_ccipReceive:test_ccipReceive_fallbackToWethTransfer() (gas: 96907) EtherSenderReceiverTest_ccipReceive:test_ccipReceive_happyPath() (gas: 49775) @@ -379,20 +379,20 @@ FeeQuoter_getValidatedFee:test_NotAFeeToken_Revert() (gas: 21172) FeeQuoter_getValidatedFee:test_SingleTokenMessage_Success() (gas: 113309) FeeQuoter_getValidatedFee:test_TooManyTokens_Revert() (gas: 22691) FeeQuoter_getValidatedFee:test_ZeroDataAvailabilityMultiplier_Success() (gas: 62714) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedErc20Above18Decimals_Success() (gas: 1973907) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedErc20Below18Decimals_Success() (gas: 1973865) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFeedAt0Decimals_Success() (gas: 1953984) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFeedAt18Decimals_Success() (gas: 1973639) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFlippedDecimals_Success() (gas: 1973843) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedMaxInt224Value_Success() (gas: 1973655) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedErc20Above18Decimals_Success() (gas: 2045042) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedErc20Below18Decimals_Success() (gas: 2045000) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFeedAt0Decimals_Success() (gas: 2025119) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFeedAt18Decimals_Success() (gas: 2044774) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFlippedDecimals_Success() (gas: 2044978) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedMaxInt224Value_Success() (gas: 2044790) FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedOverStalenessPeriod_Success() (gas: 64610) FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeed_Success() (gas: 64490) FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPrice_Success() (gas: 58894) -FeeQuoter_getValidatedTokenPrice:test_OverflowFeedPrice_Revert() (gas: 1973352) +FeeQuoter_getValidatedTokenPrice:test_OverflowFeedPrice_Revert() (gas: 2044487) FeeQuoter_getValidatedTokenPrice:test_StaleFeeToken_Success() (gas: 61764) FeeQuoter_getValidatedTokenPrice:test_TokenNotSupportedFeed_Revert() (gas: 116495) FeeQuoter_getValidatedTokenPrice:test_TokenNotSupported_Revert() (gas: 14037) -FeeQuoter_getValidatedTokenPrice:test_UnderflowFeedPrice_Revert() (gas: 1972029) +FeeQuoter_getValidatedTokenPrice:test_UnderflowFeedPrice_Revert() (gas: 2043164) FeeQuoter_onReport:test_OnReport_StaleUpdate_Revert() (gas: 43631) FeeQuoter_onReport:test_onReport_InvalidForwarder_Reverts() (gas: 23492) FeeQuoter_onReport:test_onReport_Success() (gas: 80094) @@ -431,13 +431,13 @@ FeeQuoter_validateDestFamilyAddress:test_InvalidEVMAddressPrecompiles_Revert() ( FeeQuoter_validateDestFamilyAddress:test_InvalidEVMAddress_Revert() (gas: 10839) FeeQuoter_validateDestFamilyAddress:test_ValidEVMAddress_Success() (gas: 6731) FeeQuoter_validateDestFamilyAddress:test_ValidNonEVMAddress_Success() (gas: 6511) -HybridUSDCTokenPoolMigrationTests:test_LockOrBurn_LockReleaseMechanism_then_switchToPrimary_Success() (gas: 209248) -HybridUSDCTokenPoolMigrationTests:test_LockOrBurn_PrimaryMechanism_Success() (gas: 135879) -HybridUSDCTokenPoolMigrationTests:test_LockOrBurn_WhileMigrationPause_Revert() (gas: 107090) +HybridUSDCTokenPoolMigrationTests:test_LockOrBurn_LockReleaseMechanism_then_switchToPrimary_Success() (gas: 209283) +HybridUSDCTokenPoolMigrationTests:test_LockOrBurn_PrimaryMechanism_Success() (gas: 135896) +HybridUSDCTokenPoolMigrationTests:test_LockOrBurn_WhileMigrationPause_Revert() (gas: 107112) HybridUSDCTokenPoolMigrationTests:test_LockOrBurn_onLockReleaseMechanism_Success() (gas: 144586) -HybridUSDCTokenPoolMigrationTests:test_MintOrRelease_OnLockReleaseMechanism_Success() (gas: 214817) -HybridUSDCTokenPoolMigrationTests:test_MintOrRelease_OnLockReleaseMechanism_then_switchToPrimary_Success() (gas: 423641) -HybridUSDCTokenPoolMigrationTests:test_MintOrRelease_incomingMessageWithPrimaryMechanism() (gas: 268928) +HybridUSDCTokenPoolMigrationTests:test_MintOrRelease_OnLockReleaseMechanism_Success() (gas: 214795) +HybridUSDCTokenPoolMigrationTests:test_MintOrRelease_OnLockReleaseMechanism_then_switchToPrimary_Success() (gas: 423509) +HybridUSDCTokenPoolMigrationTests:test_MintOrRelease_incomingMessageWithPrimaryMechanism() (gas: 268840) HybridUSDCTokenPoolMigrationTests:test_ReleaseOrMint_WhileMigrationPause_Revert() (gas: 111484) HybridUSDCTokenPoolMigrationTests:test_burnLockedUSDC_invalidPermissions_Revert() (gas: 39362) HybridUSDCTokenPoolMigrationTests:test_cancelExistingCCTPMigrationProposal() (gas: 33189) @@ -445,19 +445,19 @@ HybridUSDCTokenPoolMigrationTests:test_cannotCancelANonExistentMigrationProposal HybridUSDCTokenPoolMigrationTests:test_cannotModifyLiquidityWithoutPermissions_Revert() (gas: 13329) HybridUSDCTokenPoolMigrationTests:test_cannotTransferLiquidityDuringPendingMigration_Revert() (gas: 160900) HybridUSDCTokenPoolMigrationTests:test_lockOrBurn_then_BurnInCCTPMigration_Success() (gas: 255982) -HybridUSDCTokenPoolMigrationTests:test_transferLiquidity_Success() (gas: 165921) -HybridUSDCTokenPoolMigrationTests:test_unstickManualTxAfterMigration_destChain_Success() (gas: 154242) -HybridUSDCTokenPoolMigrationTests:test_unstickManualTxAfterMigration_homeChain_Success() (gas: 463740) -HybridUSDCTokenPoolTests:test_LockOrBurn_LockReleaseMechanism_then_switchToPrimary_Success() (gas: 209230) -HybridUSDCTokenPoolTests:test_LockOrBurn_PrimaryMechanism_Success() (gas: 135880) -HybridUSDCTokenPoolTests:test_LockOrBurn_WhileMigrationPause_Revert() (gas: 107135) +HybridUSDCTokenPoolMigrationTests:test_transferLiquidity_Success() (gas: 165904) +HybridUSDCTokenPoolMigrationTests:test_unstickManualTxAfterMigration_destChain_Success() (gas: 154220) +HybridUSDCTokenPoolMigrationTests:test_unstickManualTxAfterMigration_homeChain_Success() (gas: 463617) +HybridUSDCTokenPoolTests:test_LockOrBurn_LockReleaseMechanism_then_switchToPrimary_Success() (gas: 209265) +HybridUSDCTokenPoolTests:test_LockOrBurn_PrimaryMechanism_Success() (gas: 135897) +HybridUSDCTokenPoolTests:test_LockOrBurn_WhileMigrationPause_Revert() (gas: 107157) HybridUSDCTokenPoolTests:test_LockOrBurn_onLockReleaseMechanism_Success() (gas: 144607) -HybridUSDCTokenPoolTests:test_MintOrRelease_OnLockReleaseMechanism_Success() (gas: 214795) -HybridUSDCTokenPoolTests:test_MintOrRelease_OnLockReleaseMechanism_then_switchToPrimary_Success() (gas: 423619) -HybridUSDCTokenPoolTests:test_MintOrRelease_incomingMessageWithPrimaryMechanism() (gas: 268910) +HybridUSDCTokenPoolTests:test_MintOrRelease_OnLockReleaseMechanism_Success() (gas: 214773) +HybridUSDCTokenPoolTests:test_MintOrRelease_OnLockReleaseMechanism_then_switchToPrimary_Success() (gas: 423487) +HybridUSDCTokenPoolTests:test_MintOrRelease_incomingMessageWithPrimaryMechanism() (gas: 268822) HybridUSDCTokenPoolTests:test_ReleaseOrMint_WhileMigrationPause_Revert() (gas: 111528) HybridUSDCTokenPoolTests:test_cannotTransferLiquidityDuringPendingMigration_Revert() (gas: 160845) -HybridUSDCTokenPoolTests:test_transferLiquidity_Success() (gas: 165904) +HybridUSDCTokenPoolTests:test_transferLiquidity_Success() (gas: 165886) LockReleaseTokenPoolAndProxy_setRebalancer:test_SetRebalancer_Revert() (gas: 10989) LockReleaseTokenPoolAndProxy_setRebalancer:test_SetRebalancer_Success() (gas: 18028) LockReleaseTokenPoolPoolAndProxy_canAcceptLiquidity:test_CanAcceptLiquidity_Success() (gas: 3051552) @@ -469,17 +469,17 @@ LockReleaseTokenPoolPoolAndProxy_withdrawalLiquidity:test_Unauthorized_Revert() LockReleaseTokenPool_canAcceptLiquidity:test_CanAcceptLiquidity_Success() (gas: 2836138) LockReleaseTokenPool_lockOrBurn:test_LockOrBurnWithAllowList_Revert() (gas: 30062) LockReleaseTokenPool_lockOrBurn:test_LockOrBurnWithAllowList_Success() (gas: 79943) -LockReleaseTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 59620) +LockReleaseTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 59576) LockReleaseTokenPool_provideLiquidity:test_LiquidityNotAccepted_Revert() (gas: 2832618) LockReleaseTokenPool_provideLiquidity:test_Unauthorized_Revert() (gas: 11489) LockReleaseTokenPool_releaseOrMint:test_ChainNotAllowed_Revert() (gas: 72743) -LockReleaseTokenPool_releaseOrMint:test_PoolMintNotHealthy_Revert() (gas: 56352) -LockReleaseTokenPool_releaseOrMint:test_ReleaseOrMint_Success() (gas: 225548) +LockReleaseTokenPool_releaseOrMint:test_PoolMintNotHealthy_Revert() (gas: 56308) +LockReleaseTokenPool_releaseOrMint:test_ReleaseOrMint_Success() (gas: 225477) LockReleaseTokenPool_setRebalancer:test_SetRebalancer_Revert() (gas: 11011) LockReleaseTokenPool_setRebalancer:test_SetRebalancer_Success() (gas: 18094) LockReleaseTokenPool_supportsInterface:test_SupportsInterface_Success() (gas: 10196) -LockReleaseTokenPool_transferLiquidity:test_transferLiquidity_Success() (gas: 83231) -LockReleaseTokenPool_transferLiquidity:test_transferLiquidity_transferTooMuch_Revert() (gas: 55953) +LockReleaseTokenPool_transferLiquidity:test_transferLiquidity_Success() (gas: 83187) +LockReleaseTokenPool_transferLiquidity:test_transferLiquidity_transferTooMuch_Revert() (gas: 55887) LockReleaseTokenPool_withdrawalLiquidity:test_InsufficientLiquidity_Revert() (gas: 60187) LockReleaseTokenPool_withdrawalLiquidity:test_Unauthorized_Revert() (gas: 11464) LockRelease_setRateLimitAdmin:test_SetRateLimitAdmin_Revert() (gas: 11054) @@ -573,7 +573,7 @@ MultiOCR3Base_transmit:test_UnauthorizedSigner_Revert() (gas: 61275) MultiOCR3Base_transmit:test_UnconfiguredPlugin_Revert() (gas: 39933) MultiOCR3Base_transmit:test_ZeroSignatures_Revert() (gas: 33049) MultiOnRampTokenPoolReentrancy:test_OnRampTokenPoolReentrancy_Success() (gas: 233701) -MultiRampsE2E:test_E2E_3MessagesMMultiOffRampSuccess_gas() (gas: 1500580) +MultiRampsE2E:test_E2E_3MessagesMMultiOffRampSuccess_gas() (gas: 1500382) NonceManager_NonceIncrementation:test_getIncrementedOutboundNonce_Success() (gas: 37934) NonceManager_NonceIncrementation:test_incrementInboundNonce_Skip() (gas: 23706) NonceManager_NonceIncrementation:test_incrementInboundNonce_Success() (gas: 38778) @@ -637,7 +637,7 @@ OffRamp_batchExecute:test_MultipleReportsSameChain_Success() (gas: 278912) OffRamp_batchExecute:test_MultipleReportsSkipDuplicate_Success() (gas: 169308) OffRamp_batchExecute:test_OutOfBoundsGasLimitsAccess_Revert() (gas: 189031) OffRamp_batchExecute:test_SingleReport_Success() (gas: 157132) -OffRamp_batchExecute:test_Unhealthy_Success() (gas: 554208) +OffRamp_batchExecute:test_Unhealthy_Success() (gas: 554076) OffRamp_batchExecute:test_ZeroReports_Revert() (gas: 10600) OffRamp_ccipReceive:test_Reverts() (gas: 15385) OffRamp_commit:test_CommitOnRampMismatch_Revert() (gas: 92905) @@ -679,18 +679,18 @@ OffRamp_execute:test_UnauthorizedTransmitter_Revert() (gas: 148382) OffRamp_execute:test_WrongConfigWithSigners_Revert() (gas: 6672410) OffRamp_execute:test_ZeroReports_Revert() (gas: 17361) OffRamp_executeSingleMessage:test_MessageSender_Revert() (gas: 18511) -OffRamp_executeSingleMessage:test_NonContractWithTokens_Success() (gas: 244057) +OffRamp_executeSingleMessage:test_NonContractWithTokens_Success() (gas: 243991) OffRamp_executeSingleMessage:test_NonContract_Success() (gas: 20759) -OffRamp_executeSingleMessage:test_TokenHandlingError_Revert() (gas: 205094) +OffRamp_executeSingleMessage:test_TokenHandlingError_Revert() (gas: 205050) OffRamp_executeSingleMessage:test_ZeroGasDONExecution_Revert() (gas: 49316) OffRamp_executeSingleMessage:test_executeSingleMessage_NoTokens_Success() (gas: 48760) OffRamp_executeSingleMessage:test_executeSingleMessage_WithFailingValidationNoRouterCall_Revert() (gas: 218081) OffRamp_executeSingleMessage:test_executeSingleMessage_WithFailingValidation_Revert() (gas: 85349) -OffRamp_executeSingleMessage:test_executeSingleMessage_WithTokens_Success() (gas: 274194) +OffRamp_executeSingleMessage:test_executeSingleMessage_WithTokens_Success() (gas: 274128) OffRamp_executeSingleMessage:test_executeSingleMessage_WithVInterception_Success() (gas: 91809) OffRamp_executeSingleReport:test_DisabledSourceChain_Revert() (gas: 28260) OffRamp_executeSingleReport:test_EmptyReport_Revert() (gas: 22062) -OffRamp_executeSingleReport:test_InvalidSourcePoolAddress_Success() (gas: 481748) +OffRamp_executeSingleReport:test_InvalidSourcePoolAddress_Success() (gas: 481660) OffRamp_executeSingleReport:test_ManualExecutionNotYetEnabled_Revert() (gas: 48372) OffRamp_executeSingleReport:test_MismatchingDestChainSelector_Revert() (gas: 33959) OffRamp_executeSingleReport:test_NonExistingSourceChain_Revert() (gas: 28436) @@ -703,15 +703,15 @@ OffRamp_executeSingleReport:test_SingleMessageNoTokensUnordered_Success() (gas: OffRamp_executeSingleReport:test_SingleMessageNoTokens_Success() (gas: 213624) OffRamp_executeSingleReport:test_SingleMessageToNonCCIPReceiver_Success() (gas: 249506) OffRamp_executeSingleReport:test_SingleMessagesNoTokensSuccess_gas() (gas: 142151) -OffRamp_executeSingleReport:test_SkippedIncorrectNonceStillExecutes_Success() (gas: 409289) +OffRamp_executeSingleReport:test_SkippedIncorrectNonceStillExecutes_Success() (gas: 409223) OffRamp_executeSingleReport:test_SkippedIncorrectNonce_Success() (gas: 58293) OffRamp_executeSingleReport:test_TokenDataMismatch_Revert() (gas: 73868) -OffRamp_executeSingleReport:test_TwoMessagesWithTokensAndGE_Success() (gas: 583401) -OffRamp_executeSingleReport:test_TwoMessagesWithTokensSuccess_gas() (gas: 532115) +OffRamp_executeSingleReport:test_TwoMessagesWithTokensAndGE_Success() (gas: 583269) +OffRamp_executeSingleReport:test_TwoMessagesWithTokensSuccess_gas() (gas: 531983) OffRamp_executeSingleReport:test_UnexpectedTokenData_Revert() (gas: 33717) -OffRamp_executeSingleReport:test_UnhealthySingleChainCurse_Revert() (gas: 549738) -OffRamp_executeSingleReport:test_Unhealthy_Success() (gas: 549752) -OffRamp_executeSingleReport:test_WithCurseOnAnotherSourceChain_Success() (gas: 460495) +OffRamp_executeSingleReport:test_UnhealthySingleChainCurse_Revert() (gas: 549606) +OffRamp_executeSingleReport:test_Unhealthy_Success() (gas: 549620) +OffRamp_executeSingleReport:test_WithCurseOnAnotherSourceChain_Success() (gas: 460363) OffRamp_executeSingleReport:test__execute_SkippedAlreadyExecutedMessageUnordered_Success() (gas: 135910) OffRamp_executeSingleReport:test__execute_SkippedAlreadyExecutedMessage_Success() (gas: 165615) OffRamp_getExecutionState:test_FillExecutionState_Success() (gas: 3868658) @@ -727,34 +727,34 @@ OffRamp_manuallyExecute:test_manuallyExecute_InvalidReceiverExecutionGasLimit_Re OffRamp_manuallyExecute:test_manuallyExecute_InvalidTokenGasOverride_Revert() (gas: 55260) OffRamp_manuallyExecute:test_manuallyExecute_LowGasLimit_Success() (gas: 498614) OffRamp_manuallyExecute:test_manuallyExecute_MultipleReportsWithSingleCursedLane_Revert() (gas: 316158) -OffRamp_manuallyExecute:test_manuallyExecute_ReentrancyFails_Success() (gas: 2245360) +OffRamp_manuallyExecute:test_manuallyExecute_ReentrancyFails_Success() (gas: 2245294) OffRamp_manuallyExecute:test_manuallyExecute_SourceChainSelectorMismatch_Revert() (gas: 165602) OffRamp_manuallyExecute:test_manuallyExecute_Success() (gas: 227234) OffRamp_manuallyExecute:test_manuallyExecute_WithGasOverride_Success() (gas: 227774) OffRamp_manuallyExecute:test_manuallyExecute_WithMultiReportGasOverride_Success() (gas: 781510) OffRamp_manuallyExecute:test_manuallyExecute_WithPartialMessages_Success() (gas: 347431) OffRamp_releaseOrMintSingleToken:test__releaseOrMintSingleToken_NotACompatiblePool_Revert() (gas: 37634) -OffRamp_releaseOrMintSingleToken:test__releaseOrMintSingleToken_Success() (gas: 104404) -OffRamp_releaseOrMintSingleToken:test__releaseOrMintSingleToken_TokenHandlingError_transfer_Revert() (gas: 85342) +OffRamp_releaseOrMintSingleToken:test__releaseOrMintSingleToken_Success() (gas: 104338) +OffRamp_releaseOrMintSingleToken:test__releaseOrMintSingleToken_TokenHandlingError_transfer_Revert() (gas: 85320) OffRamp_releaseOrMintSingleToken:test_releaseOrMintToken_InvalidDataLength_Revert() (gas: 36752) -OffRamp_releaseOrMintSingleToken:test_releaseOrMintToken_ReleaseOrMintBalanceMismatch_Revert() (gas: 94382) +OffRamp_releaseOrMintSingleToken:test_releaseOrMintToken_ReleaseOrMintBalanceMismatch_Revert() (gas: 94404) OffRamp_releaseOrMintSingleToken:test_releaseOrMintToken_TokenHandlingError_BalanceOf_Revert() (gas: 39741) OffRamp_releaseOrMintSingleToken:test_releaseOrMintToken_skip_ReleaseOrMintBalanceMismatch_if_pool_Revert() (gas: 86516) -OffRamp_releaseOrMintTokens:test_TokenHandlingError_Reverts() (gas: 162381) +OffRamp_releaseOrMintTokens:test_TokenHandlingError_Reverts() (gas: 162337) OffRamp_releaseOrMintTokens:test__releaseOrMintTokens_PoolIsNotAPool_Reverts() (gas: 23903) -OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_InvalidDataLengthReturnData_Revert() (gas: 62751) -OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_PoolDoesNotSupportDest_Reverts() (gas: 79790) -OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_Success() (gas: 174512) -OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_WithGasOverride_Success() (gas: 176424) -OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_destDenominatedDecimals_Success() (gas: 187723) +OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_InvalidDataLengthReturnData_Revert() (gas: 62729) +OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_PoolDoesNotSupportDest_Reverts() (gas: 79768) +OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_Success() (gas: 174402) +OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_WithGasOverride_Success() (gas: 176314) +OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_destDenominatedDecimals_Success() (gas: 187657) OffRamp_setDynamicConfig:test_FeeQuoterZeroAddress_Revert() (gas: 11269) OffRamp_setDynamicConfig:test_NonOwner_Revert() (gas: 13884) OffRamp_setDynamicConfig:test_SetDynamicConfigWithInterceptor_Success() (gas: 46421) OffRamp_setDynamicConfig:test_SetDynamicConfig_Success() (gas: 24463) -OffRamp_trialExecute:test_RateLimitError_Success() (gas: 219355) -OffRamp_trialExecute:test_TokenHandlingErrorIsCaught_Success() (gas: 227977) -OffRamp_trialExecute:test_TokenPoolIsNotAContract_Success() (gas: 295350) -OffRamp_trialExecute:test_trialExecute_Success() (gas: 277894) +OffRamp_trialExecute:test_RateLimitError_Success() (gas: 219311) +OffRamp_trialExecute:test_TokenHandlingErrorIsCaught_Success() (gas: 227889) +OffRamp_trialExecute:test_TokenPoolIsNotAContract_Success() (gas: 295284) +OffRamp_trialExecute:test_trialExecute_Success() (gas: 277784) OnRampTokenPoolReentrancy:test_OnRampTokenPoolReentrancy_Success() (gas: 390842) OnRamp_applyAllowListUpdates:test_applyAllowListUpdates_InvalidAllowListRequestDisabledAllowListWithAdds() (gas: 18030) OnRamp_applyAllowListUpdates:test_applyAllowListUpdates_Revert() (gas: 67426) @@ -782,9 +782,9 @@ OnRamp_forwardFromRouter:test_Paused_Revert() (gas: 38431) OnRamp_forwardFromRouter:test_Permissions_Revert() (gas: 23640) OnRamp_forwardFromRouter:test_ShouldIncrementNonceOnlyOnOrdered_Success() (gas: 183954) OnRamp_forwardFromRouter:test_ShouldIncrementSeqNumAndNonce_Success() (gas: 210338) -OnRamp_forwardFromRouter:test_ShouldStoreLinkFees() (gas: 146154) -OnRamp_forwardFromRouter:test_ShouldStoreNonLinkFees() (gas: 160259) -OnRamp_forwardFromRouter:test_SourceTokenDataTooLarge_Revert() (gas: 3613942) +OnRamp_forwardFromRouter:test_ShouldStoreLinkFees() (gas: 146132) +OnRamp_forwardFromRouter:test_ShouldStoreNonLinkFees() (gas: 160237) +OnRamp_forwardFromRouter:test_SourceTokenDataTooLarge_Revert() (gas: 3613854) OnRamp_forwardFromRouter:test_UnAllowedOriginalSender_Revert() (gas: 24010) OnRamp_forwardFromRouter:test_UnsupportedToken_Revert() (gas: 75866) OnRamp_forwardFromRouter:test_forwardFromRouter_UnsupportedToken_Revert() (gas: 38599) @@ -803,7 +803,7 @@ OnRamp_setDynamicConfig:test_setDynamicConfig_InvalidConfigInvalidConfig_Revert( OnRamp_setDynamicConfig:test_setDynamicConfig_InvalidConfigOnlyOwner_Revert() (gas: 16850) OnRamp_setDynamicConfig:test_setDynamicConfig_InvalidConfigReentrancyGuardEnteredEqTrue_Revert() (gas: 13265) OnRamp_setDynamicConfig:test_setDynamicConfig_Success() (gas: 56369) -OnRamp_withdrawFeeTokens:test_WithdrawFeeTokens_Success() (gas: 97302) +OnRamp_withdrawFeeTokens:test_WithdrawFeeTokens_Success() (gas: 97258) PingPong_ccipReceive:test_CcipReceive_Success() (gas: 151349) PingPong_plumbing:test_OutOfOrderExecution_Success() (gas: 20310) PingPong_plumbing:test_Pausing_Success() (gas: 17810) @@ -902,8 +902,8 @@ RateLimiter_currentTokenBucketState:test_CurrentTokenBucketState_Success() (gas: RateLimiter_currentTokenBucketState:test_Refill_Success() (gas: 46849) RateLimiter_setTokenBucketConfig:test_SetRateLimiterConfig_Success() (gas: 38506) RegistryModuleOwnerCustom_constructor:test_constructor_Revert() (gas: 36033) -RegistryModuleOwnerCustom_registerAdminViaGetCCIPAdmin:test_registerAdminViaGetCCIPAdmin_Revert() (gas: 19739) -RegistryModuleOwnerCustom_registerAdminViaGetCCIPAdmin:test_registerAdminViaGetCCIPAdmin_Success() (gas: 130086) +RegistryModuleOwnerCustom_registerAdminViaGetCCIPAdmin:test_registerAdminViaGetCCIPAdmin_Revert() (gas: 19663) +RegistryModuleOwnerCustom_registerAdminViaGetCCIPAdmin:test_registerAdminViaGetCCIPAdmin_Success() (gas: 130010) RegistryModuleOwnerCustom_registerAdminViaOwner:test_registerAdminViaOwner_Revert() (gas: 19559) RegistryModuleOwnerCustom_registerAdminViaOwner:test_registerAdminViaOwner_Success() (gas: 129905) Router_applyRampUpdates:test_OffRampMismatch_Revert() (gas: 89366) @@ -934,7 +934,7 @@ Router_recoverTokens:test_RecoverTokensInvalidRecipient_Revert() (gas: 11334) Router_recoverTokens:test_RecoverTokensNoFunds_Revert() (gas: 20267) Router_recoverTokens:test_RecoverTokensNonOwner_Revert() (gas: 11171) Router_recoverTokens:test_RecoverTokensValueReceiver_Revert() (gas: 358049) -Router_recoverTokens:test_RecoverTokens_Success() (gas: 52480) +Router_recoverTokens:test_RecoverTokens_Success() (gas: 52445) Router_routeMessage:test_AutoExec_Success() (gas: 42816) Router_routeMessage:test_ExecutionEvent_Success() (gas: 158520) Router_routeMessage:test_ManualExec_Success() (gas: 35546) @@ -966,18 +966,18 @@ TokenAdminRegistry_setPool:test_setPool_Success() (gas: 36135) TokenAdminRegistry_setPool:test_setPool_ZeroAddressRemovesPool_Success() (gas: 30842) TokenAdminRegistry_transferAdminRole:test_transferAdminRole_OnlyAdministrator_Revert() (gas: 18103) TokenAdminRegistry_transferAdminRole:test_transferAdminRole_Success() (gas: 49438) -TokenPoolAndProxy:test_lockOrBurn_burnMint_Success() (gas: 5586499) -TokenPoolAndProxy:test_lockOrBurn_burnWithFromMint_Success() (gas: 5617969) -TokenPoolAndProxy:test_lockOrBurn_lockRelease_Success() (gas: 5793246) +TokenPoolAndProxy:test_lockOrBurn_burnMint_Success() (gas: 5586367) +TokenPoolAndProxy:test_lockOrBurn_burnWithFromMint_Success() (gas: 5617902) +TokenPoolAndProxy:test_lockOrBurn_lockRelease_Success() (gas: 5793136) TokenPoolAndProxy:test_setPreviousPool_Success() (gas: 3070731) -TokenPoolAndProxyMigration:test_tokenPoolMigration_Success_1_2() (gas: 6434801) -TokenPoolAndProxyMigration:test_tokenPoolMigration_Success_1_4() (gas: 6634934) -TokenPoolFactoryTests:test_TokenPoolFactory_Constructor_Revert() (gas: 4118758) -TokenPoolFactoryTests:test_createTokenPool_ExistingRemoteToken_AndPredictPool_Success() (gas: 15396183) -TokenPoolFactoryTests:test_createTokenPool_WithNoExistingRemoteContracts_predict_Success() (gas: 15665428) -TokenPoolFactoryTests:test_createTokenPool_WithNoExistingTokenOnRemoteChain_Success() (gas: 5740557) -TokenPoolFactoryTests:test_createTokenPool_WithRemoteTokenAndRemotePool_Success() (gas: 5894400) -TokenPoolFactoryTests:test_updateRemoteChainConfig_Success() (gas: 86259) +TokenPoolAndProxyMigration:test_tokenPoolMigration_Success_1_2() (gas: 6434669) +TokenPoolAndProxyMigration:test_tokenPoolMigration_Success_1_4() (gas: 6634802) +TokenPoolFactoryTests:test_TokenPoolFactory_Constructor_Revert() (gas: 4108300) +TokenPoolFactoryTests:test_createTokenPool_ExistingRemoteToken_AndPredictPool_Success() (gas: 15388758) +TokenPoolFactoryTests:test_createTokenPool_WithNoExistingRemoteContracts_predict_Success() (gas: 15658396) +TokenPoolFactoryTests:test_createTokenPool_WithNoExistingTokenOnRemoteChain_Success() (gas: 5743209) +TokenPoolFactoryTests:test_createTokenPool_WithRemoteTokenAndRemotePool_Success() (gas: 5897047) +TokenPoolFactoryTests:test_updateRemoteChainConfig_Success() (gas: 86214) TokenPoolWithAllowList_applyAllowListUpdates:test_AllowListNotEnabled_Revert() (gas: 1979943) TokenPoolWithAllowList_applyAllowListUpdates:test_OnlyOwner_Revert() (gas: 12113) TokenPoolWithAllowList_applyAllowListUpdates:test_SetAllowListSkipsZero_Success() (gas: 23476) @@ -1019,9 +1019,9 @@ TokenProxy_getFee:test_GetFee_Success() (gas: 85240) USDCTokenPool__validateMessage:test_ValidateInvalidMessage_Revert() (gas: 25704) USDCTokenPool_lockOrBurn:test_CallerIsNotARampOnRouter_Revert() (gas: 35481) USDCTokenPool_lockOrBurn:test_LockOrBurnWithAllowList_Revert() (gas: 30235) -USDCTokenPool_lockOrBurn:test_LockOrBurn_Success() (gas: 133508) -USDCTokenPool_lockOrBurn:test_UnknownDomain_Revert() (gas: 478182) -USDCTokenPool_releaseOrMint:test_ReleaseOrMintRealTx_Success() (gas: 268672) +USDCTokenPool_lockOrBurn:test_LockOrBurn_Success() (gas: 133525) +USDCTokenPool_lockOrBurn:test_UnknownDomain_Revert() (gas: 478072) +USDCTokenPool_releaseOrMint:test_ReleaseOrMintRealTx_Success() (gas: 268584) USDCTokenPool_releaseOrMint:test_TokenMaxCapacityExceeded_Revert() (gas: 50952) USDCTokenPool_releaseOrMint:test_UnlockingUSDCFailed_Revert() (gas: 98987) USDCTokenPool_setDomains:test_InvalidDomain_Revert() (gas: 66393) diff --git a/contracts/gas-snapshots/shared.gas-snapshot b/contracts/gas-snapshots/shared.gas-snapshot index 70b9ccc982..f563f05078 100644 --- a/contracts/gas-snapshots/shared.gas-snapshot +++ b/contracts/gas-snapshots/shared.gas-snapshot @@ -9,58 +9,58 @@ AuthorizedCallers_constructor:test_ZeroAddressNotAllowed_Revert() (gas: 64473) AuthorizedCallers_constructor:test_constructor_Success() (gas: 720513) BurnMintERC20_approve:testApproveSuccess() (gas: 55477) BurnMintERC20_approve:testInvalidAddressReverts() (gas: 10663) -BurnMintERC20_burn:testBasicBurnSuccess() (gas: 135064) +BurnMintERC20_burn:testBasicBurnSuccess() (gas: 173886) BurnMintERC20_burn:testBurnFromZeroAddressReverts() (gas: 47201) BurnMintERC20_burn:testExceedsBalanceReverts() (gas: 21819) -BurnMintERC20_burn:testSenderNotBurnerReverts() (gas: 32182) +BurnMintERC20_burn:testSenderNotBurnerReverts() (gas: 16739) BurnMintERC20_burnFrom:testBurnFromSuccess() (gas: 57957) BurnMintERC20_burnFrom:testExceedsBalanceReverts() (gas: 35916) BurnMintERC20_burnFrom:testInsufficientAllowanceReverts() (gas: 21914) -BurnMintERC20_burnFrom:testSenderNotBurnerReverts() (gas: 32182) +BurnMintERC20_burnFrom:testSenderNotBurnerReverts() (gas: 16739) BurnMintERC20_burnFromAlias:testBurnFromSuccess() (gas: 57932) BurnMintERC20_burnFromAlias:testExceedsBalanceReverts() (gas: 35880) BurnMintERC20_burnFromAlias:testInsufficientAllowanceReverts() (gas: 21869) -BurnMintERC20_burnFromAlias:testSenderNotBurnerReverts() (gas: 32137) -BurnMintERC20_constructor:testConstructorSuccess() (gas: 1737298) +BurnMintERC20_burnFromAlias:testSenderNotBurnerReverts() (gas: 16694) +BurnMintERC20_constructor:testConstructorSuccess() (gas: 1600593) BurnMintERC20_decreaseApproval:testDecreaseApprovalSuccess() (gas: 31123) BurnMintERC20_grantMintAndBurnRoles:testGrantMintAndBurnRolesSuccess() (gas: 121170) BurnMintERC20_grantRole:testGrantBurnAccessSuccess() (gas: 53407) -BurnMintERC20_grantRole:testGrantManySuccess() (gas: 957680) +BurnMintERC20_grantRole:testGrantManySuccess() (gas: 944594) BurnMintERC20_grantRole:testGrantMintAccessSuccess() (gas: 94200) BurnMintERC20_increaseApproval:testIncreaseApprovalSuccess() (gas: 44121) -BurnMintERC20_mint:testBasicMintSuccess() (gas: 52689) +BurnMintERC20_mint:testBasicMintSuccess() (gas: 149743) BurnMintERC20_mint:testMaxSupplyExceededReverts() (gas: 50429) -BurnMintERC20_mint:testSenderNotMinterReverts() (gas: 30039) +BurnMintERC20_mint:testSenderNotMinterReverts() (gas: 14596) BurnMintERC20_supportsInterface:testConstructorSuccess() (gas: 11123) BurnMintERC20_transfer:testInvalidAddressReverts() (gas: 10661) BurnMintERC20_transfer:testTransferSuccess() (gas: 42277) -BurnMintERC677_approve:testApproveSuccess() (gas: 55512) +BurnMintERC677_approve:testApproveSuccess() (gas: 55477) BurnMintERC677_approve:testInvalidAddressReverts() (gas: 10663) -BurnMintERC677_burn:testBasicBurnSuccess() (gas: 173939) -BurnMintERC677_burn:testBurnFromZeroAddressReverts() (gas: 47201) +BurnMintERC677_burn:testBasicBurnSuccess() (gas: 173904) +BurnMintERC677_burn:testBurnFromZeroAddressReverts() (gas: 47223) BurnMintERC677_burn:testExceedsBalanceReverts() (gas: 21841) -BurnMintERC677_burn:testSenderNotBurnerReverts() (gas: 13359) -BurnMintERC677_burnFrom:testBurnFromSuccess() (gas: 57923) -BurnMintERC677_burnFrom:testExceedsBalanceReverts() (gas: 35864) -BurnMintERC677_burnFrom:testInsufficientAllowanceReverts() (gas: 21849) -BurnMintERC677_burnFrom:testSenderNotBurnerReverts() (gas: 13359) -BurnMintERC677_burnFromAlias:testBurnFromSuccess() (gas: 57949) +BurnMintERC677_burn:testSenderNotBurnerReverts() (gas: 13424) +BurnMintERC677_burnFrom:testBurnFromSuccess() (gas: 57957) +BurnMintERC677_burnFrom:testExceedsBalanceReverts() (gas: 35916) +BurnMintERC677_burnFrom:testInsufficientAllowanceReverts() (gas: 21914) +BurnMintERC677_burnFrom:testSenderNotBurnerReverts() (gas: 13424) +BurnMintERC677_burnFromAlias:testBurnFromSuccess() (gas: 57932) BurnMintERC677_burnFromAlias:testExceedsBalanceReverts() (gas: 35880) BurnMintERC677_burnFromAlias:testInsufficientAllowanceReverts() (gas: 21869) BurnMintERC677_burnFromAlias:testSenderNotBurnerReverts() (gas: 13379) -BurnMintERC677_constructor:testConstructorSuccess() (gas: 1672809) -BurnMintERC677_decreaseApproval:testDecreaseApprovalSuccess() (gas: 31069) -BurnMintERC677_grantMintAndBurnRoles:testGrantMintAndBurnRolesSuccess() (gas: 121324) -BurnMintERC677_grantRole:testGrantBurnAccessSuccess() (gas: 53460) -BurnMintERC677_grantRole:testGrantManySuccess() (gas: 937759) -BurnMintERC677_grantRole:testGrantMintAccessSuccess() (gas: 94340) -BurnMintERC677_increaseApproval:testIncreaseApprovalSuccess() (gas: 44076) -BurnMintERC677_mint:testBasicMintSuccess() (gas: 149699) -BurnMintERC677_mint:testMaxSupplyExceededReverts() (gas: 50385) +BurnMintERC677_constructor:testConstructorSuccess() (gas: 1763863) +BurnMintERC677_decreaseApproval:testDecreaseApprovalSuccess() (gas: 31088) +BurnMintERC677_grantMintAndBurnRoles:testGrantMintAndBurnRolesSuccess() (gas: 121214) +BurnMintERC677_grantRole:testGrantBurnAccessSuccess() (gas: 53477) +BurnMintERC677_grantRole:testGrantManySuccess() (gas: 937980) +BurnMintERC677_grantRole:testGrantMintAccessSuccess() (gas: 94200) +BurnMintERC677_increaseApproval:testIncreaseApprovalSuccess() (gas: 44121) +BurnMintERC677_mint:testBasicMintSuccess() (gas: 149677) +BurnMintERC677_mint:testMaxSupplyExceededReverts() (gas: 50297) BurnMintERC677_mint:testSenderNotMinterReverts() (gas: 11195) -BurnMintERC677_supportsInterface:testConstructorSuccess() (gas: 12476) -BurnMintERC677_transfer:testInvalidAddressReverts() (gas: 10639) -BurnMintERC677_transfer:testTransferSuccess() (gas: 42299) +BurnMintERC677_supportsInterface:testConstructorSuccess() (gas: 12610) +BurnMintERC677_transfer:testInvalidAddressReverts() (gas: 10661) +BurnMintERC677_transfer:testTransferSuccess() (gas: 42277) CallWithExactGas__callWithExactGas:test_CallWithExactGasReceiverErrorSuccess() (gas: 67209) CallWithExactGas__callWithExactGas:test_CallWithExactGasSafeReturnDataExactGas() (gas: 18324) CallWithExactGas__callWithExactGas:test_NoContractReverts() (gas: 11559) @@ -101,11 +101,11 @@ EnumerableMapAddresses_set:testSetSuccess() (gas: 94685) EnumerableMapAddresses_tryGet:testBytes32TryGetSuccess() (gas: 94622) EnumerableMapAddresses_tryGet:testBytesTryGetSuccess() (gas: 96279) EnumerableMapAddresses_tryGet:testTryGetSuccess() (gas: 94893) -OpStackBurnMintERC677_constructor:testConstructorSuccess() (gas: 1743649) -OpStackBurnMintERC677_interfaceCompatibility:testBurnCompatibility() (gas: 298649) -OpStackBurnMintERC677_interfaceCompatibility:testMintCompatibility() (gas: 137957) +OpStackBurnMintERC677_constructor:testConstructorSuccess() (gas: 1829158) +OpStackBurnMintERC677_interfaceCompatibility:testBurnCompatibility() (gas: 298741) +OpStackBurnMintERC677_interfaceCompatibility:testMintCompatibility() (gas: 138155) OpStackBurnMintERC677_interfaceCompatibility:testStaticFunctionsCompatibility() (gas: 13781) -OpStackBurnMintERC677_supportsInterface:testConstructorSuccess() (gas: 12752) +OpStackBurnMintERC677_supportsInterface:testConstructorSuccess() (gas: 12814) SortedSetValidationUtil_CheckIsValidUniqueSubsetTest:test__checkIsValidUniqueSubset_EmptySubset_Reverts() (gas: 5460) SortedSetValidationUtil_CheckIsValidUniqueSubsetTest:test__checkIsValidUniqueSubset_EmptySuperset_Reverts() (gas: 4661) SortedSetValidationUtil_CheckIsValidUniqueSubsetTest:test__checkIsValidUniqueSubset_HasDuplicates_Reverts() (gas: 8265) diff --git a/contracts/src/v0.8/ccip/test/helpers/BurnMintERC677Helper.sol b/contracts/src/v0.8/ccip/test/helpers/BurnMintERC677Helper.sol index 9d2346996a..b6b3907124 100644 --- a/contracts/src/v0.8/ccip/test/helpers/BurnMintERC677Helper.sol +++ b/contracts/src/v0.8/ccip/test/helpers/BurnMintERC677Helper.sol @@ -4,15 +4,11 @@ pragma solidity 0.8.24; import {BurnMintERC677} from "../../../shared/token/ERC677/BurnMintERC677.sol"; import {IGetCCIPAdmin} from "../../interfaces/IGetCCIPAdmin.sol"; -contract BurnMintERC677Helper is BurnMintERC677, IGetCCIPAdmin { +contract BurnMintERC677Helper is BurnMintERC677 { constructor(string memory name, string memory symbol) BurnMintERC677(name, symbol, 18, 0) {} // Gives one full token to any given address. function drip(address to) external { _mint(to, 1e18); } - - function getCCIPAdmin() external view override returns (address) { - return owner(); - } } diff --git a/contracts/src/v0.8/ccip/test/legacy/TokenPoolAndProxy.t.sol b/contracts/src/v0.8/ccip/test/legacy/TokenPoolAndProxy.t.sol index 9645d70b7a..762e52a430 100644 --- a/contracts/src/v0.8/ccip/test/legacy/TokenPoolAndProxy.t.sol +++ b/contracts/src/v0.8/ccip/test/legacy/TokenPoolAndProxy.t.sol @@ -4,6 +4,7 @@ pragma solidity ^0.8.0; import {IPoolV1} from "../../interfaces/IPool.sol"; import {IPoolPriorTo1_5} from "../../interfaces/IPoolPriorTo1_5.sol"; +import {BurnMintERC20} from "../../../shared/token/ERC20/BurnMintERC20.sol"; import {BurnMintERC677} from "../../../shared/token/ERC677/BurnMintERC677.sol"; import {Router} from "../../Router.sol"; import {Client} from "../../libraries/Client.sol"; @@ -112,9 +113,9 @@ contract TokenPoolAndProxyMigration is EVM2EVMOnRampSetup { s_newPool.setPreviousPool(IPoolPriorTo1_5(address(0))); // The new pool is now active, but is has not been given permissions to burn/mint yet - vm.expectRevert(abi.encodeWithSelector(BurnMintERC677.SenderNotBurner.selector, address(s_newPool))); + vm.expectRevert(abi.encodeWithSelector(BurnMintERC20.SenderNotBurner.selector, address(s_newPool))); _ccipSend1_5(); - vm.expectRevert(abi.encodeWithSelector(BurnMintERC677.SenderNotMinter.selector, address(s_newPool))); + vm.expectRevert(abi.encodeWithSelector(BurnMintERC20.SenderNotMinter.selector, address(s_newPool))); _fakeReleaseOrMintFromOffRamp1_5(); // When we do give burn/mint, the new pool is fully active @@ -176,9 +177,9 @@ contract TokenPoolAndProxyMigration is EVM2EVMOnRampSetup { s_newPool.setPreviousPool(IPoolPriorTo1_5(address(0))); // The new pool is now active, but is has not been given permissions to burn/mint yet - vm.expectRevert(abi.encodeWithSelector(BurnMintERC677.SenderNotBurner.selector, address(s_newPool))); + vm.expectRevert(abi.encodeWithSelector(BurnMintERC20.SenderNotBurner.selector, address(s_newPool))); _ccipSend1_5(); - vm.expectRevert(abi.encodeWithSelector(BurnMintERC677.SenderNotMinter.selector, address(s_newPool))); + vm.expectRevert(abi.encodeWithSelector(BurnMintERC20.SenderNotMinter.selector, address(s_newPool))); _fakeReleaseOrMintFromOffRamp1_5(); // When we do give burn/mint, the new pool is fully active diff --git a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol index a309713d2d..0494158dbc 100644 --- a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol +++ b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol @@ -1,21 +1,19 @@ pragma solidity ^0.8.24; import {IOwner} from "../../interfaces/IOwner.sol"; +import {ITokenAdminRegistry} from "../../interfaces/ITokenAdminRegistry.sol"; +import {OwnerIsCreator} from "../../../shared/access/OwnerIsCreator.sol"; + +import {RateLimiter} from "../../libraries/RateLimiter.sol"; import {BurnMintTokenPool} from "../../pools/BurnMintTokenPool.sol"; import {TokenPool} from "../../pools/TokenPool.sol"; - +import {FactoryBurnMintERC20} from "../../tokenAdminRegistry/FactoryBurnMintERC20.sol"; +import {RegistryModuleOwnerCustom} from "../../tokenAdminRegistry/RegistryModuleOwnerCustom.sol"; import {TokenAdminRegistry} from "../../tokenAdminRegistry/TokenAdminRegistry.sol"; import {TokenPoolFactory} from "../../tokenAdminRegistry/TokenPoolFactory.sol"; - -import {RegistryModuleOwnerCustom} from "../../tokenAdminRegistry/RegistryModuleOwnerCustom.sol"; import {TokenAdminRegistrySetup} from "./TokenAdminRegistry.t.sol"; -import {RateLimiter} from "../../libraries/RateLimiter.sol"; - -import {OwnerIsCreator} from "../../../shared/access/OwnerIsCreator.sol"; -import {BurnMintERC20} from "../../../shared/token/ERC20/BurnMintERC20.sol"; - import {Create2} from "../../../vendor/openzeppelin-solidity/v5.0.2/contracts/utils/Create2.sol"; contract TokenPoolFactorySetup is TokenAdminRegistrySetup { @@ -42,14 +40,13 @@ contract TokenPoolFactorySetup is TokenAdminRegistrySetup { s_registryModuleOwnerCustom = new RegistryModuleOwnerCustom(address(s_tokenAdminRegistry)); s_tokenAdminRegistry.addRegistryModule(address(s_registryModuleOwnerCustom)); - s_tokenPoolFactory = new TokenPoolFactory( - address(s_tokenAdminRegistry), address(s_registryModuleOwnerCustom), s_rmnProxy, address(s_sourceRouter) - ); + s_tokenPoolFactory = + new TokenPoolFactory(s_tokenAdminRegistry, s_registryModuleOwnerCustom, s_rmnProxy, address(s_sourceRouter)); // Create Init Code for BurnMintERC20 TestToken with 18 decimals and supply cap of max uint256 value s_tokenCreationParams = abi.encode("TestToken", "TT", 18, type(uint256).max, PREMINT_AMOUNT, OWNER); - s_tokenInitCode = abi.encodePacked(type(BurnMintERC20).creationCode, s_tokenCreationParams); + s_tokenInitCode = abi.encodePacked(type(FactoryBurnMintERC20).creationCode, s_tokenCreationParams); s_poolInitCode = type(BurnMintTokenPool).creationCode; @@ -66,9 +63,14 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { function test_TokenPoolFactory_Constructor_Revert() public { // Revert cause the tokenAdminRegistry is address(0) vm.expectRevert(TokenPoolFactory.InvalidZeroAddress.selector); - new TokenPoolFactory(address(0), address(0), address(0), address(0)); + new TokenPoolFactory(ITokenAdminRegistry(address(0)), RegistryModuleOwnerCustom(address(0)), address(0), address(0)); - new TokenPoolFactory(address(0xdeadbeef), address(0xdeadbeef), address(0xdeadbeef), address(0xdeadbeef)); + new TokenPoolFactory( + ITokenAdminRegistry(address(0xdeadbeef)), + RegistryModuleOwnerCustom(address(0xdeadbeef)), + address(0xdeadbeef), + address(0xdeadbeef) + ); } function test_createTokenPool_WithNoExistingTokenOnRemoteChain_Success() public { @@ -116,9 +118,8 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { RegistryModuleOwnerCustom newRegistryModule = new RegistryModuleOwnerCustom(address(newTokenAdminRegistry)); // We want to deploy a new factory and Owner Module. - TokenPoolFactory newTokenPoolFactory = new TokenPoolFactory( - address(newTokenAdminRegistry), address(newRegistryModule), s_rmnProxy, address(s_destRouter) - ); + TokenPoolFactory newTokenPoolFactory = + new TokenPoolFactory(newTokenAdminRegistry, newRegistryModule, s_rmnProxy, address(s_destRouter)); newTokenAdminRegistry.addRegistryModule(address(newRegistryModule)); @@ -207,7 +208,8 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { vm.startPrank(OWNER); bytes32 dynamicSalt = keccak256(abi.encodePacked(FAKE_SALT, OWNER)); - BurnMintERC20 newRemoteToken = new BurnMintERC20("TestToken", "TT", 18, type(uint256).max, PREMINT_AMOUNT, OWNER); + FactoryBurnMintERC20 newRemoteToken = + new FactoryBurnMintERC20("TestToken", "TT", 18, type(uint256).max, PREMINT_AMOUNT, OWNER); // We have to create a new factory, registry module, and token admin registry to simulate the other chain @@ -215,9 +217,8 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { RegistryModuleOwnerCustom newRegistryModule = new RegistryModuleOwnerCustom(address(newTokenAdminRegistry)); // We want to deploy a new factory and Owner Module. - TokenPoolFactory newTokenPoolFactory = new TokenPoolFactory( - address(newTokenAdminRegistry), address(newRegistryModule), s_rmnProxy, address(s_destRouter) - ); + TokenPoolFactory newTokenPoolFactory = + new TokenPoolFactory(newTokenAdminRegistry, newRegistryModule, s_rmnProxy, address(s_destRouter)); newTokenAdminRegistry.addRegistryModule(address(newRegistryModule)); diff --git a/contracts/src/v0.8/ccip/tokenAdminRegistry/FactoryBurnMintERC20.sol b/contracts/src/v0.8/ccip/tokenAdminRegistry/FactoryBurnMintERC20.sol new file mode 100644 index 0000000000..2d3bebe57b --- /dev/null +++ b/contracts/src/v0.8/ccip/tokenAdminRegistry/FactoryBurnMintERC20.sol @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {BurnMintERC20} from "../../shared/token/ERC20/BurnMintERC20.sol"; + +/// @notice A basic ERC20 compatible token contract with burn and minting roles. +/// @dev The total supply can be limited during deployment. +contract FactoryBurnMintERC20 is BurnMintERC20 { + constructor( + string memory name, + string memory symbol, + uint8 decimals_, + uint256 maxSupply_, + uint256 preMint_, + address newOwner_ + ) BurnMintERC20(name, symbol, decimals_, maxSupply_) { + i_decimals = decimals_; + i_maxSupply = maxSupply_; + + s_ccipAdmin = newOwner_; + + // Mint the initial supply to the new Owner, saving gas by not calling if the mint amount is zero + if (preMint_ != 0) _mint(newOwner_, preMint_); + + // Grant the deployer the minter and burner roles. This contract is expected to be deployed by a factory + // contract that will transfer ownership to the correct address after deployment, so granting minting and burning + // privileges here saves gas by not requiring two transactions. + grantMintRole(newOwner_); + grantBurnRole(newOwner_); + } +} diff --git a/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory.sol b/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory.sol index 13bf738eb9..5055a1065f 100644 --- a/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory.sol +++ b/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory.sol @@ -1,4 +1,4 @@ -pragma solidity ^0.8.24; +pragma solidity 0.8.24; import {IOwnable} from "../../shared/interfaces/IOwnable.sol"; import {ITypeAndVersion} from "../../shared/interfaces/ITypeAndVersion.sol"; @@ -12,6 +12,9 @@ import {RegistryModuleOwnerCustom} from "./RegistryModuleOwnerCustom.sol"; import {Create2} from "../../vendor/openzeppelin-solidity/v5.0.2/contracts/utils/Create2.sol"; +/// @notice A contract for deploying new tokens and token pools, and configuring them with the token admin registry +/// @dev At the end of the transaction, the ownership transfer process will begin, but the user must accept the +/// ownership transfer in a separate transaction. contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { using Create2 for bytes32; @@ -47,20 +50,25 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { RemoteChainConfig remoteChainConfig; } - bytes4 public constant EMPTY_PARAMETER_FLAG = bytes4(keccak256("EMPTY_PARAMETER_FLAG")); string public constant typeAndVersion = "TokenPoolFactory 1.0.0-dev"; - ITokenAdminRegistry internal immutable i_tokenAdminRegistry; - RegistryModuleOwnerCustom internal immutable i_registryModuleOwnerCustom; + ITokenAdminRegistry private immutable i_tokenAdminRegistry; + RegistryModuleOwnerCustom private immutable i_registryModuleOwnerCustom; address private immutable i_rmnProxy; address private immutable i_ccipRouter; - mapping(uint64 remoteChainSelector => RemoteChainConfig remoteConfig) internal s_remoteChainConfigs; + mapping(uint64 remoteChainSelector => RemoteChainConfig remoteConfig) private s_remoteChainConfigs; - constructor(address tokenAdminRegistry, address tokenAdminModule, address rmnProxy, address ccipRouter) { + constructor( + ITokenAdminRegistry tokenAdminRegistry, + RegistryModuleOwnerCustom tokenAdminModule, + address rmnProxy, + address ccipRouter + ) { if ( - tokenAdminRegistry == address(0) || rmnProxy == address(0) || rmnProxy == address(0) || ccipRouter == address(0) + address(tokenAdminRegistry) == address(0) || address(tokenAdminModule) == address(0) || rmnProxy == address(0) + || ccipRouter == address(0) ) revert InvalidZeroAddress(); i_tokenAdminRegistry = ITokenAdminRegistry(tokenAdminRegistry); @@ -83,7 +91,7 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { // Ensure a unique deployment between senders even if the same input parameter is used salt = keccak256(abi.encodePacked(salt, msg.sender)); - // Deploy the token + // Deploy the token. The constructor parameters are already provided in the tokenInitCode address token = Create2.deploy(0, salt, tokenInitCode); // Deploy the token pool @@ -141,12 +149,13 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { bytes calldata tokenPoolInitCode, bytes memory tokenPoolInitArgs, bytes32 salt - ) internal returns (address) { + ) private returns (address) { // Create an array of chain updates to apply to the token pool TokenPool.ChainUpdate[] memory chainUpdates = new TokenPool.ChainUpdate[](remoteTokenPools.length); + RemoteTokenPoolInfo memory remoteTokenPool; for (uint256 i = 0; i < remoteTokenPools.length; i++) { - RemoteTokenPoolInfo memory remoteTokenPool = remoteTokenPools[i]; + remoteTokenPool = remoteTokenPools[i]; RemoteChainConfig memory remoteChainConfig = s_remoteChainConfigs[remoteTokenPool.remoteChainSelector]; // If the user provides an empty byte string, indicated no token has already been deployed, @@ -218,7 +227,7 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { /// the token pool will not be able to be set in the token admin registry, and this function will revert. /// @param token The address of the token to set the pool for /// @param pool The address of the pool to set in the token admin registry - function _setTokenPoolInTokenAdminRegistry(address token, address pool) internal { + function _setTokenPoolInTokenAdminRegistry(address token, address pool) private { i_registryModuleOwnerCustom.registerAdminViaOwner(token); i_tokenAdminRegistry.acceptAdminRole(token); i_tokenAdminRegistry.setPool(token, pool); diff --git a/contracts/src/v0.8/shared/test/token/ERC20/BurnMintERC20.t.sol b/contracts/src/v0.8/shared/test/token/ERC20/BurnMintERC20.t.sol index 964e918168..10143a7057 100644 --- a/contracts/src/v0.8/shared/test/token/ERC20/BurnMintERC20.t.sol +++ b/contracts/src/v0.8/shared/test/token/ERC20/BurnMintERC20.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.19; +pragma solidity ^0.8.4; import {IBurnMintERC20} from "../../../token/ERC20/IBurnMintERC20.sol"; @@ -24,7 +24,7 @@ contract BurnMintERC20Setup is BaseTest { function setUp() public virtual override { BaseTest.setUp(); - s_burnMintERC20 = new BurnMintERC20("Chainlink Token", "LINK", 18, s_maxSupply, 0, OWNER); + s_burnMintERC20 = new BurnMintERC20("Chainlink Token", "LINK", 18, s_maxSupply); // Set s_mockPool to be a burner and minter s_burnMintERC20.grantMintAndBurnRoles(s_mockPool); @@ -38,7 +38,7 @@ contract BurnMintERC20_constructor is BurnMintERC20Setup { string memory symbol = "LINK2"; uint8 decimals = 19; uint256 maxSupply = 1e33; - s_burnMintERC20 = new BurnMintERC20(name, symbol, decimals, maxSupply, 0, OWNER); + s_burnMintERC20 = new BurnMintERC20(name, symbol, decimals, maxSupply); assertEq(name, s_burnMintERC20.name()); assertEq(symbol, s_burnMintERC20.symbol()); diff --git a/contracts/src/v0.8/shared/test/token/ERC677/BurnMintERC677.t.sol b/contracts/src/v0.8/shared/test/token/ERC677/BurnMintERC677.t.sol index 2815f99256..9330a311cd 100644 --- a/contracts/src/v0.8/shared/test/token/ERC677/BurnMintERC677.t.sol +++ b/contracts/src/v0.8/shared/test/token/ERC677/BurnMintERC677.t.sol @@ -6,6 +6,7 @@ import {IERC677} from "../../../token/ERC677/IERC677.sol"; import {BaseTest} from "../../BaseTest.t.sol"; import {BurnMintERC677} from "../../../token/ERC677/BurnMintERC677.sol"; +import {BurnMintERC20} from "../../../token/ERC20/BurnMintERC20.sol"; import {IERC20} from "../../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol"; import {IERC165} from "../../../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/introspection/IERC165.sol"; @@ -106,7 +107,7 @@ contract BurnMintERC677_mint is BurnMintERC677Setup { // Revert function testSenderNotMinterReverts() public { - vm.expectRevert(abi.encodeWithSelector(BurnMintERC677.SenderNotMinter.selector, OWNER)); + vm.expectRevert(abi.encodeWithSelector(BurnMintERC20.SenderNotMinter.selector, OWNER)); s_burnMintERC677.mint(STRANGER, 1e18); } @@ -117,7 +118,7 @@ contract BurnMintERC677_mint is BurnMintERC677Setup { s_burnMintERC677.mint(OWNER, s_burnMintERC677.maxSupply()); vm.expectRevert( - abi.encodeWithSelector(BurnMintERC677.MaxSupplyExceeded.selector, s_burnMintERC677.maxSupply() + 1) + abi.encodeWithSelector(BurnMintERC20.MaxSupplyExceeded.selector, s_burnMintERC677.maxSupply() + 1) ); // Attempt to mint 1 more than max supply @@ -141,7 +142,7 @@ contract BurnMintERC677_burn is BurnMintERC677Setup { // Revert function testSenderNotBurnerReverts() public { - vm.expectRevert(abi.encodeWithSelector(BurnMintERC677.SenderNotBurner.selector, OWNER)); + vm.expectRevert(abi.encodeWithSelector(BurnMintERC20.SenderNotBurner.selector, OWNER)); s_burnMintERC677.burnFrom(STRANGER, s_amount); } @@ -182,7 +183,7 @@ contract BurnMintERC677_burnFromAlias is BurnMintERC677Setup { // Reverts function testSenderNotBurnerReverts() public { - vm.expectRevert(abi.encodeWithSelector(BurnMintERC677.SenderNotBurner.selector, OWNER)); + vm.expectRevert(abi.encodeWithSelector(BurnMintERC20.SenderNotBurner.selector, OWNER)); s_burnMintERC677.burn(OWNER, s_amount); } @@ -224,7 +225,7 @@ contract BurnMintERC677_burnFrom is BurnMintERC677Setup { // Reverts function testSenderNotBurnerReverts() public { - vm.expectRevert(abi.encodeWithSelector(BurnMintERC677.SenderNotBurner.selector, OWNER)); + vm.expectRevert(abi.encodeWithSelector(BurnMintERC20.SenderNotBurner.selector, OWNER)); s_burnMintERC677.burnFrom(OWNER, s_amount); } diff --git a/contracts/src/v0.8/shared/test/token/ERC677/OpStackBurnMintERC677.t.sol b/contracts/src/v0.8/shared/test/token/ERC677/OpStackBurnMintERC677.t.sol index 614b3bea15..442382fb86 100644 --- a/contracts/src/v0.8/shared/test/token/ERC677/OpStackBurnMintERC677.t.sol +++ b/contracts/src/v0.8/shared/test/token/ERC677/OpStackBurnMintERC677.t.sol @@ -6,6 +6,8 @@ import {IOptimismMintableERC20Minimal, IOptimismMintableERC20} from "../../../to import {IERC677} from "../../../token/ERC677/IERC677.sol"; import {BurnMintERC677} from "../../../token/ERC677/BurnMintERC677.sol"; +import {BurnMintERC20} from "../../../token/ERC20/BurnMintERC20.sol"; + import {BaseTest} from "../../BaseTest.t.sol"; import {OpStackBurnMintERC677} from "../../../token/ERC677/OpStackBurnMintERC677.sol"; @@ -66,7 +68,7 @@ contract OpStackBurnMintERC677_interfaceCompatibility is OpStackBurnMintERC677Se function testMintCompatibility() public { // Ensure roles work - vm.expectRevert(abi.encodeWithSelector(BurnMintERC677.SenderNotMinter.selector, OWNER)); + vm.expectRevert(abi.encodeWithSelector(BurnMintERC20.SenderNotMinter.selector, OWNER)); s_opStackToken.mint(OWNER, 1); // Use the actual contract to grant mint @@ -87,7 +89,7 @@ contract OpStackBurnMintERC677_interfaceCompatibility is OpStackBurnMintERC677Se function testBurnCompatibility() public { // Ensure roles work - vm.expectRevert(abi.encodeWithSelector(BurnMintERC677.SenderNotBurner.selector, OWNER)); + vm.expectRevert(abi.encodeWithSelector(BurnMintERC20.SenderNotBurner.selector, OWNER)); s_opStackToken.burn(address(0x0), 1); // Use the actual contract to grant burn diff --git a/contracts/src/v0.8/shared/token/ERC20/BurnMintERC20.sol b/contracts/src/v0.8/shared/token/ERC20/BurnMintERC20.sol index 41d71c6f16..9b3fc56cc9 100644 --- a/contracts/src/v0.8/shared/token/ERC20/BurnMintERC20.sol +++ b/contracts/src/v0.8/shared/token/ERC20/BurnMintERC20.sol @@ -3,6 +3,7 @@ pragma solidity ^0.8.0; import {IBurnMintERC20} from "../ERC20/IBurnMintERC20.sol"; import {IOwnable} from "../../interfaces/IOwnable.sol"; +import {IGetCCIPAdmin} from "../../../ccip/interfaces/IGetCCIPAdmin.sol"; import {OwnerIsCreator} from "../../access/OwnerIsCreator.sol"; @@ -14,7 +15,7 @@ import {EnumerableSet} from "../../../vendor/openzeppelin-solidity/v4.8.3/contra /// @notice A basic ERC20 compatible token contract with burn and minting roles. /// @dev The total supply can be limited during deployment. -contract BurnMintERC20 is IBurnMintERC20, IERC165, ERC20Burnable, OwnerIsCreator { +contract BurnMintERC20 is IBurnMintERC20, IGetCCIPAdmin, IERC165, ERC20Burnable, OwnerIsCreator { using EnumerableSet for EnumerableSet.AddressSet; error SenderNotMinter(address sender); @@ -47,23 +48,12 @@ contract BurnMintERC20 is IBurnMintERC20, IERC165, ERC20Burnable, OwnerIsCreator string memory name, string memory symbol, uint8 decimals_, - uint256 maxSupply_, - uint256 preMint_, - address newOwner_ + uint256 maxSupply_ ) ERC20(name, symbol) { i_decimals = decimals_; i_maxSupply = maxSupply_; - s_ccipAdmin = newOwner_; - - // Mint the initial supply to the new Owner, saving gas by not calling if the mint amount is zero - if (preMint_ != 0) _mint(newOwner_, preMint_); - - // Grant the deployer the minter and burner roles. This contract is expected to be deployed by a factory - // contract that will transfer ownership to the correct address after deployment, so granting minting and burning - // privileges here saves gas by not requiring two transactions. - grantMintRole(newOwner_); - grantBurnRole(newOwner_); + s_ccipAdmin = msg.sender; } function supportsInterface(bytes4 interfaceId) public pure virtual override returns (bool) { diff --git a/contracts/src/v0.8/shared/token/ERC677/BurnMintERC677.sol b/contracts/src/v0.8/shared/token/ERC677/BurnMintERC677.sol index 24573f3057..f565aefeae 100644 --- a/contracts/src/v0.8/shared/token/ERC677/BurnMintERC677.sol +++ b/contracts/src/v0.8/shared/token/ERC677/BurnMintERC677.sol @@ -1,217 +1,35 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import {IBurnMintERC20} from "../ERC20/IBurnMintERC20.sol"; import {IERC677} from "./IERC677.sol"; +import {IERC677Receiver} from "../../interfaces/IERC677Receiver.sol"; -import {ERC677} from "./ERC677.sol"; -import {OwnerIsCreator} from "../../access/OwnerIsCreator.sol"; - -import {ERC20Burnable} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/extensions/ERC20Burnable.sol"; -import {EnumerableSet} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/structs/EnumerableSet.sol"; -import {IERC165} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/introspection/IERC165.sol"; -import {IERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol"; +import {BurnMintERC20} from "../ERC20/BurnMintERC20.sol"; /// @notice A basic ERC677 compatible token contract with burn and minting roles. /// @dev The total supply can be limited during deployment. -contract BurnMintERC677 is IBurnMintERC20, ERC677, IERC165, ERC20Burnable, OwnerIsCreator { - using EnumerableSet for EnumerableSet.AddressSet; - - error SenderNotMinter(address sender); - error SenderNotBurner(address sender); - error MaxSupplyExceeded(uint256 supplyAfterMint); - - event MintAccessGranted(address indexed minter); - event BurnAccessGranted(address indexed burner); - event MintAccessRevoked(address indexed minter); - event BurnAccessRevoked(address indexed burner); - - // @dev the allowed minter addresses - EnumerableSet.AddressSet internal s_minters; - // @dev the allowed burner addresses - EnumerableSet.AddressSet internal s_burners; +contract BurnMintERC677 is BurnMintERC20, IERC677 { - /// @dev The number of decimals for the token - uint8 internal immutable i_decimals; - - /// @dev The maximum supply of the token, 0 if unlimited - uint256 internal immutable i_maxSupply; - - constructor(string memory name, string memory symbol, uint8 decimals_, uint256 maxSupply_) ERC677(name, symbol) { - i_decimals = decimals_; - i_maxSupply = maxSupply_; - } + constructor(string memory name, string memory symbol, uint8 decimals_, uint256 maxSupply_) BurnMintERC20(name, symbol, + decimals_, maxSupply_) {} function supportsInterface(bytes4 interfaceId) public pure virtual override returns (bool) { return - interfaceId == type(IERC20).interfaceId || interfaceId == type(IERC677).interfaceId || - interfaceId == type(IBurnMintERC20).interfaceId || - interfaceId == type(IERC165).interfaceId; - } - - // ================================================================ - // | ERC20 | - // ================================================================ - - /// @dev Returns the number of decimals used in its user representation. - function decimals() public view virtual override returns (uint8) { - return i_decimals; - } - - /// @dev Returns the max supply of the token, 0 if unlimited. - function maxSupply() public view virtual returns (uint256) { - return i_maxSupply; - } - - /// @dev Uses OZ ERC20 _transfer to disallow sending to address(0). - /// @dev Disallows sending to address(this) - function _transfer(address from, address to, uint256 amount) internal virtual override validAddress(to) { - super._transfer(from, to, amount); + super.supportsInterface(interfaceId); } - /// @dev Uses OZ ERC20 _approve to disallow approving for address(0). - /// @dev Disallows approving for address(this) - function _approve(address owner, address spender, uint256 amount) internal virtual override validAddress(spender) { - super._approve(owner, spender, amount); - } - - /// @dev Exists to be backwards compatible with the older naming convention. - function decreaseApproval(address spender, uint256 subtractedValue) external returns (bool success) { - return decreaseAllowance(spender, subtractedValue); - } - - /// @dev Exists to be backwards compatible with the older naming convention. - function increaseApproval(address spender, uint256 addedValue) external { - increaseAllowance(spender, addedValue); - } - - /// @notice Check if recipient is valid (not this contract address). - /// @param recipient the account we transfer/approve to. - /// @dev Reverts with an empty revert to be compatible with the existing link token when - /// the recipient is this contract address. - modifier validAddress(address recipient) virtual { - // solhint-disable-next-line reason-string, gas-custom-errors - if (recipient == address(this)) revert(); - _; - } - - // ================================================================ - // | Burning & minting | - // ================================================================ - - /// @inheritdoc ERC20Burnable - /// @dev Uses OZ ERC20 _burn to disallow burning from address(0). - /// @dev Decreases the total supply. - function burn(uint256 amount) public override(IBurnMintERC20, ERC20Burnable) onlyBurner { - super.burn(amount); - } - - /// @inheritdoc IBurnMintERC20 - /// @dev Alias for BurnFrom for compatibility with the older naming convention. - /// @dev Uses burnFrom for all validation & logic. - function burn(address account, uint256 amount) public virtual override { - burnFrom(account, amount); - } - - /// @inheritdoc ERC20Burnable - /// @dev Uses OZ ERC20 _burn to disallow burning from address(0). - /// @dev Decreases the total supply. - function burnFrom(address account, uint256 amount) public override(IBurnMintERC20, ERC20Burnable) onlyBurner { - super.burnFrom(account, amount); - } - - /// @inheritdoc IBurnMintERC20 - /// @dev Uses OZ ERC20 _mint to disallow minting to address(0). - /// @dev Disallows minting to address(this) - /// @dev Increases the total supply. - function mint(address account, uint256 amount) external override onlyMinter validAddress(account) { - if (i_maxSupply != 0 && totalSupply() + amount > i_maxSupply) revert MaxSupplyExceeded(totalSupply() + amount); - - _mint(account, amount); - } - - // ================================================================ - // | Roles | - // ================================================================ - - /// @notice grants both mint and burn roles to `burnAndMinter`. - /// @dev calls public functions so this function does not require - /// access controls. This is handled in the inner functions. - function grantMintAndBurnRoles(address burnAndMinter) external { - grantMintRole(burnAndMinter); - grantBurnRole(burnAndMinter); - } - - /// @notice Grants mint role to the given address. - /// @dev only the owner can call this function. - function grantMintRole(address minter) public onlyOwner { - if (s_minters.add(minter)) { - emit MintAccessGranted(minter); + /// @inheritdoc IERC677 + /// @dev This function has been duplicated from ERC677.sol since functionality cannot be inherited due to + /// dual imports of ERC20 with BurnMintERC20.sol + function transferAndCall(address to, uint256 amount, bytes memory data) public returns (bool success) { + super.transfer(to, amount); + emit Transfer(msg.sender, to, amount, data); + if (to.code.length > 0) { + IERC677Receiver(to).onTokenTransfer(msg.sender, amount, data); } + return true; } - /// @notice Grants burn role to the given address. - /// @dev only the owner can call this function. - function grantBurnRole(address burner) public onlyOwner { - if (s_burners.add(burner)) { - emit BurnAccessGranted(burner); - } - } - /// @notice Revokes mint role for the given address. - /// @dev only the owner can call this function. - function revokeMintRole(address minter) public onlyOwner { - if (s_minters.remove(minter)) { - emit MintAccessRevoked(minter); - } - } - - /// @notice Revokes burn role from the given address. - /// @dev only the owner can call this function - function revokeBurnRole(address burner) public onlyOwner { - if (s_burners.remove(burner)) { - emit BurnAccessRevoked(burner); - } - } - - /// @notice Returns all permissioned minters - function getMinters() public view returns (address[] memory) { - return s_minters.values(); - } - - /// @notice Returns all permissioned burners - function getBurners() public view returns (address[] memory) { - return s_burners.values(); - } - - // ================================================================ - // | Access | - // ================================================================ - - /// @notice Checks whether a given address is a minter for this token. - /// @return true if the address is allowed to mint. - function isMinter(address minter) public view returns (bool) { - return s_minters.contains(minter); - } - - /// @notice Checks whether a given address is a burner for this token. - /// @return true if the address is allowed to burn. - function isBurner(address burner) public view returns (bool) { - return s_burners.contains(burner); - } - - /// @notice Checks whether the msg.sender is a permissioned minter for this token - /// @dev Reverts with a SenderNotMinter if the check fails - modifier onlyMinter() { - if (!isMinter(msg.sender)) revert SenderNotMinter(msg.sender); - _; - } - - /// @notice Checks whether the msg.sender is a permissioned burner for this token - /// @dev Reverts with a SenderNotBurner if the check fails - modifier onlyBurner() { - if (!isBurner(msg.sender)) revert SenderNotBurner(msg.sender); - _; - } } From 706eb0b684794366ed26d014a74ac592d42d0fea Mon Sep 17 00:00:00 2001 From: Josh Date: Wed, 25 Sep 2024 13:22:55 -0400 Subject: [PATCH 22/48] linting --- .../test/token/ERC677/BurnMintERC677.t.sol | 4 +--- .../v0.8/shared/token/ERC20/BurnMintERC20.sol | 7 +------ .../v0.8/shared/token/ERC677/BurnMintERC677.sol | 17 ++++++++--------- 3 files changed, 10 insertions(+), 18 deletions(-) diff --git a/contracts/src/v0.8/shared/test/token/ERC677/BurnMintERC677.t.sol b/contracts/src/v0.8/shared/test/token/ERC677/BurnMintERC677.t.sol index 9330a311cd..9ec6f53dce 100644 --- a/contracts/src/v0.8/shared/test/token/ERC677/BurnMintERC677.t.sol +++ b/contracts/src/v0.8/shared/test/token/ERC677/BurnMintERC677.t.sol @@ -117,9 +117,7 @@ contract BurnMintERC677_mint is BurnMintERC677Setup { // Mint max supply s_burnMintERC677.mint(OWNER, s_burnMintERC677.maxSupply()); - vm.expectRevert( - abi.encodeWithSelector(BurnMintERC20.MaxSupplyExceeded.selector, s_burnMintERC677.maxSupply() + 1) - ); + vm.expectRevert(abi.encodeWithSelector(BurnMintERC20.MaxSupplyExceeded.selector, s_burnMintERC677.maxSupply() + 1)); // Attempt to mint 1 more than max supply s_burnMintERC677.mint(OWNER, 1); diff --git a/contracts/src/v0.8/shared/token/ERC20/BurnMintERC20.sol b/contracts/src/v0.8/shared/token/ERC20/BurnMintERC20.sol index 9b3fc56cc9..783f7ebc71 100644 --- a/contracts/src/v0.8/shared/token/ERC20/BurnMintERC20.sol +++ b/contracts/src/v0.8/shared/token/ERC20/BurnMintERC20.sol @@ -44,12 +44,7 @@ contract BurnMintERC20 is IBurnMintERC20, IGetCCIPAdmin, IERC165, ERC20Burnable, /// @dev the allowed burner addresses EnumerableSet.AddressSet internal s_burners; - constructor( - string memory name, - string memory symbol, - uint8 decimals_, - uint256 maxSupply_ - ) ERC20(name, symbol) { + constructor(string memory name, string memory symbol, uint8 decimals_, uint256 maxSupply_) ERC20(name, symbol) { i_decimals = decimals_; i_maxSupply = maxSupply_; diff --git a/contracts/src/v0.8/shared/token/ERC677/BurnMintERC677.sol b/contracts/src/v0.8/shared/token/ERC677/BurnMintERC677.sol index f565aefeae..5d5bfb7db3 100644 --- a/contracts/src/v0.8/shared/token/ERC677/BurnMintERC677.sol +++ b/contracts/src/v0.8/shared/token/ERC677/BurnMintERC677.sol @@ -9,18 +9,19 @@ import {BurnMintERC20} from "../ERC20/BurnMintERC20.sol"; /// @notice A basic ERC677 compatible token contract with burn and minting roles. /// @dev The total supply can be limited during deployment. contract BurnMintERC677 is BurnMintERC20, IERC677 { - - constructor(string memory name, string memory symbol, uint8 decimals_, uint256 maxSupply_) BurnMintERC20(name, symbol, - decimals_, maxSupply_) {} + constructor( + string memory name, + string memory symbol, + uint8 decimals_, + uint256 maxSupply_ + ) BurnMintERC20(name, symbol, decimals_, maxSupply_) {} function supportsInterface(bytes4 interfaceId) public pure virtual override returns (bool) { - return - interfaceId == type(IERC677).interfaceId || - super.supportsInterface(interfaceId); + return interfaceId == type(IERC677).interfaceId || super.supportsInterface(interfaceId); } /// @inheritdoc IERC677 - /// @dev This function has been duplicated from ERC677.sol since functionality cannot be inherited due to + /// @dev This function has been duplicated from ERC677.sol since functionality cannot be inherited due to /// dual imports of ERC20 with BurnMintERC20.sol function transferAndCall(address to, uint256 amount, bytes memory data) public returns (bool success) { super.transfer(to, amount); @@ -30,6 +31,4 @@ contract BurnMintERC677 is BurnMintERC20, IERC677 { } return true; } - - } From 559bfee2c9a82e1e38437e84de33b0e3820ef8fa Mon Sep 17 00:00:00 2001 From: Josh Date: Wed, 25 Sep 2024 13:31:33 -0400 Subject: [PATCH 23/48] fix a weird snapshot issue idek how this happened --- .../gas-snapshots/operatorforwarder.gas-snapshot | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/contracts/gas-snapshots/operatorforwarder.gas-snapshot b/contracts/gas-snapshots/operatorforwarder.gas-snapshot index 66bb19f1f6..0414f500c2 100644 --- a/contracts/gas-snapshots/operatorforwarder.gas-snapshot +++ b/contracts/gas-snapshots/operatorforwarder.gas-snapshot @@ -4,12 +4,12 @@ FactoryTest:test_DeployNewOperatorAndForwarder_Success() (gas: 4069305) FactoryTest:test_DeployNewOperator_Success() (gas: 3020464) ForwarderTest:test_Forward_Success(uint256) (runs: 257, μ: 226979, ~: 227289) ForwarderTest:test_MultiForward_Success(uint256,uint256) (runs: 257, μ: 258577, ~: 259120) -ForwarderTest:test_OwnerForward_Success() (gas: 30118) +ForwarderTest:test_OwnerForward_Success() (gas: 30096) ForwarderTest:test_SetAuthorizedSenders_Success() (gas: 160524) ForwarderTest:test_TransferOwnershipWithMessage_Success() (gas: 35123) -OperatorTest:test_CancelOracleRequest_Success() (gas: 274436) -OperatorTest:test_FulfillOracleRequest_Success() (gas: 330603) -OperatorTest:test_NotAuthorizedSender_Revert() (gas: 246716) -OperatorTest:test_OracleRequest_Success() (gas: 250019) -OperatorTest:test_SendRequestAndCancelRequest_Success(uint96) (runs: 257, μ: 387121, ~: 387124) -OperatorTest:test_SendRequest_Success(uint96) (runs: 257, μ: 303612, ~: 303615) \ No newline at end of file +OperatorTest:test_CancelOracleRequest_Success() (gas: 274295) +OperatorTest:test_FulfillOracleRequest_Success() (gas: 330480) +OperatorTest:test_NotAuthorizedSender_Revert() (gas: 246628) +OperatorTest:test_OracleRequest_Success() (gas: 249843) +OperatorTest:test_SendRequestAndCancelRequest_Success(uint96) (runs: 257, μ: 386787, ~: 386790) +OperatorTest:test_SendRequest_Success(uint96) (runs: 257, μ: 303436, ~: 303439) \ No newline at end of file From a99738744e81e35326a6430ac5f9a307460df9b1 Mon Sep 17 00:00:00 2001 From: "app-token-issuer-infra-releng[bot]" <120227048+app-token-issuer-infra-releng[bot]@users.noreply.github.com> Date: Wed, 25 Sep 2024 17:37:55 +0000 Subject: [PATCH 24/48] Update gethwrappers --- .../burn_mint_erc677/burn_mint_erc677.go | 196 +++++++++++++++++- .../shared/generated/link_token/link_token.go | 196 +++++++++++++++++- ...rapper-dependency-versions-do-not-edit.txt | 4 +- 3 files changed, 384 insertions(+), 12 deletions(-) diff --git a/core/gethwrappers/shared/generated/burn_mint_erc677/burn_mint_erc677.go b/core/gethwrappers/shared/generated/burn_mint_erc677/burn_mint_erc677.go index 1d5b1c4ab1..d412d6949d 100644 --- a/core/gethwrappers/shared/generated/burn_mint_erc677/burn_mint_erc677.go +++ b/core/gethwrappers/shared/generated/burn_mint_erc677/burn_mint_erc677.go @@ -31,8 +31,8 @@ var ( ) var BurnMintERC677MetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"decimals_\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"maxSupply_\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"supplyAfterMint\",\"type\":\"uint256\"}],\"name\":\"MaxSupplyExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SenderNotBurner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SenderNotMinter\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"}],\"name\":\"BurnAccessGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"}],\"name\":\"BurnAccessRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"MintAccessGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"MintAccessRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseApproval\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getBurners\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMinters\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"}],\"name\":\"grantBurnRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"burnAndMinter\",\"type\":\"address\"}],\"name\":\"grantMintAndBurnRoles\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"grantMintRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseApproval\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"}],\"name\":\"isBurner\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"isMinter\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"}],\"name\":\"revokeBurnRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"revokeMintRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"transferAndCall\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x60c06040523480156200001157600080fd5b50604051620022dd380380620022dd833981016040819052620000349162000277565b338060008686818160036200004a838262000391565b50600462000059828262000391565b5050506001600160a01b0384169150620000bc90505760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600580546001600160a01b0319166001600160a01b0384811691909117909155811615620000ef57620000ef8162000106565b50505060ff90911660805260a052506200045d9050565b336001600160a01b03821603620001605760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401620000b3565b600680546001600160a01b0319166001600160a01b03838116918217909255600554604051919216907fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae127890600090a350565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001da57600080fd5b81516001600160401b0380821115620001f757620001f7620001b2565b604051601f8301601f19908116603f01168101908282118183101715620002225762000222620001b2565b816040528381526020925086838588010111156200023f57600080fd5b600091505b8382101562000263578582018301518183018401529082019062000244565b600093810190920192909252949350505050565b600080600080608085870312156200028e57600080fd5b84516001600160401b0380821115620002a657600080fd5b620002b488838901620001c8565b95506020870151915080821115620002cb57600080fd5b50620002da87828801620001c8565b935050604085015160ff81168114620002f257600080fd5b6060959095015193969295505050565b600181811c908216806200031757607f821691505b6020821081036200033857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200038c57600081815260208120601f850160051c81016020861015620003675750805b601f850160051c820191505b81811015620003885782815560010162000373565b5050505b505050565b81516001600160401b03811115620003ad57620003ad620001b2565b620003c581620003be845462000302565b846200033e565b602080601f831160018114620003fd5760008415620003e45750858301515b600019600386901b1c1916600185901b17855562000388565b600085815260208120601f198616915b828110156200042e578886015182559484019460019091019084016200040d565b50858210156200044d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a051611e4c6200049160003960008181610447015281816108c301526108ed015260006102710152611e4c6000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c806379cc67901161010f578063c2e3273d116100a2578063d73dd62311610071578063d73dd6231461046b578063dd62ed3e1461047e578063f2fde38b146104c4578063f81094f3146104d757600080fd5b8063c2e3273d1461040c578063c630948d1461041f578063c64d0ebc14610432578063d5abeb011461044557600080fd5b80639dc29fac116100de5780639dc29fac146103c0578063a457c2d7146103d3578063a9059cbb146103e6578063aa271e1a146103f957600080fd5b806379cc67901461037557806386fe8b43146103885780638da5cb5b1461039057806395d89b41146103b857600080fd5b806340c10f19116101875780636618846311610156578063661884631461030f5780636b32810b1461032257806370a082311461033757806379ba50971461036d57600080fd5b806340c10f19146102c157806342966c68146102d65780634334614a146102e95780634f5632f8146102fc57600080fd5b806323b872dd116101c357806323b872dd14610257578063313ce5671461026a578063395093511461029b5780634000aea0146102ae57600080fd5b806301ffc9a7146101f557806306fdde031461021d578063095ea7b31461023257806318160ddd14610245575b600080fd5b6102086102033660046119b9565b6104ea565b60405190151581526020015b60405180910390f35b61022561061b565b6040516102149190611a5f565b610208610240366004611a9b565b6106ad565b6002545b604051908152602001610214565b610208610265366004611ac5565b6106c5565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610214565b6102086102a9366004611a9b565b6106e9565b6102086102bc366004611b30565b610735565b6102d46102cf366004611a9b565b610858565b005b6102d46102e4366004611c19565b61097f565b6102086102f7366004611c32565b6109cc565b6102d461030a366004611c32565b6109d9565b61020861031d366004611a9b565b610a35565b61032a610a48565b6040516102149190611c4d565b610249610345366004611c32565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6102d4610a59565b6102d4610383366004611a9b565b610b5a565b61032a610ba9565b60055460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610214565b610225610bb5565b6102d46103ce366004611a9b565b610bc4565b6102086103e1366004611a9b565b610bce565b6102086103f4366004611a9b565b610c9f565b610208610407366004611c32565b610cad565b6102d461041a366004611c32565b610cba565b6102d461042d366004611c32565b610d16565b6102d4610440366004611c32565b610d24565b7f0000000000000000000000000000000000000000000000000000000000000000610249565b6102d4610479366004611a9b565b610d80565b61024961048c366004611ca7565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6102d46104d2366004611c32565b610d8a565b6102d46104e5366004611c32565b610d9b565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f36372b0700000000000000000000000000000000000000000000000000000000148061057d57507fffffffff0000000000000000000000000000000000000000000000000000000082167f4000aea000000000000000000000000000000000000000000000000000000000145b806105c957507fffffffff0000000000000000000000000000000000000000000000000000000082167fe6599b4d00000000000000000000000000000000000000000000000000000000145b8061061557507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b60606003805461062a90611cda565b80601f016020809104026020016040519081016040528092919081815260200182805461065690611cda565b80156106a35780601f10610678576101008083540402835291602001916106a3565b820191906000526020600020905b81548152906001019060200180831161068657829003601f168201915b5050505050905090565b6000336106bb818585610df7565b5060019392505050565b6000336106d3858285610e2b565b6106de858585610efc565b506001949350505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906106bb9082908690610730908790611d5c565b610df7565b60006107418484610c9f565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fe19260aff97b920c7df27010903aeb9c8d2be5d310a2c67824cf3f15396e4c1685856040516107a1929190611d6f565b60405180910390a373ffffffffffffffffffffffffffffffffffffffff84163b156106bb576040517fa4c0ed3600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063a4c0ed369061081c90339087908790600401611d90565b600060405180830381600087803b15801561083657600080fd5b505af115801561084a573d6000803e3d6000fd5b505050505060019392505050565b61086133610cad565b61089e576040517fe2c8c9d50000000000000000000000000000000000000000000000000000000081523360048201526024015b60405180910390fd5b813073ffffffffffffffffffffffffffffffffffffffff8216036108c157600080fd5b7f00000000000000000000000000000000000000000000000000000000000000001580159061092257507f00000000000000000000000000000000000000000000000000000000000000008261091660025490565b6109209190611d5c565b115b15610970578161093160025490565b61093b9190611d5c565b6040517fcbbf111300000000000000000000000000000000000000000000000000000000815260040161089591815260200190565b61097a8383610f2a565b505050565b610988336109cc565b6109c0576040517fc820b10b000000000000000000000000000000000000000000000000000000008152336004820152602401610895565b6109c98161101d565b50565b6000610615600983611027565b6109e1611056565b6109ec6009826110d9565b156109c95760405173ffffffffffffffffffffffffffffffffffffffff8216907f0a675452746933cefe3d74182e78db7afe57ba60eaa4234b5d85e9aa41b0610c90600090a250565b6000610a418383610bce565b9392505050565b6060610a5460076110fb565b905090565b60065473ffffffffffffffffffffffffffffffffffffffff163314610ada576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610895565b600580547fffffffffffffffffffffffff00000000000000000000000000000000000000008082163390811790935560068054909116905560405173ffffffffffffffffffffffffffffffffffffffff909116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b610b63336109cc565b610b9b576040517fc820b10b000000000000000000000000000000000000000000000000000000008152336004820152602401610895565b610ba58282611108565b5050565b6060610a5460096110fb565b60606004805461062a90611cda565b610ba58282610b5a565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610c92576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610895565b6106de8286868403610df7565b6000336106bb818585610efc565b6000610615600783611027565b610cc2611056565b610ccd60078261111d565b156109c95760405173ffffffffffffffffffffffffffffffffffffffff8216907fe46fef8bbff1389d9010703cf8ebb363fb3daf5bf56edc27080b67bc8d9251ea90600090a250565b610d1f81610cba565b6109c9815b610d2c611056565b610d3760098261111d565b156109c95760405173ffffffffffffffffffffffffffffffffffffffff8216907f92308bb7573b2a3d17ddb868b39d8ebec433f3194421abc22d084f89658c9bad90600090a250565b61097a82826106e9565b610d92611056565b6109c98161113f565b610da3611056565b610dae6007826110d9565b156109c95760405173ffffffffffffffffffffffffffffffffffffffff8216907fed998b960f6340d045f620c119730f7aa7995e7425c2401d3a5b64ff998a59e990600090a250565b813073ffffffffffffffffffffffffffffffffffffffff821603610e1a57600080fd5b610e25848484611235565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610e255781811015610eef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610895565b610e258484848403610df7565b813073ffffffffffffffffffffffffffffffffffffffff821603610f1f57600080fd5b610e258484846113e8565b73ffffffffffffffffffffffffffffffffffffffff8216610fa7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610895565b8060026000828254610fb99190611d5c565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6109c93382611657565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001830160205260408120541515610a41565b60055473ffffffffffffffffffffffffffffffffffffffff1633146110d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610895565b565b6000610a418373ffffffffffffffffffffffffffffffffffffffff841661181b565b60606000610a418361190e565b611113823383610e2b565b610ba58282611657565b6000610a418373ffffffffffffffffffffffffffffffffffffffff841661196a565b3373ffffffffffffffffffffffffffffffffffffffff8216036111be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610895565b600680547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff838116918217909255600554604051919216907fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae127890600090a350565b73ffffffffffffffffffffffffffffffffffffffff83166112d7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff821661137a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff831661148b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff821661152e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040902054818110156115e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610e25565b73ffffffffffffffffffffffffffffffffffffffff82166116fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040902054818110156117b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b6000818152600183016020526040812054801561190457600061183f600183611dce565b855490915060009061185390600190611dce565b90508181146118b857600086600001828154811061187357611873611de1565b906000526020600020015490508087600001848154811061189657611896611de1565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806118c9576118c9611e10565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610615565b6000915050610615565b60608160000180548060200260200160405190810160405280929190818152602001828054801561195e57602002820191906000526020600020905b81548152602001906001019080831161194a575b50505050509050919050565b60008181526001830160205260408120546119b157508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610615565b506000610615565b6000602082840312156119cb57600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610a4157600080fd5b6000815180845260005b81811015611a2157602081850181015186830182015201611a05565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081526000610a4160208301846119fb565b803573ffffffffffffffffffffffffffffffffffffffff81168114611a9657600080fd5b919050565b60008060408385031215611aae57600080fd5b611ab783611a72565b946020939093013593505050565b600080600060608486031215611ada57600080fd5b611ae384611a72565b9250611af160208501611a72565b9150604084013590509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080600060608486031215611b4557600080fd5b611b4e84611a72565b925060208401359150604084013567ffffffffffffffff80821115611b7257600080fd5b818601915086601f830112611b8657600080fd5b813581811115611b9857611b98611b01565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611bde57611bde611b01565b81604052828152896020848701011115611bf757600080fd5b8260208601602083013760006020848301015280955050505050509250925092565b600060208284031215611c2b57600080fd5b5035919050565b600060208284031215611c4457600080fd5b610a4182611a72565b6020808252825182820181905260009190848201906040850190845b81811015611c9b57835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101611c69565b50909695505050505050565b60008060408385031215611cba57600080fd5b611cc383611a72565b9150611cd160208401611a72565b90509250929050565b600181811c90821680611cee57607f821691505b602082108103611d27577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561061557610615611d2d565b828152604060208201526000611d8860408301846119fb565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000611dc560608301846119fb565b95945050505050565b8181038181111561061557610615611d2d565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000813000a", + ABI: "[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"decimals_\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"maxSupply_\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"supplyAfterMint\",\"type\":\"uint256\"}],\"name\":\"MaxSupplyExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SenderNotBurner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SenderNotMinter\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"}],\"name\":\"BurnAccessGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"}],\"name\":\"BurnAccessRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousAdmin\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"CCIPAdminTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"MintAccessGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"MintAccessRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseApproval\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getBurners\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCCIPAdmin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMinters\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"}],\"name\":\"grantBurnRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"burnAndMinter\",\"type\":\"address\"}],\"name\":\"grantMintAndBurnRoles\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"grantMintRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseApproval\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"}],\"name\":\"isBurner\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"isMinter\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"}],\"name\":\"revokeBurnRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"revokeMintRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"setCCIPAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"transferAndCall\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + Bin: "0x60c06040523480156200001157600080fd5b50604051620024493803806200244983398101604081905262000034916200028b565b8383838333806000868660036200004c8382620003a5565b5060046200005b8282620003a5565b5050506001600160a01b038216620000ba5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600580546001600160a01b0319166001600160a01b0384811691909117909155811615620000ed57620000ed816200011a565b50505060ff90911660805260a0525050600780546001600160a01b03191633179055506200047192505050565b336001600160a01b03821603620001745760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401620000b1565b600680546001600160a01b0319166001600160a01b03838116918217909255600554604051919216907fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae127890600090a350565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001ee57600080fd5b81516001600160401b03808211156200020b576200020b620001c6565b604051601f8301601f19908116603f01168101908282118183101715620002365762000236620001c6565b816040528381526020925086838588010111156200025357600080fd5b600091505b8382101562000277578582018301518183018401529082019062000258565b600093810190920192909252949350505050565b60008060008060808587031215620002a257600080fd5b84516001600160401b0380821115620002ba57600080fd5b620002c888838901620001dc565b95506020870151915080821115620002df57600080fd5b50620002ee87828801620001dc565b935050604085015160ff811681146200030657600080fd5b6060959095015193969295505050565b600181811c908216806200032b57607f821691505b6020821081036200034c57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620003a057600081815260208120601f850160051c810160208610156200037b5750805b601f850160051c820191505b818110156200039c5782815560010162000387565b5050505b505050565b81516001600160401b03811115620003c157620003c1620001c6565b620003d981620003d2845462000316565b8462000352565b602080601f831160018114620004115760008415620003f85750858301515b600019600386901b1c1916600185901b1785556200039c565b600085815260208120601f198616915b82811015620004425788860151825594840194600190910190840162000421565b5085821015620004615787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a051611fa4620004a5600039600081816104c50152818161086c0152610896015260006102a70152611fa46000f3fe608060405234801561001057600080fd5b50600436106102265760003560e01c806386fe8b431161012a578063aa271e1a116100bd578063d5abeb011161008c578063dd62ed3e11610071578063dd62ed3e146104fc578063f2fde38b14610542578063f81094f31461055557600080fd5b8063d5abeb01146104c3578063d73dd623146104e957600080fd5b8063aa271e1a14610477578063c2e3273d1461048a578063c630948d1461049d578063c64d0ebc146104b057600080fd5b80639dc29fac116100f95780639dc29fac1461042b578063a457c2d71461043e578063a8fa343c14610451578063a9059cbb1461046457600080fd5b806386fe8b43146103be5780638da5cb5b146103c65780638fd6a6ac1461040557806395d89b411461042357600080fd5b806340c10f19116101bd578063661884631161018c57806370a082311161017157806370a082311461036d57806379ba5097146103a357806379cc6790146103ab57600080fd5b806366188463146103455780636b32810b1461035857600080fd5b806340c10f19146102f757806342966c681461030c5780634334614a1461031f5780634f5632f81461033257600080fd5b806323b872dd116101f957806323b872dd1461028d578063313ce567146102a057806339509351146102d15780634000aea0146102e457600080fd5b806301ffc9a71461022b57806306fdde0314610253578063095ea7b31461026857806318160ddd1461027b575b600080fd5b61023e610239366004611b11565b610568565b60405190151581526020015b60405180910390f35b61025b6105c4565b60405161024a9190611bb7565b61023e610276366004611bf3565b610656565b6002545b60405190815260200161024a565b61023e61029b366004611c1d565b61066e565b60405160ff7f000000000000000000000000000000000000000000000000000000000000000016815260200161024a565b61023e6102df366004611bf3565b610692565b61023e6102f2366004611c88565b6106de565b61030a610305366004611bf3565b610801565b005b61030a61031a366004611d71565b610928565b61023e61032d366004611d8a565b610975565b61030a610340366004611d8a565b610982565b61023e610353366004611bf3565b6109de565b6103606109f1565b60405161024a9190611da5565b61027f61037b366004611d8a565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b61030a610a02565b61030a6103b9366004611bf3565b610b03565b610360610b52565b60055473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161024a565b60075473ffffffffffffffffffffffffffffffffffffffff166103e0565b61025b610b5e565b61030a610439366004611bf3565b610b6d565b61023e61044c366004611bf3565b610b77565b61030a61045f366004611d8a565b610c48565b61023e610472366004611bf3565b610cc7565b61023e610485366004611d8a565b610cd5565b61030a610498366004611d8a565b610ce2565b61030a6104ab366004611d8a565b610d3e565b61030a6104be366004611d8a565b610d4c565b7f000000000000000000000000000000000000000000000000000000000000000061027f565b61030a6104f7366004611bf3565b610da8565b61027f61050a366004611dff565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b61030a610550366004611d8a565b610db2565b61030a610563366004611d8a565b610dc3565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f4000aea00000000000000000000000000000000000000000000000000000000014806105be57506105be82610e1f565b92915050565b6060600380546105d390611e32565b80601f01602080910402602001604051908101604052809291908181526020018280546105ff90611e32565b801561064c5780601f106106215761010080835404028352916020019161064c565b820191906000526020600020905b81548152906001019060200180831161062f57829003601f168201915b5050505050905090565b600033610664818585610f4f565b5060019392505050565b60003361067c858285610f83565b610687858585611054565b506001949350505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919061066490829086906106d9908790611eb4565b610f4f565b60006106ea8484610cc7565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fe19260aff97b920c7df27010903aeb9c8d2be5d310a2c67824cf3f15396e4c16858560405161074a929190611ec7565b60405180910390a373ffffffffffffffffffffffffffffffffffffffff84163b15610664576040517fa4c0ed3600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063a4c0ed36906107c590339087908790600401611ee8565b600060405180830381600087803b1580156107df57600080fd5b505af11580156107f3573d6000803e3d6000fd5b505050505060019392505050565b61080a33610cd5565b610847576040517fe2c8c9d50000000000000000000000000000000000000000000000000000000081523360048201526024015b60405180910390fd5b813073ffffffffffffffffffffffffffffffffffffffff82160361086a57600080fd5b7f0000000000000000000000000000000000000000000000000000000000000000158015906108cb57507f0000000000000000000000000000000000000000000000000000000000000000826108bf60025490565b6108c99190611eb4565b115b1561091957816108da60025490565b6108e49190611eb4565b6040517fcbbf111300000000000000000000000000000000000000000000000000000000815260040161083e91815260200190565b6109238383611082565b505050565b61093133610975565b610969576040517fc820b10b00000000000000000000000000000000000000000000000000000000815233600482015260240161083e565b61097281611175565b50565b60006105be600a8361117f565b61098a6111ae565b610995600a82611231565b156109725760405173ffffffffffffffffffffffffffffffffffffffff8216907f0a675452746933cefe3d74182e78db7afe57ba60eaa4234b5d85e9aa41b0610c90600090a250565b60006109ea8383610b77565b9392505050565b60606109fd6008611253565b905090565b60065473ffffffffffffffffffffffffffffffffffffffff163314610a83576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e657200000000000000000000604482015260640161083e565b600580547fffffffffffffffffffffffff00000000000000000000000000000000000000008082163390811790935560068054909116905560405173ffffffffffffffffffffffffffffffffffffffff909116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b610b0c33610975565b610b44576040517fc820b10b00000000000000000000000000000000000000000000000000000000815233600482015260240161083e565b610b4e8282611260565b5050565b60606109fd600a611253565b6060600480546105d390611e32565b610b4e8282610b03565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610c3b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f000000000000000000000000000000000000000000000000000000606482015260840161083e565b6106878286868403610f4f565b610c506111ae565b6007805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f9524c9e4b0b61eb018dd58a1cd856e3e74009528328ab4a613b434fa631d724290600090a35050565b600033610664818585611054565b60006105be60088361117f565b610cea6111ae565b610cf5600882611275565b156109725760405173ffffffffffffffffffffffffffffffffffffffff8216907fe46fef8bbff1389d9010703cf8ebb363fb3daf5bf56edc27080b67bc8d9251ea90600090a250565b610d4781610ce2565b610972815b610d546111ae565b610d5f600a82611275565b156109725760405173ffffffffffffffffffffffffffffffffffffffff8216907f92308bb7573b2a3d17ddb868b39d8ebec433f3194421abc22d084f89658c9bad90600090a250565b6109238282610692565b610dba6111ae565b61097281611297565b610dcb6111ae565b610dd6600882611231565b156109725760405173ffffffffffffffffffffffffffffffffffffffff8216907fed998b960f6340d045f620c119730f7aa7995e7425c2401d3a5b64ff998a59e990600090a250565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f36372b07000000000000000000000000000000000000000000000000000000001480610eb257507fffffffff0000000000000000000000000000000000000000000000000000000082167fe6599b4d00000000000000000000000000000000000000000000000000000000145b80610efe57507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b806105be57507fffffffff0000000000000000000000000000000000000000000000000000000082167f06e27847000000000000000000000000000000000000000000000000000000001492915050565b813073ffffffffffffffffffffffffffffffffffffffff821603610f7257600080fd5b610f7d84848461138d565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610f7d5781811015611047576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161083e565b610f7d8484848403610f4f565b813073ffffffffffffffffffffffffffffffffffffffff82160361107757600080fd5b610f7d848484611540565b73ffffffffffffffffffffffffffffffffffffffff82166110ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161083e565b80600260008282546111119190611eb4565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b61097233826117af565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260018301602052604081205415156109ea565b60055473ffffffffffffffffffffffffffffffffffffffff16331461122f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015260640161083e565b565b60006109ea8373ffffffffffffffffffffffffffffffffffffffff8416611973565b606060006109ea83611a66565b61126b823383610f83565b610b4e82826117af565b60006109ea8373ffffffffffffffffffffffffffffffffffffffff8416611ac2565b3373ffffffffffffffffffffffffffffffffffffffff821603611316576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640161083e565b600680547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff838116918217909255600554604051919216907fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae127890600090a350565b73ffffffffffffffffffffffffffffffffffffffff831661142f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161083e565b73ffffffffffffffffffffffffffffffffffffffff82166114d2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161083e565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff83166115e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161083e565b73ffffffffffffffffffffffffffffffffffffffff8216611686576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161083e565b73ffffffffffffffffffffffffffffffffffffffff83166000908152602081905260409020548181101561173c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e63650000000000000000000000000000000000000000000000000000606482015260840161083e565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610f7d565b73ffffffffffffffffffffffffffffffffffffffff8216611852576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161083e565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015611908576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f6365000000000000000000000000000000000000000000000000000000000000606482015260840161083e565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b60008181526001830160205260408120548015611a5c576000611997600183611f26565b85549091506000906119ab90600190611f26565b9050818114611a105760008660000182815481106119cb576119cb611f39565b90600052602060002001549050808760000184815481106119ee576119ee611f39565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611a2157611a21611f68565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506105be565b60009150506105be565b606081600001805480602002602001604051908101604052809291908181526020018280548015611ab657602002820191906000526020600020905b815481526020019060010190808311611aa2575b50505050509050919050565b6000818152600183016020526040812054611b09575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556105be565b5060006105be565b600060208284031215611b2357600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146109ea57600080fd5b6000815180845260005b81811015611b7957602081850181015186830182015201611b5d565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b6020815260006109ea6020830184611b53565b803573ffffffffffffffffffffffffffffffffffffffff81168114611bee57600080fd5b919050565b60008060408385031215611c0657600080fd5b611c0f83611bca565b946020939093013593505050565b600080600060608486031215611c3257600080fd5b611c3b84611bca565b9250611c4960208501611bca565b9150604084013590509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080600060608486031215611c9d57600080fd5b611ca684611bca565b925060208401359150604084013567ffffffffffffffff80821115611cca57600080fd5b818601915086601f830112611cde57600080fd5b813581811115611cf057611cf0611c59565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611d3657611d36611c59565b81604052828152896020848701011115611d4f57600080fd5b8260208601602083013760006020848301015280955050505050509250925092565b600060208284031215611d8357600080fd5b5035919050565b600060208284031215611d9c57600080fd5b6109ea82611bca565b6020808252825182820181905260009190848201906040850190845b81811015611df357835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101611dc1565b50909695505050505050565b60008060408385031215611e1257600080fd5b611e1b83611bca565b9150611e2960208401611bca565b90509250929050565b600181811c90821680611e4657607f821691505b602082108103611e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156105be576105be611e85565b828152604060208201526000611ee06040830184611b53565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000611f1d6060830184611b53565b95945050505050565b818103818111156105be576105be611e85565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000813000a", } var BurnMintERC677ABI = BurnMintERC677MetaData.ABI @@ -259,6 +259,28 @@ func (_BurnMintERC677 *BurnMintERC677CallerSession) GetBurners() ([]common.Addre return _BurnMintERC677.Contract.GetBurners(&_BurnMintERC677.CallOpts) } +func (_BurnMintERC677 *BurnMintERC677Caller) GetCCIPAdmin(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _BurnMintERC677.contract.Call(opts, &out, "getCCIPAdmin") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_BurnMintERC677 *BurnMintERC677Session) GetCCIPAdmin() (common.Address, error) { + return _BurnMintERC677.Contract.GetCCIPAdmin(&_BurnMintERC677.CallOpts) +} + +func (_BurnMintERC677 *BurnMintERC677CallerSession) GetCCIPAdmin() (common.Address, error) { + return _BurnMintERC677.Contract.GetCCIPAdmin(&_BurnMintERC677.CallOpts) +} + func (_BurnMintERC677 *BurnMintERC677Caller) GetMinters(opts *bind.CallOpts) ([]common.Address, error) { var out []interface{} err := _BurnMintERC677.contract.Call(opts, &out, "getMinters") @@ -637,6 +659,18 @@ func (_BurnMintERC677 *BurnMintERC677TransactorSession) RevokeMintRole(minter co return _BurnMintERC677.Contract.RevokeMintRole(&_BurnMintERC677.TransactOpts, minter) } +func (_BurnMintERC677 *BurnMintERC677Transactor) SetCCIPAdmin(opts *bind.TransactOpts, newAdmin common.Address) (*types.Transaction, error) { + return _BurnMintERC677.contract.Transact(opts, "setCCIPAdmin", newAdmin) +} + +func (_BurnMintERC677 *BurnMintERC677Session) SetCCIPAdmin(newAdmin common.Address) (*types.Transaction, error) { + return _BurnMintERC677.Contract.SetCCIPAdmin(&_BurnMintERC677.TransactOpts, newAdmin) +} + +func (_BurnMintERC677 *BurnMintERC677TransactorSession) SetCCIPAdmin(newAdmin common.Address) (*types.Transaction, error) { + return _BurnMintERC677.Contract.SetCCIPAdmin(&_BurnMintERC677.TransactOpts, newAdmin) +} + func (_BurnMintERC677 *BurnMintERC677Transactor) Transfer(opts *bind.TransactOpts, to common.Address, amount *big.Int) (*types.Transaction, error) { return _BurnMintERC677.contract.Transact(opts, "transfer", to, amount) } @@ -1076,6 +1110,142 @@ func (_BurnMintERC677 *BurnMintERC677Filterer) ParseBurnAccessRevoked(log types. return event, nil } +type BurnMintERC677CCIPAdminTransferredIterator struct { + Event *BurnMintERC677CCIPAdminTransferred + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BurnMintERC677CCIPAdminTransferredIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BurnMintERC677CCIPAdminTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BurnMintERC677CCIPAdminTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BurnMintERC677CCIPAdminTransferredIterator) Error() error { + return it.fail +} + +func (it *BurnMintERC677CCIPAdminTransferredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BurnMintERC677CCIPAdminTransferred struct { + PreviousAdmin common.Address + NewAdmin common.Address + Raw types.Log +} + +func (_BurnMintERC677 *BurnMintERC677Filterer) FilterCCIPAdminTransferred(opts *bind.FilterOpts, previousAdmin []common.Address, newAdmin []common.Address) (*BurnMintERC677CCIPAdminTransferredIterator, error) { + + var previousAdminRule []interface{} + for _, previousAdminItem := range previousAdmin { + previousAdminRule = append(previousAdminRule, previousAdminItem) + } + var newAdminRule []interface{} + for _, newAdminItem := range newAdmin { + newAdminRule = append(newAdminRule, newAdminItem) + } + + logs, sub, err := _BurnMintERC677.contract.FilterLogs(opts, "CCIPAdminTransferred", previousAdminRule, newAdminRule) + if err != nil { + return nil, err + } + return &BurnMintERC677CCIPAdminTransferredIterator{contract: _BurnMintERC677.contract, event: "CCIPAdminTransferred", logs: logs, sub: sub}, nil +} + +func (_BurnMintERC677 *BurnMintERC677Filterer) WatchCCIPAdminTransferred(opts *bind.WatchOpts, sink chan<- *BurnMintERC677CCIPAdminTransferred, previousAdmin []common.Address, newAdmin []common.Address) (event.Subscription, error) { + + var previousAdminRule []interface{} + for _, previousAdminItem := range previousAdmin { + previousAdminRule = append(previousAdminRule, previousAdminItem) + } + var newAdminRule []interface{} + for _, newAdminItem := range newAdmin { + newAdminRule = append(newAdminRule, newAdminItem) + } + + logs, sub, err := _BurnMintERC677.contract.WatchLogs(opts, "CCIPAdminTransferred", previousAdminRule, newAdminRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(BurnMintERC677CCIPAdminTransferred) + if err := _BurnMintERC677.contract.UnpackLog(event, "CCIPAdminTransferred", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_BurnMintERC677 *BurnMintERC677Filterer) ParseCCIPAdminTransferred(log types.Log) (*BurnMintERC677CCIPAdminTransferred, error) { + event := new(BurnMintERC677CCIPAdminTransferred) + if err := _BurnMintERC677.contract.UnpackLog(event, "CCIPAdminTransferred", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + type BurnMintERC677MintAccessGrantedIterator struct { Event *BurnMintERC677MintAccessGranted @@ -1666,6 +1836,7 @@ type BurnMintERC677Transfer struct { From common.Address To common.Address Value *big.Int + Data []byte Raw types.Log } @@ -1803,7 +1974,6 @@ type BurnMintERC677Transfer0 struct { From common.Address To common.Address Value *big.Int - Data []byte Raw types.Log } @@ -1885,6 +2055,8 @@ func (_BurnMintERC677 *BurnMintERC677) ParseLog(log types.Log) (generated.Abigen return _BurnMintERC677.ParseBurnAccessGranted(log) case _BurnMintERC677.abi.Events["BurnAccessRevoked"].ID: return _BurnMintERC677.ParseBurnAccessRevoked(log) + case _BurnMintERC677.abi.Events["CCIPAdminTransferred"].ID: + return _BurnMintERC677.ParseCCIPAdminTransferred(log) case _BurnMintERC677.abi.Events["MintAccessGranted"].ID: return _BurnMintERC677.ParseMintAccessGranted(log) case _BurnMintERC677.abi.Events["MintAccessRevoked"].ID: @@ -1915,6 +2087,10 @@ func (BurnMintERC677BurnAccessRevoked) Topic() common.Hash { return common.HexToHash("0x0a675452746933cefe3d74182e78db7afe57ba60eaa4234b5d85e9aa41b0610c") } +func (BurnMintERC677CCIPAdminTransferred) Topic() common.Hash { + return common.HexToHash("0x9524c9e4b0b61eb018dd58a1cd856e3e74009528328ab4a613b434fa631d7242") +} + func (BurnMintERC677MintAccessGranted) Topic() common.Hash { return common.HexToHash("0xe46fef8bbff1389d9010703cf8ebb363fb3daf5bf56edc27080b67bc8d9251ea") } @@ -1932,11 +2108,11 @@ func (BurnMintERC677OwnershipTransferred) Topic() common.Hash { } func (BurnMintERC677Transfer) Topic() common.Hash { - return common.HexToHash("0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef") + return common.HexToHash("0xe19260aff97b920c7df27010903aeb9c8d2be5d310a2c67824cf3f15396e4c16") } func (BurnMintERC677Transfer0) Topic() common.Hash { - return common.HexToHash("0xe19260aff97b920c7df27010903aeb9c8d2be5d310a2c67824cf3f15396e4c16") + return common.HexToHash("0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef") } func (_BurnMintERC677 *BurnMintERC677) Address() common.Address { @@ -1952,6 +2128,8 @@ type BurnMintERC677Interface interface { GetBurners(opts *bind.CallOpts) ([]common.Address, error) + GetCCIPAdmin(opts *bind.CallOpts) (common.Address, error) + GetMinters(opts *bind.CallOpts) ([]common.Address, error) IsBurner(opts *bind.CallOpts, burner common.Address) (bool, error) @@ -2000,6 +2178,8 @@ type BurnMintERC677Interface interface { RevokeMintRole(opts *bind.TransactOpts, minter common.Address) (*types.Transaction, error) + SetCCIPAdmin(opts *bind.TransactOpts, newAdmin common.Address) (*types.Transaction, error) + Transfer(opts *bind.TransactOpts, to common.Address, amount *big.Int) (*types.Transaction, error) TransferAndCall(opts *bind.TransactOpts, to common.Address, amount *big.Int, data []byte) (*types.Transaction, error) @@ -2026,6 +2206,12 @@ type BurnMintERC677Interface interface { ParseBurnAccessRevoked(log types.Log) (*BurnMintERC677BurnAccessRevoked, error) + FilterCCIPAdminTransferred(opts *bind.FilterOpts, previousAdmin []common.Address, newAdmin []common.Address) (*BurnMintERC677CCIPAdminTransferredIterator, error) + + WatchCCIPAdminTransferred(opts *bind.WatchOpts, sink chan<- *BurnMintERC677CCIPAdminTransferred, previousAdmin []common.Address, newAdmin []common.Address) (event.Subscription, error) + + ParseCCIPAdminTransferred(log types.Log) (*BurnMintERC677CCIPAdminTransferred, error) + FilterMintAccessGranted(opts *bind.FilterOpts, minter []common.Address) (*BurnMintERC677MintAccessGrantedIterator, error) WatchMintAccessGranted(opts *bind.WatchOpts, sink chan<- *BurnMintERC677MintAccessGranted, minter []common.Address) (event.Subscription, error) diff --git a/core/gethwrappers/shared/generated/link_token/link_token.go b/core/gethwrappers/shared/generated/link_token/link_token.go index 1467680626..bf1eb903a7 100644 --- a/core/gethwrappers/shared/generated/link_token/link_token.go +++ b/core/gethwrappers/shared/generated/link_token/link_token.go @@ -31,8 +31,8 @@ var ( ) var LinkTokenMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"supplyAfterMint\",\"type\":\"uint256\"}],\"name\":\"MaxSupplyExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SenderNotBurner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SenderNotMinter\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"}],\"name\":\"BurnAccessGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"}],\"name\":\"BurnAccessRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"MintAccessGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"MintAccessRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseApproval\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getBurners\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMinters\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"}],\"name\":\"grantBurnRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"burnAndMinter\",\"type\":\"address\"}],\"name\":\"grantMintAndBurnRoles\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"grantMintRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseApproval\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"}],\"name\":\"isBurner\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"isMinter\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"}],\"name\":\"revokeBurnRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"revokeMintRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"transferAndCall\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x60c06040523480156200001157600080fd5b506040518060400160405280600f81526020016e21b430b4b72634b735902a37b5b2b760891b815250604051806040016040528060048152602001634c494e4b60e01b81525060126b033b2e3c9fd0803ce8000000338060008686818181600390816200007f91906200028c565b5060046200008e82826200028c565b5050506001600160a01b0384169150620000f190505760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600580546001600160a01b0319166001600160a01b0384811691909117909155811615620001245762000124816200013b565b50505060ff90911660805260a05250620003589050565b336001600160a01b03821603620001955760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401620000e8565b600680546001600160a01b0319166001600160a01b03838116918217909255600554604051919216907fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae127890600090a350565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200021257607f821691505b6020821081036200023357634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200028757600081815260208120601f850160051c81016020861015620002625750805b601f850160051c820191505b8181101562000283578281556001016200026e565b5050505b505050565b81516001600160401b03811115620002a857620002a8620001e7565b620002c081620002b98454620001fd565b8462000239565b602080601f831160018114620002f85760008415620002df5750858301515b600019600386901b1c1916600185901b17855562000283565b600085815260208120601f198616915b82811015620003295788860151825594840194600190910190840162000308565b5085821015620003485787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a051611e4c6200038c60003960008181610447015281816108c301526108ed015260006102710152611e4c6000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c806379cc67901161010f578063c2e3273d116100a2578063d73dd62311610071578063d73dd6231461046b578063dd62ed3e1461047e578063f2fde38b146104c4578063f81094f3146104d757600080fd5b8063c2e3273d1461040c578063c630948d1461041f578063c64d0ebc14610432578063d5abeb011461044557600080fd5b80639dc29fac116100de5780639dc29fac146103c0578063a457c2d7146103d3578063a9059cbb146103e6578063aa271e1a146103f957600080fd5b806379cc67901461037557806386fe8b43146103885780638da5cb5b1461039057806395d89b41146103b857600080fd5b806340c10f19116101875780636618846311610156578063661884631461030f5780636b32810b1461032257806370a082311461033757806379ba50971461036d57600080fd5b806340c10f19146102c157806342966c68146102d65780634334614a146102e95780634f5632f8146102fc57600080fd5b806323b872dd116101c357806323b872dd14610257578063313ce5671461026a578063395093511461029b5780634000aea0146102ae57600080fd5b806301ffc9a7146101f557806306fdde031461021d578063095ea7b31461023257806318160ddd14610245575b600080fd5b6102086102033660046119b9565b6104ea565b60405190151581526020015b60405180910390f35b61022561061b565b6040516102149190611a5f565b610208610240366004611a9b565b6106ad565b6002545b604051908152602001610214565b610208610265366004611ac5565b6106c5565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610214565b6102086102a9366004611a9b565b6106e9565b6102086102bc366004611b30565b610735565b6102d46102cf366004611a9b565b610858565b005b6102d46102e4366004611c19565b61097f565b6102086102f7366004611c32565b6109cc565b6102d461030a366004611c32565b6109d9565b61020861031d366004611a9b565b610a35565b61032a610a48565b6040516102149190611c4d565b610249610345366004611c32565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6102d4610a59565b6102d4610383366004611a9b565b610b5a565b61032a610ba9565b60055460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610214565b610225610bb5565b6102d46103ce366004611a9b565b610bc4565b6102086103e1366004611a9b565b610bce565b6102086103f4366004611a9b565b610c9f565b610208610407366004611c32565b610cad565b6102d461041a366004611c32565b610cba565b6102d461042d366004611c32565b610d16565b6102d4610440366004611c32565b610d24565b7f0000000000000000000000000000000000000000000000000000000000000000610249565b6102d4610479366004611a9b565b610d80565b61024961048c366004611ca7565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6102d46104d2366004611c32565b610d8a565b6102d46104e5366004611c32565b610d9b565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f36372b0700000000000000000000000000000000000000000000000000000000148061057d57507fffffffff0000000000000000000000000000000000000000000000000000000082167f4000aea000000000000000000000000000000000000000000000000000000000145b806105c957507fffffffff0000000000000000000000000000000000000000000000000000000082167fe6599b4d00000000000000000000000000000000000000000000000000000000145b8061061557507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b60606003805461062a90611cda565b80601f016020809104026020016040519081016040528092919081815260200182805461065690611cda565b80156106a35780601f10610678576101008083540402835291602001916106a3565b820191906000526020600020905b81548152906001019060200180831161068657829003601f168201915b5050505050905090565b6000336106bb818585610df7565b5060019392505050565b6000336106d3858285610e2b565b6106de858585610efc565b506001949350505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906106bb9082908690610730908790611d5c565b610df7565b60006107418484610c9f565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fe19260aff97b920c7df27010903aeb9c8d2be5d310a2c67824cf3f15396e4c1685856040516107a1929190611d6f565b60405180910390a373ffffffffffffffffffffffffffffffffffffffff84163b156106bb576040517fa4c0ed3600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063a4c0ed369061081c90339087908790600401611d90565b600060405180830381600087803b15801561083657600080fd5b505af115801561084a573d6000803e3d6000fd5b505050505060019392505050565b61086133610cad565b61089e576040517fe2c8c9d50000000000000000000000000000000000000000000000000000000081523360048201526024015b60405180910390fd5b813073ffffffffffffffffffffffffffffffffffffffff8216036108c157600080fd5b7f00000000000000000000000000000000000000000000000000000000000000001580159061092257507f00000000000000000000000000000000000000000000000000000000000000008261091660025490565b6109209190611d5c565b115b15610970578161093160025490565b61093b9190611d5c565b6040517fcbbf111300000000000000000000000000000000000000000000000000000000815260040161089591815260200190565b61097a8383610f2a565b505050565b610988336109cc565b6109c0576040517fc820b10b000000000000000000000000000000000000000000000000000000008152336004820152602401610895565b6109c98161101d565b50565b6000610615600983611027565b6109e1611056565b6109ec6009826110d9565b156109c95760405173ffffffffffffffffffffffffffffffffffffffff8216907f0a675452746933cefe3d74182e78db7afe57ba60eaa4234b5d85e9aa41b0610c90600090a250565b6000610a418383610bce565b9392505050565b6060610a5460076110fb565b905090565b60065473ffffffffffffffffffffffffffffffffffffffff163314610ada576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610895565b600580547fffffffffffffffffffffffff00000000000000000000000000000000000000008082163390811790935560068054909116905560405173ffffffffffffffffffffffffffffffffffffffff909116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b610b63336109cc565b610b9b576040517fc820b10b000000000000000000000000000000000000000000000000000000008152336004820152602401610895565b610ba58282611108565b5050565b6060610a5460096110fb565b60606004805461062a90611cda565b610ba58282610b5a565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610c92576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610895565b6106de8286868403610df7565b6000336106bb818585610efc565b6000610615600783611027565b610cc2611056565b610ccd60078261111d565b156109c95760405173ffffffffffffffffffffffffffffffffffffffff8216907fe46fef8bbff1389d9010703cf8ebb363fb3daf5bf56edc27080b67bc8d9251ea90600090a250565b610d1f81610cba565b6109c9815b610d2c611056565b610d3760098261111d565b156109c95760405173ffffffffffffffffffffffffffffffffffffffff8216907f92308bb7573b2a3d17ddb868b39d8ebec433f3194421abc22d084f89658c9bad90600090a250565b61097a82826106e9565b610d92611056565b6109c98161113f565b610da3611056565b610dae6007826110d9565b156109c95760405173ffffffffffffffffffffffffffffffffffffffff8216907fed998b960f6340d045f620c119730f7aa7995e7425c2401d3a5b64ff998a59e990600090a250565b813073ffffffffffffffffffffffffffffffffffffffff821603610e1a57600080fd5b610e25848484611235565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610e255781811015610eef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610895565b610e258484848403610df7565b813073ffffffffffffffffffffffffffffffffffffffff821603610f1f57600080fd5b610e258484846113e8565b73ffffffffffffffffffffffffffffffffffffffff8216610fa7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610895565b8060026000828254610fb99190611d5c565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6109c93382611657565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001830160205260408120541515610a41565b60055473ffffffffffffffffffffffffffffffffffffffff1633146110d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610895565b565b6000610a418373ffffffffffffffffffffffffffffffffffffffff841661181b565b60606000610a418361190e565b611113823383610e2b565b610ba58282611657565b6000610a418373ffffffffffffffffffffffffffffffffffffffff841661196a565b3373ffffffffffffffffffffffffffffffffffffffff8216036111be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610895565b600680547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff838116918217909255600554604051919216907fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae127890600090a350565b73ffffffffffffffffffffffffffffffffffffffff83166112d7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff821661137a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff831661148b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff821661152e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040902054818110156115e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610e25565b73ffffffffffffffffffffffffffffffffffffffff82166116fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040902054818110156117b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b6000818152600183016020526040812054801561190457600061183f600183611dce565b855490915060009061185390600190611dce565b90508181146118b857600086600001828154811061187357611873611de1565b906000526020600020015490508087600001848154811061189657611896611de1565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806118c9576118c9611e10565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610615565b6000915050610615565b60608160000180548060200260200160405190810160405280929190818152602001828054801561195e57602002820191906000526020600020905b81548152602001906001019080831161194a575b50505050509050919050565b60008181526001830160205260408120546119b157508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610615565b506000610615565b6000602082840312156119cb57600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610a4157600080fd5b6000815180845260005b81811015611a2157602081850181015186830182015201611a05565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081526000610a4160208301846119fb565b803573ffffffffffffffffffffffffffffffffffffffff81168114611a9657600080fd5b919050565b60008060408385031215611aae57600080fd5b611ab783611a72565b946020939093013593505050565b600080600060608486031215611ada57600080fd5b611ae384611a72565b9250611af160208501611a72565b9150604084013590509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080600060608486031215611b4557600080fd5b611b4e84611a72565b925060208401359150604084013567ffffffffffffffff80821115611b7257600080fd5b818601915086601f830112611b8657600080fd5b813581811115611b9857611b98611b01565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611bde57611bde611b01565b81604052828152896020848701011115611bf757600080fd5b8260208601602083013760006020848301015280955050505050509250925092565b600060208284031215611c2b57600080fd5b5035919050565b600060208284031215611c4457600080fd5b610a4182611a72565b6020808252825182820181905260009190848201906040850190845b81811015611c9b57835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101611c69565b50909695505050505050565b60008060408385031215611cba57600080fd5b611cc383611a72565b9150611cd160208401611a72565b90509250929050565b600181811c90821680611cee57607f821691505b602082108103611d27577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561061557610615611d2d565b828152604060208201526000611d8860408301846119fb565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000611dc560608301846119fb565b95945050505050565b8181038181111561061557610615611d2d565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000813000a", + ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"supplyAfterMint\",\"type\":\"uint256\"}],\"name\":\"MaxSupplyExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SenderNotBurner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SenderNotMinter\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"}],\"name\":\"BurnAccessGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"}],\"name\":\"BurnAccessRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousAdmin\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"CCIPAdminTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"MintAccessGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"MintAccessRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseApproval\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getBurners\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCCIPAdmin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMinters\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"}],\"name\":\"grantBurnRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"burnAndMinter\",\"type\":\"address\"}],\"name\":\"grantMintAndBurnRoles\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"grantMintRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseApproval\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"}],\"name\":\"isBurner\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"isMinter\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"}],\"name\":\"revokeBurnRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"revokeMintRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"setCCIPAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"transferAndCall\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + Bin: "0x60c06040523480156200001157600080fd5b506040518060400160405280600f81526020016e21b430b4b72634b735902a37b5b2b760891b815250604051806040016040528060048152602001634c494e4b60e01b81525060126b033b2e3c9fd0803ce8000000838383833380600086868160039081620000819190620002a0565b506004620000908282620002a0565b5050506001600160a01b038216620000ef5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600580546001600160a01b0319166001600160a01b0384811691909117909155811615620001225762000122816200014f565b50505060ff90911660805260a0525050600780546001600160a01b03191633179055506200036c92505050565b336001600160a01b03821603620001a95760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401620000e6565b600680546001600160a01b0319166001600160a01b03838116918217909255600554604051919216907fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae127890600090a350565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200022657607f821691505b6020821081036200024757634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200029b57600081815260208120601f850160051c81016020861015620002765750805b601f850160051c820191505b81811015620002975782815560010162000282565b5050505b505050565b81516001600160401b03811115620002bc57620002bc620001fb565b620002d481620002cd845462000211565b846200024d565b602080601f8311600181146200030c5760008415620002f35750858301515b600019600386901b1c1916600185901b17855562000297565b600085815260208120601f198616915b828110156200033d578886015182559484019460019091019084016200031c565b50858210156200035c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a051611fa4620003a0600039600081816104c50152818161086c0152610896015260006102a70152611fa46000f3fe608060405234801561001057600080fd5b50600436106102265760003560e01c806386fe8b431161012a578063aa271e1a116100bd578063d5abeb011161008c578063dd62ed3e11610071578063dd62ed3e146104fc578063f2fde38b14610542578063f81094f31461055557600080fd5b8063d5abeb01146104c3578063d73dd623146104e957600080fd5b8063aa271e1a14610477578063c2e3273d1461048a578063c630948d1461049d578063c64d0ebc146104b057600080fd5b80639dc29fac116100f95780639dc29fac1461042b578063a457c2d71461043e578063a8fa343c14610451578063a9059cbb1461046457600080fd5b806386fe8b43146103be5780638da5cb5b146103c65780638fd6a6ac1461040557806395d89b411461042357600080fd5b806340c10f19116101bd578063661884631161018c57806370a082311161017157806370a082311461036d57806379ba5097146103a357806379cc6790146103ab57600080fd5b806366188463146103455780636b32810b1461035857600080fd5b806340c10f19146102f757806342966c681461030c5780634334614a1461031f5780634f5632f81461033257600080fd5b806323b872dd116101f957806323b872dd1461028d578063313ce567146102a057806339509351146102d15780634000aea0146102e457600080fd5b806301ffc9a71461022b57806306fdde0314610253578063095ea7b31461026857806318160ddd1461027b575b600080fd5b61023e610239366004611b11565b610568565b60405190151581526020015b60405180910390f35b61025b6105c4565b60405161024a9190611bb7565b61023e610276366004611bf3565b610656565b6002545b60405190815260200161024a565b61023e61029b366004611c1d565b61066e565b60405160ff7f000000000000000000000000000000000000000000000000000000000000000016815260200161024a565b61023e6102df366004611bf3565b610692565b61023e6102f2366004611c88565b6106de565b61030a610305366004611bf3565b610801565b005b61030a61031a366004611d71565b610928565b61023e61032d366004611d8a565b610975565b61030a610340366004611d8a565b610982565b61023e610353366004611bf3565b6109de565b6103606109f1565b60405161024a9190611da5565b61027f61037b366004611d8a565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b61030a610a02565b61030a6103b9366004611bf3565b610b03565b610360610b52565b60055473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161024a565b60075473ffffffffffffffffffffffffffffffffffffffff166103e0565b61025b610b5e565b61030a610439366004611bf3565b610b6d565b61023e61044c366004611bf3565b610b77565b61030a61045f366004611d8a565b610c48565b61023e610472366004611bf3565b610cc7565b61023e610485366004611d8a565b610cd5565b61030a610498366004611d8a565b610ce2565b61030a6104ab366004611d8a565b610d3e565b61030a6104be366004611d8a565b610d4c565b7f000000000000000000000000000000000000000000000000000000000000000061027f565b61030a6104f7366004611bf3565b610da8565b61027f61050a366004611dff565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b61030a610550366004611d8a565b610db2565b61030a610563366004611d8a565b610dc3565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f4000aea00000000000000000000000000000000000000000000000000000000014806105be57506105be82610e1f565b92915050565b6060600380546105d390611e32565b80601f01602080910402602001604051908101604052809291908181526020018280546105ff90611e32565b801561064c5780601f106106215761010080835404028352916020019161064c565b820191906000526020600020905b81548152906001019060200180831161062f57829003601f168201915b5050505050905090565b600033610664818585610f4f565b5060019392505050565b60003361067c858285610f83565b610687858585611054565b506001949350505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919061066490829086906106d9908790611eb4565b610f4f565b60006106ea8484610cc7565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fe19260aff97b920c7df27010903aeb9c8d2be5d310a2c67824cf3f15396e4c16858560405161074a929190611ec7565b60405180910390a373ffffffffffffffffffffffffffffffffffffffff84163b15610664576040517fa4c0ed3600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063a4c0ed36906107c590339087908790600401611ee8565b600060405180830381600087803b1580156107df57600080fd5b505af11580156107f3573d6000803e3d6000fd5b505050505060019392505050565b61080a33610cd5565b610847576040517fe2c8c9d50000000000000000000000000000000000000000000000000000000081523360048201526024015b60405180910390fd5b813073ffffffffffffffffffffffffffffffffffffffff82160361086a57600080fd5b7f0000000000000000000000000000000000000000000000000000000000000000158015906108cb57507f0000000000000000000000000000000000000000000000000000000000000000826108bf60025490565b6108c99190611eb4565b115b1561091957816108da60025490565b6108e49190611eb4565b6040517fcbbf111300000000000000000000000000000000000000000000000000000000815260040161083e91815260200190565b6109238383611082565b505050565b61093133610975565b610969576040517fc820b10b00000000000000000000000000000000000000000000000000000000815233600482015260240161083e565b61097281611175565b50565b60006105be600a8361117f565b61098a6111ae565b610995600a82611231565b156109725760405173ffffffffffffffffffffffffffffffffffffffff8216907f0a675452746933cefe3d74182e78db7afe57ba60eaa4234b5d85e9aa41b0610c90600090a250565b60006109ea8383610b77565b9392505050565b60606109fd6008611253565b905090565b60065473ffffffffffffffffffffffffffffffffffffffff163314610a83576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e657200000000000000000000604482015260640161083e565b600580547fffffffffffffffffffffffff00000000000000000000000000000000000000008082163390811790935560068054909116905560405173ffffffffffffffffffffffffffffffffffffffff909116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b610b0c33610975565b610b44576040517fc820b10b00000000000000000000000000000000000000000000000000000000815233600482015260240161083e565b610b4e8282611260565b5050565b60606109fd600a611253565b6060600480546105d390611e32565b610b4e8282610b03565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610c3b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f000000000000000000000000000000000000000000000000000000606482015260840161083e565b6106878286868403610f4f565b610c506111ae565b6007805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f9524c9e4b0b61eb018dd58a1cd856e3e74009528328ab4a613b434fa631d724290600090a35050565b600033610664818585611054565b60006105be60088361117f565b610cea6111ae565b610cf5600882611275565b156109725760405173ffffffffffffffffffffffffffffffffffffffff8216907fe46fef8bbff1389d9010703cf8ebb363fb3daf5bf56edc27080b67bc8d9251ea90600090a250565b610d4781610ce2565b610972815b610d546111ae565b610d5f600a82611275565b156109725760405173ffffffffffffffffffffffffffffffffffffffff8216907f92308bb7573b2a3d17ddb868b39d8ebec433f3194421abc22d084f89658c9bad90600090a250565b6109238282610692565b610dba6111ae565b61097281611297565b610dcb6111ae565b610dd6600882611231565b156109725760405173ffffffffffffffffffffffffffffffffffffffff8216907fed998b960f6340d045f620c119730f7aa7995e7425c2401d3a5b64ff998a59e990600090a250565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f36372b07000000000000000000000000000000000000000000000000000000001480610eb257507fffffffff0000000000000000000000000000000000000000000000000000000082167fe6599b4d00000000000000000000000000000000000000000000000000000000145b80610efe57507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b806105be57507fffffffff0000000000000000000000000000000000000000000000000000000082167f06e27847000000000000000000000000000000000000000000000000000000001492915050565b813073ffffffffffffffffffffffffffffffffffffffff821603610f7257600080fd5b610f7d84848461138d565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610f7d5781811015611047576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161083e565b610f7d8484848403610f4f565b813073ffffffffffffffffffffffffffffffffffffffff82160361107757600080fd5b610f7d848484611540565b73ffffffffffffffffffffffffffffffffffffffff82166110ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161083e565b80600260008282546111119190611eb4565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b61097233826117af565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260018301602052604081205415156109ea565b60055473ffffffffffffffffffffffffffffffffffffffff16331461122f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015260640161083e565b565b60006109ea8373ffffffffffffffffffffffffffffffffffffffff8416611973565b606060006109ea83611a66565b61126b823383610f83565b610b4e82826117af565b60006109ea8373ffffffffffffffffffffffffffffffffffffffff8416611ac2565b3373ffffffffffffffffffffffffffffffffffffffff821603611316576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640161083e565b600680547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff838116918217909255600554604051919216907fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae127890600090a350565b73ffffffffffffffffffffffffffffffffffffffff831661142f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161083e565b73ffffffffffffffffffffffffffffffffffffffff82166114d2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161083e565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff83166115e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161083e565b73ffffffffffffffffffffffffffffffffffffffff8216611686576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161083e565b73ffffffffffffffffffffffffffffffffffffffff83166000908152602081905260409020548181101561173c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e63650000000000000000000000000000000000000000000000000000606482015260840161083e565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610f7d565b73ffffffffffffffffffffffffffffffffffffffff8216611852576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161083e565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015611908576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f6365000000000000000000000000000000000000000000000000000000000000606482015260840161083e565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b60008181526001830160205260408120548015611a5c576000611997600183611f26565b85549091506000906119ab90600190611f26565b9050818114611a105760008660000182815481106119cb576119cb611f39565b90600052602060002001549050808760000184815481106119ee576119ee611f39565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611a2157611a21611f68565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506105be565b60009150506105be565b606081600001805480602002602001604051908101604052809291908181526020018280548015611ab657602002820191906000526020600020905b815481526020019060010190808311611aa2575b50505050509050919050565b6000818152600183016020526040812054611b09575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556105be565b5060006105be565b600060208284031215611b2357600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146109ea57600080fd5b6000815180845260005b81811015611b7957602081850181015186830182015201611b5d565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b6020815260006109ea6020830184611b53565b803573ffffffffffffffffffffffffffffffffffffffff81168114611bee57600080fd5b919050565b60008060408385031215611c0657600080fd5b611c0f83611bca565b946020939093013593505050565b600080600060608486031215611c3257600080fd5b611c3b84611bca565b9250611c4960208501611bca565b9150604084013590509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080600060608486031215611c9d57600080fd5b611ca684611bca565b925060208401359150604084013567ffffffffffffffff80821115611cca57600080fd5b818601915086601f830112611cde57600080fd5b813581811115611cf057611cf0611c59565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611d3657611d36611c59565b81604052828152896020848701011115611d4f57600080fd5b8260208601602083013760006020848301015280955050505050509250925092565b600060208284031215611d8357600080fd5b5035919050565b600060208284031215611d9c57600080fd5b6109ea82611bca565b6020808252825182820181905260009190848201906040850190845b81811015611df357835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101611dc1565b50909695505050505050565b60008060408385031215611e1257600080fd5b611e1b83611bca565b9150611e2960208401611bca565b90509250929050565b600181811c90821680611e4657607f821691505b602082108103611e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156105be576105be611e85565b828152604060208201526000611ee06040830184611b53565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000611f1d6060830184611b53565b95945050505050565b818103818111156105be576105be611e85565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000813000a", } var LinkTokenABI = LinkTokenMetaData.ABI @@ -259,6 +259,28 @@ func (_LinkToken *LinkTokenCallerSession) GetBurners() ([]common.Address, error) return _LinkToken.Contract.GetBurners(&_LinkToken.CallOpts) } +func (_LinkToken *LinkTokenCaller) GetCCIPAdmin(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _LinkToken.contract.Call(opts, &out, "getCCIPAdmin") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_LinkToken *LinkTokenSession) GetCCIPAdmin() (common.Address, error) { + return _LinkToken.Contract.GetCCIPAdmin(&_LinkToken.CallOpts) +} + +func (_LinkToken *LinkTokenCallerSession) GetCCIPAdmin() (common.Address, error) { + return _LinkToken.Contract.GetCCIPAdmin(&_LinkToken.CallOpts) +} + func (_LinkToken *LinkTokenCaller) GetMinters(opts *bind.CallOpts) ([]common.Address, error) { var out []interface{} err := _LinkToken.contract.Call(opts, &out, "getMinters") @@ -637,6 +659,18 @@ func (_LinkToken *LinkTokenTransactorSession) RevokeMintRole(minter common.Addre return _LinkToken.Contract.RevokeMintRole(&_LinkToken.TransactOpts, minter) } +func (_LinkToken *LinkTokenTransactor) SetCCIPAdmin(opts *bind.TransactOpts, newAdmin common.Address) (*types.Transaction, error) { + return _LinkToken.contract.Transact(opts, "setCCIPAdmin", newAdmin) +} + +func (_LinkToken *LinkTokenSession) SetCCIPAdmin(newAdmin common.Address) (*types.Transaction, error) { + return _LinkToken.Contract.SetCCIPAdmin(&_LinkToken.TransactOpts, newAdmin) +} + +func (_LinkToken *LinkTokenTransactorSession) SetCCIPAdmin(newAdmin common.Address) (*types.Transaction, error) { + return _LinkToken.Contract.SetCCIPAdmin(&_LinkToken.TransactOpts, newAdmin) +} + func (_LinkToken *LinkTokenTransactor) Transfer(opts *bind.TransactOpts, to common.Address, amount *big.Int) (*types.Transaction, error) { return _LinkToken.contract.Transact(opts, "transfer", to, amount) } @@ -1076,6 +1110,142 @@ func (_LinkToken *LinkTokenFilterer) ParseBurnAccessRevoked(log types.Log) (*Lin return event, nil } +type LinkTokenCCIPAdminTransferredIterator struct { + Event *LinkTokenCCIPAdminTransferred + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *LinkTokenCCIPAdminTransferredIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(LinkTokenCCIPAdminTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(LinkTokenCCIPAdminTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *LinkTokenCCIPAdminTransferredIterator) Error() error { + return it.fail +} + +func (it *LinkTokenCCIPAdminTransferredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type LinkTokenCCIPAdminTransferred struct { + PreviousAdmin common.Address + NewAdmin common.Address + Raw types.Log +} + +func (_LinkToken *LinkTokenFilterer) FilterCCIPAdminTransferred(opts *bind.FilterOpts, previousAdmin []common.Address, newAdmin []common.Address) (*LinkTokenCCIPAdminTransferredIterator, error) { + + var previousAdminRule []interface{} + for _, previousAdminItem := range previousAdmin { + previousAdminRule = append(previousAdminRule, previousAdminItem) + } + var newAdminRule []interface{} + for _, newAdminItem := range newAdmin { + newAdminRule = append(newAdminRule, newAdminItem) + } + + logs, sub, err := _LinkToken.contract.FilterLogs(opts, "CCIPAdminTransferred", previousAdminRule, newAdminRule) + if err != nil { + return nil, err + } + return &LinkTokenCCIPAdminTransferredIterator{contract: _LinkToken.contract, event: "CCIPAdminTransferred", logs: logs, sub: sub}, nil +} + +func (_LinkToken *LinkTokenFilterer) WatchCCIPAdminTransferred(opts *bind.WatchOpts, sink chan<- *LinkTokenCCIPAdminTransferred, previousAdmin []common.Address, newAdmin []common.Address) (event.Subscription, error) { + + var previousAdminRule []interface{} + for _, previousAdminItem := range previousAdmin { + previousAdminRule = append(previousAdminRule, previousAdminItem) + } + var newAdminRule []interface{} + for _, newAdminItem := range newAdmin { + newAdminRule = append(newAdminRule, newAdminItem) + } + + logs, sub, err := _LinkToken.contract.WatchLogs(opts, "CCIPAdminTransferred", previousAdminRule, newAdminRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(LinkTokenCCIPAdminTransferred) + if err := _LinkToken.contract.UnpackLog(event, "CCIPAdminTransferred", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_LinkToken *LinkTokenFilterer) ParseCCIPAdminTransferred(log types.Log) (*LinkTokenCCIPAdminTransferred, error) { + event := new(LinkTokenCCIPAdminTransferred) + if err := _LinkToken.contract.UnpackLog(event, "CCIPAdminTransferred", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + type LinkTokenMintAccessGrantedIterator struct { Event *LinkTokenMintAccessGranted @@ -1666,6 +1836,7 @@ type LinkTokenTransfer struct { From common.Address To common.Address Value *big.Int + Data []byte Raw types.Log } @@ -1803,7 +1974,6 @@ type LinkTokenTransfer0 struct { From common.Address To common.Address Value *big.Int - Data []byte Raw types.Log } @@ -1885,6 +2055,8 @@ func (_LinkToken *LinkToken) ParseLog(log types.Log) (generated.AbigenLog, error return _LinkToken.ParseBurnAccessGranted(log) case _LinkToken.abi.Events["BurnAccessRevoked"].ID: return _LinkToken.ParseBurnAccessRevoked(log) + case _LinkToken.abi.Events["CCIPAdminTransferred"].ID: + return _LinkToken.ParseCCIPAdminTransferred(log) case _LinkToken.abi.Events["MintAccessGranted"].ID: return _LinkToken.ParseMintAccessGranted(log) case _LinkToken.abi.Events["MintAccessRevoked"].ID: @@ -1915,6 +2087,10 @@ func (LinkTokenBurnAccessRevoked) Topic() common.Hash { return common.HexToHash("0x0a675452746933cefe3d74182e78db7afe57ba60eaa4234b5d85e9aa41b0610c") } +func (LinkTokenCCIPAdminTransferred) Topic() common.Hash { + return common.HexToHash("0x9524c9e4b0b61eb018dd58a1cd856e3e74009528328ab4a613b434fa631d7242") +} + func (LinkTokenMintAccessGranted) Topic() common.Hash { return common.HexToHash("0xe46fef8bbff1389d9010703cf8ebb363fb3daf5bf56edc27080b67bc8d9251ea") } @@ -1932,11 +2108,11 @@ func (LinkTokenOwnershipTransferred) Topic() common.Hash { } func (LinkTokenTransfer) Topic() common.Hash { - return common.HexToHash("0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef") + return common.HexToHash("0xe19260aff97b920c7df27010903aeb9c8d2be5d310a2c67824cf3f15396e4c16") } func (LinkTokenTransfer0) Topic() common.Hash { - return common.HexToHash("0xe19260aff97b920c7df27010903aeb9c8d2be5d310a2c67824cf3f15396e4c16") + return common.HexToHash("0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef") } func (_LinkToken *LinkToken) Address() common.Address { @@ -1952,6 +2128,8 @@ type LinkTokenInterface interface { GetBurners(opts *bind.CallOpts) ([]common.Address, error) + GetCCIPAdmin(opts *bind.CallOpts) (common.Address, error) + GetMinters(opts *bind.CallOpts) ([]common.Address, error) IsBurner(opts *bind.CallOpts, burner common.Address) (bool, error) @@ -2000,6 +2178,8 @@ type LinkTokenInterface interface { RevokeMintRole(opts *bind.TransactOpts, minter common.Address) (*types.Transaction, error) + SetCCIPAdmin(opts *bind.TransactOpts, newAdmin common.Address) (*types.Transaction, error) + Transfer(opts *bind.TransactOpts, to common.Address, amount *big.Int) (*types.Transaction, error) TransferAndCall(opts *bind.TransactOpts, to common.Address, amount *big.Int, data []byte) (*types.Transaction, error) @@ -2026,6 +2206,12 @@ type LinkTokenInterface interface { ParseBurnAccessRevoked(log types.Log) (*LinkTokenBurnAccessRevoked, error) + FilterCCIPAdminTransferred(opts *bind.FilterOpts, previousAdmin []common.Address, newAdmin []common.Address) (*LinkTokenCCIPAdminTransferredIterator, error) + + WatchCCIPAdminTransferred(opts *bind.WatchOpts, sink chan<- *LinkTokenCCIPAdminTransferred, previousAdmin []common.Address, newAdmin []common.Address) (event.Subscription, error) + + ParseCCIPAdminTransferred(log types.Log) (*LinkTokenCCIPAdminTransferred, error) + FilterMintAccessGranted(opts *bind.FilterOpts, minter []common.Address) (*LinkTokenMintAccessGrantedIterator, error) WatchMintAccessGranted(opts *bind.WatchOpts, sink chan<- *LinkTokenMintAccessGranted, minter []common.Address) (event.Subscription, error) diff --git a/core/gethwrappers/shared/generation/generated-wrapper-dependency-versions-do-not-edit.txt b/core/gethwrappers/shared/generation/generated-wrapper-dependency-versions-do-not-edit.txt index 3268bb55bd..d713d9d92b 100644 --- a/core/gethwrappers/shared/generation/generated-wrapper-dependency-versions-do-not-edit.txt +++ b/core/gethwrappers/shared/generation/generated-wrapper-dependency-versions-do-not-edit.txt @@ -1,5 +1,5 @@ GETH_VERSION: 1.13.8 -burn_mint_erc677: ../../../contracts/solc/v0.8.19/BurnMintERC677/BurnMintERC677.abi ../../../contracts/solc/v0.8.19/BurnMintERC677/BurnMintERC677.bin 405c9016171e614b17e10588653ef8d33dcea21dd569c3fddc596a46fcff68a3 +burn_mint_erc677: ../../../contracts/solc/v0.8.19/BurnMintERC677/BurnMintERC677.abi ../../../contracts/solc/v0.8.19/BurnMintERC677/BurnMintERC677.bin 84d3e0b3cb4b521e1d03968a990dffe45ff917b2d5a7c88eb552dac908defb29 erc20: ../../../contracts/solc/v0.8.19/ERC20/ERC20.abi ../../../contracts/solc/v0.8.19/ERC20/ERC20.bin 5b1a93d9b24f250e49a730c96335a8113c3f7010365cba578f313b483001d4fc -link_token: ../../../contracts/solc/v0.8.19/LinkToken/LinkToken.abi ../../../contracts/solc/v0.8.19/LinkToken/LinkToken.bin c0ef9b507103aae541ebc31d87d051c2764ba9d843076b30ec505d37cdfffaba +link_token: ../../../contracts/solc/v0.8.19/LinkToken/LinkToken.abi ../../../contracts/solc/v0.8.19/LinkToken/LinkToken.bin 2a1e80350c338e0ddd643e690e99875f4aaf66904a4a473822f656e0a34b398f werc20_mock: ../../../contracts/solc/v0.8.19/WERC20Mock/WERC20Mock.abi ../../../contracts/solc/v0.8.19/WERC20Mock/WERC20Mock.bin ff2ca3928b2aa9c412c892cb8226c4d754c73eeb291bb7481c32c48791b2aa94 From 729dbb956d3d41998b095d07404591e77e52338d Mon Sep 17 00:00:00 2001 From: Josh Date: Wed, 25 Sep 2024 14:12:56 -0400 Subject: [PATCH 25/48] snapshotting --- contracts/gas-snapshots/ccip.gas-snapshot | 6 +- .../tokenAdminRegistry/TokenPoolFactory.t.sol | 178 +++++++++++++----- 2 files changed, 136 insertions(+), 48 deletions(-) diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot index 2627e7df41..8ae9ad18e3 100644 --- a/contracts/gas-snapshots/ccip.gas-snapshot +++ b/contracts/gas-snapshots/ccip.gas-snapshot @@ -122,9 +122,9 @@ CommitStore_verify:test_Blessed_Success() (gas: 96581) CommitStore_verify:test_NotBlessed_Success() (gas: 61473) CommitStore_verify:test_Paused_Revert() (gas: 18568) CommitStore_verify:test_TooManyLeaves_Revert() (gas: 36848) -DefensiveExampleTest:test_HappyPath_Success() (gas: 200200) -DefensiveExampleTest:test_Recovery() (gas: 424476) -E2E:test_E2E_3MessagesSuccess_gas() (gas: 1106985) +DefensiveExampleTest:test_HappyPath_Success() (gas: 200130) +DefensiveExampleTest:test_Recovery() (gas: 424336) +E2E:test_E2E_3MessagesSuccess_gas() (gas: 1106787) EVM2EVMOffRamp__releaseOrMintToken:test__releaseOrMintToken_NotACompatiblePool_Revert() (gas: 38322) EVM2EVMOffRamp__releaseOrMintToken:test__releaseOrMintToken_Success() (gas: 104372) EVM2EVMOffRamp__releaseOrMintToken:test__releaseOrMintToken_TokenHandlingError_transfer_Revert() (gas: 86004) diff --git a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol index 0494158dbc..999feeb2ab 100644 --- a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol +++ b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol @@ -40,8 +40,12 @@ contract TokenPoolFactorySetup is TokenAdminRegistrySetup { s_registryModuleOwnerCustom = new RegistryModuleOwnerCustom(address(s_tokenAdminRegistry)); s_tokenAdminRegistry.addRegistryModule(address(s_registryModuleOwnerCustom)); - s_tokenPoolFactory = - new TokenPoolFactory(s_tokenAdminRegistry, s_registryModuleOwnerCustom, s_rmnProxy, address(s_sourceRouter)); + s_tokenPoolFactory = new TokenPoolFactory( + s_tokenAdminRegistry, + s_registryModuleOwnerCustom, + s_rmnProxy, + address(s_sourceRouter) + ); // Create Init Code for BurnMintERC20 TestToken with 18 decimals and supply cap of max uint256 value s_tokenCreationParams = abi.encode("TestToken", "TT", 18, type(uint256).max, PREMINT_AMOUNT, OWNER); @@ -63,7 +67,12 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { function test_TokenPoolFactory_Constructor_Revert() public { // Revert cause the tokenAdminRegistry is address(0) vm.expectRevert(TokenPoolFactory.InvalidZeroAddress.selector); - new TokenPoolFactory(ITokenAdminRegistry(address(0)), RegistryModuleOwnerCustom(address(0)), address(0), address(0)); + new TokenPoolFactory( + ITokenAdminRegistry(address(0)), + RegistryModuleOwnerCustom(address(0)), + address(0), + address(0) + ); new TokenPoolFactory( ITokenAdminRegistry(address(0xdeadbeef)), @@ -78,8 +87,11 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { bytes32 dynamicSalt = keccak256(abi.encodePacked(FAKE_SALT, OWNER)); - address predictedTokenAddress = - Create2.computeAddress(dynamicSalt, keccak256(s_tokenInitCode), address(s_tokenPoolFactory)); + address predictedTokenAddress = Create2.computeAddress( + dynamicSalt, + keccak256(s_tokenInitCode), + address(s_tokenPoolFactory) + ); // Create the constructor params for the predicted pool bytes memory poolCreationParams = abi.encode(predictedTokenAddress, new address[](0), s_rmnProxy, s_sourceRouter); @@ -87,11 +99,17 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { // Predict the address of the pool before we make the tx by using the init code and the params bytes memory predictedPoolInitCode = abi.encodePacked(s_poolInitCode, poolCreationParams); - address predictedPoolAddress = - dynamicSalt.computeAddress(keccak256(predictedPoolInitCode), address(s_tokenPoolFactory)); + address predictedPoolAddress = dynamicSalt.computeAddress( + keccak256(predictedPoolInitCode), + address(s_tokenPoolFactory) + ); (address tokenAddress, address poolAddress) = s_tokenPoolFactory.deployTokenAndTokenPool( - new TokenPoolFactory.RemoteTokenPoolInfo[](0), s_tokenInitCode, s_poolInitCode, poolCreationParams, FAKE_SALT + new TokenPoolFactory.RemoteTokenPoolInfo[](0), + s_tokenInitCode, + s_poolInitCode, + poolCreationParams, + FAKE_SALT ); assertNotEq(address(0), tokenAddress, "Token Address should not be 0"); @@ -118,20 +136,27 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { RegistryModuleOwnerCustom newRegistryModule = new RegistryModuleOwnerCustom(address(newTokenAdminRegistry)); // We want to deploy a new factory and Owner Module. - TokenPoolFactory newTokenPoolFactory = - new TokenPoolFactory(newTokenAdminRegistry, newRegistryModule, s_rmnProxy, address(s_destRouter)); + TokenPoolFactory newTokenPoolFactory = new TokenPoolFactory( + newTokenAdminRegistry, + newRegistryModule, + s_rmnProxy, + address(s_destRouter) + ); newTokenAdminRegistry.addRegistryModule(address(newRegistryModule)); - TokenPoolFactory.RemoteChainConfig memory remoteChainConfig = - TokenPoolFactory.RemoteChainConfig(address(newTokenPoolFactory), address(s_destRouter), address(s_rmnProxy)); + TokenPoolFactory.RemoteChainConfig memory remoteChainConfig = TokenPoolFactory.RemoteChainConfig( + address(newTokenPoolFactory), + address(s_destRouter), + address(s_rmnProxy) + ); { TokenPoolFactory.RemoteChainConfig[] memory remoteChainConfigs = new TokenPoolFactory.RemoteChainConfig[](1); remoteChainConfigs[0] = remoteChainConfig; - TokenPoolFactory.RemoteChainConfigUpdate[] memory remoteChainConfigUpdates = - new TokenPoolFactory.RemoteChainConfigUpdate[](1); + TokenPoolFactory.RemoteChainConfigUpdate[] + memory remoteChainConfigUpdates = new TokenPoolFactory.RemoteChainConfigUpdate[](1); remoteChainConfigUpdates[0] = TokenPoolFactory.RemoteChainConfigUpdate(DEST_CHAIN_SELECTOR, remoteChainConfig); // Add the new token Factory to the remote chain config and set it for the simulated destination chain @@ -145,16 +170,28 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { // The only field that matters is DEST_CHAIN_SELECTOR because we dont want any existing token pool or token // on the remote chain remoteTokenPools[0] = TokenPoolFactory.RemoteTokenPoolInfo( - DEST_CHAIN_SELECTOR, "", "", s_tokenInitCode, RateLimiter.Config(false, 0, 0) + DEST_CHAIN_SELECTOR, + "", + "", + s_tokenInitCode, + RateLimiter.Config(false, 0, 0) ); // Predict the address of the token and pool on the DESTINATION chain - address predictedTokenAddress = dynamicSalt.computeAddress(keccak256(s_tokenInitCode), address(newTokenPoolFactory)); + address predictedTokenAddress = dynamicSalt.computeAddress( + keccak256(s_tokenInitCode), + address(newTokenPoolFactory) + ); // Since the remote chain information was provided, we should be able to get the information from the newly // deployed token pool using the available getter functions - (, address poolAddress) = - s_tokenPoolFactory.deployTokenAndTokenPool(remoteTokenPools, s_tokenInitCode, s_poolInitCode, "", FAKE_SALT); + (, address poolAddress) = s_tokenPoolFactory.deployTokenAndTokenPool( + remoteTokenPools, + s_tokenInitCode, + s_poolInitCode, + "", + FAKE_SALT + ); // Ensure that the remote Token was set to the one we predicted assertEq( @@ -167,15 +204,21 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { // Create the constructor params for the predicted pool // The predictedTokenAddress is NOT abi-encoded since the raw evm-address // is used in the constructor params - bytes memory predictedPoolCreationParams = - abi.encode(predictedTokenAddress, new address[](0), s_rmnProxy, address(s_destRouter)); + bytes memory predictedPoolCreationParams = abi.encode( + predictedTokenAddress, + new address[](0), + s_rmnProxy, + address(s_destRouter) + ); // Take the init code and concat the destination params to it, the initCode shouldn't change bytes memory predictedPoolInitCode = abi.encodePacked(s_poolInitCode, predictedPoolCreationParams); // Predict the address of the pool on the DESTINATION chain - address predictedPoolAddress = - dynamicSalt.computeAddress(keccak256(predictedPoolInitCode), address(newTokenPoolFactory)); + address predictedPoolAddress = dynamicSalt.computeAddress( + keccak256(predictedPoolInitCode), + address(newTokenPoolFactory) + ); // Assert that the address set for the remote pool is the same as the predicted address assertEq( @@ -188,7 +231,11 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { // On the new token pool factory, representing a destination chain, // deploy a new token and a new pool (address newTokenAddress, address newPoolAddress) = newTokenPoolFactory.deployTokenAndTokenPool( - new TokenPoolFactory.RemoteTokenPoolInfo[](0), s_tokenInitCode, s_poolInitCode, "", FAKE_SALT + new TokenPoolFactory.RemoteTokenPoolInfo[](0), + s_tokenInitCode, + s_poolInitCode, + "", + FAKE_SALT ); assertEq( @@ -208,8 +255,14 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { vm.startPrank(OWNER); bytes32 dynamicSalt = keccak256(abi.encodePacked(FAKE_SALT, OWNER)); - FactoryBurnMintERC20 newRemoteToken = - new FactoryBurnMintERC20("TestToken", "TT", 18, type(uint256).max, PREMINT_AMOUNT, OWNER); + FactoryBurnMintERC20 newRemoteToken = new FactoryBurnMintERC20( + "TestToken", + "TT", + 18, + type(uint256).max, + PREMINT_AMOUNT, + OWNER + ); // We have to create a new factory, registry module, and token admin registry to simulate the other chain @@ -217,20 +270,27 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { RegistryModuleOwnerCustom newRegistryModule = new RegistryModuleOwnerCustom(address(newTokenAdminRegistry)); // We want to deploy a new factory and Owner Module. - TokenPoolFactory newTokenPoolFactory = - new TokenPoolFactory(newTokenAdminRegistry, newRegistryModule, s_rmnProxy, address(s_destRouter)); + TokenPoolFactory newTokenPoolFactory = new TokenPoolFactory( + newTokenAdminRegistry, + newRegistryModule, + s_rmnProxy, + address(s_destRouter) + ); newTokenAdminRegistry.addRegistryModule(address(newRegistryModule)); { - TokenPoolFactory.RemoteChainConfig memory remoteChainConfig = - TokenPoolFactory.RemoteChainConfig(address(newTokenPoolFactory), address(s_destRouter), address(s_rmnProxy)); + TokenPoolFactory.RemoteChainConfig memory remoteChainConfig = TokenPoolFactory.RemoteChainConfig( + address(newTokenPoolFactory), + address(s_destRouter), + address(s_rmnProxy) + ); TokenPoolFactory.RemoteChainConfig[] memory remoteChainConfigs = new TokenPoolFactory.RemoteChainConfig[](1); remoteChainConfigs[0] = remoteChainConfig; - TokenPoolFactory.RemoteChainConfigUpdate[] memory remoteChainConfigUpdates = - new TokenPoolFactory.RemoteChainConfigUpdate[](1); + TokenPoolFactory.RemoteChainConfigUpdate[] + memory remoteChainConfigUpdates = new TokenPoolFactory.RemoteChainConfigUpdate[](1); remoteChainConfigUpdates[0] = TokenPoolFactory.RemoteChainConfigUpdate(DEST_CHAIN_SELECTOR, remoteChainConfig); // Add the new token Factory to the remote chain config and set it for the simulated destination chain @@ -244,13 +304,22 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { // The only field that matters is DEST_CHAIN_SELECTOR because we dont want any existing token pool or token // on the remote chain remoteTokenPools[0] = TokenPoolFactory.RemoteTokenPoolInfo( - DEST_CHAIN_SELECTOR, "", abi.encode(address(newRemoteToken)), s_tokenInitCode, RateLimiter.Config(false, 0, 0) + DEST_CHAIN_SELECTOR, + "", + abi.encode(address(newRemoteToken)), + s_tokenInitCode, + RateLimiter.Config(false, 0, 0) ); // Since the remote chain information was provided, we should be able to get the information from the newly // deployed token pool using the available getter functions - (address tokenAddress, address poolAddress) = - s_tokenPoolFactory.deployTokenAndTokenPool(remoteTokenPools, s_tokenInitCode, s_poolInitCode, "", FAKE_SALT); + (address tokenAddress, address poolAddress) = s_tokenPoolFactory.deployTokenAndTokenPool( + remoteTokenPools, + s_tokenInitCode, + s_poolInitCode, + "", + FAKE_SALT + ); assertEq(address(TokenPool(poolAddress).getToken()), tokenAddress, "Token Address should have been set locally"); @@ -264,15 +333,21 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { // Create the constructor params for the predicted pool // The predictedTokenAddress is NOT abi-encoded since the raw evm-address // is used in the constructor params - bytes memory predictedPoolCreationParams = - abi.encode(address(newRemoteToken), new address[](0), s_rmnProxy, address(s_destRouter)); + bytes memory predictedPoolCreationParams = abi.encode( + address(newRemoteToken), + new address[](0), + s_rmnProxy, + address(s_destRouter) + ); // Take the init code and concat the destination params to it, the initCode shouldn't change bytes memory predictedPoolInitCode = abi.encodePacked(s_poolInitCode, predictedPoolCreationParams); // Predict the address of the pool on the DESTINATION chain - address predictedPoolAddress = - dynamicSalt.computeAddress(keccak256(predictedPoolInitCode), address(newTokenPoolFactory)); + address predictedPoolAddress = dynamicSalt.computeAddress( + keccak256(predictedPoolInitCode), + address(newTokenPoolFactory) + ); // Assert that the address set for the remote pool is the same as the predicted address assertEq( @@ -284,7 +359,11 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { // On the new token pool factory, representing a destination chain, // deploy a new token and a new pool address newPoolAddress = newTokenPoolFactory.deployTokenPoolWithExistingToken( - address(newRemoteToken), new TokenPoolFactory.RemoteTokenPoolInfo[](0), s_poolInitCode, "", FAKE_SALT + address(newRemoteToken), + new TokenPoolFactory.RemoteTokenPoolInfo[](0), + s_poolInitCode, + "", + FAKE_SALT ); assertEq( @@ -317,11 +396,19 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { TokenPoolFactory.RemoteTokenPoolInfo[] memory remoteTokenPools = new TokenPoolFactory.RemoteTokenPoolInfo[](1); remoteTokenPools[0] = TokenPoolFactory.RemoteTokenPoolInfo( - DEST_CHAIN_SELECTOR, RANDOM_POOL_ADDRESS, RANDOM_TOKEN_ADDRESS, "", RateLimiter.Config(false, 0, 0) + DEST_CHAIN_SELECTOR, + RANDOM_POOL_ADDRESS, + RANDOM_TOKEN_ADDRESS, + "", + RateLimiter.Config(false, 0, 0) ); (address tokenAddress, address poolAddress) = s_tokenPoolFactory.deployTokenAndTokenPool( - remoteTokenPools, s_tokenInitCode, s_poolInitCode, poolCreationParams, FAKE_SALT + remoteTokenPools, + s_tokenInitCode, + s_poolInitCode, + poolCreationParams, + FAKE_SALT ); assertNotEq(address(0), tokenAddress, "Token Address should not be 0"); @@ -361,14 +448,15 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { remoteChainConfigs[0] = remoteChainConfig; - TokenPoolFactory.RemoteChainConfigUpdate[] memory remoteChainConfigUpdates = - new TokenPoolFactory.RemoteChainConfigUpdate[](1); + TokenPoolFactory.RemoteChainConfigUpdate[] + memory remoteChainConfigUpdates = new TokenPoolFactory.RemoteChainConfigUpdate[](1); remoteChainConfigUpdates[0] = TokenPoolFactory.RemoteChainConfigUpdate(DEST_CHAIN_SELECTOR, remoteChainConfig); s_tokenPoolFactory.updateRemoteChainConfig(remoteChainConfigUpdates); - TokenPoolFactory.RemoteChainConfig memory updatedRemoteChainConfig = - s_tokenPoolFactory.getRemoteChainConfig(DEST_CHAIN_SELECTOR); + TokenPoolFactory.RemoteChainConfig memory updatedRemoteChainConfig = s_tokenPoolFactory.getRemoteChainConfig( + DEST_CHAIN_SELECTOR + ); assertEq( remoteChainConfig.remotePoolFactory, From 0688f98dcade97d0d0c9b47185052a9e4daac442 Mon Sep 17 00:00:00 2001 From: Josh Date: Wed, 25 Sep 2024 15:28:45 -0400 Subject: [PATCH 26/48] formatting --- .../tokenAdminRegistry/TokenPoolFactory.t.sol | 179 +++++------------- .../tokenAdminRegistry/TokenPoolFactory.sol | 6 +- 2 files changed, 49 insertions(+), 136 deletions(-) diff --git a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol index 999feeb2ab..5580ee7226 100644 --- a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol +++ b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol @@ -40,12 +40,8 @@ contract TokenPoolFactorySetup is TokenAdminRegistrySetup { s_registryModuleOwnerCustom = new RegistryModuleOwnerCustom(address(s_tokenAdminRegistry)); s_tokenAdminRegistry.addRegistryModule(address(s_registryModuleOwnerCustom)); - s_tokenPoolFactory = new TokenPoolFactory( - s_tokenAdminRegistry, - s_registryModuleOwnerCustom, - s_rmnProxy, - address(s_sourceRouter) - ); + s_tokenPoolFactory = + new TokenPoolFactory(s_tokenAdminRegistry, s_registryModuleOwnerCustom, s_rmnProxy, address(s_sourceRouter)); // Create Init Code for BurnMintERC20 TestToken with 18 decimals and supply cap of max uint256 value s_tokenCreationParams = abi.encode("TestToken", "TT", 18, type(uint256).max, PREMINT_AMOUNT, OWNER); @@ -67,12 +63,7 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { function test_TokenPoolFactory_Constructor_Revert() public { // Revert cause the tokenAdminRegistry is address(0) vm.expectRevert(TokenPoolFactory.InvalidZeroAddress.selector); - new TokenPoolFactory( - ITokenAdminRegistry(address(0)), - RegistryModuleOwnerCustom(address(0)), - address(0), - address(0) - ); + new TokenPoolFactory(ITokenAdminRegistry(address(0)), RegistryModuleOwnerCustom(address(0)), address(0), address(0)); new TokenPoolFactory( ITokenAdminRegistry(address(0xdeadbeef)), @@ -87,11 +78,8 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { bytes32 dynamicSalt = keccak256(abi.encodePacked(FAKE_SALT, OWNER)); - address predictedTokenAddress = Create2.computeAddress( - dynamicSalt, - keccak256(s_tokenInitCode), - address(s_tokenPoolFactory) - ); + address predictedTokenAddress = + Create2.computeAddress(dynamicSalt, keccak256(s_tokenInitCode), address(s_tokenPoolFactory)); // Create the constructor params for the predicted pool bytes memory poolCreationParams = abi.encode(predictedTokenAddress, new address[](0), s_rmnProxy, s_sourceRouter); @@ -99,17 +87,11 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { // Predict the address of the pool before we make the tx by using the init code and the params bytes memory predictedPoolInitCode = abi.encodePacked(s_poolInitCode, poolCreationParams); - address predictedPoolAddress = dynamicSalt.computeAddress( - keccak256(predictedPoolInitCode), - address(s_tokenPoolFactory) - ); + address predictedPoolAddress = + dynamicSalt.computeAddress(keccak256(predictedPoolInitCode), address(s_tokenPoolFactory)); (address tokenAddress, address poolAddress) = s_tokenPoolFactory.deployTokenAndTokenPool( - new TokenPoolFactory.RemoteTokenPoolInfo[](0), - s_tokenInitCode, - s_poolInitCode, - poolCreationParams, - FAKE_SALT + new TokenPoolFactory.RemoteTokenPoolInfo[](0), s_tokenInitCode, s_poolInitCode, poolCreationParams, FAKE_SALT ); assertNotEq(address(0), tokenAddress, "Token Address should not be 0"); @@ -136,27 +118,20 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { RegistryModuleOwnerCustom newRegistryModule = new RegistryModuleOwnerCustom(address(newTokenAdminRegistry)); // We want to deploy a new factory and Owner Module. - TokenPoolFactory newTokenPoolFactory = new TokenPoolFactory( - newTokenAdminRegistry, - newRegistryModule, - s_rmnProxy, - address(s_destRouter) - ); + TokenPoolFactory newTokenPoolFactory = + new TokenPoolFactory(newTokenAdminRegistry, newRegistryModule, s_rmnProxy, address(s_destRouter)); newTokenAdminRegistry.addRegistryModule(address(newRegistryModule)); - TokenPoolFactory.RemoteChainConfig memory remoteChainConfig = TokenPoolFactory.RemoteChainConfig( - address(newTokenPoolFactory), - address(s_destRouter), - address(s_rmnProxy) - ); + TokenPoolFactory.RemoteChainConfig memory remoteChainConfig = + TokenPoolFactory.RemoteChainConfig(address(newTokenPoolFactory), address(s_destRouter), address(s_rmnProxy)); { TokenPoolFactory.RemoteChainConfig[] memory remoteChainConfigs = new TokenPoolFactory.RemoteChainConfig[](1); remoteChainConfigs[0] = remoteChainConfig; - TokenPoolFactory.RemoteChainConfigUpdate[] - memory remoteChainConfigUpdates = new TokenPoolFactory.RemoteChainConfigUpdate[](1); + TokenPoolFactory.RemoteChainConfigUpdate[] memory remoteChainConfigUpdates = + new TokenPoolFactory.RemoteChainConfigUpdate[](1); remoteChainConfigUpdates[0] = TokenPoolFactory.RemoteChainConfigUpdate(DEST_CHAIN_SELECTOR, remoteChainConfig); // Add the new token Factory to the remote chain config and set it for the simulated destination chain @@ -170,28 +145,16 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { // The only field that matters is DEST_CHAIN_SELECTOR because we dont want any existing token pool or token // on the remote chain remoteTokenPools[0] = TokenPoolFactory.RemoteTokenPoolInfo( - DEST_CHAIN_SELECTOR, - "", - "", - s_tokenInitCode, - RateLimiter.Config(false, 0, 0) + DEST_CHAIN_SELECTOR, "", "", s_tokenInitCode, RateLimiter.Config(false, 0, 0) ); // Predict the address of the token and pool on the DESTINATION chain - address predictedTokenAddress = dynamicSalt.computeAddress( - keccak256(s_tokenInitCode), - address(newTokenPoolFactory) - ); + address predictedTokenAddress = dynamicSalt.computeAddress(keccak256(s_tokenInitCode), address(newTokenPoolFactory)); // Since the remote chain information was provided, we should be able to get the information from the newly // deployed token pool using the available getter functions - (, address poolAddress) = s_tokenPoolFactory.deployTokenAndTokenPool( - remoteTokenPools, - s_tokenInitCode, - s_poolInitCode, - "", - FAKE_SALT - ); + (, address poolAddress) = + s_tokenPoolFactory.deployTokenAndTokenPool(remoteTokenPools, s_tokenInitCode, s_poolInitCode, "", FAKE_SALT); // Ensure that the remote Token was set to the one we predicted assertEq( @@ -204,21 +167,15 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { // Create the constructor params for the predicted pool // The predictedTokenAddress is NOT abi-encoded since the raw evm-address // is used in the constructor params - bytes memory predictedPoolCreationParams = abi.encode( - predictedTokenAddress, - new address[](0), - s_rmnProxy, - address(s_destRouter) - ); + bytes memory predictedPoolCreationParams = + abi.encode(predictedTokenAddress, new address[](0), s_rmnProxy, address(s_destRouter)); // Take the init code and concat the destination params to it, the initCode shouldn't change bytes memory predictedPoolInitCode = abi.encodePacked(s_poolInitCode, predictedPoolCreationParams); // Predict the address of the pool on the DESTINATION chain - address predictedPoolAddress = dynamicSalt.computeAddress( - keccak256(predictedPoolInitCode), - address(newTokenPoolFactory) - ); + address predictedPoolAddress = + dynamicSalt.computeAddress(keccak256(predictedPoolInitCode), address(newTokenPoolFactory)); // Assert that the address set for the remote pool is the same as the predicted address assertEq( @@ -231,11 +188,7 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { // On the new token pool factory, representing a destination chain, // deploy a new token and a new pool (address newTokenAddress, address newPoolAddress) = newTokenPoolFactory.deployTokenAndTokenPool( - new TokenPoolFactory.RemoteTokenPoolInfo[](0), - s_tokenInitCode, - s_poolInitCode, - "", - FAKE_SALT + new TokenPoolFactory.RemoteTokenPoolInfo[](0), s_tokenInitCode, s_poolInitCode, "", FAKE_SALT ); assertEq( @@ -255,42 +208,28 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { vm.startPrank(OWNER); bytes32 dynamicSalt = keccak256(abi.encodePacked(FAKE_SALT, OWNER)); - FactoryBurnMintERC20 newRemoteToken = new FactoryBurnMintERC20( - "TestToken", - "TT", - 18, - type(uint256).max, - PREMINT_AMOUNT, - OWNER - ); + FactoryBurnMintERC20 newRemoteToken = + new FactoryBurnMintERC20("TestToken", "TT", 18, type(uint256).max, PREMINT_AMOUNT, OWNER); // We have to create a new factory, registry module, and token admin registry to simulate the other chain - TokenAdminRegistry newTokenAdminRegistry = new TokenAdminRegistry(); RegistryModuleOwnerCustom newRegistryModule = new RegistryModuleOwnerCustom(address(newTokenAdminRegistry)); // We want to deploy a new factory and Owner Module. - TokenPoolFactory newTokenPoolFactory = new TokenPoolFactory( - newTokenAdminRegistry, - newRegistryModule, - s_rmnProxy, - address(s_destRouter) - ); + TokenPoolFactory newTokenPoolFactory = + new TokenPoolFactory(newTokenAdminRegistry, newRegistryModule, s_rmnProxy, address(s_destRouter)); newTokenAdminRegistry.addRegistryModule(address(newRegistryModule)); { - TokenPoolFactory.RemoteChainConfig memory remoteChainConfig = TokenPoolFactory.RemoteChainConfig( - address(newTokenPoolFactory), - address(s_destRouter), - address(s_rmnProxy) - ); + TokenPoolFactory.RemoteChainConfig memory remoteChainConfig = + TokenPoolFactory.RemoteChainConfig(address(newTokenPoolFactory), address(s_destRouter), address(s_rmnProxy)); TokenPoolFactory.RemoteChainConfig[] memory remoteChainConfigs = new TokenPoolFactory.RemoteChainConfig[](1); remoteChainConfigs[0] = remoteChainConfig; - TokenPoolFactory.RemoteChainConfigUpdate[] - memory remoteChainConfigUpdates = new TokenPoolFactory.RemoteChainConfigUpdate[](1); + TokenPoolFactory.RemoteChainConfigUpdate[] memory remoteChainConfigUpdates = + new TokenPoolFactory.RemoteChainConfigUpdate[](1); remoteChainConfigUpdates[0] = TokenPoolFactory.RemoteChainConfigUpdate(DEST_CHAIN_SELECTOR, remoteChainConfig); // Add the new token Factory to the remote chain config and set it for the simulated destination chain @@ -304,22 +243,13 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { // The only field that matters is DEST_CHAIN_SELECTOR because we dont want any existing token pool or token // on the remote chain remoteTokenPools[0] = TokenPoolFactory.RemoteTokenPoolInfo( - DEST_CHAIN_SELECTOR, - "", - abi.encode(address(newRemoteToken)), - s_tokenInitCode, - RateLimiter.Config(false, 0, 0) + DEST_CHAIN_SELECTOR, "", abi.encode(address(newRemoteToken)), s_tokenInitCode, RateLimiter.Config(false, 0, 0) ); // Since the remote chain information was provided, we should be able to get the information from the newly // deployed token pool using the available getter functions - (address tokenAddress, address poolAddress) = s_tokenPoolFactory.deployTokenAndTokenPool( - remoteTokenPools, - s_tokenInitCode, - s_poolInitCode, - "", - FAKE_SALT - ); + (address tokenAddress, address poolAddress) = + s_tokenPoolFactory.deployTokenAndTokenPool(remoteTokenPools, s_tokenInitCode, s_poolInitCode, "", FAKE_SALT); assertEq(address(TokenPool(poolAddress).getToken()), tokenAddress, "Token Address should have been set locally"); @@ -333,21 +263,15 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { // Create the constructor params for the predicted pool // The predictedTokenAddress is NOT abi-encoded since the raw evm-address // is used in the constructor params - bytes memory predictedPoolCreationParams = abi.encode( - address(newRemoteToken), - new address[](0), - s_rmnProxy, - address(s_destRouter) - ); + bytes memory predictedPoolCreationParams = + abi.encode(address(newRemoteToken), new address[](0), s_rmnProxy, address(s_destRouter)); // Take the init code and concat the destination params to it, the initCode shouldn't change bytes memory predictedPoolInitCode = abi.encodePacked(s_poolInitCode, predictedPoolCreationParams); // Predict the address of the pool on the DESTINATION chain - address predictedPoolAddress = dynamicSalt.computeAddress( - keccak256(predictedPoolInitCode), - address(newTokenPoolFactory) - ); + address predictedPoolAddress = + dynamicSalt.computeAddress(keccak256(predictedPoolInitCode), address(newTokenPoolFactory)); // Assert that the address set for the remote pool is the same as the predicted address assertEq( @@ -359,11 +283,7 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { // On the new token pool factory, representing a destination chain, // deploy a new token and a new pool address newPoolAddress = newTokenPoolFactory.deployTokenPoolWithExistingToken( - address(newRemoteToken), - new TokenPoolFactory.RemoteTokenPoolInfo[](0), - s_poolInitCode, - "", - FAKE_SALT + address(newRemoteToken), new TokenPoolFactory.RemoteTokenPoolInfo[](0), s_poolInitCode, "", FAKE_SALT ); assertEq( @@ -396,19 +316,11 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { TokenPoolFactory.RemoteTokenPoolInfo[] memory remoteTokenPools = new TokenPoolFactory.RemoteTokenPoolInfo[](1); remoteTokenPools[0] = TokenPoolFactory.RemoteTokenPoolInfo( - DEST_CHAIN_SELECTOR, - RANDOM_POOL_ADDRESS, - RANDOM_TOKEN_ADDRESS, - "", - RateLimiter.Config(false, 0, 0) + DEST_CHAIN_SELECTOR, RANDOM_POOL_ADDRESS, RANDOM_TOKEN_ADDRESS, "", RateLimiter.Config(false, 0, 0) ); (address tokenAddress, address poolAddress) = s_tokenPoolFactory.deployTokenAndTokenPool( - remoteTokenPools, - s_tokenInitCode, - s_poolInitCode, - poolCreationParams, - FAKE_SALT + remoteTokenPools, s_tokenInitCode, s_poolInitCode, poolCreationParams, FAKE_SALT ); assertNotEq(address(0), tokenAddress, "Token Address should not be 0"); @@ -448,15 +360,14 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { remoteChainConfigs[0] = remoteChainConfig; - TokenPoolFactory.RemoteChainConfigUpdate[] - memory remoteChainConfigUpdates = new TokenPoolFactory.RemoteChainConfigUpdate[](1); + TokenPoolFactory.RemoteChainConfigUpdate[] memory remoteChainConfigUpdates = + new TokenPoolFactory.RemoteChainConfigUpdate[](1); remoteChainConfigUpdates[0] = TokenPoolFactory.RemoteChainConfigUpdate(DEST_CHAIN_SELECTOR, remoteChainConfig); s_tokenPoolFactory.updateRemoteChainConfig(remoteChainConfigUpdates); - TokenPoolFactory.RemoteChainConfig memory updatedRemoteChainConfig = s_tokenPoolFactory.getRemoteChainConfig( - DEST_CHAIN_SELECTOR - ); + TokenPoolFactory.RemoteChainConfig memory updatedRemoteChainConfig = + s_tokenPoolFactory.getRemoteChainConfig(DEST_CHAIN_SELECTOR); assertEq( remoteChainConfig.remotePoolFactory, diff --git a/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory.sol b/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory.sol index 5055a1065f..64634bff3c 100644 --- a/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory.sol +++ b/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory.sol @@ -88,7 +88,8 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { bytes memory tokenPoolInitArgs, bytes32 salt ) external returns (address, address) { - // Ensure a unique deployment between senders even if the same input parameter is used + // Ensure a unique deployment between senders even if the same input parameter is used to prevent + // DOS/Frontrunning attacks salt = keccak256(abi.encodePacked(salt, msg.sender)); // Deploy the token. The constructor parameters are already provided in the tokenInitCode @@ -124,7 +125,8 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { bytes memory tokenPoolInitArgs, bytes32 salt ) external returns (address poolAddress) { - // Ensure a unique deployment between senders even if the same input parameter is used + // Ensure a unique deployment between senders even if the same input parameter is used to prevent + // DOS/Frontrunning attacks salt = keccak256(abi.encodePacked(salt, msg.sender)); // create the token pool and return the address From 90ee01d2d42b23bc992fc5cd1b861d280761bbdc Mon Sep 17 00:00:00 2001 From: Josh Date: Thu, 26 Sep 2024 11:47:10 -0400 Subject: [PATCH 27/48] Revert Changes to shared folders, will be in Chainlink repo --- contracts/gas-snapshots/shared.gas-snapshot | 77 +-- .../interfaces/IRegistryModuleOwnerCustom.sol | 14 + .../test/helpers/BurnMintERC677Helper.sol | 6 +- .../ccip/test/legacy/TokenPoolAndProxy.t.sol | 85 ++- .../tokenAdminRegistry/TokenPoolFactory.t.sol | 636 +++++++++--------- .../FactoryBurnMintERC20.sol | 31 - .../TokenPoolFactory.sol | 35 +- .../test/token/ERC20/BurnMintERC20.t.sol | 360 ---------- .../test/token/ERC677/BurnMintERC677.t.sol | 13 +- .../token/ERC677/OpStackBurnMintERC677.t.sol | 5 +- .../v0.8/shared/token/ERC20/BurnMintERC20.sol | 252 ------- .../shared/token/ERC677/BurnMintERC677.sol | 221 +++++- 12 files changed, 655 insertions(+), 1080 deletions(-) create mode 100644 contracts/src/v0.8/ccip/interfaces/IRegistryModuleOwnerCustom.sol delete mode 100644 contracts/src/v0.8/ccip/tokenAdminRegistry/FactoryBurnMintERC20.sol rename contracts/src/v0.8/ccip/tokenAdminRegistry/{ => TokenPoolFactory}/TokenPoolFactory.sol (91%) delete mode 100644 contracts/src/v0.8/shared/test/token/ERC20/BurnMintERC20.t.sol delete mode 100644 contracts/src/v0.8/shared/token/ERC20/BurnMintERC20.sol diff --git a/contracts/gas-snapshots/shared.gas-snapshot b/contracts/gas-snapshots/shared.gas-snapshot index f563f05078..d7a4e21978 100644 --- a/contracts/gas-snapshots/shared.gas-snapshot +++ b/contracts/gas-snapshots/shared.gas-snapshot @@ -7,60 +7,33 @@ AuthorizedCallers_applyAuthorizedCallerUpdates:test_SkipRemove_Success() (gas: 3 AuthorizedCallers_applyAuthorizedCallerUpdates:test_ZeroAddressNotAllowed_Revert() (gas: 64473) AuthorizedCallers_constructor:test_ZeroAddressNotAllowed_Revert() (gas: 64473) AuthorizedCallers_constructor:test_constructor_Success() (gas: 720513) -BurnMintERC20_approve:testApproveSuccess() (gas: 55477) -BurnMintERC20_approve:testInvalidAddressReverts() (gas: 10663) -BurnMintERC20_burn:testBasicBurnSuccess() (gas: 173886) -BurnMintERC20_burn:testBurnFromZeroAddressReverts() (gas: 47201) -BurnMintERC20_burn:testExceedsBalanceReverts() (gas: 21819) -BurnMintERC20_burn:testSenderNotBurnerReverts() (gas: 16739) -BurnMintERC20_burnFrom:testBurnFromSuccess() (gas: 57957) -BurnMintERC20_burnFrom:testExceedsBalanceReverts() (gas: 35916) -BurnMintERC20_burnFrom:testInsufficientAllowanceReverts() (gas: 21914) -BurnMintERC20_burnFrom:testSenderNotBurnerReverts() (gas: 16739) -BurnMintERC20_burnFromAlias:testBurnFromSuccess() (gas: 57932) -BurnMintERC20_burnFromAlias:testExceedsBalanceReverts() (gas: 35880) -BurnMintERC20_burnFromAlias:testInsufficientAllowanceReverts() (gas: 21869) -BurnMintERC20_burnFromAlias:testSenderNotBurnerReverts() (gas: 16694) -BurnMintERC20_constructor:testConstructorSuccess() (gas: 1600593) -BurnMintERC20_decreaseApproval:testDecreaseApprovalSuccess() (gas: 31123) -BurnMintERC20_grantMintAndBurnRoles:testGrantMintAndBurnRolesSuccess() (gas: 121170) -BurnMintERC20_grantRole:testGrantBurnAccessSuccess() (gas: 53407) -BurnMintERC20_grantRole:testGrantManySuccess() (gas: 944594) -BurnMintERC20_grantRole:testGrantMintAccessSuccess() (gas: 94200) -BurnMintERC20_increaseApproval:testIncreaseApprovalSuccess() (gas: 44121) -BurnMintERC20_mint:testBasicMintSuccess() (gas: 149743) -BurnMintERC20_mint:testMaxSupplyExceededReverts() (gas: 50429) -BurnMintERC20_mint:testSenderNotMinterReverts() (gas: 14596) -BurnMintERC20_supportsInterface:testConstructorSuccess() (gas: 11123) -BurnMintERC20_transfer:testInvalidAddressReverts() (gas: 10661) -BurnMintERC20_transfer:testTransferSuccess() (gas: 42277) -BurnMintERC677_approve:testApproveSuccess() (gas: 55477) +BurnMintERC677_approve:testApproveSuccess() (gas: 55512) BurnMintERC677_approve:testInvalidAddressReverts() (gas: 10663) -BurnMintERC677_burn:testBasicBurnSuccess() (gas: 173904) -BurnMintERC677_burn:testBurnFromZeroAddressReverts() (gas: 47223) +BurnMintERC677_burn:testBasicBurnSuccess() (gas: 173939) +BurnMintERC677_burn:testBurnFromZeroAddressReverts() (gas: 47201) BurnMintERC677_burn:testExceedsBalanceReverts() (gas: 21841) -BurnMintERC677_burn:testSenderNotBurnerReverts() (gas: 13424) -BurnMintERC677_burnFrom:testBurnFromSuccess() (gas: 57957) -BurnMintERC677_burnFrom:testExceedsBalanceReverts() (gas: 35916) -BurnMintERC677_burnFrom:testInsufficientAllowanceReverts() (gas: 21914) -BurnMintERC677_burnFrom:testSenderNotBurnerReverts() (gas: 13424) -BurnMintERC677_burnFromAlias:testBurnFromSuccess() (gas: 57932) +BurnMintERC677_burn:testSenderNotBurnerReverts() (gas: 13359) +BurnMintERC677_burnFrom:testBurnFromSuccess() (gas: 57923) +BurnMintERC677_burnFrom:testExceedsBalanceReverts() (gas: 35864) +BurnMintERC677_burnFrom:testInsufficientAllowanceReverts() (gas: 21849) +BurnMintERC677_burnFrom:testSenderNotBurnerReverts() (gas: 13359) +BurnMintERC677_burnFromAlias:testBurnFromSuccess() (gas: 57949) BurnMintERC677_burnFromAlias:testExceedsBalanceReverts() (gas: 35880) BurnMintERC677_burnFromAlias:testInsufficientAllowanceReverts() (gas: 21869) BurnMintERC677_burnFromAlias:testSenderNotBurnerReverts() (gas: 13379) -BurnMintERC677_constructor:testConstructorSuccess() (gas: 1763863) -BurnMintERC677_decreaseApproval:testDecreaseApprovalSuccess() (gas: 31088) -BurnMintERC677_grantMintAndBurnRoles:testGrantMintAndBurnRolesSuccess() (gas: 121214) -BurnMintERC677_grantRole:testGrantBurnAccessSuccess() (gas: 53477) -BurnMintERC677_grantRole:testGrantManySuccess() (gas: 937980) -BurnMintERC677_grantRole:testGrantMintAccessSuccess() (gas: 94200) -BurnMintERC677_increaseApproval:testIncreaseApprovalSuccess() (gas: 44121) -BurnMintERC677_mint:testBasicMintSuccess() (gas: 149677) -BurnMintERC677_mint:testMaxSupplyExceededReverts() (gas: 50297) +BurnMintERC677_constructor:testConstructorSuccess() (gas: 1672809) +BurnMintERC677_decreaseApproval:testDecreaseApprovalSuccess() (gas: 31069) +BurnMintERC677_grantMintAndBurnRoles:testGrantMintAndBurnRolesSuccess() (gas: 121324) +BurnMintERC677_grantRole:testGrantBurnAccessSuccess() (gas: 53460) +BurnMintERC677_grantRole:testGrantManySuccess() (gas: 937759) +BurnMintERC677_grantRole:testGrantMintAccessSuccess() (gas: 94340) +BurnMintERC677_increaseApproval:testIncreaseApprovalSuccess() (gas: 44076) +BurnMintERC677_mint:testBasicMintSuccess() (gas: 149699) +BurnMintERC677_mint:testMaxSupplyExceededReverts() (gas: 50385) BurnMintERC677_mint:testSenderNotMinterReverts() (gas: 11195) -BurnMintERC677_supportsInterface:testConstructorSuccess() (gas: 12610) -BurnMintERC677_transfer:testInvalidAddressReverts() (gas: 10661) -BurnMintERC677_transfer:testTransferSuccess() (gas: 42277) +BurnMintERC677_supportsInterface:testConstructorSuccess() (gas: 12476) +BurnMintERC677_transfer:testInvalidAddressReverts() (gas: 10639) +BurnMintERC677_transfer:testTransferSuccess() (gas: 42299) CallWithExactGas__callWithExactGas:test_CallWithExactGasReceiverErrorSuccess() (gas: 67209) CallWithExactGas__callWithExactGas:test_CallWithExactGasSafeReturnDataExactGas() (gas: 18324) CallWithExactGas__callWithExactGas:test_NoContractReverts() (gas: 11559) @@ -101,11 +74,11 @@ EnumerableMapAddresses_set:testSetSuccess() (gas: 94685) EnumerableMapAddresses_tryGet:testBytes32TryGetSuccess() (gas: 94622) EnumerableMapAddresses_tryGet:testBytesTryGetSuccess() (gas: 96279) EnumerableMapAddresses_tryGet:testTryGetSuccess() (gas: 94893) -OpStackBurnMintERC677_constructor:testConstructorSuccess() (gas: 1829158) -OpStackBurnMintERC677_interfaceCompatibility:testBurnCompatibility() (gas: 298741) -OpStackBurnMintERC677_interfaceCompatibility:testMintCompatibility() (gas: 138155) +OpStackBurnMintERC677_constructor:testConstructorSuccess() (gas: 1743649) +OpStackBurnMintERC677_interfaceCompatibility:testBurnCompatibility() (gas: 298649) +OpStackBurnMintERC677_interfaceCompatibility:testMintCompatibility() (gas: 137957) OpStackBurnMintERC677_interfaceCompatibility:testStaticFunctionsCompatibility() (gas: 13781) -OpStackBurnMintERC677_supportsInterface:testConstructorSuccess() (gas: 12814) +OpStackBurnMintERC677_supportsInterface:testConstructorSuccess() (gas: 12752) SortedSetValidationUtil_CheckIsValidUniqueSubsetTest:test__checkIsValidUniqueSubset_EmptySubset_Reverts() (gas: 5460) SortedSetValidationUtil_CheckIsValidUniqueSubsetTest:test__checkIsValidUniqueSubset_EmptySuperset_Reverts() (gas: 4661) SortedSetValidationUtil_CheckIsValidUniqueSubsetTest:test__checkIsValidUniqueSubset_HasDuplicates_Reverts() (gas: 8265) diff --git a/contracts/src/v0.8/ccip/interfaces/IRegistryModuleOwnerCustom.sol b/contracts/src/v0.8/ccip/interfaces/IRegistryModuleOwnerCustom.sol new file mode 100644 index 0000000000..f0412015d3 --- /dev/null +++ b/contracts/src/v0.8/ccip/interfaces/IRegistryModuleOwnerCustom.sol @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.19; + +interface IRegistryModuleOwnerCustom { + /// @notice Registers the admin of the token using the `getCCIPAdmin` method. + /// @param token The token to register the admin for. + /// @dev The caller must be the admin returned by the `getCCIPAdmin` method. + function registerAdminViaGetCCIPAdmin(address token) external; + + /// @notice Registers the admin of the token using the `owner` method. + /// @param token The token to register the admin for. + /// @dev The caller must be the admin returned by the `owner` method. + function registerAdminViaOwner(address token) external; +} diff --git a/contracts/src/v0.8/ccip/test/helpers/BurnMintERC677Helper.sol b/contracts/src/v0.8/ccip/test/helpers/BurnMintERC677Helper.sol index b6b3907124..9d2346996a 100644 --- a/contracts/src/v0.8/ccip/test/helpers/BurnMintERC677Helper.sol +++ b/contracts/src/v0.8/ccip/test/helpers/BurnMintERC677Helper.sol @@ -4,11 +4,15 @@ pragma solidity 0.8.24; import {BurnMintERC677} from "../../../shared/token/ERC677/BurnMintERC677.sol"; import {IGetCCIPAdmin} from "../../interfaces/IGetCCIPAdmin.sol"; -contract BurnMintERC677Helper is BurnMintERC677 { +contract BurnMintERC677Helper is BurnMintERC677, IGetCCIPAdmin { constructor(string memory name, string memory symbol) BurnMintERC677(name, symbol, 18, 0) {} // Gives one full token to any given address. function drip(address to) external { _mint(to, 1e18); } + + function getCCIPAdmin() external view override returns (address) { + return owner(); + } } diff --git a/contracts/src/v0.8/ccip/test/legacy/TokenPoolAndProxy.t.sol b/contracts/src/v0.8/ccip/test/legacy/TokenPoolAndProxy.t.sol index 762e52a430..a721d37c64 100644 --- a/contracts/src/v0.8/ccip/test/legacy/TokenPoolAndProxy.t.sol +++ b/contracts/src/v0.8/ccip/test/legacy/TokenPoolAndProxy.t.sol @@ -4,7 +4,6 @@ pragma solidity ^0.8.0; import {IPoolV1} from "../../interfaces/IPool.sol"; import {IPoolPriorTo1_5} from "../../interfaces/IPoolPriorTo1_5.sol"; -import {BurnMintERC20} from "../../../shared/token/ERC20/BurnMintERC20.sol"; import {BurnMintERC677} from "../../../shared/token/ERC677/BurnMintERC677.sol"; import {Router} from "../../Router.sol"; import {Client} from "../../libraries/Client.sol"; @@ -113,9 +112,9 @@ contract TokenPoolAndProxyMigration is EVM2EVMOnRampSetup { s_newPool.setPreviousPool(IPoolPriorTo1_5(address(0))); // The new pool is now active, but is has not been given permissions to burn/mint yet - vm.expectRevert(abi.encodeWithSelector(BurnMintERC20.SenderNotBurner.selector, address(s_newPool))); + vm.expectRevert(abi.encodeWithSelector(BurnMintERC677.SenderNotBurner.selector, address(s_newPool))); _ccipSend1_5(); - vm.expectRevert(abi.encodeWithSelector(BurnMintERC20.SenderNotMinter.selector, address(s_newPool))); + vm.expectRevert(abi.encodeWithSelector(BurnMintERC677.SenderNotMinter.selector, address(s_newPool))); _fakeReleaseOrMintFromOffRamp1_5(); // When we do give burn/mint, the new pool is fully active @@ -177,9 +176,9 @@ contract TokenPoolAndProxyMigration is EVM2EVMOnRampSetup { s_newPool.setPreviousPool(IPoolPriorTo1_5(address(0))); // The new pool is now active, but is has not been given permissions to burn/mint yet - vm.expectRevert(abi.encodeWithSelector(BurnMintERC20.SenderNotBurner.selector, address(s_newPool))); + vm.expectRevert(abi.encodeWithSelector(BurnMintERC677.SenderNotBurner.selector, address(s_newPool))); _ccipSend1_5(); - vm.expectRevert(abi.encodeWithSelector(BurnMintERC20.SenderNotMinter.selector, address(s_newPool))); + vm.expectRevert(abi.encodeWithSelector(BurnMintERC677.SenderNotMinter.selector, address(s_newPool))); _fakeReleaseOrMintFromOffRamp1_5(); // When we do give burn/mint, the new pool is fully active @@ -362,8 +361,12 @@ contract TokenPoolAndProxy is EVM2EVMOnRampSetup { } function test_lockOrBurn_burnWithFromMint_Success() public { - s_pool = - new BurnWithFromMintTokenPoolAndProxy(s_token, new address[](0), address(s_mockRMN), address(s_sourceRouter)); + s_pool = new BurnWithFromMintTokenPoolAndProxy( + s_token, + new address[](0), + address(s_mockRMN), + address(s_sourceRouter) + ); _configurePool(); _deployOldPool(); _assertLockOrBurnCorrect(); @@ -375,8 +378,13 @@ contract TokenPoolAndProxy is EVM2EVMOnRampSetup { } function test_lockOrBurn_lockRelease_Success() public { - s_pool = - new LockReleaseTokenPoolAndProxy(s_token, new address[](0), address(s_mockRMN), false, address(s_sourceRouter)); + s_pool = new LockReleaseTokenPoolAndProxy( + s_token, + new address[](0), + address(s_mockRMN), + false, + address(s_sourceRouter) + ); _configurePool(); _deployOldPool(); _assertLockOrBurnCorrect(); @@ -392,11 +400,17 @@ contract TokenPoolAndProxy is EVM2EVMOnRampSetup { s_token.grantMintAndBurnRoles(address(s_legacyPool)); TokenPool1_2.RampUpdate[] memory onRampUpdates = new TokenPool1_2.RampUpdate[](1); - onRampUpdates[0] = - TokenPool1_2.RampUpdate({ramp: address(s_pool), allowed: true, rateLimiterConfig: _getInboundRateLimiterConfig()}); + onRampUpdates[0] = TokenPool1_2.RampUpdate({ + ramp: address(s_pool), + allowed: true, + rateLimiterConfig: _getInboundRateLimiterConfig() + }); TokenPool1_2.RampUpdate[] memory offRampUpdates = new TokenPool1_2.RampUpdate[](1); - offRampUpdates[0] = - TokenPool1_2.RampUpdate({ramp: address(s_pool), allowed: true, rateLimiterConfig: _getInboundRateLimiterConfig()}); + offRampUpdates[0] = TokenPool1_2.RampUpdate({ + ramp: address(s_pool), + allowed: true, + rateLimiterConfig: _getInboundRateLimiterConfig() + }); BurnMintTokenPool1_2(address(s_legacyPool)).applyRampUpdates(onRampUpdates, offRampUpdates); } @@ -507,8 +521,13 @@ contract TokenPoolAndProxy is EVM2EVMOnRampSetup { } function test_setPreviousPool_Success() public { - LockReleaseTokenPoolAndProxy pool = - new LockReleaseTokenPoolAndProxy(s_token, new address[](0), address(s_mockRMN), true, address(s_sourceRouter)); + LockReleaseTokenPoolAndProxy pool = new LockReleaseTokenPoolAndProxy( + s_token, + new address[](0), + address(s_mockRMN), + true, + address(s_sourceRouter) + ); assertEq(pool.getPreviousPool(), address(0)); @@ -540,13 +559,23 @@ contract LockReleaseTokenPoolAndProxySetup is RouterSetup { RouterSetup.setUp(); s_token = new BurnMintERC677("LINK", "LNK", 18, 0); deal(address(s_token), OWNER, type(uint256).max); - s_lockReleaseTokenPoolAndProxy = - new LockReleaseTokenPoolAndProxy(s_token, new address[](0), address(s_mockRMN), true, address(s_sourceRouter)); + s_lockReleaseTokenPoolAndProxy = new LockReleaseTokenPoolAndProxy( + s_token, + new address[](0), + address(s_mockRMN), + true, + address(s_sourceRouter) + ); s_allowedList.push(USER_1); s_allowedList.push(DUMMY_CONTRACT_ADDRESS); - s_lockReleaseTokenPoolAndProxyWithAllowList = - new LockReleaseTokenPoolAndProxy(s_token, s_allowedList, address(s_mockRMN), true, address(s_sourceRouter)); + s_lockReleaseTokenPoolAndProxyWithAllowList = new LockReleaseTokenPoolAndProxy( + s_token, + s_allowedList, + address(s_mockRMN), + true, + address(s_sourceRouter) + ); TokenPool.ChainUpdate[] memory chainUpdate = new TokenPool.ChainUpdate[](1); chainUpdate[0] = TokenPool.ChainUpdate({ @@ -589,8 +618,13 @@ contract LockReleaseTokenPoolPoolAndProxy_canAcceptLiquidity is LockReleaseToken function test_CanAcceptLiquidity_Success() public { assertEq(true, s_lockReleaseTokenPoolAndProxy.canAcceptLiquidity()); - s_lockReleaseTokenPoolAndProxy = - new LockReleaseTokenPoolAndProxy(s_token, new address[](0), address(s_mockRMN), false, address(s_sourceRouter)); + s_lockReleaseTokenPoolAndProxy = new LockReleaseTokenPoolAndProxy( + s_token, + new address[](0), + address(s_mockRMN), + false, + address(s_sourceRouter) + ); assertEq(false, s_lockReleaseTokenPoolAndProxy.canAcceptLiquidity()); } } @@ -622,8 +656,13 @@ contract LockReleaseTokenPoolPoolAndProxy_provideLiquidity is LockReleaseTokenPo } function test_LiquidityNotAccepted_Revert() public { - s_lockReleaseTokenPoolAndProxy = - new LockReleaseTokenPoolAndProxy(s_token, new address[](0), address(s_mockRMN), false, address(s_sourceRouter)); + s_lockReleaseTokenPoolAndProxy = new LockReleaseTokenPoolAndProxy( + s_token, + new address[](0), + address(s_mockRMN), + false, + address(s_sourceRouter) + ); vm.expectRevert(LockReleaseTokenPoolAndProxy.LiquidityNotAccepted.selector); s_lockReleaseTokenPoolAndProxy.provideLiquidity(1); diff --git a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol index 5580ee7226..33515eecaa 100644 --- a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol +++ b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol @@ -1,382 +1,382 @@ -pragma solidity ^0.8.24; +// pragma solidity ^0.8.24; -import {IOwner} from "../../interfaces/IOwner.sol"; -import {ITokenAdminRegistry} from "../../interfaces/ITokenAdminRegistry.sol"; +// import {IOwner} from "../../interfaces/IOwner.sol"; +// import {ITokenAdminRegistry} from "../../interfaces/ITokenAdminRegistry.sol"; -import {OwnerIsCreator} from "../../../shared/access/OwnerIsCreator.sol"; +// import {OwnerIsCreator} from "../../../shared/access/OwnerIsCreator.sol"; -import {RateLimiter} from "../../libraries/RateLimiter.sol"; -import {BurnMintTokenPool} from "../../pools/BurnMintTokenPool.sol"; -import {TokenPool} from "../../pools/TokenPool.sol"; -import {FactoryBurnMintERC20} from "../../tokenAdminRegistry/FactoryBurnMintERC20.sol"; -import {RegistryModuleOwnerCustom} from "../../tokenAdminRegistry/RegistryModuleOwnerCustom.sol"; -import {TokenAdminRegistry} from "../../tokenAdminRegistry/TokenAdminRegistry.sol"; -import {TokenPoolFactory} from "../../tokenAdminRegistry/TokenPoolFactory.sol"; -import {TokenAdminRegistrySetup} from "./TokenAdminRegistry.t.sol"; +// import {RateLimiter} from "../../libraries/RateLimiter.sol"; +// import {BurnMintTokenPool} from "../../pools/BurnMintTokenPool.sol"; +// import {TokenPool} from "../../pools/TokenPool.sol"; +// import {FactoryBurnMintERC20} from "../../tokenAdminRegistry/FactoryBurnMintERC20.sol"; +// import {RegistryModuleOwnerCustom} from "../../tokenAdminRegistry/RegistryModuleOwnerCustom.sol"; +// import {TokenAdminRegistry} from "../../tokenAdminRegistry/TokenAdminRegistry.sol"; +// import {TokenPoolFactory} from "../../tokenAdminRegistry/TokenPoolFactory.sol"; +// import {TokenAdminRegistrySetup} from "./TokenAdminRegistry.t.sol"; -import {Create2} from "../../../vendor/openzeppelin-solidity/v5.0.2/contracts/utils/Create2.sol"; +// import {Create2} from "../../../vendor/openzeppelin-solidity/v5.0.2/contracts/utils/Create2.sol"; -contract TokenPoolFactorySetup is TokenAdminRegistrySetup { - using Create2 for bytes32; +// contract TokenPoolFactorySetup is TokenAdminRegistrySetup { +// using Create2 for bytes32; - TokenPoolFactory internal s_tokenPoolFactory; - RegistryModuleOwnerCustom internal s_registryModuleOwnerCustom; +// TokenPoolFactory internal s_tokenPoolFactory; +// RegistryModuleOwnerCustom internal s_registryModuleOwnerCustom; - bytes internal s_poolInitCode; - bytes internal s_poolInitArgs; +// bytes internal s_poolInitCode; +// bytes internal s_poolInitArgs; - bytes32 internal constant FAKE_SALT = keccak256(abi.encode("FAKE_SALT")); +// bytes32 internal constant FAKE_SALT = keccak256(abi.encode("FAKE_SALT")); - address internal s_rmnProxy = address(0x1234); +// address internal s_rmnProxy = address(0x1234); - bytes internal s_tokenCreationParams; - bytes internal s_tokenInitCode; +// bytes internal s_tokenCreationParams; +// bytes internal s_tokenInitCode; - uint256 public constant PREMINT_AMOUNT = 1e20; // 100 tokens in 18 decimals +// uint256 public constant PREMINT_AMOUNT = 1e20; // 100 tokens in 18 decimals - function setUp() public virtual override { - TokenAdminRegistrySetup.setUp(); +// function setUp() public virtual override { +// TokenAdminRegistrySetup.setUp(); - s_registryModuleOwnerCustom = new RegistryModuleOwnerCustom(address(s_tokenAdminRegistry)); - s_tokenAdminRegistry.addRegistryModule(address(s_registryModuleOwnerCustom)); +// s_registryModuleOwnerCustom = new RegistryModuleOwnerCustom(address(s_tokenAdminRegistry)); +// s_tokenAdminRegistry.addRegistryModule(address(s_registryModuleOwnerCustom)); - s_tokenPoolFactory = - new TokenPoolFactory(s_tokenAdminRegistry, s_registryModuleOwnerCustom, s_rmnProxy, address(s_sourceRouter)); +// s_tokenPoolFactory = +// new TokenPoolFactory(s_tokenAdminRegistry, s_registryModuleOwnerCustom, s_rmnProxy, address(s_sourceRouter)); - // Create Init Code for BurnMintERC20 TestToken with 18 decimals and supply cap of max uint256 value - s_tokenCreationParams = abi.encode("TestToken", "TT", 18, type(uint256).max, PREMINT_AMOUNT, OWNER); +// // Create Init Code for BurnMintERC20 TestToken with 18 decimals and supply cap of max uint256 value +// s_tokenCreationParams = abi.encode("TestToken", "TT", 18, type(uint256).max, PREMINT_AMOUNT, OWNER); - s_tokenInitCode = abi.encodePacked(type(FactoryBurnMintERC20).creationCode, s_tokenCreationParams); +// s_tokenInitCode = abi.encodePacked(type(FactoryBurnMintERC20).creationCode, s_tokenCreationParams); - s_poolInitCode = type(BurnMintTokenPool).creationCode; +// s_poolInitCode = type(BurnMintTokenPool).creationCode; - // Create Init Args for BurnMintTokenPool with no allowlist minus the token address - address[] memory allowlist = new address[](1); - allowlist[0] = OWNER; - s_poolInitArgs = abi.encode(allowlist, address(0x1234), s_sourceRouter); - } -} +// // Create Init Args for BurnMintTokenPool with no allowlist minus the token address +// address[] memory allowlist = new address[](1); +// allowlist[0] = OWNER; +// s_poolInitArgs = abi.encode(allowlist, address(0x1234), s_sourceRouter); +// } +// } -contract TokenPoolFactoryTests is TokenPoolFactorySetup { - using Create2 for bytes32; +// contract TokenPoolFactoryTests is TokenPoolFactorySetup { +// using Create2 for bytes32; - function test_TokenPoolFactory_Constructor_Revert() public { - // Revert cause the tokenAdminRegistry is address(0) - vm.expectRevert(TokenPoolFactory.InvalidZeroAddress.selector); - new TokenPoolFactory(ITokenAdminRegistry(address(0)), RegistryModuleOwnerCustom(address(0)), address(0), address(0)); +// function test_TokenPoolFactory_Constructor_Revert() public { +// // Revert cause the tokenAdminRegistry is address(0) +// vm.expectRevert(TokenPoolFactory.InvalidZeroAddress.selector); +// new TokenPoolFactory(ITokenAdminRegistry(address(0)), RegistryModuleOwnerCustom(address(0)), address(0), address(0)); - new TokenPoolFactory( - ITokenAdminRegistry(address(0xdeadbeef)), - RegistryModuleOwnerCustom(address(0xdeadbeef)), - address(0xdeadbeef), - address(0xdeadbeef) - ); - } +// new TokenPoolFactory( +// ITokenAdminRegistry(address(0xdeadbeef)), +// RegistryModuleOwnerCustom(address(0xdeadbeef)), +// address(0xdeadbeef), +// address(0xdeadbeef) +// ); +// } - function test_createTokenPool_WithNoExistingTokenOnRemoteChain_Success() public { - vm.startPrank(OWNER); +// function test_createTokenPool_WithNoExistingTokenOnRemoteChain_Success() public { +// vm.startPrank(OWNER); - bytes32 dynamicSalt = keccak256(abi.encodePacked(FAKE_SALT, OWNER)); +// bytes32 dynamicSalt = keccak256(abi.encodePacked(FAKE_SALT, OWNER)); - address predictedTokenAddress = - Create2.computeAddress(dynamicSalt, keccak256(s_tokenInitCode), address(s_tokenPoolFactory)); +// address predictedTokenAddress = +// Create2.computeAddress(dynamicSalt, keccak256(s_tokenInitCode), address(s_tokenPoolFactory)); - // Create the constructor params for the predicted pool - bytes memory poolCreationParams = abi.encode(predictedTokenAddress, new address[](0), s_rmnProxy, s_sourceRouter); +// // Create the constructor params for the predicted pool +// bytes memory poolCreationParams = abi.encode(predictedTokenAddress, new address[](0), s_rmnProxy, s_sourceRouter); - // Predict the address of the pool before we make the tx by using the init code and the params - bytes memory predictedPoolInitCode = abi.encodePacked(s_poolInitCode, poolCreationParams); +// // Predict the address of the pool before we make the tx by using the init code and the params +// bytes memory predictedPoolInitCode = abi.encodePacked(s_poolInitCode, poolCreationParams); - address predictedPoolAddress = - dynamicSalt.computeAddress(keccak256(predictedPoolInitCode), address(s_tokenPoolFactory)); +// address predictedPoolAddress = +// dynamicSalt.computeAddress(keccak256(predictedPoolInitCode), address(s_tokenPoolFactory)); - (address tokenAddress, address poolAddress) = s_tokenPoolFactory.deployTokenAndTokenPool( - new TokenPoolFactory.RemoteTokenPoolInfo[](0), s_tokenInitCode, s_poolInitCode, poolCreationParams, FAKE_SALT - ); +// (address tokenAddress, address poolAddress) = s_tokenPoolFactory.deployTokenAndTokenPool( +// new TokenPoolFactory.RemoteTokenPoolInfo[](0), s_tokenInitCode, s_poolInitCode, poolCreationParams, FAKE_SALT +// ); - assertNotEq(address(0), tokenAddress, "Token Address should not be 0"); - assertNotEq(address(0), poolAddress, "Pool Address should not be 0"); +// assertNotEq(address(0), tokenAddress, "Token Address should not be 0"); +// assertNotEq(address(0), poolAddress, "Pool Address should not be 0"); - assertEq(predictedTokenAddress, tokenAddress, "Token Address should have been predicted"); - assertEq(predictedPoolAddress, poolAddress, "Pool Address should have been predicted"); +// assertEq(predictedTokenAddress, tokenAddress, "Token Address should have been predicted"); +// assertEq(predictedPoolAddress, poolAddress, "Pool Address should have been predicted"); - s_tokenAdminRegistry.acceptAdminRole(tokenAddress); - OwnerIsCreator(tokenAddress).acceptOwnership(); - OwnerIsCreator(poolAddress).acceptOwnership(); +// s_tokenAdminRegistry.acceptAdminRole(tokenAddress); +// OwnerIsCreator(tokenAddress).acceptOwnership(); +// OwnerIsCreator(poolAddress).acceptOwnership(); - assertEq(poolAddress, s_tokenAdminRegistry.getPool(tokenAddress), "Token Pool should be set"); - assertEq(IOwner(tokenAddress).owner(), OWNER, "Token should be owned by the owner"); - assertEq(IOwner(poolAddress).owner(), OWNER, "Token should be owned by the owner"); - } +// assertEq(poolAddress, s_tokenAdminRegistry.getPool(tokenAddress), "Token Pool should be set"); +// assertEq(IOwner(tokenAddress).owner(), OWNER, "Token should be owned by the owner"); +// assertEq(IOwner(poolAddress).owner(), OWNER, "Token should be owned by the owner"); +// } - function test_createTokenPool_WithNoExistingRemoteContracts_predict_Success() public { - vm.startPrank(OWNER); - bytes32 dynamicSalt = keccak256(abi.encodePacked(FAKE_SALT, OWNER)); +// function test_createTokenPool_WithNoExistingRemoteContracts_predict_Success() public { +// vm.startPrank(OWNER); +// bytes32 dynamicSalt = keccak256(abi.encodePacked(FAKE_SALT, OWNER)); - // We have to create a new factory, registry module, and token admin registry to simulate the other chain - TokenAdminRegistry newTokenAdminRegistry = new TokenAdminRegistry(); - RegistryModuleOwnerCustom newRegistryModule = new RegistryModuleOwnerCustom(address(newTokenAdminRegistry)); +// // We have to create a new factory, registry module, and token admin registry to simulate the other chain +// TokenAdminRegistry newTokenAdminRegistry = new TokenAdminRegistry(); +// RegistryModuleOwnerCustom newRegistryModule = new RegistryModuleOwnerCustom(address(newTokenAdminRegistry)); - // We want to deploy a new factory and Owner Module. - TokenPoolFactory newTokenPoolFactory = - new TokenPoolFactory(newTokenAdminRegistry, newRegistryModule, s_rmnProxy, address(s_destRouter)); +// // We want to deploy a new factory and Owner Module. +// TokenPoolFactory newTokenPoolFactory = +// new TokenPoolFactory(newTokenAdminRegistry, newRegistryModule, s_rmnProxy, address(s_destRouter)); - newTokenAdminRegistry.addRegistryModule(address(newRegistryModule)); +// newTokenAdminRegistry.addRegistryModule(address(newRegistryModule)); - TokenPoolFactory.RemoteChainConfig memory remoteChainConfig = - TokenPoolFactory.RemoteChainConfig(address(newTokenPoolFactory), address(s_destRouter), address(s_rmnProxy)); +// TokenPoolFactory.RemoteChainConfig memory remoteChainConfig = +// TokenPoolFactory.RemoteChainConfig(address(newTokenPoolFactory), address(s_destRouter), address(s_rmnProxy)); - { - TokenPoolFactory.RemoteChainConfig[] memory remoteChainConfigs = new TokenPoolFactory.RemoteChainConfig[](1); - remoteChainConfigs[0] = remoteChainConfig; +// { +// TokenPoolFactory.RemoteChainConfig[] memory remoteChainConfigs = new TokenPoolFactory.RemoteChainConfig[](1); +// remoteChainConfigs[0] = remoteChainConfig; - TokenPoolFactory.RemoteChainConfigUpdate[] memory remoteChainConfigUpdates = - new TokenPoolFactory.RemoteChainConfigUpdate[](1); - remoteChainConfigUpdates[0] = TokenPoolFactory.RemoteChainConfigUpdate(DEST_CHAIN_SELECTOR, remoteChainConfig); +// TokenPoolFactory.RemoteChainConfigUpdate[] memory remoteChainConfigUpdates = +// new TokenPoolFactory.RemoteChainConfigUpdate[](1); +// remoteChainConfigUpdates[0] = TokenPoolFactory.RemoteChainConfigUpdate(DEST_CHAIN_SELECTOR, remoteChainConfig); - // Add the new token Factory to the remote chain config and set it for the simulated destination chain - s_tokenPoolFactory.updateRemoteChainConfig(remoteChainConfigUpdates); - } - - // Create an array of remote pools where nothing exists yet, but we want to predict the address for - // the new pool and token on DEST_CHAIN_SELECTOR - TokenPoolFactory.RemoteTokenPoolInfo[] memory remoteTokenPools = new TokenPoolFactory.RemoteTokenPoolInfo[](1); - - // The only field that matters is DEST_CHAIN_SELECTOR because we dont want any existing token pool or token - // on the remote chain - remoteTokenPools[0] = TokenPoolFactory.RemoteTokenPoolInfo( - DEST_CHAIN_SELECTOR, "", "", s_tokenInitCode, RateLimiter.Config(false, 0, 0) - ); - - // Predict the address of the token and pool on the DESTINATION chain - address predictedTokenAddress = dynamicSalt.computeAddress(keccak256(s_tokenInitCode), address(newTokenPoolFactory)); - - // Since the remote chain information was provided, we should be able to get the information from the newly - // deployed token pool using the available getter functions - (, address poolAddress) = - s_tokenPoolFactory.deployTokenAndTokenPool(remoteTokenPools, s_tokenInitCode, s_poolInitCode, "", FAKE_SALT); - - // Ensure that the remote Token was set to the one we predicted - assertEq( - abi.encode(predictedTokenAddress), - TokenPool(poolAddress).getRemoteToken(DEST_CHAIN_SELECTOR), - "Token Address should have been predicted" - ); - - { - // Create the constructor params for the predicted pool - // The predictedTokenAddress is NOT abi-encoded since the raw evm-address - // is used in the constructor params - bytes memory predictedPoolCreationParams = - abi.encode(predictedTokenAddress, new address[](0), s_rmnProxy, address(s_destRouter)); - - // Take the init code and concat the destination params to it, the initCode shouldn't change - bytes memory predictedPoolInitCode = abi.encodePacked(s_poolInitCode, predictedPoolCreationParams); - - // Predict the address of the pool on the DESTINATION chain - address predictedPoolAddress = - dynamicSalt.computeAddress(keccak256(predictedPoolInitCode), address(newTokenPoolFactory)); - - // Assert that the address set for the remote pool is the same as the predicted address - assertEq( - abi.encode(predictedPoolAddress), - TokenPool(poolAddress).getRemotePool(DEST_CHAIN_SELECTOR), - "Pool Address should have been predicted" - ); - } - - // On the new token pool factory, representing a destination chain, - // deploy a new token and a new pool - (address newTokenAddress, address newPoolAddress) = newTokenPoolFactory.deployTokenAndTokenPool( - new TokenPoolFactory.RemoteTokenPoolInfo[](0), s_tokenInitCode, s_poolInitCode, "", FAKE_SALT - ); - - assertEq( - TokenPool(poolAddress).getRemotePool(DEST_CHAIN_SELECTOR), - abi.encode(newPoolAddress), - "New Pool Address should have been deployed correctly" - ); - - assertEq( - TokenPool(poolAddress).getRemoteToken(DEST_CHAIN_SELECTOR), - abi.encode(newTokenAddress), - "New Token Address should have been deployed correctly" - ); - } - - function test_createTokenPool_ExistingRemoteToken_AndPredictPool_Success() public { - vm.startPrank(OWNER); - bytes32 dynamicSalt = keccak256(abi.encodePacked(FAKE_SALT, OWNER)); - - FactoryBurnMintERC20 newRemoteToken = - new FactoryBurnMintERC20("TestToken", "TT", 18, type(uint256).max, PREMINT_AMOUNT, OWNER); - - // We have to create a new factory, registry module, and token admin registry to simulate the other chain - TokenAdminRegistry newTokenAdminRegistry = new TokenAdminRegistry(); - RegistryModuleOwnerCustom newRegistryModule = new RegistryModuleOwnerCustom(address(newTokenAdminRegistry)); - - // We want to deploy a new factory and Owner Module. - TokenPoolFactory newTokenPoolFactory = - new TokenPoolFactory(newTokenAdminRegistry, newRegistryModule, s_rmnProxy, address(s_destRouter)); - - newTokenAdminRegistry.addRegistryModule(address(newRegistryModule)); - - { - TokenPoolFactory.RemoteChainConfig memory remoteChainConfig = - TokenPoolFactory.RemoteChainConfig(address(newTokenPoolFactory), address(s_destRouter), address(s_rmnProxy)); - - TokenPoolFactory.RemoteChainConfig[] memory remoteChainConfigs = new TokenPoolFactory.RemoteChainConfig[](1); - remoteChainConfigs[0] = remoteChainConfig; - - TokenPoolFactory.RemoteChainConfigUpdate[] memory remoteChainConfigUpdates = - new TokenPoolFactory.RemoteChainConfigUpdate[](1); - remoteChainConfigUpdates[0] = TokenPoolFactory.RemoteChainConfigUpdate(DEST_CHAIN_SELECTOR, remoteChainConfig); - - // Add the new token Factory to the remote chain config and set it for the simulated destination chain - s_tokenPoolFactory.updateRemoteChainConfig(remoteChainConfigUpdates); - } - - // Create an array of remote pools where nothing exists yet, but we want to predict the address for - // the new pool and token on DEST_CHAIN_SELECTOR - TokenPoolFactory.RemoteTokenPoolInfo[] memory remoteTokenPools = new TokenPoolFactory.RemoteTokenPoolInfo[](1); - - // The only field that matters is DEST_CHAIN_SELECTOR because we dont want any existing token pool or token - // on the remote chain - remoteTokenPools[0] = TokenPoolFactory.RemoteTokenPoolInfo( - DEST_CHAIN_SELECTOR, "", abi.encode(address(newRemoteToken)), s_tokenInitCode, RateLimiter.Config(false, 0, 0) - ); - - // Since the remote chain information was provided, we should be able to get the information from the newly - // deployed token pool using the available getter functions - (address tokenAddress, address poolAddress) = - s_tokenPoolFactory.deployTokenAndTokenPool(remoteTokenPools, s_tokenInitCode, s_poolInitCode, "", FAKE_SALT); - - assertEq(address(TokenPool(poolAddress).getToken()), tokenAddress, "Token Address should have been set locally"); - - // Ensure that the remote Token was set to the one we predicted - assertEq( - abi.encode(address(newRemoteToken)), - TokenPool(poolAddress).getRemoteToken(DEST_CHAIN_SELECTOR), - "Token Address should have been predicted" - ); - - // Create the constructor params for the predicted pool - // The predictedTokenAddress is NOT abi-encoded since the raw evm-address - // is used in the constructor params - bytes memory predictedPoolCreationParams = - abi.encode(address(newRemoteToken), new address[](0), s_rmnProxy, address(s_destRouter)); - - // Take the init code and concat the destination params to it, the initCode shouldn't change - bytes memory predictedPoolInitCode = abi.encodePacked(s_poolInitCode, predictedPoolCreationParams); - - // Predict the address of the pool on the DESTINATION chain - address predictedPoolAddress = - dynamicSalt.computeAddress(keccak256(predictedPoolInitCode), address(newTokenPoolFactory)); - - // Assert that the address set for the remote pool is the same as the predicted address - assertEq( - abi.encode(predictedPoolAddress), - TokenPool(poolAddress).getRemotePool(DEST_CHAIN_SELECTOR), - "Pool Address should have been predicted" - ); - - // On the new token pool factory, representing a destination chain, - // deploy a new token and a new pool - address newPoolAddress = newTokenPoolFactory.deployTokenPoolWithExistingToken( - address(newRemoteToken), new TokenPoolFactory.RemoteTokenPoolInfo[](0), s_poolInitCode, "", FAKE_SALT - ); - - assertEq( - abi.encode(newRemoteToken), - TokenPool(poolAddress).getRemoteToken(DEST_CHAIN_SELECTOR), - "Remote Token Address should have been set correctly" - ); - - assertEq( - TokenPool(poolAddress).getRemotePool(DEST_CHAIN_SELECTOR), - abi.encode(newPoolAddress), - "New Pool Address should have been deployed correctly" - ); - } +// // Add the new token Factory to the remote chain config and set it for the simulated destination chain +// s_tokenPoolFactory.updateRemoteChainConfig(remoteChainConfigUpdates); +// } + +// // Create an array of remote pools where nothing exists yet, but we want to predict the address for +// // the new pool and token on DEST_CHAIN_SELECTOR +// TokenPoolFactory.RemoteTokenPoolInfo[] memory remoteTokenPools = new TokenPoolFactory.RemoteTokenPoolInfo[](1); + +// // The only field that matters is DEST_CHAIN_SELECTOR because we dont want any existing token pool or token +// // on the remote chain +// remoteTokenPools[0] = TokenPoolFactory.RemoteTokenPoolInfo( +// DEST_CHAIN_SELECTOR, "", "", s_tokenInitCode, RateLimiter.Config(false, 0, 0) +// ); + +// // Predict the address of the token and pool on the DESTINATION chain +// address predictedTokenAddress = dynamicSalt.computeAddress(keccak256(s_tokenInitCode), address(newTokenPoolFactory)); + +// // Since the remote chain information was provided, we should be able to get the information from the newly +// // deployed token pool using the available getter functions +// (, address poolAddress) = +// s_tokenPoolFactory.deployTokenAndTokenPool(remoteTokenPools, s_tokenInitCode, s_poolInitCode, "", FAKE_SALT); + +// // Ensure that the remote Token was set to the one we predicted +// assertEq( +// abi.encode(predictedTokenAddress), +// TokenPool(poolAddress).getRemoteToken(DEST_CHAIN_SELECTOR), +// "Token Address should have been predicted" +// ); + +// { +// // Create the constructor params for the predicted pool +// // The predictedTokenAddress is NOT abi-encoded since the raw evm-address +// // is used in the constructor params +// bytes memory predictedPoolCreationParams = +// abi.encode(predictedTokenAddress, new address[](0), s_rmnProxy, address(s_destRouter)); + +// // Take the init code and concat the destination params to it, the initCode shouldn't change +// bytes memory predictedPoolInitCode = abi.encodePacked(s_poolInitCode, predictedPoolCreationParams); + +// // Predict the address of the pool on the DESTINATION chain +// address predictedPoolAddress = +// dynamicSalt.computeAddress(keccak256(predictedPoolInitCode), address(newTokenPoolFactory)); + +// // Assert that the address set for the remote pool is the same as the predicted address +// assertEq( +// abi.encode(predictedPoolAddress), +// TokenPool(poolAddress).getRemotePool(DEST_CHAIN_SELECTOR), +// "Pool Address should have been predicted" +// ); +// } + +// // On the new token pool factory, representing a destination chain, +// // deploy a new token and a new pool +// (address newTokenAddress, address newPoolAddress) = newTokenPoolFactory.deployTokenAndTokenPool( +// new TokenPoolFactory.RemoteTokenPoolInfo[](0), s_tokenInitCode, s_poolInitCode, "", FAKE_SALT +// ); + +// assertEq( +// TokenPool(poolAddress).getRemotePool(DEST_CHAIN_SELECTOR), +// abi.encode(newPoolAddress), +// "New Pool Address should have been deployed correctly" +// ); + +// assertEq( +// TokenPool(poolAddress).getRemoteToken(DEST_CHAIN_SELECTOR), +// abi.encode(newTokenAddress), +// "New Token Address should have been deployed correctly" +// ); +// } + +// function test_createTokenPool_ExistingRemoteToken_AndPredictPool_Success() public { +// vm.startPrank(OWNER); +// bytes32 dynamicSalt = keccak256(abi.encodePacked(FAKE_SALT, OWNER)); + +// FactoryBurnMintERC20 newRemoteToken = +// new FactoryBurnMintERC20("TestToken", "TT", 18, type(uint256).max, PREMINT_AMOUNT, OWNER); + +// // We have to create a new factory, registry module, and token admin registry to simulate the other chain +// TokenAdminRegistry newTokenAdminRegistry = new TokenAdminRegistry(); +// RegistryModuleOwnerCustom newRegistryModule = new RegistryModuleOwnerCustom(address(newTokenAdminRegistry)); + +// // We want to deploy a new factory and Owner Module. +// TokenPoolFactory newTokenPoolFactory = +// new TokenPoolFactory(newTokenAdminRegistry, newRegistryModule, s_rmnProxy, address(s_destRouter)); + +// newTokenAdminRegistry.addRegistryModule(address(newRegistryModule)); + +// { +// TokenPoolFactory.RemoteChainConfig memory remoteChainConfig = +// TokenPoolFactory.RemoteChainConfig(address(newTokenPoolFactory), address(s_destRouter), address(s_rmnProxy)); + +// TokenPoolFactory.RemoteChainConfig[] memory remoteChainConfigs = new TokenPoolFactory.RemoteChainConfig[](1); +// remoteChainConfigs[0] = remoteChainConfig; + +// TokenPoolFactory.RemoteChainConfigUpdate[] memory remoteChainConfigUpdates = +// new TokenPoolFactory.RemoteChainConfigUpdate[](1); +// remoteChainConfigUpdates[0] = TokenPoolFactory.RemoteChainConfigUpdate(DEST_CHAIN_SELECTOR, remoteChainConfig); + +// // Add the new token Factory to the remote chain config and set it for the simulated destination chain +// s_tokenPoolFactory.updateRemoteChainConfig(remoteChainConfigUpdates); +// } + +// // Create an array of remote pools where nothing exists yet, but we want to predict the address for +// // the new pool and token on DEST_CHAIN_SELECTOR +// TokenPoolFactory.RemoteTokenPoolInfo[] memory remoteTokenPools = new TokenPoolFactory.RemoteTokenPoolInfo[](1); + +// // The only field that matters is DEST_CHAIN_SELECTOR because we dont want any existing token pool or token +// // on the remote chain +// remoteTokenPools[0] = TokenPoolFactory.RemoteTokenPoolInfo( +// DEST_CHAIN_SELECTOR, "", abi.encode(address(newRemoteToken)), s_tokenInitCode, RateLimiter.Config(false, 0, 0) +// ); + +// // Since the remote chain information was provided, we should be able to get the information from the newly +// // deployed token pool using the available getter functions +// (address tokenAddress, address poolAddress) = +// s_tokenPoolFactory.deployTokenAndTokenPool(remoteTokenPools, s_tokenInitCode, s_poolInitCode, "", FAKE_SALT); + +// assertEq(address(TokenPool(poolAddress).getToken()), tokenAddress, "Token Address should have been set locally"); + +// // Ensure that the remote Token was set to the one we predicted +// assertEq( +// abi.encode(address(newRemoteToken)), +// TokenPool(poolAddress).getRemoteToken(DEST_CHAIN_SELECTOR), +// "Token Address should have been predicted" +// ); + +// // Create the constructor params for the predicted pool +// // The predictedTokenAddress is NOT abi-encoded since the raw evm-address +// // is used in the constructor params +// bytes memory predictedPoolCreationParams = +// abi.encode(address(newRemoteToken), new address[](0), s_rmnProxy, address(s_destRouter)); + +// // Take the init code and concat the destination params to it, the initCode shouldn't change +// bytes memory predictedPoolInitCode = abi.encodePacked(s_poolInitCode, predictedPoolCreationParams); + +// // Predict the address of the pool on the DESTINATION chain +// address predictedPoolAddress = +// dynamicSalt.computeAddress(keccak256(predictedPoolInitCode), address(newTokenPoolFactory)); + +// // Assert that the address set for the remote pool is the same as the predicted address +// assertEq( +// abi.encode(predictedPoolAddress), +// TokenPool(poolAddress).getRemotePool(DEST_CHAIN_SELECTOR), +// "Pool Address should have been predicted" +// ); + +// // On the new token pool factory, representing a destination chain, +// // deploy a new token and a new pool +// address newPoolAddress = newTokenPoolFactory.deployTokenPoolWithExistingToken( +// address(newRemoteToken), new TokenPoolFactory.RemoteTokenPoolInfo[](0), s_poolInitCode, "", FAKE_SALT +// ); + +// assertEq( +// abi.encode(newRemoteToken), +// TokenPool(poolAddress).getRemoteToken(DEST_CHAIN_SELECTOR), +// "Remote Token Address should have been set correctly" +// ); + +// assertEq( +// TokenPool(poolAddress).getRemotePool(DEST_CHAIN_SELECTOR), +// abi.encode(newPoolAddress), +// "New Pool Address should have been deployed correctly" +// ); +// } - function test_createTokenPool_WithRemoteTokenAndRemotePool_Success() public { - vm.startPrank(OWNER); +// function test_createTokenPool_WithRemoteTokenAndRemotePool_Success() public { +// vm.startPrank(OWNER); - bytes32 dynamicSalt = keccak256(abi.encodePacked(FAKE_SALT, OWNER)); +// bytes32 dynamicSalt = keccak256(abi.encodePacked(FAKE_SALT, OWNER)); - bytes memory RANDOM_TOKEN_ADDRESS = abi.encode(makeAddr("RANDOM_TOKEN")); - bytes memory RANDOM_POOL_ADDRESS = abi.encode(makeAddr("RANDOM_POOL")); +// bytes memory RANDOM_TOKEN_ADDRESS = abi.encode(makeAddr("RANDOM_TOKEN")); +// bytes memory RANDOM_POOL_ADDRESS = abi.encode(makeAddr("RANDOM_POOL")); - address predictedTokenAddress = dynamicSalt.computeAddress(keccak256(s_tokenInitCode), address(s_tokenPoolFactory)); +// address predictedTokenAddress = dynamicSalt.computeAddress(keccak256(s_tokenInitCode), address(s_tokenPoolFactory)); - // Create the constructor params for the predicted pool - bytes memory poolCreationParams = abi.encode(predictedTokenAddress, new address[](0), s_rmnProxy, s_sourceRouter); +// // Create the constructor params for the predicted pool +// bytes memory poolCreationParams = abi.encode(predictedTokenAddress, new address[](0), s_rmnProxy, s_sourceRouter); - // Create an array of remote pools with some fake addresses - TokenPoolFactory.RemoteTokenPoolInfo[] memory remoteTokenPools = new TokenPoolFactory.RemoteTokenPoolInfo[](1); +// // Create an array of remote pools with some fake addresses +// TokenPoolFactory.RemoteTokenPoolInfo[] memory remoteTokenPools = new TokenPoolFactory.RemoteTokenPoolInfo[](1); - remoteTokenPools[0] = TokenPoolFactory.RemoteTokenPoolInfo( - DEST_CHAIN_SELECTOR, RANDOM_POOL_ADDRESS, RANDOM_TOKEN_ADDRESS, "", RateLimiter.Config(false, 0, 0) - ); +// remoteTokenPools[0] = TokenPoolFactory.RemoteTokenPoolInfo( +// DEST_CHAIN_SELECTOR, RANDOM_POOL_ADDRESS, RANDOM_TOKEN_ADDRESS, "", RateLimiter.Config(false, 0, 0) +// ); - (address tokenAddress, address poolAddress) = s_tokenPoolFactory.deployTokenAndTokenPool( - remoteTokenPools, s_tokenInitCode, s_poolInitCode, poolCreationParams, FAKE_SALT - ); +// (address tokenAddress, address poolAddress) = s_tokenPoolFactory.deployTokenAndTokenPool( +// remoteTokenPools, s_tokenInitCode, s_poolInitCode, poolCreationParams, FAKE_SALT +// ); - assertNotEq(address(0), tokenAddress, "Token Address should not be 0"); - assertNotEq(address(0), poolAddress, "Pool Address should not be 0"); +// assertNotEq(address(0), tokenAddress, "Token Address should not be 0"); +// assertNotEq(address(0), poolAddress, "Pool Address should not be 0"); - s_tokenAdminRegistry.acceptAdminRole(tokenAddress); - OwnerIsCreator(tokenAddress).acceptOwnership(); - OwnerIsCreator(poolAddress).acceptOwnership(); +// s_tokenAdminRegistry.acceptAdminRole(tokenAddress); +// OwnerIsCreator(tokenAddress).acceptOwnership(); +// OwnerIsCreator(poolAddress).acceptOwnership(); - assertEq( - TokenPool(poolAddress).getRemoteToken(DEST_CHAIN_SELECTOR), - RANDOM_TOKEN_ADDRESS, - "Remote Token Address should have been set" - ); +// assertEq( +// TokenPool(poolAddress).getRemoteToken(DEST_CHAIN_SELECTOR), +// RANDOM_TOKEN_ADDRESS, +// "Remote Token Address should have been set" +// ); - assertEq( - TokenPool(poolAddress).getRemotePool(DEST_CHAIN_SELECTOR), - RANDOM_POOL_ADDRESS, - "Remote Pool Address should have been set" - ); +// assertEq( +// TokenPool(poolAddress).getRemotePool(DEST_CHAIN_SELECTOR), +// RANDOM_POOL_ADDRESS, +// "Remote Pool Address should have been set" +// ); - assertEq(poolAddress, s_tokenAdminRegistry.getPool(tokenAddress), "Token Pool should be set"); +// assertEq(poolAddress, s_tokenAdminRegistry.getPool(tokenAddress), "Token Pool should be set"); - assertEq(IOwner(tokenAddress).owner(), OWNER, "Token should be owned by the owner"); +// assertEq(IOwner(tokenAddress).owner(), OWNER, "Token should be owned by the owner"); - assertEq(IOwner(poolAddress).owner(), OWNER, "Token should be owned by the owner"); - } +// assertEq(IOwner(poolAddress).owner(), OWNER, "Token should be owned by the owner"); +// } - function test_updateRemoteChainConfig_Success() public { - TokenPoolFactory.RemoteChainConfig[] memory remoteChainConfigs = new TokenPoolFactory.RemoteChainConfig[](1); +// function test_updateRemoteChainConfig_Success() public { +// TokenPoolFactory.RemoteChainConfig[] memory remoteChainConfigs = new TokenPoolFactory.RemoteChainConfig[](1); - TokenPoolFactory.RemoteChainConfig memory remoteChainConfig = TokenPoolFactory.RemoteChainConfig({ - remotePoolFactory: address(0x1234), - remoteRouter: address(0x5678), - remoteRMNProxy: address(0x9abc) - }); +// TokenPoolFactory.RemoteChainConfig memory remoteChainConfig = TokenPoolFactory.RemoteChainConfig({ +// remotePoolFactory: address(0x1234), +// remoteRouter: address(0x5678), +// remoteRMNProxy: address(0x9abc) +// }); - remoteChainConfigs[0] = remoteChainConfig; +// remoteChainConfigs[0] = remoteChainConfig; - TokenPoolFactory.RemoteChainConfigUpdate[] memory remoteChainConfigUpdates = - new TokenPoolFactory.RemoteChainConfigUpdate[](1); - remoteChainConfigUpdates[0] = TokenPoolFactory.RemoteChainConfigUpdate(DEST_CHAIN_SELECTOR, remoteChainConfig); +// TokenPoolFactory.RemoteChainConfigUpdate[] memory remoteChainConfigUpdates = +// new TokenPoolFactory.RemoteChainConfigUpdate[](1); +// remoteChainConfigUpdates[0] = TokenPoolFactory.RemoteChainConfigUpdate(DEST_CHAIN_SELECTOR, remoteChainConfig); - s_tokenPoolFactory.updateRemoteChainConfig(remoteChainConfigUpdates); +// s_tokenPoolFactory.updateRemoteChainConfig(remoteChainConfigUpdates); - TokenPoolFactory.RemoteChainConfig memory updatedRemoteChainConfig = - s_tokenPoolFactory.getRemoteChainConfig(DEST_CHAIN_SELECTOR); +// TokenPoolFactory.RemoteChainConfig memory updatedRemoteChainConfig = +// s_tokenPoolFactory.getRemoteChainConfig(DEST_CHAIN_SELECTOR); - assertEq( - remoteChainConfig.remotePoolFactory, - updatedRemoteChainConfig.remotePoolFactory, - "Token Pool Factory should be set" - ); +// assertEq( +// remoteChainConfig.remotePoolFactory, +// updatedRemoteChainConfig.remotePoolFactory, +// "Token Pool Factory should be set" +// ); - assertEq(remoteChainConfig.remoteRouter, updatedRemoteChainConfig.remoteRouter, "Router should be set"); +// assertEq(remoteChainConfig.remoteRouter, updatedRemoteChainConfig.remoteRouter, "Router should be set"); - assertEq(remoteChainConfig.remoteRMNProxy, updatedRemoteChainConfig.remoteRMNProxy, "RMN Proxy should be set"); - } -} +// assertEq(remoteChainConfig.remoteRMNProxy, updatedRemoteChainConfig.remoteRMNProxy, "RMN Proxy should be set"); +// } +// } diff --git a/contracts/src/v0.8/ccip/tokenAdminRegistry/FactoryBurnMintERC20.sol b/contracts/src/v0.8/ccip/tokenAdminRegistry/FactoryBurnMintERC20.sol deleted file mode 100644 index 2d3bebe57b..0000000000 --- a/contracts/src/v0.8/ccip/tokenAdminRegistry/FactoryBurnMintERC20.sol +++ /dev/null @@ -1,31 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {BurnMintERC20} from "../../shared/token/ERC20/BurnMintERC20.sol"; - -/// @notice A basic ERC20 compatible token contract with burn and minting roles. -/// @dev The total supply can be limited during deployment. -contract FactoryBurnMintERC20 is BurnMintERC20 { - constructor( - string memory name, - string memory symbol, - uint8 decimals_, - uint256 maxSupply_, - uint256 preMint_, - address newOwner_ - ) BurnMintERC20(name, symbol, decimals_, maxSupply_) { - i_decimals = decimals_; - i_maxSupply = maxSupply_; - - s_ccipAdmin = newOwner_; - - // Mint the initial supply to the new Owner, saving gas by not calling if the mint amount is zero - if (preMint_ != 0) _mint(newOwner_, preMint_); - - // Grant the deployer the minter and burner roles. This contract is expected to be deployed by a factory - // contract that will transfer ownership to the correct address after deployment, so granting minting and burning - // privileges here saves gas by not requiring two transactions. - grantMintRole(newOwner_); - grantBurnRole(newOwner_); - } -} diff --git a/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory.sol b/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory/TokenPoolFactory.sol similarity index 91% rename from contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory.sol rename to contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory/TokenPoolFactory.sol index 64634bff3c..f129140da3 100644 --- a/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory.sol +++ b/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory/TokenPoolFactory.sol @@ -1,16 +1,16 @@ pragma solidity 0.8.24; -import {IOwnable} from "../../shared/interfaces/IOwnable.sol"; -import {ITypeAndVersion} from "../../shared/interfaces/ITypeAndVersion.sol"; -import {ITokenAdminRegistry} from "../interfaces/ITokenAdminRegistry.sol"; +import {IOwnable} from "../../../shared/interfaces/IOwnable.sol"; +import {ITypeAndVersion} from "../../../shared/interfaces/ITypeAndVersion.sol"; +import {ITokenAdminRegistry} from "../../interfaces/ITokenAdminRegistry.sol"; -import {OwnerIsCreator} from "../../shared/access/OwnerIsCreator.sol"; -import {RateLimiter} from "../libraries/RateLimiter.sol"; -import {BurnMintTokenPool} from "../pools/BurnMintTokenPool.sol"; -import {TokenPool} from "../pools/TokenPool.sol"; -import {RegistryModuleOwnerCustom} from "./RegistryModuleOwnerCustom.sol"; +import {OwnerIsCreator} from "../../../shared/access/OwnerIsCreator.sol"; +import {RateLimiter} from "../../libraries/RateLimiter.sol"; +import {BurnMintTokenPool} from "../../pools/BurnMintTokenPool.sol"; +import {TokenPool} from "../../pools/TokenPool.sol"; +import {RegistryModuleOwnerCustom} from "./../RegistryModuleOwnerCustom.sol"; -import {Create2} from "../../vendor/openzeppelin-solidity/v5.0.2/contracts/utils/Create2.sol"; +import {Create2} from "../../../vendor/openzeppelin-solidity/v5.0.2/contracts/utils/Create2.sol"; /// @notice A contract for deploying new tokens and token pools, and configuring them with the token admin registry /// @dev At the end of the transaction, the ownership transfer process will begin, but the user must accept the @@ -67,8 +67,10 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { address ccipRouter ) { if ( - address(tokenAdminRegistry) == address(0) || address(tokenAdminModule) == address(0) || rmnProxy == address(0) - || ccipRouter == address(0) + address(tokenAdminRegistry) == address(0) || + address(tokenAdminModule) == address(0) || + rmnProxy == address(0) || + ccipRouter == address(0) ) revert InvalidZeroAddress(); i_tokenAdminRegistry = ITokenAdminRegistry(tokenAdminRegistry); @@ -191,8 +193,9 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { ); // Abi encode the computed remote address so it can be used as bytes in the chain update - remoteTokenPool.remotePoolAddress = - abi.encode(salt.computeAddress(remotePoolInitcode, remoteChainConfig.remotePoolFactory)); + remoteTokenPool.remotePoolAddress = abi.encode( + salt.computeAddress(remotePoolInitcode, remoteChainConfig.remotePoolFactory) + ); } chainUpdates[i] = TokenPool.ChainUpdate({ @@ -251,8 +254,10 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { // Zero address validation check if ( - remoteChainConfigs[i].remoteChainSelector == 0 || remoteConfig.remotePoolFactory == address(0) - || remoteConfig.remoteRouter == address(0) || remoteConfig.remoteRMNProxy == address(0) + remoteChainConfigs[i].remoteChainSelector == 0 || + remoteConfig.remotePoolFactory == address(0) || + remoteConfig.remoteRouter == address(0) || + remoteConfig.remoteRMNProxy == address(0) ) revert InvalidZeroAddress(); s_remoteChainConfigs[remoteChainConfigs[i].remoteChainSelector] = remoteChainConfigs[i].remoteChainConfig; diff --git a/contracts/src/v0.8/shared/test/token/ERC20/BurnMintERC20.t.sol b/contracts/src/v0.8/shared/test/token/ERC20/BurnMintERC20.t.sol deleted file mode 100644 index 10143a7057..0000000000 --- a/contracts/src/v0.8/shared/test/token/ERC20/BurnMintERC20.t.sol +++ /dev/null @@ -1,360 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.4; - -import {IBurnMintERC20} from "../../../token/ERC20/IBurnMintERC20.sol"; - -import {BurnMintERC20} from "../../../token/ERC20/BurnMintERC20.sol"; -import {BaseTest} from "../../BaseTest.t.sol"; - -import {IERC20} from "../../../../vendor/openzeppelin-solidity/v4.8.3/contracts/interfaces/IERC20.sol"; -import {IERC165} from "../../../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/introspection/IERC165.sol"; - -contract BurnMintERC20Setup is BaseTest { - event Transfer(address indexed from, address indexed to, uint256 value); - event MintAccessGranted(address indexed minter); - event BurnAccessGranted(address indexed burner); - event MintAccessRevoked(address indexed minter); - event BurnAccessRevoked(address indexed burner); - - BurnMintERC20 internal s_burnMintERC20; - - address internal s_mockPool = address(6243783892); - uint256 internal s_amount = 1e18; - uint256 internal s_maxSupply = 1e36; - - function setUp() public virtual override { - BaseTest.setUp(); - s_burnMintERC20 = new BurnMintERC20("Chainlink Token", "LINK", 18, s_maxSupply); - - // Set s_mockPool to be a burner and minter - s_burnMintERC20.grantMintAndBurnRoles(s_mockPool); - deal(address(s_burnMintERC20), OWNER, s_amount); - } -} - -contract BurnMintERC20_constructor is BurnMintERC20Setup { - function testConstructorSuccess() public { - string memory name = "Chainlink token v2"; - string memory symbol = "LINK2"; - uint8 decimals = 19; - uint256 maxSupply = 1e33; - s_burnMintERC20 = new BurnMintERC20(name, symbol, decimals, maxSupply); - - assertEq(name, s_burnMintERC20.name()); - assertEq(symbol, s_burnMintERC20.symbol()); - assertEq(decimals, s_burnMintERC20.decimals()); - assertEq(maxSupply, s_burnMintERC20.maxSupply()); - } -} - -contract BurnMintERC20_approve is BurnMintERC20Setup { - function testApproveSuccess() public { - uint256 balancePre = s_burnMintERC20.balanceOf(STRANGER); - uint256 sendingAmount = s_amount / 2; - - s_burnMintERC20.approve(STRANGER, sendingAmount); - - changePrank(STRANGER); - - s_burnMintERC20.transferFrom(OWNER, STRANGER, sendingAmount); - - assertEq(sendingAmount + balancePre, s_burnMintERC20.balanceOf(STRANGER)); - } - - // Reverts - - function testInvalidAddressReverts() public { - vm.expectRevert(); - - s_burnMintERC20.approve(address(s_burnMintERC20), s_amount); - } -} - -contract BurnMintERC20_transfer is BurnMintERC20Setup { - function testTransferSuccess() public { - uint256 balancePre = s_burnMintERC20.balanceOf(STRANGER); - uint256 sendingAmount = s_amount / 2; - - s_burnMintERC20.transfer(STRANGER, sendingAmount); - - assertEq(sendingAmount + balancePre, s_burnMintERC20.balanceOf(STRANGER)); - } - - // Reverts - - function testInvalidAddressReverts() public { - vm.expectRevert(); - - s_burnMintERC20.transfer(address(s_burnMintERC20), s_amount); - } -} - -contract BurnMintERC20_mint is BurnMintERC20Setup { - function testBasicMintSuccess() public { - uint256 balancePre = s_burnMintERC20.balanceOf(OWNER); - - s_burnMintERC20.grantMintAndBurnRoles(OWNER); - - vm.expectEmit(); - emit Transfer(address(0), OWNER, s_amount); - - s_burnMintERC20.mint(OWNER, s_amount); - - assertEq(balancePre + s_amount, s_burnMintERC20.balanceOf(OWNER)); - } - - // Revert - - function testSenderNotMinterReverts() public { - // Minter role was granted in the constructor, so we must revert it for the test to error - s_burnMintERC20.revokeMintRole(OWNER); - - vm.expectRevert(abi.encodeWithSelector(BurnMintERC20.SenderNotMinter.selector, OWNER)); - s_burnMintERC20.mint(STRANGER, 1e18); - } - - function testMaxSupplyExceededReverts() public { - changePrank(s_mockPool); - - // Mint max supply - s_burnMintERC20.mint(OWNER, s_burnMintERC20.maxSupply()); - - vm.expectRevert(abi.encodeWithSelector(BurnMintERC20.MaxSupplyExceeded.selector, s_burnMintERC20.maxSupply() + 1)); - - // Attempt to mint 1 more than max supply - s_burnMintERC20.mint(OWNER, 1); - } -} - -contract BurnMintERC20_burn is BurnMintERC20Setup { - function testBasicBurnSuccess() public { - s_burnMintERC20.grantBurnRole(OWNER); - deal(address(s_burnMintERC20), OWNER, s_amount); - - vm.expectEmit(); - emit Transfer(OWNER, address(0), s_amount); - - s_burnMintERC20.burn(s_amount); - - assertEq(0, s_burnMintERC20.balanceOf(OWNER)); - } - - // Revert - - function testSenderNotBurnerReverts() public { - // Burner role was granted in the constructor, so we must revert it for the test to revert properly - s_burnMintERC20.revokeBurnRole(OWNER); - - vm.expectRevert(abi.encodeWithSelector(BurnMintERC20.SenderNotBurner.selector, OWNER)); - - s_burnMintERC20.burnFrom(OWNER, s_amount); - } - - function testExceedsBalanceReverts() public { - changePrank(s_mockPool); - - vm.expectRevert("ERC20: burn amount exceeds balance"); - - s_burnMintERC20.burn(s_amount * 2); - } - - function testBurnFromZeroAddressReverts() public { - s_burnMintERC20.grantBurnRole(address(0)); - changePrank(address(0)); - - vm.expectRevert("ERC20: burn from the zero address"); - - s_burnMintERC20.burn(0); - } -} - -contract BurnMintERC20_burnFromAlias is BurnMintERC20Setup { - function setUp() public virtual override { - BurnMintERC20Setup.setUp(); - } - - function testBurnFromSuccess() public { - s_burnMintERC20.approve(s_mockPool, s_amount); - - changePrank(s_mockPool); - - s_burnMintERC20.burn(OWNER, s_amount); - - assertEq(0, s_burnMintERC20.balanceOf(OWNER)); - } - - // Reverts - - function testSenderNotBurnerReverts() public { - // Burner role was granted in the constructor, so we must revert it for the test to revert properly - s_burnMintERC20.revokeBurnRole(OWNER); - - vm.expectRevert(abi.encodeWithSelector(BurnMintERC20.SenderNotBurner.selector, OWNER)); - - s_burnMintERC20.burn(OWNER, s_amount); - } - - function testInsufficientAllowanceReverts() public { - changePrank(s_mockPool); - - vm.expectRevert("ERC20: insufficient allowance"); - - s_burnMintERC20.burn(OWNER, s_amount); - } - - function testExceedsBalanceReverts() public { - s_burnMintERC20.approve(s_mockPool, s_amount * 2); - - changePrank(s_mockPool); - - vm.expectRevert("ERC20: burn amount exceeds balance"); - - s_burnMintERC20.burn(OWNER, s_amount * 2); - } -} - -contract BurnMintERC20_burnFrom is BurnMintERC20Setup { - function setUp() public virtual override { - BurnMintERC20Setup.setUp(); - } - - function testBurnFromSuccess() public { - s_burnMintERC20.approve(s_mockPool, s_amount); - - changePrank(s_mockPool); - - s_burnMintERC20.burnFrom(OWNER, s_amount); - - assertEq(0, s_burnMintERC20.balanceOf(OWNER)); - } - - // Reverts - - function testSenderNotBurnerReverts() public { - s_burnMintERC20.revokeBurnRole(OWNER); - - vm.expectRevert(abi.encodeWithSelector(BurnMintERC20.SenderNotBurner.selector, OWNER)); - - s_burnMintERC20.burnFrom(OWNER, s_amount); - } - - function testInsufficientAllowanceReverts() public { - changePrank(s_mockPool); - - vm.expectRevert("ERC20: insufficient allowance"); - - s_burnMintERC20.burnFrom(OWNER, s_amount); - } - - function testExceedsBalanceReverts() public { - s_burnMintERC20.approve(s_mockPool, s_amount * 2); - - changePrank(s_mockPool); - - vm.expectRevert("ERC20: burn amount exceeds balance"); - - s_burnMintERC20.burnFrom(OWNER, s_amount * 2); - } -} - -contract BurnMintERC20_grantRole is BurnMintERC20Setup { - function testGrantMintAccessSuccess() public { - assertFalse(s_burnMintERC20.isMinter(STRANGER)); - - vm.expectEmit(); - emit MintAccessGranted(STRANGER); - - s_burnMintERC20.grantMintAndBurnRoles(STRANGER); - - assertTrue(s_burnMintERC20.isMinter(STRANGER)); - - vm.expectEmit(); - emit MintAccessRevoked(STRANGER); - - s_burnMintERC20.revokeMintRole(STRANGER); - - assertFalse(s_burnMintERC20.isMinter(STRANGER)); - } - - function testGrantBurnAccessSuccess() public { - assertFalse(s_burnMintERC20.isBurner(STRANGER)); - - vm.expectEmit(); - emit BurnAccessGranted(STRANGER); - - s_burnMintERC20.grantBurnRole(STRANGER); - - assertTrue(s_burnMintERC20.isBurner(STRANGER)); - - vm.expectEmit(); - emit BurnAccessRevoked(STRANGER); - - s_burnMintERC20.revokeBurnRole(STRANGER); - - assertFalse(s_burnMintERC20.isBurner(STRANGER)); - } - - function testGrantManySuccess() public { - // These roles were granted in the constructor. It's easier to just revoke them and start fresh for the purpose - // of the test - s_burnMintERC20.revokeBurnRole(OWNER); - s_burnMintERC20.revokeMintRole(OWNER); - - uint256 numberOfPools = 10; - address[] memory permissionedAddresses = new address[](numberOfPools + 1); - permissionedAddresses[0] = s_mockPool; - - for (uint160 i = 0; i < numberOfPools; ++i) { - permissionedAddresses[i + 1] = address(i); - s_burnMintERC20.grantMintAndBurnRoles(address(i)); - } - - assertEq(permissionedAddresses, s_burnMintERC20.getBurners()); - assertEq(permissionedAddresses, s_burnMintERC20.getMinters()); - } -} - -contract BurnMintERC20_grantMintAndBurnRoles is BurnMintERC20Setup { - function testGrantMintAndBurnRolesSuccess() public { - assertFalse(s_burnMintERC20.isMinter(STRANGER)); - assertFalse(s_burnMintERC20.isBurner(STRANGER)); - - vm.expectEmit(); - emit MintAccessGranted(STRANGER); - vm.expectEmit(); - emit BurnAccessGranted(STRANGER); - - s_burnMintERC20.grantMintAndBurnRoles(STRANGER); - - assertTrue(s_burnMintERC20.isMinter(STRANGER)); - assertTrue(s_burnMintERC20.isBurner(STRANGER)); - } -} - -contract BurnMintERC20_decreaseApproval is BurnMintERC20Setup { - function testDecreaseApprovalSuccess() public { - s_burnMintERC20.approve(s_mockPool, s_amount); - uint256 allowance = s_burnMintERC20.allowance(OWNER, s_mockPool); - assertEq(allowance, s_amount); - s_burnMintERC20.decreaseApproval(s_mockPool, s_amount); - assertEq(s_burnMintERC20.allowance(OWNER, s_mockPool), allowance - s_amount); - } -} - -contract BurnMintERC20_increaseApproval is BurnMintERC20Setup { - function testIncreaseApprovalSuccess() public { - s_burnMintERC20.approve(s_mockPool, s_amount); - uint256 allowance = s_burnMintERC20.allowance(OWNER, s_mockPool); - assertEq(allowance, s_amount); - s_burnMintERC20.increaseApproval(s_mockPool, s_amount); - assertEq(s_burnMintERC20.allowance(OWNER, s_mockPool), allowance + s_amount); - } -} - -contract BurnMintERC20_supportsInterface is BurnMintERC20Setup { - function testConstructorSuccess() public view { - assertTrue(s_burnMintERC20.supportsInterface(type(IERC20).interfaceId)); - assertTrue(s_burnMintERC20.supportsInterface(type(IBurnMintERC20).interfaceId)); - assertTrue(s_burnMintERC20.supportsInterface(type(IERC165).interfaceId)); - } -} diff --git a/contracts/src/v0.8/shared/test/token/ERC677/BurnMintERC677.t.sol b/contracts/src/v0.8/shared/test/token/ERC677/BurnMintERC677.t.sol index 9ec6f53dce..2815f99256 100644 --- a/contracts/src/v0.8/shared/test/token/ERC677/BurnMintERC677.t.sol +++ b/contracts/src/v0.8/shared/test/token/ERC677/BurnMintERC677.t.sol @@ -6,7 +6,6 @@ import {IERC677} from "../../../token/ERC677/IERC677.sol"; import {BaseTest} from "../../BaseTest.t.sol"; import {BurnMintERC677} from "../../../token/ERC677/BurnMintERC677.sol"; -import {BurnMintERC20} from "../../../token/ERC20/BurnMintERC20.sol"; import {IERC20} from "../../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol"; import {IERC165} from "../../../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/introspection/IERC165.sol"; @@ -107,7 +106,7 @@ contract BurnMintERC677_mint is BurnMintERC677Setup { // Revert function testSenderNotMinterReverts() public { - vm.expectRevert(abi.encodeWithSelector(BurnMintERC20.SenderNotMinter.selector, OWNER)); + vm.expectRevert(abi.encodeWithSelector(BurnMintERC677.SenderNotMinter.selector, OWNER)); s_burnMintERC677.mint(STRANGER, 1e18); } @@ -117,7 +116,9 @@ contract BurnMintERC677_mint is BurnMintERC677Setup { // Mint max supply s_burnMintERC677.mint(OWNER, s_burnMintERC677.maxSupply()); - vm.expectRevert(abi.encodeWithSelector(BurnMintERC20.MaxSupplyExceeded.selector, s_burnMintERC677.maxSupply() + 1)); + vm.expectRevert( + abi.encodeWithSelector(BurnMintERC677.MaxSupplyExceeded.selector, s_burnMintERC677.maxSupply() + 1) + ); // Attempt to mint 1 more than max supply s_burnMintERC677.mint(OWNER, 1); @@ -140,7 +141,7 @@ contract BurnMintERC677_burn is BurnMintERC677Setup { // Revert function testSenderNotBurnerReverts() public { - vm.expectRevert(abi.encodeWithSelector(BurnMintERC20.SenderNotBurner.selector, OWNER)); + vm.expectRevert(abi.encodeWithSelector(BurnMintERC677.SenderNotBurner.selector, OWNER)); s_burnMintERC677.burnFrom(STRANGER, s_amount); } @@ -181,7 +182,7 @@ contract BurnMintERC677_burnFromAlias is BurnMintERC677Setup { // Reverts function testSenderNotBurnerReverts() public { - vm.expectRevert(abi.encodeWithSelector(BurnMintERC20.SenderNotBurner.selector, OWNER)); + vm.expectRevert(abi.encodeWithSelector(BurnMintERC677.SenderNotBurner.selector, OWNER)); s_burnMintERC677.burn(OWNER, s_amount); } @@ -223,7 +224,7 @@ contract BurnMintERC677_burnFrom is BurnMintERC677Setup { // Reverts function testSenderNotBurnerReverts() public { - vm.expectRevert(abi.encodeWithSelector(BurnMintERC20.SenderNotBurner.selector, OWNER)); + vm.expectRevert(abi.encodeWithSelector(BurnMintERC677.SenderNotBurner.selector, OWNER)); s_burnMintERC677.burnFrom(OWNER, s_amount); } diff --git a/contracts/src/v0.8/shared/test/token/ERC677/OpStackBurnMintERC677.t.sol b/contracts/src/v0.8/shared/test/token/ERC677/OpStackBurnMintERC677.t.sol index 442382fb86..b084ebd38a 100644 --- a/contracts/src/v0.8/shared/test/token/ERC677/OpStackBurnMintERC677.t.sol +++ b/contracts/src/v0.8/shared/test/token/ERC677/OpStackBurnMintERC677.t.sol @@ -6,7 +6,6 @@ import {IOptimismMintableERC20Minimal, IOptimismMintableERC20} from "../../../to import {IERC677} from "../../../token/ERC677/IERC677.sol"; import {BurnMintERC677} from "../../../token/ERC677/BurnMintERC677.sol"; -import {BurnMintERC20} from "../../../token/ERC20/BurnMintERC20.sol"; import {BaseTest} from "../../BaseTest.t.sol"; import {OpStackBurnMintERC677} from "../../../token/ERC677/OpStackBurnMintERC677.sol"; @@ -68,7 +67,7 @@ contract OpStackBurnMintERC677_interfaceCompatibility is OpStackBurnMintERC677Se function testMintCompatibility() public { // Ensure roles work - vm.expectRevert(abi.encodeWithSelector(BurnMintERC20.SenderNotMinter.selector, OWNER)); + vm.expectRevert(abi.encodeWithSelector(BurnMintERC677.SenderNotMinter.selector, OWNER)); s_opStackToken.mint(OWNER, 1); // Use the actual contract to grant mint @@ -89,7 +88,7 @@ contract OpStackBurnMintERC677_interfaceCompatibility is OpStackBurnMintERC677Se function testBurnCompatibility() public { // Ensure roles work - vm.expectRevert(abi.encodeWithSelector(BurnMintERC20.SenderNotBurner.selector, OWNER)); + vm.expectRevert(abi.encodeWithSelector(BurnMintERC677.SenderNotBurner.selector, OWNER)); s_opStackToken.burn(address(0x0), 1); // Use the actual contract to grant burn diff --git a/contracts/src/v0.8/shared/token/ERC20/BurnMintERC20.sol b/contracts/src/v0.8/shared/token/ERC20/BurnMintERC20.sol deleted file mode 100644 index 783f7ebc71..0000000000 --- a/contracts/src/v0.8/shared/token/ERC20/BurnMintERC20.sol +++ /dev/null @@ -1,252 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import {IBurnMintERC20} from "../ERC20/IBurnMintERC20.sol"; -import {IOwnable} from "../../interfaces/IOwnable.sol"; -import {IGetCCIPAdmin} from "../../../ccip/interfaces/IGetCCIPAdmin.sol"; - -import {OwnerIsCreator} from "../../access/OwnerIsCreator.sol"; - -import {ERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/ERC20.sol"; -import {ERC20Burnable} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/extensions/ERC20Burnable.sol"; -import {IERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol"; -import {IERC165} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/introspection/IERC165.sol"; -import {EnumerableSet} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/structs/EnumerableSet.sol"; - -/// @notice A basic ERC20 compatible token contract with burn and minting roles. -/// @dev The total supply can be limited during deployment. -contract BurnMintERC20 is IBurnMintERC20, IGetCCIPAdmin, IERC165, ERC20Burnable, OwnerIsCreator { - using EnumerableSet for EnumerableSet.AddressSet; - - error SenderNotMinter(address sender); - error SenderNotBurner(address sender); - error MaxSupplyExceeded(uint256 supplyAfterMint); - - event MintAccessGranted(address indexed minter); - event BurnAccessGranted(address indexed burner); - event MintAccessRevoked(address indexed minter); - event BurnAccessRevoked(address indexed burner); - - event CCIPAdminTransferred(address indexed previousAdmin, address indexed newAdmin); - - /// @dev The number of decimals for the token - uint8 internal immutable i_decimals; - - /// @dev The maximum supply of the token, 0 if unlimited - uint256 internal immutable i_maxSupply; - - /// @dev the CCIPAdmin can be used to register with the CCIP token admin registry, but has no other special powers, - /// and can only be transferred by the owner. - address internal s_ccipAdmin; - - /// @dev the allowed minter addresses - EnumerableSet.AddressSet internal s_minters; - /// @dev the allowed burner addresses - EnumerableSet.AddressSet internal s_burners; - - constructor(string memory name, string memory symbol, uint8 decimals_, uint256 maxSupply_) ERC20(name, symbol) { - i_decimals = decimals_; - i_maxSupply = maxSupply_; - - s_ccipAdmin = msg.sender; - } - - function supportsInterface(bytes4 interfaceId) public pure virtual override returns (bool) { - return - interfaceId == type(IERC20).interfaceId || - interfaceId == type(IBurnMintERC20).interfaceId || - interfaceId == type(IERC165).interfaceId || - interfaceId == type(IOwnable).interfaceId; - } - - // ================================================================ - // | ERC20 | - // ================================================================ - - /// @dev Returns the number of decimals used in its user representation. - function decimals() public view virtual override returns (uint8) { - return i_decimals; - } - - /// @dev Returns the max supply of the token, 0 if unlimited. - function maxSupply() public view virtual returns (uint256) { - return i_maxSupply; - } - - /// @dev Uses OZ ERC20 _transfer to disallow sending to address(0). - /// @dev Disallows sending to address(this) - function _transfer(address from, address to, uint256 amount) internal virtual override validAddress(to) { - super._transfer(from, to, amount); - } - - /// @dev Uses OZ ERC20 _approve to disallow approving for address(0). - /// @dev Disallows approving for address(this) - function _approve(address owner, address spender, uint256 amount) internal virtual override validAddress(spender) { - super._approve(owner, spender, amount); - } - - /// @dev Exists to be backwards compatible with the older naming convention. - /// @param spender the account being approved to spend on the users' behalf. - /// @param subtractedValue the amount being removed from the approval. - /// @return success Bool to return if the approval was successfully decreased. - function decreaseApproval(address spender, uint256 subtractedValue) external returns (bool success) { - return decreaseAllowance(spender, subtractedValue); - } - - /// @dev Exists to be backwards compatible with the older naming convention. - /// @param spender the account being approved to spend on the users' behalf. - /// @param addedValue the amount being added to the approval. - function increaseApproval(address spender, uint256 addedValue) external { - increaseAllowance(spender, addedValue); - } - - /// @notice Check if recipient is valid (not this contract address). - /// @param recipient the account we transfer/approve to. - /// @dev Reverts with an empty revert to be compatible with the existing link token when - /// the recipient is this contract address. - modifier validAddress(address recipient) virtual { - // solhint-disable-next-line reason-string, gas-custom-errors - if (recipient == address(this)) revert(); - _; - } - - // ================================================================ - // | Burning & minting | - // ================================================================ - - /// @inheritdoc ERC20Burnable - /// @dev Uses OZ ERC20 _burn to disallow burning from address(0). - /// @dev Decreases the total supply. - function burn(uint256 amount) public override(IBurnMintERC20, ERC20Burnable) onlyBurner { - super.burn(amount); - } - - /// @inheritdoc IBurnMintERC20 - /// @dev Alias for BurnFrom for compatibility with the older naming convention. - /// @dev Uses burnFrom for all validation & logic. - - function burn(address account, uint256 amount) public virtual override { - burnFrom(account, amount); - } - - /// @inheritdoc ERC20Burnable - /// @dev Uses OZ ERC20 _burn to disallow burning from address(0). - /// @dev Decreases the total supply. - function burnFrom(address account, uint256 amount) public override(IBurnMintERC20, ERC20Burnable) onlyBurner { - super.burnFrom(account, amount); - } - - /// @inheritdoc IBurnMintERC20 - /// @dev Uses OZ ERC20 _mint to disallow minting to address(0). - /// @dev Disallows minting to address(this) - /// @dev Increases the total supply. - function mint(address account, uint256 amount) external override onlyMinter validAddress(account) { - if (i_maxSupply != 0 && totalSupply() + amount > i_maxSupply) revert MaxSupplyExceeded(totalSupply() + amount); - - _mint(account, amount); - } - - // ================================================================ - // | Roles | - // ================================================================ - - /// @notice grants both mint and burn roles to `burnAndMinter`. - /// @dev calls public functions so this function does not require - /// access controls. This is handled in the inner functions. - function grantMintAndBurnRoles(address burnAndMinter) external { - grantMintRole(burnAndMinter); - grantBurnRole(burnAndMinter); - } - - /// @notice Grants mint role to the given address. - /// @dev only the owner can call this function. - function grantMintRole(address minter) public onlyOwner { - if (s_minters.add(minter)) { - emit MintAccessGranted(minter); - } - } - - /// @notice Grants burn role to the given address. - /// @dev only the owner can call this function. - /// @param burner the address to grant the burner role to - function grantBurnRole(address burner) public onlyOwner { - if (s_burners.add(burner)) { - emit BurnAccessGranted(burner); - } - } - - /// @notice Revokes mint role for the given address. - /// @dev only the owner can call this function. - /// @param minter the address to revoke the mint role from. - function revokeMintRole(address minter) public onlyOwner { - if (s_minters.remove(minter)) { - emit MintAccessRevoked(minter); - } - } - - /// @notice Revokes burn role from the given address. - /// @dev only the owner can call this function - /// @param burner the address to revoke the burner role from - function revokeBurnRole(address burner) public onlyOwner { - if (s_burners.remove(burner)) { - emit BurnAccessRevoked(burner); - } - } - - /// @notice Returns all permissioned minters - function getMinters() public view returns (address[] memory) { - return s_minters.values(); - } - - /// @notice Returns all permissioned burners - function getBurners() public view returns (address[] memory) { - return s_burners.values(); - } - - /// @notice Returns the current CCIPAdmin - function getCCIPAdmin() public view returns (address) { - return s_ccipAdmin; - } - - /// @notice Transfers the CCIPAdmin role to a new address - /// @dev only the owner can call this function, NOT the current ccipAdmin, and 1-step ownership transfer is used. - /// @param newAdmin The address to transfer the CCIPAdmin role to. Setting to address(0) is a valid way to revoke - /// the role - function setCCIPAdmin(address newAdmin) public onlyOwner { - address currentAdmin = s_ccipAdmin; - - s_ccipAdmin = newAdmin; - - emit CCIPAdminTransferred(currentAdmin, newAdmin); - } - - // ================================================================ - // | Access | - // ================================================================ - - /// @notice Checks whether a given address is a minter for this token. - /// @return true if the address is allowed to mint. - function isMinter(address minter) public view returns (bool) { - return s_minters.contains(minter); - } - - /// @notice Checks whether a given address is a burner for this token. - /// @return true if the address is allowed to burn. - function isBurner(address burner) public view returns (bool) { - return s_burners.contains(burner); - } - - /// @notice Checks whether the msg.sender is a permissioned minter for this token - /// @dev Reverts with a SenderNotMinter if the check fails - modifier onlyMinter() { - if (!isMinter(msg.sender)) revert SenderNotMinter(msg.sender); - _; - } - - /// @notice Checks whether the msg.sender is a permissioned burner for this token - /// @dev Reverts with a SenderNotBurner if the check fails - modifier onlyBurner() { - if (!isBurner(msg.sender)) revert SenderNotBurner(msg.sender); - _; - } -} diff --git a/contracts/src/v0.8/shared/token/ERC677/BurnMintERC677.sol b/contracts/src/v0.8/shared/token/ERC677/BurnMintERC677.sol index 5d5bfb7db3..24573f3057 100644 --- a/contracts/src/v0.8/shared/token/ERC677/BurnMintERC677.sol +++ b/contracts/src/v0.8/shared/token/ERC677/BurnMintERC677.sol @@ -1,34 +1,217 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; +import {IBurnMintERC20} from "../ERC20/IBurnMintERC20.sol"; import {IERC677} from "./IERC677.sol"; -import {IERC677Receiver} from "../../interfaces/IERC677Receiver.sol"; -import {BurnMintERC20} from "../ERC20/BurnMintERC20.sol"; +import {ERC677} from "./ERC677.sol"; +import {OwnerIsCreator} from "../../access/OwnerIsCreator.sol"; + +import {ERC20Burnable} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/extensions/ERC20Burnable.sol"; +import {EnumerableSet} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/structs/EnumerableSet.sol"; +import {IERC165} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/introspection/IERC165.sol"; +import {IERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol"; /// @notice A basic ERC677 compatible token contract with burn and minting roles. /// @dev The total supply can be limited during deployment. -contract BurnMintERC677 is BurnMintERC20, IERC677 { - constructor( - string memory name, - string memory symbol, - uint8 decimals_, - uint256 maxSupply_ - ) BurnMintERC20(name, symbol, decimals_, maxSupply_) {} +contract BurnMintERC677 is IBurnMintERC20, ERC677, IERC165, ERC20Burnable, OwnerIsCreator { + using EnumerableSet for EnumerableSet.AddressSet; + + error SenderNotMinter(address sender); + error SenderNotBurner(address sender); + error MaxSupplyExceeded(uint256 supplyAfterMint); + + event MintAccessGranted(address indexed minter); + event BurnAccessGranted(address indexed burner); + event MintAccessRevoked(address indexed minter); + event BurnAccessRevoked(address indexed burner); + + // @dev the allowed minter addresses + EnumerableSet.AddressSet internal s_minters; + // @dev the allowed burner addresses + EnumerableSet.AddressSet internal s_burners; + + /// @dev The number of decimals for the token + uint8 internal immutable i_decimals; + + /// @dev The maximum supply of the token, 0 if unlimited + uint256 internal immutable i_maxSupply; + + constructor(string memory name, string memory symbol, uint8 decimals_, uint256 maxSupply_) ERC677(name, symbol) { + i_decimals = decimals_; + i_maxSupply = maxSupply_; + } function supportsInterface(bytes4 interfaceId) public pure virtual override returns (bool) { - return interfaceId == type(IERC677).interfaceId || super.supportsInterface(interfaceId); + return + interfaceId == type(IERC20).interfaceId || + interfaceId == type(IERC677).interfaceId || + interfaceId == type(IBurnMintERC20).interfaceId || + interfaceId == type(IERC165).interfaceId; + } + + // ================================================================ + // | ERC20 | + // ================================================================ + + /// @dev Returns the number of decimals used in its user representation. + function decimals() public view virtual override returns (uint8) { + return i_decimals; + } + + /// @dev Returns the max supply of the token, 0 if unlimited. + function maxSupply() public view virtual returns (uint256) { + return i_maxSupply; + } + + /// @dev Uses OZ ERC20 _transfer to disallow sending to address(0). + /// @dev Disallows sending to address(this) + function _transfer(address from, address to, uint256 amount) internal virtual override validAddress(to) { + super._transfer(from, to, amount); + } + + /// @dev Uses OZ ERC20 _approve to disallow approving for address(0). + /// @dev Disallows approving for address(this) + function _approve(address owner, address spender, uint256 amount) internal virtual override validAddress(spender) { + super._approve(owner, spender, amount); + } + + /// @dev Exists to be backwards compatible with the older naming convention. + function decreaseApproval(address spender, uint256 subtractedValue) external returns (bool success) { + return decreaseAllowance(spender, subtractedValue); + } + + /// @dev Exists to be backwards compatible with the older naming convention. + function increaseApproval(address spender, uint256 addedValue) external { + increaseAllowance(spender, addedValue); + } + + /// @notice Check if recipient is valid (not this contract address). + /// @param recipient the account we transfer/approve to. + /// @dev Reverts with an empty revert to be compatible with the existing link token when + /// the recipient is this contract address. + modifier validAddress(address recipient) virtual { + // solhint-disable-next-line reason-string, gas-custom-errors + if (recipient == address(this)) revert(); + _; + } + + // ================================================================ + // | Burning & minting | + // ================================================================ + + /// @inheritdoc ERC20Burnable + /// @dev Uses OZ ERC20 _burn to disallow burning from address(0). + /// @dev Decreases the total supply. + function burn(uint256 amount) public override(IBurnMintERC20, ERC20Burnable) onlyBurner { + super.burn(amount); + } + + /// @inheritdoc IBurnMintERC20 + /// @dev Alias for BurnFrom for compatibility with the older naming convention. + /// @dev Uses burnFrom for all validation & logic. + function burn(address account, uint256 amount) public virtual override { + burnFrom(account, amount); + } + + /// @inheritdoc ERC20Burnable + /// @dev Uses OZ ERC20 _burn to disallow burning from address(0). + /// @dev Decreases the total supply. + function burnFrom(address account, uint256 amount) public override(IBurnMintERC20, ERC20Burnable) onlyBurner { + super.burnFrom(account, amount); + } + + /// @inheritdoc IBurnMintERC20 + /// @dev Uses OZ ERC20 _mint to disallow minting to address(0). + /// @dev Disallows minting to address(this) + /// @dev Increases the total supply. + function mint(address account, uint256 amount) external override onlyMinter validAddress(account) { + if (i_maxSupply != 0 && totalSupply() + amount > i_maxSupply) revert MaxSupplyExceeded(totalSupply() + amount); + + _mint(account, amount); } - /// @inheritdoc IERC677 - /// @dev This function has been duplicated from ERC677.sol since functionality cannot be inherited due to - /// dual imports of ERC20 with BurnMintERC20.sol - function transferAndCall(address to, uint256 amount, bytes memory data) public returns (bool success) { - super.transfer(to, amount); - emit Transfer(msg.sender, to, amount, data); - if (to.code.length > 0) { - IERC677Receiver(to).onTokenTransfer(msg.sender, amount, data); + // ================================================================ + // | Roles | + // ================================================================ + + /// @notice grants both mint and burn roles to `burnAndMinter`. + /// @dev calls public functions so this function does not require + /// access controls. This is handled in the inner functions. + function grantMintAndBurnRoles(address burnAndMinter) external { + grantMintRole(burnAndMinter); + grantBurnRole(burnAndMinter); + } + + /// @notice Grants mint role to the given address. + /// @dev only the owner can call this function. + function grantMintRole(address minter) public onlyOwner { + if (s_minters.add(minter)) { + emit MintAccessGranted(minter); } - return true; + } + + /// @notice Grants burn role to the given address. + /// @dev only the owner can call this function. + function grantBurnRole(address burner) public onlyOwner { + if (s_burners.add(burner)) { + emit BurnAccessGranted(burner); + } + } + + /// @notice Revokes mint role for the given address. + /// @dev only the owner can call this function. + function revokeMintRole(address minter) public onlyOwner { + if (s_minters.remove(minter)) { + emit MintAccessRevoked(minter); + } + } + + /// @notice Revokes burn role from the given address. + /// @dev only the owner can call this function + function revokeBurnRole(address burner) public onlyOwner { + if (s_burners.remove(burner)) { + emit BurnAccessRevoked(burner); + } + } + + /// @notice Returns all permissioned minters + function getMinters() public view returns (address[] memory) { + return s_minters.values(); + } + + /// @notice Returns all permissioned burners + function getBurners() public view returns (address[] memory) { + return s_burners.values(); + } + + // ================================================================ + // | Access | + // ================================================================ + + /// @notice Checks whether a given address is a minter for this token. + /// @return true if the address is allowed to mint. + function isMinter(address minter) public view returns (bool) { + return s_minters.contains(minter); + } + + /// @notice Checks whether a given address is a burner for this token. + /// @return true if the address is allowed to burn. + function isBurner(address burner) public view returns (bool) { + return s_burners.contains(burner); + } + + /// @notice Checks whether the msg.sender is a permissioned minter for this token + /// @dev Reverts with a SenderNotMinter if the check fails + modifier onlyMinter() { + if (!isMinter(msg.sender)) revert SenderNotMinter(msg.sender); + _; + } + + /// @notice Checks whether the msg.sender is a permissioned burner for this token + /// @dev Reverts with a SenderNotBurner if the check fails + modifier onlyBurner() { + if (!isBurner(msg.sender)) revert SenderNotBurner(msg.sender); + _; } } From 34ac7c63f3e48939b431fe400d2adec005368c27 Mon Sep 17 00:00:00 2001 From: "app-token-issuer-infra-releng[bot]" <120227048+app-token-issuer-infra-releng[bot]@users.noreply.github.com> Date: Thu, 26 Sep 2024 15:53:02 +0000 Subject: [PATCH 28/48] Update gethwrappers --- .../burn_mint_erc677/burn_mint_erc677.go | 196 +----------------- .../shared/generated/link_token/link_token.go | 196 +----------------- ...rapper-dependency-versions-do-not-edit.txt | 4 +- 3 files changed, 12 insertions(+), 384 deletions(-) diff --git a/core/gethwrappers/shared/generated/burn_mint_erc677/burn_mint_erc677.go b/core/gethwrappers/shared/generated/burn_mint_erc677/burn_mint_erc677.go index d412d6949d..1d5b1c4ab1 100644 --- a/core/gethwrappers/shared/generated/burn_mint_erc677/burn_mint_erc677.go +++ b/core/gethwrappers/shared/generated/burn_mint_erc677/burn_mint_erc677.go @@ -31,8 +31,8 @@ var ( ) var BurnMintERC677MetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"decimals_\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"maxSupply_\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"supplyAfterMint\",\"type\":\"uint256\"}],\"name\":\"MaxSupplyExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SenderNotBurner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SenderNotMinter\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"}],\"name\":\"BurnAccessGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"}],\"name\":\"BurnAccessRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousAdmin\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"CCIPAdminTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"MintAccessGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"MintAccessRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseApproval\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getBurners\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCCIPAdmin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMinters\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"}],\"name\":\"grantBurnRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"burnAndMinter\",\"type\":\"address\"}],\"name\":\"grantMintAndBurnRoles\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"grantMintRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseApproval\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"}],\"name\":\"isBurner\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"isMinter\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"}],\"name\":\"revokeBurnRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"revokeMintRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"setCCIPAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"transferAndCall\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x60c06040523480156200001157600080fd5b50604051620024493803806200244983398101604081905262000034916200028b565b8383838333806000868660036200004c8382620003a5565b5060046200005b8282620003a5565b5050506001600160a01b038216620000ba5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600580546001600160a01b0319166001600160a01b0384811691909117909155811615620000ed57620000ed816200011a565b50505060ff90911660805260a0525050600780546001600160a01b03191633179055506200047192505050565b336001600160a01b03821603620001745760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401620000b1565b600680546001600160a01b0319166001600160a01b03838116918217909255600554604051919216907fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae127890600090a350565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001ee57600080fd5b81516001600160401b03808211156200020b576200020b620001c6565b604051601f8301601f19908116603f01168101908282118183101715620002365762000236620001c6565b816040528381526020925086838588010111156200025357600080fd5b600091505b8382101562000277578582018301518183018401529082019062000258565b600093810190920192909252949350505050565b60008060008060808587031215620002a257600080fd5b84516001600160401b0380821115620002ba57600080fd5b620002c888838901620001dc565b95506020870151915080821115620002df57600080fd5b50620002ee87828801620001dc565b935050604085015160ff811681146200030657600080fd5b6060959095015193969295505050565b600181811c908216806200032b57607f821691505b6020821081036200034c57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620003a057600081815260208120601f850160051c810160208610156200037b5750805b601f850160051c820191505b818110156200039c5782815560010162000387565b5050505b505050565b81516001600160401b03811115620003c157620003c1620001c6565b620003d981620003d2845462000316565b8462000352565b602080601f831160018114620004115760008415620003f85750858301515b600019600386901b1c1916600185901b1785556200039c565b600085815260208120601f198616915b82811015620004425788860151825594840194600190910190840162000421565b5085821015620004615787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a051611fa4620004a5600039600081816104c50152818161086c0152610896015260006102a70152611fa46000f3fe608060405234801561001057600080fd5b50600436106102265760003560e01c806386fe8b431161012a578063aa271e1a116100bd578063d5abeb011161008c578063dd62ed3e11610071578063dd62ed3e146104fc578063f2fde38b14610542578063f81094f31461055557600080fd5b8063d5abeb01146104c3578063d73dd623146104e957600080fd5b8063aa271e1a14610477578063c2e3273d1461048a578063c630948d1461049d578063c64d0ebc146104b057600080fd5b80639dc29fac116100f95780639dc29fac1461042b578063a457c2d71461043e578063a8fa343c14610451578063a9059cbb1461046457600080fd5b806386fe8b43146103be5780638da5cb5b146103c65780638fd6a6ac1461040557806395d89b411461042357600080fd5b806340c10f19116101bd578063661884631161018c57806370a082311161017157806370a082311461036d57806379ba5097146103a357806379cc6790146103ab57600080fd5b806366188463146103455780636b32810b1461035857600080fd5b806340c10f19146102f757806342966c681461030c5780634334614a1461031f5780634f5632f81461033257600080fd5b806323b872dd116101f957806323b872dd1461028d578063313ce567146102a057806339509351146102d15780634000aea0146102e457600080fd5b806301ffc9a71461022b57806306fdde0314610253578063095ea7b31461026857806318160ddd1461027b575b600080fd5b61023e610239366004611b11565b610568565b60405190151581526020015b60405180910390f35b61025b6105c4565b60405161024a9190611bb7565b61023e610276366004611bf3565b610656565b6002545b60405190815260200161024a565b61023e61029b366004611c1d565b61066e565b60405160ff7f000000000000000000000000000000000000000000000000000000000000000016815260200161024a565b61023e6102df366004611bf3565b610692565b61023e6102f2366004611c88565b6106de565b61030a610305366004611bf3565b610801565b005b61030a61031a366004611d71565b610928565b61023e61032d366004611d8a565b610975565b61030a610340366004611d8a565b610982565b61023e610353366004611bf3565b6109de565b6103606109f1565b60405161024a9190611da5565b61027f61037b366004611d8a565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b61030a610a02565b61030a6103b9366004611bf3565b610b03565b610360610b52565b60055473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161024a565b60075473ffffffffffffffffffffffffffffffffffffffff166103e0565b61025b610b5e565b61030a610439366004611bf3565b610b6d565b61023e61044c366004611bf3565b610b77565b61030a61045f366004611d8a565b610c48565b61023e610472366004611bf3565b610cc7565b61023e610485366004611d8a565b610cd5565b61030a610498366004611d8a565b610ce2565b61030a6104ab366004611d8a565b610d3e565b61030a6104be366004611d8a565b610d4c565b7f000000000000000000000000000000000000000000000000000000000000000061027f565b61030a6104f7366004611bf3565b610da8565b61027f61050a366004611dff565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b61030a610550366004611d8a565b610db2565b61030a610563366004611d8a565b610dc3565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f4000aea00000000000000000000000000000000000000000000000000000000014806105be57506105be82610e1f565b92915050565b6060600380546105d390611e32565b80601f01602080910402602001604051908101604052809291908181526020018280546105ff90611e32565b801561064c5780601f106106215761010080835404028352916020019161064c565b820191906000526020600020905b81548152906001019060200180831161062f57829003601f168201915b5050505050905090565b600033610664818585610f4f565b5060019392505050565b60003361067c858285610f83565b610687858585611054565b506001949350505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919061066490829086906106d9908790611eb4565b610f4f565b60006106ea8484610cc7565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fe19260aff97b920c7df27010903aeb9c8d2be5d310a2c67824cf3f15396e4c16858560405161074a929190611ec7565b60405180910390a373ffffffffffffffffffffffffffffffffffffffff84163b15610664576040517fa4c0ed3600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063a4c0ed36906107c590339087908790600401611ee8565b600060405180830381600087803b1580156107df57600080fd5b505af11580156107f3573d6000803e3d6000fd5b505050505060019392505050565b61080a33610cd5565b610847576040517fe2c8c9d50000000000000000000000000000000000000000000000000000000081523360048201526024015b60405180910390fd5b813073ffffffffffffffffffffffffffffffffffffffff82160361086a57600080fd5b7f0000000000000000000000000000000000000000000000000000000000000000158015906108cb57507f0000000000000000000000000000000000000000000000000000000000000000826108bf60025490565b6108c99190611eb4565b115b1561091957816108da60025490565b6108e49190611eb4565b6040517fcbbf111300000000000000000000000000000000000000000000000000000000815260040161083e91815260200190565b6109238383611082565b505050565b61093133610975565b610969576040517fc820b10b00000000000000000000000000000000000000000000000000000000815233600482015260240161083e565b61097281611175565b50565b60006105be600a8361117f565b61098a6111ae565b610995600a82611231565b156109725760405173ffffffffffffffffffffffffffffffffffffffff8216907f0a675452746933cefe3d74182e78db7afe57ba60eaa4234b5d85e9aa41b0610c90600090a250565b60006109ea8383610b77565b9392505050565b60606109fd6008611253565b905090565b60065473ffffffffffffffffffffffffffffffffffffffff163314610a83576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e657200000000000000000000604482015260640161083e565b600580547fffffffffffffffffffffffff00000000000000000000000000000000000000008082163390811790935560068054909116905560405173ffffffffffffffffffffffffffffffffffffffff909116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b610b0c33610975565b610b44576040517fc820b10b00000000000000000000000000000000000000000000000000000000815233600482015260240161083e565b610b4e8282611260565b5050565b60606109fd600a611253565b6060600480546105d390611e32565b610b4e8282610b03565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610c3b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f000000000000000000000000000000000000000000000000000000606482015260840161083e565b6106878286868403610f4f565b610c506111ae565b6007805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f9524c9e4b0b61eb018dd58a1cd856e3e74009528328ab4a613b434fa631d724290600090a35050565b600033610664818585611054565b60006105be60088361117f565b610cea6111ae565b610cf5600882611275565b156109725760405173ffffffffffffffffffffffffffffffffffffffff8216907fe46fef8bbff1389d9010703cf8ebb363fb3daf5bf56edc27080b67bc8d9251ea90600090a250565b610d4781610ce2565b610972815b610d546111ae565b610d5f600a82611275565b156109725760405173ffffffffffffffffffffffffffffffffffffffff8216907f92308bb7573b2a3d17ddb868b39d8ebec433f3194421abc22d084f89658c9bad90600090a250565b6109238282610692565b610dba6111ae565b61097281611297565b610dcb6111ae565b610dd6600882611231565b156109725760405173ffffffffffffffffffffffffffffffffffffffff8216907fed998b960f6340d045f620c119730f7aa7995e7425c2401d3a5b64ff998a59e990600090a250565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f36372b07000000000000000000000000000000000000000000000000000000001480610eb257507fffffffff0000000000000000000000000000000000000000000000000000000082167fe6599b4d00000000000000000000000000000000000000000000000000000000145b80610efe57507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b806105be57507fffffffff0000000000000000000000000000000000000000000000000000000082167f06e27847000000000000000000000000000000000000000000000000000000001492915050565b813073ffffffffffffffffffffffffffffffffffffffff821603610f7257600080fd5b610f7d84848461138d565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610f7d5781811015611047576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161083e565b610f7d8484848403610f4f565b813073ffffffffffffffffffffffffffffffffffffffff82160361107757600080fd5b610f7d848484611540565b73ffffffffffffffffffffffffffffffffffffffff82166110ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161083e565b80600260008282546111119190611eb4565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b61097233826117af565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260018301602052604081205415156109ea565b60055473ffffffffffffffffffffffffffffffffffffffff16331461122f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015260640161083e565b565b60006109ea8373ffffffffffffffffffffffffffffffffffffffff8416611973565b606060006109ea83611a66565b61126b823383610f83565b610b4e82826117af565b60006109ea8373ffffffffffffffffffffffffffffffffffffffff8416611ac2565b3373ffffffffffffffffffffffffffffffffffffffff821603611316576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640161083e565b600680547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff838116918217909255600554604051919216907fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae127890600090a350565b73ffffffffffffffffffffffffffffffffffffffff831661142f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161083e565b73ffffffffffffffffffffffffffffffffffffffff82166114d2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161083e565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff83166115e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161083e565b73ffffffffffffffffffffffffffffffffffffffff8216611686576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161083e565b73ffffffffffffffffffffffffffffffffffffffff83166000908152602081905260409020548181101561173c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e63650000000000000000000000000000000000000000000000000000606482015260840161083e565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610f7d565b73ffffffffffffffffffffffffffffffffffffffff8216611852576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161083e565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015611908576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f6365000000000000000000000000000000000000000000000000000000000000606482015260840161083e565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b60008181526001830160205260408120548015611a5c576000611997600183611f26565b85549091506000906119ab90600190611f26565b9050818114611a105760008660000182815481106119cb576119cb611f39565b90600052602060002001549050808760000184815481106119ee576119ee611f39565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611a2157611a21611f68565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506105be565b60009150506105be565b606081600001805480602002602001604051908101604052809291908181526020018280548015611ab657602002820191906000526020600020905b815481526020019060010190808311611aa2575b50505050509050919050565b6000818152600183016020526040812054611b09575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556105be565b5060006105be565b600060208284031215611b2357600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146109ea57600080fd5b6000815180845260005b81811015611b7957602081850181015186830182015201611b5d565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b6020815260006109ea6020830184611b53565b803573ffffffffffffffffffffffffffffffffffffffff81168114611bee57600080fd5b919050565b60008060408385031215611c0657600080fd5b611c0f83611bca565b946020939093013593505050565b600080600060608486031215611c3257600080fd5b611c3b84611bca565b9250611c4960208501611bca565b9150604084013590509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080600060608486031215611c9d57600080fd5b611ca684611bca565b925060208401359150604084013567ffffffffffffffff80821115611cca57600080fd5b818601915086601f830112611cde57600080fd5b813581811115611cf057611cf0611c59565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611d3657611d36611c59565b81604052828152896020848701011115611d4f57600080fd5b8260208601602083013760006020848301015280955050505050509250925092565b600060208284031215611d8357600080fd5b5035919050565b600060208284031215611d9c57600080fd5b6109ea82611bca565b6020808252825182820181905260009190848201906040850190845b81811015611df357835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101611dc1565b50909695505050505050565b60008060408385031215611e1257600080fd5b611e1b83611bca565b9150611e2960208401611bca565b90509250929050565b600181811c90821680611e4657607f821691505b602082108103611e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156105be576105be611e85565b828152604060208201526000611ee06040830184611b53565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000611f1d6060830184611b53565b95945050505050565b818103818111156105be576105be611e85565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000813000a", + ABI: "[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"decimals_\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"maxSupply_\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"supplyAfterMint\",\"type\":\"uint256\"}],\"name\":\"MaxSupplyExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SenderNotBurner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SenderNotMinter\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"}],\"name\":\"BurnAccessGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"}],\"name\":\"BurnAccessRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"MintAccessGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"MintAccessRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseApproval\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getBurners\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMinters\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"}],\"name\":\"grantBurnRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"burnAndMinter\",\"type\":\"address\"}],\"name\":\"grantMintAndBurnRoles\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"grantMintRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseApproval\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"}],\"name\":\"isBurner\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"isMinter\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"}],\"name\":\"revokeBurnRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"revokeMintRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"transferAndCall\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + Bin: "0x60c06040523480156200001157600080fd5b50604051620022dd380380620022dd833981016040819052620000349162000277565b338060008686818160036200004a838262000391565b50600462000059828262000391565b5050506001600160a01b0384169150620000bc90505760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600580546001600160a01b0319166001600160a01b0384811691909117909155811615620000ef57620000ef8162000106565b50505060ff90911660805260a052506200045d9050565b336001600160a01b03821603620001605760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401620000b3565b600680546001600160a01b0319166001600160a01b03838116918217909255600554604051919216907fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae127890600090a350565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001da57600080fd5b81516001600160401b0380821115620001f757620001f7620001b2565b604051601f8301601f19908116603f01168101908282118183101715620002225762000222620001b2565b816040528381526020925086838588010111156200023f57600080fd5b600091505b8382101562000263578582018301518183018401529082019062000244565b600093810190920192909252949350505050565b600080600080608085870312156200028e57600080fd5b84516001600160401b0380821115620002a657600080fd5b620002b488838901620001c8565b95506020870151915080821115620002cb57600080fd5b50620002da87828801620001c8565b935050604085015160ff81168114620002f257600080fd5b6060959095015193969295505050565b600181811c908216806200031757607f821691505b6020821081036200033857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200038c57600081815260208120601f850160051c81016020861015620003675750805b601f850160051c820191505b81811015620003885782815560010162000373565b5050505b505050565b81516001600160401b03811115620003ad57620003ad620001b2565b620003c581620003be845462000302565b846200033e565b602080601f831160018114620003fd5760008415620003e45750858301515b600019600386901b1c1916600185901b17855562000388565b600085815260208120601f198616915b828110156200042e578886015182559484019460019091019084016200040d565b50858210156200044d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a051611e4c6200049160003960008181610447015281816108c301526108ed015260006102710152611e4c6000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c806379cc67901161010f578063c2e3273d116100a2578063d73dd62311610071578063d73dd6231461046b578063dd62ed3e1461047e578063f2fde38b146104c4578063f81094f3146104d757600080fd5b8063c2e3273d1461040c578063c630948d1461041f578063c64d0ebc14610432578063d5abeb011461044557600080fd5b80639dc29fac116100de5780639dc29fac146103c0578063a457c2d7146103d3578063a9059cbb146103e6578063aa271e1a146103f957600080fd5b806379cc67901461037557806386fe8b43146103885780638da5cb5b1461039057806395d89b41146103b857600080fd5b806340c10f19116101875780636618846311610156578063661884631461030f5780636b32810b1461032257806370a082311461033757806379ba50971461036d57600080fd5b806340c10f19146102c157806342966c68146102d65780634334614a146102e95780634f5632f8146102fc57600080fd5b806323b872dd116101c357806323b872dd14610257578063313ce5671461026a578063395093511461029b5780634000aea0146102ae57600080fd5b806301ffc9a7146101f557806306fdde031461021d578063095ea7b31461023257806318160ddd14610245575b600080fd5b6102086102033660046119b9565b6104ea565b60405190151581526020015b60405180910390f35b61022561061b565b6040516102149190611a5f565b610208610240366004611a9b565b6106ad565b6002545b604051908152602001610214565b610208610265366004611ac5565b6106c5565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610214565b6102086102a9366004611a9b565b6106e9565b6102086102bc366004611b30565b610735565b6102d46102cf366004611a9b565b610858565b005b6102d46102e4366004611c19565b61097f565b6102086102f7366004611c32565b6109cc565b6102d461030a366004611c32565b6109d9565b61020861031d366004611a9b565b610a35565b61032a610a48565b6040516102149190611c4d565b610249610345366004611c32565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6102d4610a59565b6102d4610383366004611a9b565b610b5a565b61032a610ba9565b60055460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610214565b610225610bb5565b6102d46103ce366004611a9b565b610bc4565b6102086103e1366004611a9b565b610bce565b6102086103f4366004611a9b565b610c9f565b610208610407366004611c32565b610cad565b6102d461041a366004611c32565b610cba565b6102d461042d366004611c32565b610d16565b6102d4610440366004611c32565b610d24565b7f0000000000000000000000000000000000000000000000000000000000000000610249565b6102d4610479366004611a9b565b610d80565b61024961048c366004611ca7565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6102d46104d2366004611c32565b610d8a565b6102d46104e5366004611c32565b610d9b565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f36372b0700000000000000000000000000000000000000000000000000000000148061057d57507fffffffff0000000000000000000000000000000000000000000000000000000082167f4000aea000000000000000000000000000000000000000000000000000000000145b806105c957507fffffffff0000000000000000000000000000000000000000000000000000000082167fe6599b4d00000000000000000000000000000000000000000000000000000000145b8061061557507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b60606003805461062a90611cda565b80601f016020809104026020016040519081016040528092919081815260200182805461065690611cda565b80156106a35780601f10610678576101008083540402835291602001916106a3565b820191906000526020600020905b81548152906001019060200180831161068657829003601f168201915b5050505050905090565b6000336106bb818585610df7565b5060019392505050565b6000336106d3858285610e2b565b6106de858585610efc565b506001949350505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906106bb9082908690610730908790611d5c565b610df7565b60006107418484610c9f565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fe19260aff97b920c7df27010903aeb9c8d2be5d310a2c67824cf3f15396e4c1685856040516107a1929190611d6f565b60405180910390a373ffffffffffffffffffffffffffffffffffffffff84163b156106bb576040517fa4c0ed3600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063a4c0ed369061081c90339087908790600401611d90565b600060405180830381600087803b15801561083657600080fd5b505af115801561084a573d6000803e3d6000fd5b505050505060019392505050565b61086133610cad565b61089e576040517fe2c8c9d50000000000000000000000000000000000000000000000000000000081523360048201526024015b60405180910390fd5b813073ffffffffffffffffffffffffffffffffffffffff8216036108c157600080fd5b7f00000000000000000000000000000000000000000000000000000000000000001580159061092257507f00000000000000000000000000000000000000000000000000000000000000008261091660025490565b6109209190611d5c565b115b15610970578161093160025490565b61093b9190611d5c565b6040517fcbbf111300000000000000000000000000000000000000000000000000000000815260040161089591815260200190565b61097a8383610f2a565b505050565b610988336109cc565b6109c0576040517fc820b10b000000000000000000000000000000000000000000000000000000008152336004820152602401610895565b6109c98161101d565b50565b6000610615600983611027565b6109e1611056565b6109ec6009826110d9565b156109c95760405173ffffffffffffffffffffffffffffffffffffffff8216907f0a675452746933cefe3d74182e78db7afe57ba60eaa4234b5d85e9aa41b0610c90600090a250565b6000610a418383610bce565b9392505050565b6060610a5460076110fb565b905090565b60065473ffffffffffffffffffffffffffffffffffffffff163314610ada576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610895565b600580547fffffffffffffffffffffffff00000000000000000000000000000000000000008082163390811790935560068054909116905560405173ffffffffffffffffffffffffffffffffffffffff909116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b610b63336109cc565b610b9b576040517fc820b10b000000000000000000000000000000000000000000000000000000008152336004820152602401610895565b610ba58282611108565b5050565b6060610a5460096110fb565b60606004805461062a90611cda565b610ba58282610b5a565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610c92576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610895565b6106de8286868403610df7565b6000336106bb818585610efc565b6000610615600783611027565b610cc2611056565b610ccd60078261111d565b156109c95760405173ffffffffffffffffffffffffffffffffffffffff8216907fe46fef8bbff1389d9010703cf8ebb363fb3daf5bf56edc27080b67bc8d9251ea90600090a250565b610d1f81610cba565b6109c9815b610d2c611056565b610d3760098261111d565b156109c95760405173ffffffffffffffffffffffffffffffffffffffff8216907f92308bb7573b2a3d17ddb868b39d8ebec433f3194421abc22d084f89658c9bad90600090a250565b61097a82826106e9565b610d92611056565b6109c98161113f565b610da3611056565b610dae6007826110d9565b156109c95760405173ffffffffffffffffffffffffffffffffffffffff8216907fed998b960f6340d045f620c119730f7aa7995e7425c2401d3a5b64ff998a59e990600090a250565b813073ffffffffffffffffffffffffffffffffffffffff821603610e1a57600080fd5b610e25848484611235565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610e255781811015610eef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610895565b610e258484848403610df7565b813073ffffffffffffffffffffffffffffffffffffffff821603610f1f57600080fd5b610e258484846113e8565b73ffffffffffffffffffffffffffffffffffffffff8216610fa7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610895565b8060026000828254610fb99190611d5c565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6109c93382611657565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001830160205260408120541515610a41565b60055473ffffffffffffffffffffffffffffffffffffffff1633146110d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610895565b565b6000610a418373ffffffffffffffffffffffffffffffffffffffff841661181b565b60606000610a418361190e565b611113823383610e2b565b610ba58282611657565b6000610a418373ffffffffffffffffffffffffffffffffffffffff841661196a565b3373ffffffffffffffffffffffffffffffffffffffff8216036111be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610895565b600680547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff838116918217909255600554604051919216907fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae127890600090a350565b73ffffffffffffffffffffffffffffffffffffffff83166112d7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff821661137a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff831661148b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff821661152e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040902054818110156115e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610e25565b73ffffffffffffffffffffffffffffffffffffffff82166116fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040902054818110156117b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b6000818152600183016020526040812054801561190457600061183f600183611dce565b855490915060009061185390600190611dce565b90508181146118b857600086600001828154811061187357611873611de1565b906000526020600020015490508087600001848154811061189657611896611de1565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806118c9576118c9611e10565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610615565b6000915050610615565b60608160000180548060200260200160405190810160405280929190818152602001828054801561195e57602002820191906000526020600020905b81548152602001906001019080831161194a575b50505050509050919050565b60008181526001830160205260408120546119b157508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610615565b506000610615565b6000602082840312156119cb57600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610a4157600080fd5b6000815180845260005b81811015611a2157602081850181015186830182015201611a05565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081526000610a4160208301846119fb565b803573ffffffffffffffffffffffffffffffffffffffff81168114611a9657600080fd5b919050565b60008060408385031215611aae57600080fd5b611ab783611a72565b946020939093013593505050565b600080600060608486031215611ada57600080fd5b611ae384611a72565b9250611af160208501611a72565b9150604084013590509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080600060608486031215611b4557600080fd5b611b4e84611a72565b925060208401359150604084013567ffffffffffffffff80821115611b7257600080fd5b818601915086601f830112611b8657600080fd5b813581811115611b9857611b98611b01565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611bde57611bde611b01565b81604052828152896020848701011115611bf757600080fd5b8260208601602083013760006020848301015280955050505050509250925092565b600060208284031215611c2b57600080fd5b5035919050565b600060208284031215611c4457600080fd5b610a4182611a72565b6020808252825182820181905260009190848201906040850190845b81811015611c9b57835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101611c69565b50909695505050505050565b60008060408385031215611cba57600080fd5b611cc383611a72565b9150611cd160208401611a72565b90509250929050565b600181811c90821680611cee57607f821691505b602082108103611d27577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561061557610615611d2d565b828152604060208201526000611d8860408301846119fb565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000611dc560608301846119fb565b95945050505050565b8181038181111561061557610615611d2d565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000813000a", } var BurnMintERC677ABI = BurnMintERC677MetaData.ABI @@ -259,28 +259,6 @@ func (_BurnMintERC677 *BurnMintERC677CallerSession) GetBurners() ([]common.Addre return _BurnMintERC677.Contract.GetBurners(&_BurnMintERC677.CallOpts) } -func (_BurnMintERC677 *BurnMintERC677Caller) GetCCIPAdmin(opts *bind.CallOpts) (common.Address, error) { - var out []interface{} - err := _BurnMintERC677.contract.Call(opts, &out, "getCCIPAdmin") - - if err != nil { - return *new(common.Address), err - } - - out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) - - return out0, err - -} - -func (_BurnMintERC677 *BurnMintERC677Session) GetCCIPAdmin() (common.Address, error) { - return _BurnMintERC677.Contract.GetCCIPAdmin(&_BurnMintERC677.CallOpts) -} - -func (_BurnMintERC677 *BurnMintERC677CallerSession) GetCCIPAdmin() (common.Address, error) { - return _BurnMintERC677.Contract.GetCCIPAdmin(&_BurnMintERC677.CallOpts) -} - func (_BurnMintERC677 *BurnMintERC677Caller) GetMinters(opts *bind.CallOpts) ([]common.Address, error) { var out []interface{} err := _BurnMintERC677.contract.Call(opts, &out, "getMinters") @@ -659,18 +637,6 @@ func (_BurnMintERC677 *BurnMintERC677TransactorSession) RevokeMintRole(minter co return _BurnMintERC677.Contract.RevokeMintRole(&_BurnMintERC677.TransactOpts, minter) } -func (_BurnMintERC677 *BurnMintERC677Transactor) SetCCIPAdmin(opts *bind.TransactOpts, newAdmin common.Address) (*types.Transaction, error) { - return _BurnMintERC677.contract.Transact(opts, "setCCIPAdmin", newAdmin) -} - -func (_BurnMintERC677 *BurnMintERC677Session) SetCCIPAdmin(newAdmin common.Address) (*types.Transaction, error) { - return _BurnMintERC677.Contract.SetCCIPAdmin(&_BurnMintERC677.TransactOpts, newAdmin) -} - -func (_BurnMintERC677 *BurnMintERC677TransactorSession) SetCCIPAdmin(newAdmin common.Address) (*types.Transaction, error) { - return _BurnMintERC677.Contract.SetCCIPAdmin(&_BurnMintERC677.TransactOpts, newAdmin) -} - func (_BurnMintERC677 *BurnMintERC677Transactor) Transfer(opts *bind.TransactOpts, to common.Address, amount *big.Int) (*types.Transaction, error) { return _BurnMintERC677.contract.Transact(opts, "transfer", to, amount) } @@ -1110,142 +1076,6 @@ func (_BurnMintERC677 *BurnMintERC677Filterer) ParseBurnAccessRevoked(log types. return event, nil } -type BurnMintERC677CCIPAdminTransferredIterator struct { - Event *BurnMintERC677CCIPAdminTransferred - - contract *bind.BoundContract - event string - - logs chan types.Log - sub ethereum.Subscription - done bool - fail error -} - -func (it *BurnMintERC677CCIPAdminTransferredIterator) Next() bool { - - if it.fail != nil { - return false - } - - if it.done { - select { - case log := <-it.logs: - it.Event = new(BurnMintERC677CCIPAdminTransferred) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - - select { - case log := <-it.logs: - it.Event = new(BurnMintERC677CCIPAdminTransferred) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -func (it *BurnMintERC677CCIPAdminTransferredIterator) Error() error { - return it.fail -} - -func (it *BurnMintERC677CCIPAdminTransferredIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -type BurnMintERC677CCIPAdminTransferred struct { - PreviousAdmin common.Address - NewAdmin common.Address - Raw types.Log -} - -func (_BurnMintERC677 *BurnMintERC677Filterer) FilterCCIPAdminTransferred(opts *bind.FilterOpts, previousAdmin []common.Address, newAdmin []common.Address) (*BurnMintERC677CCIPAdminTransferredIterator, error) { - - var previousAdminRule []interface{} - for _, previousAdminItem := range previousAdmin { - previousAdminRule = append(previousAdminRule, previousAdminItem) - } - var newAdminRule []interface{} - for _, newAdminItem := range newAdmin { - newAdminRule = append(newAdminRule, newAdminItem) - } - - logs, sub, err := _BurnMintERC677.contract.FilterLogs(opts, "CCIPAdminTransferred", previousAdminRule, newAdminRule) - if err != nil { - return nil, err - } - return &BurnMintERC677CCIPAdminTransferredIterator{contract: _BurnMintERC677.contract, event: "CCIPAdminTransferred", logs: logs, sub: sub}, nil -} - -func (_BurnMintERC677 *BurnMintERC677Filterer) WatchCCIPAdminTransferred(opts *bind.WatchOpts, sink chan<- *BurnMintERC677CCIPAdminTransferred, previousAdmin []common.Address, newAdmin []common.Address) (event.Subscription, error) { - - var previousAdminRule []interface{} - for _, previousAdminItem := range previousAdmin { - previousAdminRule = append(previousAdminRule, previousAdminItem) - } - var newAdminRule []interface{} - for _, newAdminItem := range newAdmin { - newAdminRule = append(newAdminRule, newAdminItem) - } - - logs, sub, err := _BurnMintERC677.contract.WatchLogs(opts, "CCIPAdminTransferred", previousAdminRule, newAdminRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - - event := new(BurnMintERC677CCIPAdminTransferred) - if err := _BurnMintERC677.contract.UnpackLog(event, "CCIPAdminTransferred", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -func (_BurnMintERC677 *BurnMintERC677Filterer) ParseCCIPAdminTransferred(log types.Log) (*BurnMintERC677CCIPAdminTransferred, error) { - event := new(BurnMintERC677CCIPAdminTransferred) - if err := _BurnMintERC677.contract.UnpackLog(event, "CCIPAdminTransferred", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - type BurnMintERC677MintAccessGrantedIterator struct { Event *BurnMintERC677MintAccessGranted @@ -1836,7 +1666,6 @@ type BurnMintERC677Transfer struct { From common.Address To common.Address Value *big.Int - Data []byte Raw types.Log } @@ -1974,6 +1803,7 @@ type BurnMintERC677Transfer0 struct { From common.Address To common.Address Value *big.Int + Data []byte Raw types.Log } @@ -2055,8 +1885,6 @@ func (_BurnMintERC677 *BurnMintERC677) ParseLog(log types.Log) (generated.Abigen return _BurnMintERC677.ParseBurnAccessGranted(log) case _BurnMintERC677.abi.Events["BurnAccessRevoked"].ID: return _BurnMintERC677.ParseBurnAccessRevoked(log) - case _BurnMintERC677.abi.Events["CCIPAdminTransferred"].ID: - return _BurnMintERC677.ParseCCIPAdminTransferred(log) case _BurnMintERC677.abi.Events["MintAccessGranted"].ID: return _BurnMintERC677.ParseMintAccessGranted(log) case _BurnMintERC677.abi.Events["MintAccessRevoked"].ID: @@ -2087,10 +1915,6 @@ func (BurnMintERC677BurnAccessRevoked) Topic() common.Hash { return common.HexToHash("0x0a675452746933cefe3d74182e78db7afe57ba60eaa4234b5d85e9aa41b0610c") } -func (BurnMintERC677CCIPAdminTransferred) Topic() common.Hash { - return common.HexToHash("0x9524c9e4b0b61eb018dd58a1cd856e3e74009528328ab4a613b434fa631d7242") -} - func (BurnMintERC677MintAccessGranted) Topic() common.Hash { return common.HexToHash("0xe46fef8bbff1389d9010703cf8ebb363fb3daf5bf56edc27080b67bc8d9251ea") } @@ -2108,11 +1932,11 @@ func (BurnMintERC677OwnershipTransferred) Topic() common.Hash { } func (BurnMintERC677Transfer) Topic() common.Hash { - return common.HexToHash("0xe19260aff97b920c7df27010903aeb9c8d2be5d310a2c67824cf3f15396e4c16") + return common.HexToHash("0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef") } func (BurnMintERC677Transfer0) Topic() common.Hash { - return common.HexToHash("0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef") + return common.HexToHash("0xe19260aff97b920c7df27010903aeb9c8d2be5d310a2c67824cf3f15396e4c16") } func (_BurnMintERC677 *BurnMintERC677) Address() common.Address { @@ -2128,8 +1952,6 @@ type BurnMintERC677Interface interface { GetBurners(opts *bind.CallOpts) ([]common.Address, error) - GetCCIPAdmin(opts *bind.CallOpts) (common.Address, error) - GetMinters(opts *bind.CallOpts) ([]common.Address, error) IsBurner(opts *bind.CallOpts, burner common.Address) (bool, error) @@ -2178,8 +2000,6 @@ type BurnMintERC677Interface interface { RevokeMintRole(opts *bind.TransactOpts, minter common.Address) (*types.Transaction, error) - SetCCIPAdmin(opts *bind.TransactOpts, newAdmin common.Address) (*types.Transaction, error) - Transfer(opts *bind.TransactOpts, to common.Address, amount *big.Int) (*types.Transaction, error) TransferAndCall(opts *bind.TransactOpts, to common.Address, amount *big.Int, data []byte) (*types.Transaction, error) @@ -2206,12 +2026,6 @@ type BurnMintERC677Interface interface { ParseBurnAccessRevoked(log types.Log) (*BurnMintERC677BurnAccessRevoked, error) - FilterCCIPAdminTransferred(opts *bind.FilterOpts, previousAdmin []common.Address, newAdmin []common.Address) (*BurnMintERC677CCIPAdminTransferredIterator, error) - - WatchCCIPAdminTransferred(opts *bind.WatchOpts, sink chan<- *BurnMintERC677CCIPAdminTransferred, previousAdmin []common.Address, newAdmin []common.Address) (event.Subscription, error) - - ParseCCIPAdminTransferred(log types.Log) (*BurnMintERC677CCIPAdminTransferred, error) - FilterMintAccessGranted(opts *bind.FilterOpts, minter []common.Address) (*BurnMintERC677MintAccessGrantedIterator, error) WatchMintAccessGranted(opts *bind.WatchOpts, sink chan<- *BurnMintERC677MintAccessGranted, minter []common.Address) (event.Subscription, error) diff --git a/core/gethwrappers/shared/generated/link_token/link_token.go b/core/gethwrappers/shared/generated/link_token/link_token.go index bf1eb903a7..1467680626 100644 --- a/core/gethwrappers/shared/generated/link_token/link_token.go +++ b/core/gethwrappers/shared/generated/link_token/link_token.go @@ -31,8 +31,8 @@ var ( ) var LinkTokenMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"supplyAfterMint\",\"type\":\"uint256\"}],\"name\":\"MaxSupplyExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SenderNotBurner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SenderNotMinter\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"}],\"name\":\"BurnAccessGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"}],\"name\":\"BurnAccessRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousAdmin\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"CCIPAdminTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"MintAccessGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"MintAccessRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseApproval\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getBurners\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCCIPAdmin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMinters\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"}],\"name\":\"grantBurnRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"burnAndMinter\",\"type\":\"address\"}],\"name\":\"grantMintAndBurnRoles\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"grantMintRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseApproval\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"}],\"name\":\"isBurner\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"isMinter\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"}],\"name\":\"revokeBurnRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"revokeMintRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"setCCIPAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"transferAndCall\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x60c06040523480156200001157600080fd5b506040518060400160405280600f81526020016e21b430b4b72634b735902a37b5b2b760891b815250604051806040016040528060048152602001634c494e4b60e01b81525060126b033b2e3c9fd0803ce8000000838383833380600086868160039081620000819190620002a0565b506004620000908282620002a0565b5050506001600160a01b038216620000ef5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600580546001600160a01b0319166001600160a01b0384811691909117909155811615620001225762000122816200014f565b50505060ff90911660805260a0525050600780546001600160a01b03191633179055506200036c92505050565b336001600160a01b03821603620001a95760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401620000e6565b600680546001600160a01b0319166001600160a01b03838116918217909255600554604051919216907fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae127890600090a350565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200022657607f821691505b6020821081036200024757634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200029b57600081815260208120601f850160051c81016020861015620002765750805b601f850160051c820191505b81811015620002975782815560010162000282565b5050505b505050565b81516001600160401b03811115620002bc57620002bc620001fb565b620002d481620002cd845462000211565b846200024d565b602080601f8311600181146200030c5760008415620002f35750858301515b600019600386901b1c1916600185901b17855562000297565b600085815260208120601f198616915b828110156200033d578886015182559484019460019091019084016200031c565b50858210156200035c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a051611fa4620003a0600039600081816104c50152818161086c0152610896015260006102a70152611fa46000f3fe608060405234801561001057600080fd5b50600436106102265760003560e01c806386fe8b431161012a578063aa271e1a116100bd578063d5abeb011161008c578063dd62ed3e11610071578063dd62ed3e146104fc578063f2fde38b14610542578063f81094f31461055557600080fd5b8063d5abeb01146104c3578063d73dd623146104e957600080fd5b8063aa271e1a14610477578063c2e3273d1461048a578063c630948d1461049d578063c64d0ebc146104b057600080fd5b80639dc29fac116100f95780639dc29fac1461042b578063a457c2d71461043e578063a8fa343c14610451578063a9059cbb1461046457600080fd5b806386fe8b43146103be5780638da5cb5b146103c65780638fd6a6ac1461040557806395d89b411461042357600080fd5b806340c10f19116101bd578063661884631161018c57806370a082311161017157806370a082311461036d57806379ba5097146103a357806379cc6790146103ab57600080fd5b806366188463146103455780636b32810b1461035857600080fd5b806340c10f19146102f757806342966c681461030c5780634334614a1461031f5780634f5632f81461033257600080fd5b806323b872dd116101f957806323b872dd1461028d578063313ce567146102a057806339509351146102d15780634000aea0146102e457600080fd5b806301ffc9a71461022b57806306fdde0314610253578063095ea7b31461026857806318160ddd1461027b575b600080fd5b61023e610239366004611b11565b610568565b60405190151581526020015b60405180910390f35b61025b6105c4565b60405161024a9190611bb7565b61023e610276366004611bf3565b610656565b6002545b60405190815260200161024a565b61023e61029b366004611c1d565b61066e565b60405160ff7f000000000000000000000000000000000000000000000000000000000000000016815260200161024a565b61023e6102df366004611bf3565b610692565b61023e6102f2366004611c88565b6106de565b61030a610305366004611bf3565b610801565b005b61030a61031a366004611d71565b610928565b61023e61032d366004611d8a565b610975565b61030a610340366004611d8a565b610982565b61023e610353366004611bf3565b6109de565b6103606109f1565b60405161024a9190611da5565b61027f61037b366004611d8a565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b61030a610a02565b61030a6103b9366004611bf3565b610b03565b610360610b52565b60055473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161024a565b60075473ffffffffffffffffffffffffffffffffffffffff166103e0565b61025b610b5e565b61030a610439366004611bf3565b610b6d565b61023e61044c366004611bf3565b610b77565b61030a61045f366004611d8a565b610c48565b61023e610472366004611bf3565b610cc7565b61023e610485366004611d8a565b610cd5565b61030a610498366004611d8a565b610ce2565b61030a6104ab366004611d8a565b610d3e565b61030a6104be366004611d8a565b610d4c565b7f000000000000000000000000000000000000000000000000000000000000000061027f565b61030a6104f7366004611bf3565b610da8565b61027f61050a366004611dff565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b61030a610550366004611d8a565b610db2565b61030a610563366004611d8a565b610dc3565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f4000aea00000000000000000000000000000000000000000000000000000000014806105be57506105be82610e1f565b92915050565b6060600380546105d390611e32565b80601f01602080910402602001604051908101604052809291908181526020018280546105ff90611e32565b801561064c5780601f106106215761010080835404028352916020019161064c565b820191906000526020600020905b81548152906001019060200180831161062f57829003601f168201915b5050505050905090565b600033610664818585610f4f565b5060019392505050565b60003361067c858285610f83565b610687858585611054565b506001949350505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919061066490829086906106d9908790611eb4565b610f4f565b60006106ea8484610cc7565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fe19260aff97b920c7df27010903aeb9c8d2be5d310a2c67824cf3f15396e4c16858560405161074a929190611ec7565b60405180910390a373ffffffffffffffffffffffffffffffffffffffff84163b15610664576040517fa4c0ed3600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063a4c0ed36906107c590339087908790600401611ee8565b600060405180830381600087803b1580156107df57600080fd5b505af11580156107f3573d6000803e3d6000fd5b505050505060019392505050565b61080a33610cd5565b610847576040517fe2c8c9d50000000000000000000000000000000000000000000000000000000081523360048201526024015b60405180910390fd5b813073ffffffffffffffffffffffffffffffffffffffff82160361086a57600080fd5b7f0000000000000000000000000000000000000000000000000000000000000000158015906108cb57507f0000000000000000000000000000000000000000000000000000000000000000826108bf60025490565b6108c99190611eb4565b115b1561091957816108da60025490565b6108e49190611eb4565b6040517fcbbf111300000000000000000000000000000000000000000000000000000000815260040161083e91815260200190565b6109238383611082565b505050565b61093133610975565b610969576040517fc820b10b00000000000000000000000000000000000000000000000000000000815233600482015260240161083e565b61097281611175565b50565b60006105be600a8361117f565b61098a6111ae565b610995600a82611231565b156109725760405173ffffffffffffffffffffffffffffffffffffffff8216907f0a675452746933cefe3d74182e78db7afe57ba60eaa4234b5d85e9aa41b0610c90600090a250565b60006109ea8383610b77565b9392505050565b60606109fd6008611253565b905090565b60065473ffffffffffffffffffffffffffffffffffffffff163314610a83576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e657200000000000000000000604482015260640161083e565b600580547fffffffffffffffffffffffff00000000000000000000000000000000000000008082163390811790935560068054909116905560405173ffffffffffffffffffffffffffffffffffffffff909116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b610b0c33610975565b610b44576040517fc820b10b00000000000000000000000000000000000000000000000000000000815233600482015260240161083e565b610b4e8282611260565b5050565b60606109fd600a611253565b6060600480546105d390611e32565b610b4e8282610b03565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610c3b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f000000000000000000000000000000000000000000000000000000606482015260840161083e565b6106878286868403610f4f565b610c506111ae565b6007805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f9524c9e4b0b61eb018dd58a1cd856e3e74009528328ab4a613b434fa631d724290600090a35050565b600033610664818585611054565b60006105be60088361117f565b610cea6111ae565b610cf5600882611275565b156109725760405173ffffffffffffffffffffffffffffffffffffffff8216907fe46fef8bbff1389d9010703cf8ebb363fb3daf5bf56edc27080b67bc8d9251ea90600090a250565b610d4781610ce2565b610972815b610d546111ae565b610d5f600a82611275565b156109725760405173ffffffffffffffffffffffffffffffffffffffff8216907f92308bb7573b2a3d17ddb868b39d8ebec433f3194421abc22d084f89658c9bad90600090a250565b6109238282610692565b610dba6111ae565b61097281611297565b610dcb6111ae565b610dd6600882611231565b156109725760405173ffffffffffffffffffffffffffffffffffffffff8216907fed998b960f6340d045f620c119730f7aa7995e7425c2401d3a5b64ff998a59e990600090a250565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f36372b07000000000000000000000000000000000000000000000000000000001480610eb257507fffffffff0000000000000000000000000000000000000000000000000000000082167fe6599b4d00000000000000000000000000000000000000000000000000000000145b80610efe57507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b806105be57507fffffffff0000000000000000000000000000000000000000000000000000000082167f06e27847000000000000000000000000000000000000000000000000000000001492915050565b813073ffffffffffffffffffffffffffffffffffffffff821603610f7257600080fd5b610f7d84848461138d565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610f7d5781811015611047576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161083e565b610f7d8484848403610f4f565b813073ffffffffffffffffffffffffffffffffffffffff82160361107757600080fd5b610f7d848484611540565b73ffffffffffffffffffffffffffffffffffffffff82166110ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161083e565b80600260008282546111119190611eb4565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b61097233826117af565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260018301602052604081205415156109ea565b60055473ffffffffffffffffffffffffffffffffffffffff16331461122f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015260640161083e565b565b60006109ea8373ffffffffffffffffffffffffffffffffffffffff8416611973565b606060006109ea83611a66565b61126b823383610f83565b610b4e82826117af565b60006109ea8373ffffffffffffffffffffffffffffffffffffffff8416611ac2565b3373ffffffffffffffffffffffffffffffffffffffff821603611316576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640161083e565b600680547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff838116918217909255600554604051919216907fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae127890600090a350565b73ffffffffffffffffffffffffffffffffffffffff831661142f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161083e565b73ffffffffffffffffffffffffffffffffffffffff82166114d2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f7373000000000000000000000000000000000000000000000000000000000000606482015260840161083e565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff83166115e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161083e565b73ffffffffffffffffffffffffffffffffffffffff8216611686576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161083e565b73ffffffffffffffffffffffffffffffffffffffff83166000908152602081905260409020548181101561173c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e63650000000000000000000000000000000000000000000000000000606482015260840161083e565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610f7d565b73ffffffffffffffffffffffffffffffffffffffff8216611852576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161083e565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015611908576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f6365000000000000000000000000000000000000000000000000000000000000606482015260840161083e565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b60008181526001830160205260408120548015611a5c576000611997600183611f26565b85549091506000906119ab90600190611f26565b9050818114611a105760008660000182815481106119cb576119cb611f39565b90600052602060002001549050808760000184815481106119ee576119ee611f39565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611a2157611a21611f68565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506105be565b60009150506105be565b606081600001805480602002602001604051908101604052809291908181526020018280548015611ab657602002820191906000526020600020905b815481526020019060010190808311611aa2575b50505050509050919050565b6000818152600183016020526040812054611b09575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556105be565b5060006105be565b600060208284031215611b2357600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146109ea57600080fd5b6000815180845260005b81811015611b7957602081850181015186830182015201611b5d565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b6020815260006109ea6020830184611b53565b803573ffffffffffffffffffffffffffffffffffffffff81168114611bee57600080fd5b919050565b60008060408385031215611c0657600080fd5b611c0f83611bca565b946020939093013593505050565b600080600060608486031215611c3257600080fd5b611c3b84611bca565b9250611c4960208501611bca565b9150604084013590509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080600060608486031215611c9d57600080fd5b611ca684611bca565b925060208401359150604084013567ffffffffffffffff80821115611cca57600080fd5b818601915086601f830112611cde57600080fd5b813581811115611cf057611cf0611c59565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611d3657611d36611c59565b81604052828152896020848701011115611d4f57600080fd5b8260208601602083013760006020848301015280955050505050509250925092565b600060208284031215611d8357600080fd5b5035919050565b600060208284031215611d9c57600080fd5b6109ea82611bca565b6020808252825182820181905260009190848201906040850190845b81811015611df357835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101611dc1565b50909695505050505050565b60008060408385031215611e1257600080fd5b611e1b83611bca565b9150611e2960208401611bca565b90509250929050565b600181811c90821680611e4657607f821691505b602082108103611e7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156105be576105be611e85565b828152604060208201526000611ee06040830184611b53565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000611f1d6060830184611b53565b95945050505050565b818103818111156105be576105be611e85565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000813000a", + ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"supplyAfterMint\",\"type\":\"uint256\"}],\"name\":\"MaxSupplyExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SenderNotBurner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SenderNotMinter\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"}],\"name\":\"BurnAccessGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"}],\"name\":\"BurnAccessRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"MintAccessGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"MintAccessRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseApproval\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getBurners\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMinters\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"}],\"name\":\"grantBurnRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"burnAndMinter\",\"type\":\"address\"}],\"name\":\"grantMintAndBurnRoles\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"grantMintRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseApproval\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"}],\"name\":\"isBurner\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"isMinter\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"}],\"name\":\"revokeBurnRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"revokeMintRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"transferAndCall\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + Bin: "0x60c06040523480156200001157600080fd5b506040518060400160405280600f81526020016e21b430b4b72634b735902a37b5b2b760891b815250604051806040016040528060048152602001634c494e4b60e01b81525060126b033b2e3c9fd0803ce8000000338060008686818181600390816200007f91906200028c565b5060046200008e82826200028c565b5050506001600160a01b0384169150620000f190505760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600580546001600160a01b0319166001600160a01b0384811691909117909155811615620001245762000124816200013b565b50505060ff90911660805260a05250620003589050565b336001600160a01b03821603620001955760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401620000e8565b600680546001600160a01b0319166001600160a01b03838116918217909255600554604051919216907fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae127890600090a350565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200021257607f821691505b6020821081036200023357634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200028757600081815260208120601f850160051c81016020861015620002625750805b601f850160051c820191505b8181101562000283578281556001016200026e565b5050505b505050565b81516001600160401b03811115620002a857620002a8620001e7565b620002c081620002b98454620001fd565b8462000239565b602080601f831160018114620002f85760008415620002df5750858301515b600019600386901b1c1916600185901b17855562000283565b600085815260208120601f198616915b82811015620003295788860151825594840194600190910190840162000308565b5085821015620003485787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a051611e4c6200038c60003960008181610447015281816108c301526108ed015260006102710152611e4c6000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c806379cc67901161010f578063c2e3273d116100a2578063d73dd62311610071578063d73dd6231461046b578063dd62ed3e1461047e578063f2fde38b146104c4578063f81094f3146104d757600080fd5b8063c2e3273d1461040c578063c630948d1461041f578063c64d0ebc14610432578063d5abeb011461044557600080fd5b80639dc29fac116100de5780639dc29fac146103c0578063a457c2d7146103d3578063a9059cbb146103e6578063aa271e1a146103f957600080fd5b806379cc67901461037557806386fe8b43146103885780638da5cb5b1461039057806395d89b41146103b857600080fd5b806340c10f19116101875780636618846311610156578063661884631461030f5780636b32810b1461032257806370a082311461033757806379ba50971461036d57600080fd5b806340c10f19146102c157806342966c68146102d65780634334614a146102e95780634f5632f8146102fc57600080fd5b806323b872dd116101c357806323b872dd14610257578063313ce5671461026a578063395093511461029b5780634000aea0146102ae57600080fd5b806301ffc9a7146101f557806306fdde031461021d578063095ea7b31461023257806318160ddd14610245575b600080fd5b6102086102033660046119b9565b6104ea565b60405190151581526020015b60405180910390f35b61022561061b565b6040516102149190611a5f565b610208610240366004611a9b565b6106ad565b6002545b604051908152602001610214565b610208610265366004611ac5565b6106c5565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610214565b6102086102a9366004611a9b565b6106e9565b6102086102bc366004611b30565b610735565b6102d46102cf366004611a9b565b610858565b005b6102d46102e4366004611c19565b61097f565b6102086102f7366004611c32565b6109cc565b6102d461030a366004611c32565b6109d9565b61020861031d366004611a9b565b610a35565b61032a610a48565b6040516102149190611c4d565b610249610345366004611c32565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6102d4610a59565b6102d4610383366004611a9b565b610b5a565b61032a610ba9565b60055460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610214565b610225610bb5565b6102d46103ce366004611a9b565b610bc4565b6102086103e1366004611a9b565b610bce565b6102086103f4366004611a9b565b610c9f565b610208610407366004611c32565b610cad565b6102d461041a366004611c32565b610cba565b6102d461042d366004611c32565b610d16565b6102d4610440366004611c32565b610d24565b7f0000000000000000000000000000000000000000000000000000000000000000610249565b6102d4610479366004611a9b565b610d80565b61024961048c366004611ca7565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6102d46104d2366004611c32565b610d8a565b6102d46104e5366004611c32565b610d9b565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f36372b0700000000000000000000000000000000000000000000000000000000148061057d57507fffffffff0000000000000000000000000000000000000000000000000000000082167f4000aea000000000000000000000000000000000000000000000000000000000145b806105c957507fffffffff0000000000000000000000000000000000000000000000000000000082167fe6599b4d00000000000000000000000000000000000000000000000000000000145b8061061557507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b60606003805461062a90611cda565b80601f016020809104026020016040519081016040528092919081815260200182805461065690611cda565b80156106a35780601f10610678576101008083540402835291602001916106a3565b820191906000526020600020905b81548152906001019060200180831161068657829003601f168201915b5050505050905090565b6000336106bb818585610df7565b5060019392505050565b6000336106d3858285610e2b565b6106de858585610efc565b506001949350505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906106bb9082908690610730908790611d5c565b610df7565b60006107418484610c9f565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fe19260aff97b920c7df27010903aeb9c8d2be5d310a2c67824cf3f15396e4c1685856040516107a1929190611d6f565b60405180910390a373ffffffffffffffffffffffffffffffffffffffff84163b156106bb576040517fa4c0ed3600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063a4c0ed369061081c90339087908790600401611d90565b600060405180830381600087803b15801561083657600080fd5b505af115801561084a573d6000803e3d6000fd5b505050505060019392505050565b61086133610cad565b61089e576040517fe2c8c9d50000000000000000000000000000000000000000000000000000000081523360048201526024015b60405180910390fd5b813073ffffffffffffffffffffffffffffffffffffffff8216036108c157600080fd5b7f00000000000000000000000000000000000000000000000000000000000000001580159061092257507f00000000000000000000000000000000000000000000000000000000000000008261091660025490565b6109209190611d5c565b115b15610970578161093160025490565b61093b9190611d5c565b6040517fcbbf111300000000000000000000000000000000000000000000000000000000815260040161089591815260200190565b61097a8383610f2a565b505050565b610988336109cc565b6109c0576040517fc820b10b000000000000000000000000000000000000000000000000000000008152336004820152602401610895565b6109c98161101d565b50565b6000610615600983611027565b6109e1611056565b6109ec6009826110d9565b156109c95760405173ffffffffffffffffffffffffffffffffffffffff8216907f0a675452746933cefe3d74182e78db7afe57ba60eaa4234b5d85e9aa41b0610c90600090a250565b6000610a418383610bce565b9392505050565b6060610a5460076110fb565b905090565b60065473ffffffffffffffffffffffffffffffffffffffff163314610ada576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610895565b600580547fffffffffffffffffffffffff00000000000000000000000000000000000000008082163390811790935560068054909116905560405173ffffffffffffffffffffffffffffffffffffffff909116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b610b63336109cc565b610b9b576040517fc820b10b000000000000000000000000000000000000000000000000000000008152336004820152602401610895565b610ba58282611108565b5050565b6060610a5460096110fb565b60606004805461062a90611cda565b610ba58282610b5a565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610c92576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610895565b6106de8286868403610df7565b6000336106bb818585610efc565b6000610615600783611027565b610cc2611056565b610ccd60078261111d565b156109c95760405173ffffffffffffffffffffffffffffffffffffffff8216907fe46fef8bbff1389d9010703cf8ebb363fb3daf5bf56edc27080b67bc8d9251ea90600090a250565b610d1f81610cba565b6109c9815b610d2c611056565b610d3760098261111d565b156109c95760405173ffffffffffffffffffffffffffffffffffffffff8216907f92308bb7573b2a3d17ddb868b39d8ebec433f3194421abc22d084f89658c9bad90600090a250565b61097a82826106e9565b610d92611056565b6109c98161113f565b610da3611056565b610dae6007826110d9565b156109c95760405173ffffffffffffffffffffffffffffffffffffffff8216907fed998b960f6340d045f620c119730f7aa7995e7425c2401d3a5b64ff998a59e990600090a250565b813073ffffffffffffffffffffffffffffffffffffffff821603610e1a57600080fd5b610e25848484611235565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610e255781811015610eef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610895565b610e258484848403610df7565b813073ffffffffffffffffffffffffffffffffffffffff821603610f1f57600080fd5b610e258484846113e8565b73ffffffffffffffffffffffffffffffffffffffff8216610fa7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610895565b8060026000828254610fb99190611d5c565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6109c93382611657565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001830160205260408120541515610a41565b60055473ffffffffffffffffffffffffffffffffffffffff1633146110d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610895565b565b6000610a418373ffffffffffffffffffffffffffffffffffffffff841661181b565b60606000610a418361190e565b611113823383610e2b565b610ba58282611657565b6000610a418373ffffffffffffffffffffffffffffffffffffffff841661196a565b3373ffffffffffffffffffffffffffffffffffffffff8216036111be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610895565b600680547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff838116918217909255600554604051919216907fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae127890600090a350565b73ffffffffffffffffffffffffffffffffffffffff83166112d7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff821661137a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff831661148b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff821661152e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040902054818110156115e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610e25565b73ffffffffffffffffffffffffffffffffffffffff82166116fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040902054818110156117b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b6000818152600183016020526040812054801561190457600061183f600183611dce565b855490915060009061185390600190611dce565b90508181146118b857600086600001828154811061187357611873611de1565b906000526020600020015490508087600001848154811061189657611896611de1565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806118c9576118c9611e10565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610615565b6000915050610615565b60608160000180548060200260200160405190810160405280929190818152602001828054801561195e57602002820191906000526020600020905b81548152602001906001019080831161194a575b50505050509050919050565b60008181526001830160205260408120546119b157508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610615565b506000610615565b6000602082840312156119cb57600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610a4157600080fd5b6000815180845260005b81811015611a2157602081850181015186830182015201611a05565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081526000610a4160208301846119fb565b803573ffffffffffffffffffffffffffffffffffffffff81168114611a9657600080fd5b919050565b60008060408385031215611aae57600080fd5b611ab783611a72565b946020939093013593505050565b600080600060608486031215611ada57600080fd5b611ae384611a72565b9250611af160208501611a72565b9150604084013590509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080600060608486031215611b4557600080fd5b611b4e84611a72565b925060208401359150604084013567ffffffffffffffff80821115611b7257600080fd5b818601915086601f830112611b8657600080fd5b813581811115611b9857611b98611b01565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611bde57611bde611b01565b81604052828152896020848701011115611bf757600080fd5b8260208601602083013760006020848301015280955050505050509250925092565b600060208284031215611c2b57600080fd5b5035919050565b600060208284031215611c4457600080fd5b610a4182611a72565b6020808252825182820181905260009190848201906040850190845b81811015611c9b57835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101611c69565b50909695505050505050565b60008060408385031215611cba57600080fd5b611cc383611a72565b9150611cd160208401611a72565b90509250929050565b600181811c90821680611cee57607f821691505b602082108103611d27577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561061557610615611d2d565b828152604060208201526000611d8860408301846119fb565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000611dc560608301846119fb565b95945050505050565b8181038181111561061557610615611d2d565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000813000a", } var LinkTokenABI = LinkTokenMetaData.ABI @@ -259,28 +259,6 @@ func (_LinkToken *LinkTokenCallerSession) GetBurners() ([]common.Address, error) return _LinkToken.Contract.GetBurners(&_LinkToken.CallOpts) } -func (_LinkToken *LinkTokenCaller) GetCCIPAdmin(opts *bind.CallOpts) (common.Address, error) { - var out []interface{} - err := _LinkToken.contract.Call(opts, &out, "getCCIPAdmin") - - if err != nil { - return *new(common.Address), err - } - - out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) - - return out0, err - -} - -func (_LinkToken *LinkTokenSession) GetCCIPAdmin() (common.Address, error) { - return _LinkToken.Contract.GetCCIPAdmin(&_LinkToken.CallOpts) -} - -func (_LinkToken *LinkTokenCallerSession) GetCCIPAdmin() (common.Address, error) { - return _LinkToken.Contract.GetCCIPAdmin(&_LinkToken.CallOpts) -} - func (_LinkToken *LinkTokenCaller) GetMinters(opts *bind.CallOpts) ([]common.Address, error) { var out []interface{} err := _LinkToken.contract.Call(opts, &out, "getMinters") @@ -659,18 +637,6 @@ func (_LinkToken *LinkTokenTransactorSession) RevokeMintRole(minter common.Addre return _LinkToken.Contract.RevokeMintRole(&_LinkToken.TransactOpts, minter) } -func (_LinkToken *LinkTokenTransactor) SetCCIPAdmin(opts *bind.TransactOpts, newAdmin common.Address) (*types.Transaction, error) { - return _LinkToken.contract.Transact(opts, "setCCIPAdmin", newAdmin) -} - -func (_LinkToken *LinkTokenSession) SetCCIPAdmin(newAdmin common.Address) (*types.Transaction, error) { - return _LinkToken.Contract.SetCCIPAdmin(&_LinkToken.TransactOpts, newAdmin) -} - -func (_LinkToken *LinkTokenTransactorSession) SetCCIPAdmin(newAdmin common.Address) (*types.Transaction, error) { - return _LinkToken.Contract.SetCCIPAdmin(&_LinkToken.TransactOpts, newAdmin) -} - func (_LinkToken *LinkTokenTransactor) Transfer(opts *bind.TransactOpts, to common.Address, amount *big.Int) (*types.Transaction, error) { return _LinkToken.contract.Transact(opts, "transfer", to, amount) } @@ -1110,142 +1076,6 @@ func (_LinkToken *LinkTokenFilterer) ParseBurnAccessRevoked(log types.Log) (*Lin return event, nil } -type LinkTokenCCIPAdminTransferredIterator struct { - Event *LinkTokenCCIPAdminTransferred - - contract *bind.BoundContract - event string - - logs chan types.Log - sub ethereum.Subscription - done bool - fail error -} - -func (it *LinkTokenCCIPAdminTransferredIterator) Next() bool { - - if it.fail != nil { - return false - } - - if it.done { - select { - case log := <-it.logs: - it.Event = new(LinkTokenCCIPAdminTransferred) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - - select { - case log := <-it.logs: - it.Event = new(LinkTokenCCIPAdminTransferred) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -func (it *LinkTokenCCIPAdminTransferredIterator) Error() error { - return it.fail -} - -func (it *LinkTokenCCIPAdminTransferredIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -type LinkTokenCCIPAdminTransferred struct { - PreviousAdmin common.Address - NewAdmin common.Address - Raw types.Log -} - -func (_LinkToken *LinkTokenFilterer) FilterCCIPAdminTransferred(opts *bind.FilterOpts, previousAdmin []common.Address, newAdmin []common.Address) (*LinkTokenCCIPAdminTransferredIterator, error) { - - var previousAdminRule []interface{} - for _, previousAdminItem := range previousAdmin { - previousAdminRule = append(previousAdminRule, previousAdminItem) - } - var newAdminRule []interface{} - for _, newAdminItem := range newAdmin { - newAdminRule = append(newAdminRule, newAdminItem) - } - - logs, sub, err := _LinkToken.contract.FilterLogs(opts, "CCIPAdminTransferred", previousAdminRule, newAdminRule) - if err != nil { - return nil, err - } - return &LinkTokenCCIPAdminTransferredIterator{contract: _LinkToken.contract, event: "CCIPAdminTransferred", logs: logs, sub: sub}, nil -} - -func (_LinkToken *LinkTokenFilterer) WatchCCIPAdminTransferred(opts *bind.WatchOpts, sink chan<- *LinkTokenCCIPAdminTransferred, previousAdmin []common.Address, newAdmin []common.Address) (event.Subscription, error) { - - var previousAdminRule []interface{} - for _, previousAdminItem := range previousAdmin { - previousAdminRule = append(previousAdminRule, previousAdminItem) - } - var newAdminRule []interface{} - for _, newAdminItem := range newAdmin { - newAdminRule = append(newAdminRule, newAdminItem) - } - - logs, sub, err := _LinkToken.contract.WatchLogs(opts, "CCIPAdminTransferred", previousAdminRule, newAdminRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - - event := new(LinkTokenCCIPAdminTransferred) - if err := _LinkToken.contract.UnpackLog(event, "CCIPAdminTransferred", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -func (_LinkToken *LinkTokenFilterer) ParseCCIPAdminTransferred(log types.Log) (*LinkTokenCCIPAdminTransferred, error) { - event := new(LinkTokenCCIPAdminTransferred) - if err := _LinkToken.contract.UnpackLog(event, "CCIPAdminTransferred", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - type LinkTokenMintAccessGrantedIterator struct { Event *LinkTokenMintAccessGranted @@ -1836,7 +1666,6 @@ type LinkTokenTransfer struct { From common.Address To common.Address Value *big.Int - Data []byte Raw types.Log } @@ -1974,6 +1803,7 @@ type LinkTokenTransfer0 struct { From common.Address To common.Address Value *big.Int + Data []byte Raw types.Log } @@ -2055,8 +1885,6 @@ func (_LinkToken *LinkToken) ParseLog(log types.Log) (generated.AbigenLog, error return _LinkToken.ParseBurnAccessGranted(log) case _LinkToken.abi.Events["BurnAccessRevoked"].ID: return _LinkToken.ParseBurnAccessRevoked(log) - case _LinkToken.abi.Events["CCIPAdminTransferred"].ID: - return _LinkToken.ParseCCIPAdminTransferred(log) case _LinkToken.abi.Events["MintAccessGranted"].ID: return _LinkToken.ParseMintAccessGranted(log) case _LinkToken.abi.Events["MintAccessRevoked"].ID: @@ -2087,10 +1915,6 @@ func (LinkTokenBurnAccessRevoked) Topic() common.Hash { return common.HexToHash("0x0a675452746933cefe3d74182e78db7afe57ba60eaa4234b5d85e9aa41b0610c") } -func (LinkTokenCCIPAdminTransferred) Topic() common.Hash { - return common.HexToHash("0x9524c9e4b0b61eb018dd58a1cd856e3e74009528328ab4a613b434fa631d7242") -} - func (LinkTokenMintAccessGranted) Topic() common.Hash { return common.HexToHash("0xe46fef8bbff1389d9010703cf8ebb363fb3daf5bf56edc27080b67bc8d9251ea") } @@ -2108,11 +1932,11 @@ func (LinkTokenOwnershipTransferred) Topic() common.Hash { } func (LinkTokenTransfer) Topic() common.Hash { - return common.HexToHash("0xe19260aff97b920c7df27010903aeb9c8d2be5d310a2c67824cf3f15396e4c16") + return common.HexToHash("0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef") } func (LinkTokenTransfer0) Topic() common.Hash { - return common.HexToHash("0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef") + return common.HexToHash("0xe19260aff97b920c7df27010903aeb9c8d2be5d310a2c67824cf3f15396e4c16") } func (_LinkToken *LinkToken) Address() common.Address { @@ -2128,8 +1952,6 @@ type LinkTokenInterface interface { GetBurners(opts *bind.CallOpts) ([]common.Address, error) - GetCCIPAdmin(opts *bind.CallOpts) (common.Address, error) - GetMinters(opts *bind.CallOpts) ([]common.Address, error) IsBurner(opts *bind.CallOpts, burner common.Address) (bool, error) @@ -2178,8 +2000,6 @@ type LinkTokenInterface interface { RevokeMintRole(opts *bind.TransactOpts, minter common.Address) (*types.Transaction, error) - SetCCIPAdmin(opts *bind.TransactOpts, newAdmin common.Address) (*types.Transaction, error) - Transfer(opts *bind.TransactOpts, to common.Address, amount *big.Int) (*types.Transaction, error) TransferAndCall(opts *bind.TransactOpts, to common.Address, amount *big.Int, data []byte) (*types.Transaction, error) @@ -2206,12 +2026,6 @@ type LinkTokenInterface interface { ParseBurnAccessRevoked(log types.Log) (*LinkTokenBurnAccessRevoked, error) - FilterCCIPAdminTransferred(opts *bind.FilterOpts, previousAdmin []common.Address, newAdmin []common.Address) (*LinkTokenCCIPAdminTransferredIterator, error) - - WatchCCIPAdminTransferred(opts *bind.WatchOpts, sink chan<- *LinkTokenCCIPAdminTransferred, previousAdmin []common.Address, newAdmin []common.Address) (event.Subscription, error) - - ParseCCIPAdminTransferred(log types.Log) (*LinkTokenCCIPAdminTransferred, error) - FilterMintAccessGranted(opts *bind.FilterOpts, minter []common.Address) (*LinkTokenMintAccessGrantedIterator, error) WatchMintAccessGranted(opts *bind.WatchOpts, sink chan<- *LinkTokenMintAccessGranted, minter []common.Address) (event.Subscription, error) diff --git a/core/gethwrappers/shared/generation/generated-wrapper-dependency-versions-do-not-edit.txt b/core/gethwrappers/shared/generation/generated-wrapper-dependency-versions-do-not-edit.txt index d713d9d92b..3268bb55bd 100644 --- a/core/gethwrappers/shared/generation/generated-wrapper-dependency-versions-do-not-edit.txt +++ b/core/gethwrappers/shared/generation/generated-wrapper-dependency-versions-do-not-edit.txt @@ -1,5 +1,5 @@ GETH_VERSION: 1.13.8 -burn_mint_erc677: ../../../contracts/solc/v0.8.19/BurnMintERC677/BurnMintERC677.abi ../../../contracts/solc/v0.8.19/BurnMintERC677/BurnMintERC677.bin 84d3e0b3cb4b521e1d03968a990dffe45ff917b2d5a7c88eb552dac908defb29 +burn_mint_erc677: ../../../contracts/solc/v0.8.19/BurnMintERC677/BurnMintERC677.abi ../../../contracts/solc/v0.8.19/BurnMintERC677/BurnMintERC677.bin 405c9016171e614b17e10588653ef8d33dcea21dd569c3fddc596a46fcff68a3 erc20: ../../../contracts/solc/v0.8.19/ERC20/ERC20.abi ../../../contracts/solc/v0.8.19/ERC20/ERC20.bin 5b1a93d9b24f250e49a730c96335a8113c3f7010365cba578f313b483001d4fc -link_token: ../../../contracts/solc/v0.8.19/LinkToken/LinkToken.abi ../../../contracts/solc/v0.8.19/LinkToken/LinkToken.bin 2a1e80350c338e0ddd643e690e99875f4aaf66904a4a473822f656e0a34b398f +link_token: ../../../contracts/solc/v0.8.19/LinkToken/LinkToken.abi ../../../contracts/solc/v0.8.19/LinkToken/LinkToken.bin c0ef9b507103aae541ebc31d87d051c2764ba9d843076b30ec505d37cdfffaba werc20_mock: ../../../contracts/solc/v0.8.19/WERC20Mock/WERC20Mock.abi ../../../contracts/solc/v0.8.19/WERC20Mock/WERC20Mock.bin ff2ca3928b2aa9c412c892cb8226c4d754c73eeb291bb7481c32c48791b2aa94 From 5c05b9d4cf678afcf8ad65064509de6f04921739 Mon Sep 17 00:00:00 2001 From: Josh Date: Thu, 26 Sep 2024 13:23:59 -0400 Subject: [PATCH 29/48] remove stateful functions from tokenPoolFactory --- .../tokenAdminRegistry/TokenPoolFactory.t.sol | 766 +++++++++--------- .../TokenPoolFactory/FactoryBurnMintERC20.sol | 268 ++++++ .../TokenPoolFactory/TokenPoolFactory.sol | 68 +- 3 files changed, 699 insertions(+), 403 deletions(-) create mode 100644 contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory/FactoryBurnMintERC20.sol diff --git a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol index 33515eecaa..2a6ba093e3 100644 --- a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol +++ b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol @@ -1,382 +1,422 @@ -// pragma solidity ^0.8.24; +pragma solidity ^0.8.24; -// import {IOwner} from "../../interfaces/IOwner.sol"; -// import {ITokenAdminRegistry} from "../../interfaces/ITokenAdminRegistry.sol"; +import {IOwner} from "../../interfaces/IOwner.sol"; +import {ITokenAdminRegistry} from "../../interfaces/ITokenAdminRegistry.sol"; -// import {OwnerIsCreator} from "../../../shared/access/OwnerIsCreator.sol"; +import {OwnerIsCreator} from "../../../shared/access/OwnerIsCreator.sol"; -// import {RateLimiter} from "../../libraries/RateLimiter.sol"; -// import {BurnMintTokenPool} from "../../pools/BurnMintTokenPool.sol"; -// import {TokenPool} from "../../pools/TokenPool.sol"; -// import {FactoryBurnMintERC20} from "../../tokenAdminRegistry/FactoryBurnMintERC20.sol"; -// import {RegistryModuleOwnerCustom} from "../../tokenAdminRegistry/RegistryModuleOwnerCustom.sol"; -// import {TokenAdminRegistry} from "../../tokenAdminRegistry/TokenAdminRegistry.sol"; -// import {TokenPoolFactory} from "../../tokenAdminRegistry/TokenPoolFactory.sol"; -// import {TokenAdminRegistrySetup} from "./TokenAdminRegistry.t.sol"; +import {RateLimiter} from "../../libraries/RateLimiter.sol"; +import {BurnMintTokenPool} from "../../pools/BurnMintTokenPool.sol"; +import {TokenPool} from "../../pools/TokenPool.sol"; +import {FactoryBurnMintERC20} from "../../tokenAdminRegistry/TokenPoolFactory/FactoryBurnMintERC20.sol"; +import {RegistryModuleOwnerCustom} from "../../tokenAdminRegistry/RegistryModuleOwnerCustom.sol"; +import {TokenAdminRegistry} from "../../tokenAdminRegistry/TokenAdminRegistry.sol"; +import {TokenPoolFactory} from "../../tokenAdminRegistry/TokenPoolFactory/TokenPoolFactory.sol"; +import {TokenAdminRegistrySetup} from "./TokenAdminRegistry.t.sol"; -// import {Create2} from "../../../vendor/openzeppelin-solidity/v5.0.2/contracts/utils/Create2.sol"; +import {Create2} from "../../../vendor/openzeppelin-solidity/v5.0.2/contracts/utils/Create2.sol"; -// contract TokenPoolFactorySetup is TokenAdminRegistrySetup { -// using Create2 for bytes32; +import {console2 as console} from "forge-std/console2.sol"; -// TokenPoolFactory internal s_tokenPoolFactory; -// RegistryModuleOwnerCustom internal s_registryModuleOwnerCustom; +contract TokenPoolFactorySetup is TokenAdminRegistrySetup { + using Create2 for bytes32; -// bytes internal s_poolInitCode; -// bytes internal s_poolInitArgs; + TokenPoolFactory internal s_tokenPoolFactory; + RegistryModuleOwnerCustom internal s_registryModuleOwnerCustom; -// bytes32 internal constant FAKE_SALT = keccak256(abi.encode("FAKE_SALT")); + bytes internal s_poolInitCode; + bytes internal s_poolInitArgs; -// address internal s_rmnProxy = address(0x1234); + bytes32 internal constant FAKE_SALT = keccak256(abi.encode("FAKE_SALT")); -// bytes internal s_tokenCreationParams; -// bytes internal s_tokenInitCode; + address internal s_rmnProxy = address(0x1234); -// uint256 public constant PREMINT_AMOUNT = 1e20; // 100 tokens in 18 decimals + bytes internal s_tokenCreationParams; + bytes internal s_tokenInitCode; -// function setUp() public virtual override { -// TokenAdminRegistrySetup.setUp(); + uint256 public constant PREMINT_AMOUNT = 1e20; // 100 tokens in 18 decimals -// s_registryModuleOwnerCustom = new RegistryModuleOwnerCustom(address(s_tokenAdminRegistry)); -// s_tokenAdminRegistry.addRegistryModule(address(s_registryModuleOwnerCustom)); + function setUp() public virtual override { + TokenAdminRegistrySetup.setUp(); -// s_tokenPoolFactory = -// new TokenPoolFactory(s_tokenAdminRegistry, s_registryModuleOwnerCustom, s_rmnProxy, address(s_sourceRouter)); + s_registryModuleOwnerCustom = new RegistryModuleOwnerCustom(address(s_tokenAdminRegistry)); + s_tokenAdminRegistry.addRegistryModule(address(s_registryModuleOwnerCustom)); -// // Create Init Code for BurnMintERC20 TestToken with 18 decimals and supply cap of max uint256 value -// s_tokenCreationParams = abi.encode("TestToken", "TT", 18, type(uint256).max, PREMINT_AMOUNT, OWNER); + s_tokenPoolFactory = new TokenPoolFactory( + s_tokenAdminRegistry, + s_registryModuleOwnerCustom, + s_rmnProxy, + address(s_sourceRouter) + ); -// s_tokenInitCode = abi.encodePacked(type(FactoryBurnMintERC20).creationCode, s_tokenCreationParams); + // Create Init Code for BurnMintERC20 TestToken with 18 decimals and supply cap of max uint256 value + s_tokenCreationParams = abi.encode("TestToken", "TT", 18, type(uint256).max, PREMINT_AMOUNT, OWNER); -// s_poolInitCode = type(BurnMintTokenPool).creationCode; + s_tokenInitCode = abi.encodePacked(type(FactoryBurnMintERC20).creationCode, s_tokenCreationParams); -// // Create Init Args for BurnMintTokenPool with no allowlist minus the token address -// address[] memory allowlist = new address[](1); -// allowlist[0] = OWNER; -// s_poolInitArgs = abi.encode(allowlist, address(0x1234), s_sourceRouter); -// } -// } + s_poolInitCode = type(BurnMintTokenPool).creationCode; -// contract TokenPoolFactoryTests is TokenPoolFactorySetup { -// using Create2 for bytes32; - -// function test_TokenPoolFactory_Constructor_Revert() public { -// // Revert cause the tokenAdminRegistry is address(0) -// vm.expectRevert(TokenPoolFactory.InvalidZeroAddress.selector); -// new TokenPoolFactory(ITokenAdminRegistry(address(0)), RegistryModuleOwnerCustom(address(0)), address(0), address(0)); - -// new TokenPoolFactory( -// ITokenAdminRegistry(address(0xdeadbeef)), -// RegistryModuleOwnerCustom(address(0xdeadbeef)), -// address(0xdeadbeef), -// address(0xdeadbeef) -// ); -// } - -// function test_createTokenPool_WithNoExistingTokenOnRemoteChain_Success() public { -// vm.startPrank(OWNER); - -// bytes32 dynamicSalt = keccak256(abi.encodePacked(FAKE_SALT, OWNER)); - -// address predictedTokenAddress = -// Create2.computeAddress(dynamicSalt, keccak256(s_tokenInitCode), address(s_tokenPoolFactory)); - -// // Create the constructor params for the predicted pool -// bytes memory poolCreationParams = abi.encode(predictedTokenAddress, new address[](0), s_rmnProxy, s_sourceRouter); - -// // Predict the address of the pool before we make the tx by using the init code and the params -// bytes memory predictedPoolInitCode = abi.encodePacked(s_poolInitCode, poolCreationParams); - -// address predictedPoolAddress = -// dynamicSalt.computeAddress(keccak256(predictedPoolInitCode), address(s_tokenPoolFactory)); - -// (address tokenAddress, address poolAddress) = s_tokenPoolFactory.deployTokenAndTokenPool( -// new TokenPoolFactory.RemoteTokenPoolInfo[](0), s_tokenInitCode, s_poolInitCode, poolCreationParams, FAKE_SALT -// ); - -// assertNotEq(address(0), tokenAddress, "Token Address should not be 0"); -// assertNotEq(address(0), poolAddress, "Pool Address should not be 0"); - -// assertEq(predictedTokenAddress, tokenAddress, "Token Address should have been predicted"); -// assertEq(predictedPoolAddress, poolAddress, "Pool Address should have been predicted"); - -// s_tokenAdminRegistry.acceptAdminRole(tokenAddress); -// OwnerIsCreator(tokenAddress).acceptOwnership(); -// OwnerIsCreator(poolAddress).acceptOwnership(); - -// assertEq(poolAddress, s_tokenAdminRegistry.getPool(tokenAddress), "Token Pool should be set"); -// assertEq(IOwner(tokenAddress).owner(), OWNER, "Token should be owned by the owner"); -// assertEq(IOwner(poolAddress).owner(), OWNER, "Token should be owned by the owner"); -// } - -// function test_createTokenPool_WithNoExistingRemoteContracts_predict_Success() public { -// vm.startPrank(OWNER); -// bytes32 dynamicSalt = keccak256(abi.encodePacked(FAKE_SALT, OWNER)); - -// // We have to create a new factory, registry module, and token admin registry to simulate the other chain -// TokenAdminRegistry newTokenAdminRegistry = new TokenAdminRegistry(); -// RegistryModuleOwnerCustom newRegistryModule = new RegistryModuleOwnerCustom(address(newTokenAdminRegistry)); - -// // We want to deploy a new factory and Owner Module. -// TokenPoolFactory newTokenPoolFactory = -// new TokenPoolFactory(newTokenAdminRegistry, newRegistryModule, s_rmnProxy, address(s_destRouter)); - -// newTokenAdminRegistry.addRegistryModule(address(newRegistryModule)); - -// TokenPoolFactory.RemoteChainConfig memory remoteChainConfig = -// TokenPoolFactory.RemoteChainConfig(address(newTokenPoolFactory), address(s_destRouter), address(s_rmnProxy)); - -// { -// TokenPoolFactory.RemoteChainConfig[] memory remoteChainConfigs = new TokenPoolFactory.RemoteChainConfig[](1); -// remoteChainConfigs[0] = remoteChainConfig; - -// TokenPoolFactory.RemoteChainConfigUpdate[] memory remoteChainConfigUpdates = -// new TokenPoolFactory.RemoteChainConfigUpdate[](1); -// remoteChainConfigUpdates[0] = TokenPoolFactory.RemoteChainConfigUpdate(DEST_CHAIN_SELECTOR, remoteChainConfig); - -// // Add the new token Factory to the remote chain config and set it for the simulated destination chain -// s_tokenPoolFactory.updateRemoteChainConfig(remoteChainConfigUpdates); -// } - -// // Create an array of remote pools where nothing exists yet, but we want to predict the address for -// // the new pool and token on DEST_CHAIN_SELECTOR -// TokenPoolFactory.RemoteTokenPoolInfo[] memory remoteTokenPools = new TokenPoolFactory.RemoteTokenPoolInfo[](1); - -// // The only field that matters is DEST_CHAIN_SELECTOR because we dont want any existing token pool or token -// // on the remote chain -// remoteTokenPools[0] = TokenPoolFactory.RemoteTokenPoolInfo( -// DEST_CHAIN_SELECTOR, "", "", s_tokenInitCode, RateLimiter.Config(false, 0, 0) -// ); - -// // Predict the address of the token and pool on the DESTINATION chain -// address predictedTokenAddress = dynamicSalt.computeAddress(keccak256(s_tokenInitCode), address(newTokenPoolFactory)); - -// // Since the remote chain information was provided, we should be able to get the information from the newly -// // deployed token pool using the available getter functions -// (, address poolAddress) = -// s_tokenPoolFactory.deployTokenAndTokenPool(remoteTokenPools, s_tokenInitCode, s_poolInitCode, "", FAKE_SALT); - -// // Ensure that the remote Token was set to the one we predicted -// assertEq( -// abi.encode(predictedTokenAddress), -// TokenPool(poolAddress).getRemoteToken(DEST_CHAIN_SELECTOR), -// "Token Address should have been predicted" -// ); - -// { -// // Create the constructor params for the predicted pool -// // The predictedTokenAddress is NOT abi-encoded since the raw evm-address -// // is used in the constructor params -// bytes memory predictedPoolCreationParams = -// abi.encode(predictedTokenAddress, new address[](0), s_rmnProxy, address(s_destRouter)); - -// // Take the init code and concat the destination params to it, the initCode shouldn't change -// bytes memory predictedPoolInitCode = abi.encodePacked(s_poolInitCode, predictedPoolCreationParams); - -// // Predict the address of the pool on the DESTINATION chain -// address predictedPoolAddress = -// dynamicSalt.computeAddress(keccak256(predictedPoolInitCode), address(newTokenPoolFactory)); - -// // Assert that the address set for the remote pool is the same as the predicted address -// assertEq( -// abi.encode(predictedPoolAddress), -// TokenPool(poolAddress).getRemotePool(DEST_CHAIN_SELECTOR), -// "Pool Address should have been predicted" -// ); -// } - -// // On the new token pool factory, representing a destination chain, -// // deploy a new token and a new pool -// (address newTokenAddress, address newPoolAddress) = newTokenPoolFactory.deployTokenAndTokenPool( -// new TokenPoolFactory.RemoteTokenPoolInfo[](0), s_tokenInitCode, s_poolInitCode, "", FAKE_SALT -// ); - -// assertEq( -// TokenPool(poolAddress).getRemotePool(DEST_CHAIN_SELECTOR), -// abi.encode(newPoolAddress), -// "New Pool Address should have been deployed correctly" -// ); - -// assertEq( -// TokenPool(poolAddress).getRemoteToken(DEST_CHAIN_SELECTOR), -// abi.encode(newTokenAddress), -// "New Token Address should have been deployed correctly" -// ); -// } - -// function test_createTokenPool_ExistingRemoteToken_AndPredictPool_Success() public { -// vm.startPrank(OWNER); -// bytes32 dynamicSalt = keccak256(abi.encodePacked(FAKE_SALT, OWNER)); - -// FactoryBurnMintERC20 newRemoteToken = -// new FactoryBurnMintERC20("TestToken", "TT", 18, type(uint256).max, PREMINT_AMOUNT, OWNER); - -// // We have to create a new factory, registry module, and token admin registry to simulate the other chain -// TokenAdminRegistry newTokenAdminRegistry = new TokenAdminRegistry(); -// RegistryModuleOwnerCustom newRegistryModule = new RegistryModuleOwnerCustom(address(newTokenAdminRegistry)); - -// // We want to deploy a new factory and Owner Module. -// TokenPoolFactory newTokenPoolFactory = -// new TokenPoolFactory(newTokenAdminRegistry, newRegistryModule, s_rmnProxy, address(s_destRouter)); - -// newTokenAdminRegistry.addRegistryModule(address(newRegistryModule)); - -// { -// TokenPoolFactory.RemoteChainConfig memory remoteChainConfig = -// TokenPoolFactory.RemoteChainConfig(address(newTokenPoolFactory), address(s_destRouter), address(s_rmnProxy)); - -// TokenPoolFactory.RemoteChainConfig[] memory remoteChainConfigs = new TokenPoolFactory.RemoteChainConfig[](1); -// remoteChainConfigs[0] = remoteChainConfig; - -// TokenPoolFactory.RemoteChainConfigUpdate[] memory remoteChainConfigUpdates = -// new TokenPoolFactory.RemoteChainConfigUpdate[](1); -// remoteChainConfigUpdates[0] = TokenPoolFactory.RemoteChainConfigUpdate(DEST_CHAIN_SELECTOR, remoteChainConfig); - -// // Add the new token Factory to the remote chain config and set it for the simulated destination chain -// s_tokenPoolFactory.updateRemoteChainConfig(remoteChainConfigUpdates); -// } - -// // Create an array of remote pools where nothing exists yet, but we want to predict the address for -// // the new pool and token on DEST_CHAIN_SELECTOR -// TokenPoolFactory.RemoteTokenPoolInfo[] memory remoteTokenPools = new TokenPoolFactory.RemoteTokenPoolInfo[](1); - -// // The only field that matters is DEST_CHAIN_SELECTOR because we dont want any existing token pool or token -// // on the remote chain -// remoteTokenPools[0] = TokenPoolFactory.RemoteTokenPoolInfo( -// DEST_CHAIN_SELECTOR, "", abi.encode(address(newRemoteToken)), s_tokenInitCode, RateLimiter.Config(false, 0, 0) -// ); - -// // Since the remote chain information was provided, we should be able to get the information from the newly -// // deployed token pool using the available getter functions -// (address tokenAddress, address poolAddress) = -// s_tokenPoolFactory.deployTokenAndTokenPool(remoteTokenPools, s_tokenInitCode, s_poolInitCode, "", FAKE_SALT); - -// assertEq(address(TokenPool(poolAddress).getToken()), tokenAddress, "Token Address should have been set locally"); - -// // Ensure that the remote Token was set to the one we predicted -// assertEq( -// abi.encode(address(newRemoteToken)), -// TokenPool(poolAddress).getRemoteToken(DEST_CHAIN_SELECTOR), -// "Token Address should have been predicted" -// ); - -// // Create the constructor params for the predicted pool -// // The predictedTokenAddress is NOT abi-encoded since the raw evm-address -// // is used in the constructor params -// bytes memory predictedPoolCreationParams = -// abi.encode(address(newRemoteToken), new address[](0), s_rmnProxy, address(s_destRouter)); - -// // Take the init code and concat the destination params to it, the initCode shouldn't change -// bytes memory predictedPoolInitCode = abi.encodePacked(s_poolInitCode, predictedPoolCreationParams); - -// // Predict the address of the pool on the DESTINATION chain -// address predictedPoolAddress = -// dynamicSalt.computeAddress(keccak256(predictedPoolInitCode), address(newTokenPoolFactory)); - -// // Assert that the address set for the remote pool is the same as the predicted address -// assertEq( -// abi.encode(predictedPoolAddress), -// TokenPool(poolAddress).getRemotePool(DEST_CHAIN_SELECTOR), -// "Pool Address should have been predicted" -// ); - -// // On the new token pool factory, representing a destination chain, -// // deploy a new token and a new pool -// address newPoolAddress = newTokenPoolFactory.deployTokenPoolWithExistingToken( -// address(newRemoteToken), new TokenPoolFactory.RemoteTokenPoolInfo[](0), s_poolInitCode, "", FAKE_SALT -// ); - -// assertEq( -// abi.encode(newRemoteToken), -// TokenPool(poolAddress).getRemoteToken(DEST_CHAIN_SELECTOR), -// "Remote Token Address should have been set correctly" -// ); - -// assertEq( -// TokenPool(poolAddress).getRemotePool(DEST_CHAIN_SELECTOR), -// abi.encode(newPoolAddress), -// "New Pool Address should have been deployed correctly" -// ); -// } - -// function test_createTokenPool_WithRemoteTokenAndRemotePool_Success() public { -// vm.startPrank(OWNER); - -// bytes32 dynamicSalt = keccak256(abi.encodePacked(FAKE_SALT, OWNER)); - -// bytes memory RANDOM_TOKEN_ADDRESS = abi.encode(makeAddr("RANDOM_TOKEN")); -// bytes memory RANDOM_POOL_ADDRESS = abi.encode(makeAddr("RANDOM_POOL")); - -// address predictedTokenAddress = dynamicSalt.computeAddress(keccak256(s_tokenInitCode), address(s_tokenPoolFactory)); - -// // Create the constructor params for the predicted pool -// bytes memory poolCreationParams = abi.encode(predictedTokenAddress, new address[](0), s_rmnProxy, s_sourceRouter); - -// // Create an array of remote pools with some fake addresses -// TokenPoolFactory.RemoteTokenPoolInfo[] memory remoteTokenPools = new TokenPoolFactory.RemoteTokenPoolInfo[](1); - -// remoteTokenPools[0] = TokenPoolFactory.RemoteTokenPoolInfo( -// DEST_CHAIN_SELECTOR, RANDOM_POOL_ADDRESS, RANDOM_TOKEN_ADDRESS, "", RateLimiter.Config(false, 0, 0) -// ); - -// (address tokenAddress, address poolAddress) = s_tokenPoolFactory.deployTokenAndTokenPool( -// remoteTokenPools, s_tokenInitCode, s_poolInitCode, poolCreationParams, FAKE_SALT -// ); - -// assertNotEq(address(0), tokenAddress, "Token Address should not be 0"); -// assertNotEq(address(0), poolAddress, "Pool Address should not be 0"); - -// s_tokenAdminRegistry.acceptAdminRole(tokenAddress); -// OwnerIsCreator(tokenAddress).acceptOwnership(); -// OwnerIsCreator(poolAddress).acceptOwnership(); - -// assertEq( -// TokenPool(poolAddress).getRemoteToken(DEST_CHAIN_SELECTOR), -// RANDOM_TOKEN_ADDRESS, -// "Remote Token Address should have been set" -// ); - -// assertEq( -// TokenPool(poolAddress).getRemotePool(DEST_CHAIN_SELECTOR), -// RANDOM_POOL_ADDRESS, -// "Remote Pool Address should have been set" -// ); - -// assertEq(poolAddress, s_tokenAdminRegistry.getPool(tokenAddress), "Token Pool should be set"); - -// assertEq(IOwner(tokenAddress).owner(), OWNER, "Token should be owned by the owner"); - -// assertEq(IOwner(poolAddress).owner(), OWNER, "Token should be owned by the owner"); -// } - -// function test_updateRemoteChainConfig_Success() public { -// TokenPoolFactory.RemoteChainConfig[] memory remoteChainConfigs = new TokenPoolFactory.RemoteChainConfig[](1); - -// TokenPoolFactory.RemoteChainConfig memory remoteChainConfig = TokenPoolFactory.RemoteChainConfig({ -// remotePoolFactory: address(0x1234), -// remoteRouter: address(0x5678), -// remoteRMNProxy: address(0x9abc) -// }); - -// remoteChainConfigs[0] = remoteChainConfig; - -// TokenPoolFactory.RemoteChainConfigUpdate[] memory remoteChainConfigUpdates = -// new TokenPoolFactory.RemoteChainConfigUpdate[](1); -// remoteChainConfigUpdates[0] = TokenPoolFactory.RemoteChainConfigUpdate(DEST_CHAIN_SELECTOR, remoteChainConfig); - -// s_tokenPoolFactory.updateRemoteChainConfig(remoteChainConfigUpdates); - -// TokenPoolFactory.RemoteChainConfig memory updatedRemoteChainConfig = -// s_tokenPoolFactory.getRemoteChainConfig(DEST_CHAIN_SELECTOR); - -// assertEq( -// remoteChainConfig.remotePoolFactory, -// updatedRemoteChainConfig.remotePoolFactory, -// "Token Pool Factory should be set" -// ); - -// assertEq(remoteChainConfig.remoteRouter, updatedRemoteChainConfig.remoteRouter, "Router should be set"); - -// assertEq(remoteChainConfig.remoteRMNProxy, updatedRemoteChainConfig.remoteRMNProxy, "RMN Proxy should be set"); -// } -// } + // Create Init Args for BurnMintTokenPool with no allowlist minus the token address + address[] memory allowlist = new address[](1); + allowlist[0] = OWNER; + s_poolInitArgs = abi.encode(allowlist, address(0x1234), s_sourceRouter); + } +} + +contract TokenPoolFactoryTests is TokenPoolFactorySetup { + using Create2 for bytes32; + + function test_TokenPoolFactory_Constructor_Revert() public { + // Revert cause the tokenAdminRegistry is address(0) + vm.expectRevert(TokenPoolFactory.InvalidZeroAddress.selector); + new TokenPoolFactory( + ITokenAdminRegistry(address(0)), + RegistryModuleOwnerCustom(address(0)), + address(0), + address(0) + ); + + new TokenPoolFactory( + ITokenAdminRegistry(address(0xdeadbeef)), + RegistryModuleOwnerCustom(address(0xdeadbeef)), + address(0xdeadbeef), + address(0xdeadbeef) + ); + } + + function test_createTokenPool_WithNoExistingTokenOnRemoteChain_Success() public { + vm.startPrank(OWNER); + + bytes32 dynamicSalt = keccak256(abi.encodePacked(FAKE_SALT, OWNER)); + + address predictedTokenAddress = Create2.computeAddress( + dynamicSalt, + keccak256(s_tokenInitCode), + address(s_tokenPoolFactory) + ); + + // Create the constructor params for the predicted pool + bytes memory poolCreationParams = abi.encode(predictedTokenAddress, new address[](0), s_rmnProxy, s_sourceRouter); + + // Predict the address of the pool before we make the tx by using the init code and the params + bytes memory predictedPoolInitCode = abi.encodePacked(s_poolInitCode, poolCreationParams); + + address predictedPoolAddress = dynamicSalt.computeAddress( + keccak256(predictedPoolInitCode), + address(s_tokenPoolFactory) + ); + + (address tokenAddress, address poolAddress) = s_tokenPoolFactory.deployTokenAndTokenPool( + new TokenPoolFactory.RemoteTokenPoolInfo[](0), + s_tokenInitCode, + s_poolInitCode, + poolCreationParams, + FAKE_SALT + ); + + assertNotEq(address(0), tokenAddress, "Token Address should not be 0"); + assertNotEq(address(0), poolAddress, "Pool Address should not be 0"); + + assertEq(predictedTokenAddress, tokenAddress, "Token Address should have been predicted"); + assertEq(predictedPoolAddress, poolAddress, "Pool Address should have been predicted"); + + s_tokenAdminRegistry.acceptAdminRole(tokenAddress); + OwnerIsCreator(tokenAddress).acceptOwnership(); + OwnerIsCreator(poolAddress).acceptOwnership(); + + assertEq(poolAddress, s_tokenAdminRegistry.getPool(tokenAddress), "Token Pool should be set"); + assertEq(IOwner(tokenAddress).owner(), OWNER, "Token should be owned by the owner"); + assertEq(IOwner(poolAddress).owner(), OWNER, "Token should be owned by the owner"); + } + + function test_createTokenPool_WithNoExistingRemoteContracts_predict_Success() public { + vm.startPrank(OWNER); + bytes32 dynamicSalt = keccak256(abi.encodePacked(FAKE_SALT, OWNER)); + + // We have to create a new factory, registry module, and token admin registry to simulate the other chain + TokenAdminRegistry newTokenAdminRegistry = new TokenAdminRegistry(); + RegistryModuleOwnerCustom newRegistryModule = new RegistryModuleOwnerCustom(address(newTokenAdminRegistry)); + + // We want to deploy a new factory and Owner Module. + TokenPoolFactory newTokenPoolFactory = new TokenPoolFactory( + newTokenAdminRegistry, + newRegistryModule, + s_rmnProxy, + address(s_destRouter) + ); + + newTokenAdminRegistry.addRegistryModule(address(newRegistryModule)); + + TokenPoolFactory.RemoteChainConfig memory remoteChainConfig = TokenPoolFactory.RemoteChainConfig( + address(newTokenPoolFactory), + address(s_destRouter), + address(s_rmnProxy) + ); + + // Create an array of remote pools where nothing exists yet, but we want to predict the address for + // the new pool and token on DEST_CHAIN_SELECTOR + TokenPoolFactory.RemoteTokenPoolInfo[] memory remoteTokenPools = new TokenPoolFactory.RemoteTokenPoolInfo[](1); + + // The only field that matters is DEST_CHAIN_SELECTOR because we dont want any existing token pool or token + // on the remote chain + remoteTokenPools[0] = TokenPoolFactory.RemoteTokenPoolInfo( + DEST_CHAIN_SELECTOR, // remoteChainSelector + "", // remotePoolAddress + type(BurnMintTokenPool).creationCode, // remotePoolInitCode + remoteChainConfig, // remoteChainConfig + "", // remoteTokenAddress + s_tokenInitCode, // remoteTokenInitCode + RateLimiter.Config(false, 0, 0) + ); + + // Predict the address of the token and pool on the DESTINATION chain + address predictedTokenAddress = dynamicSalt.computeAddress( + keccak256(s_tokenInitCode), + address(newTokenPoolFactory) + ); + + // Since the remote chain information was provided, we should be able to get the information from the newly + // deployed token pool using the available getter functions + (, address poolAddress) = s_tokenPoolFactory.deployTokenAndTokenPool( + remoteTokenPools, + s_tokenInitCode, + s_poolInitCode, + "", + FAKE_SALT + ); + + // Ensure that the remote Token was set to the one we predicted + assertEq( + abi.encode(predictedTokenAddress), + TokenPool(poolAddress).getRemoteToken(DEST_CHAIN_SELECTOR), + "Token Address should have been predicted" + ); + + { + // Create the constructor params for the predicted pool + // The predictedTokenAddress is NOT abi-encoded since the raw evm-address + // is used in the constructor params + bytes memory predictedPoolCreationParams = abi.encode( + predictedTokenAddress, + new address[](0), + s_rmnProxy, + address(s_destRouter) + ); + + // Take the init code and concat the destination params to it, the initCode shouldn't change + bytes memory predictedPoolInitCode = abi.encodePacked(s_poolInitCode, predictedPoolCreationParams); + + // Predict the address of the pool on the DESTINATION chain + address predictedPoolAddress = dynamicSalt.computeAddress( + keccak256(predictedPoolInitCode), + address(newTokenPoolFactory) + ); + + // Assert that the address set for the remote pool is the same as the predicted address + assertEq( + abi.encode(predictedPoolAddress), + TokenPool(poolAddress).getRemotePool(DEST_CHAIN_SELECTOR), + "Pool Address should have been predicted" + ); + } + + // On the new token pool factory, representing a destination chain, + // deploy a new token and a new pool + (address newTokenAddress, address newPoolAddress) = newTokenPoolFactory.deployTokenAndTokenPool( + new TokenPoolFactory.RemoteTokenPoolInfo[](0), + s_tokenInitCode, + s_poolInitCode, + "", + FAKE_SALT + ); + + assertEq( + TokenPool(poolAddress).getRemotePool(DEST_CHAIN_SELECTOR), + abi.encode(newPoolAddress), + "New Pool Address should have been deployed correctly" + ); + + assertEq( + TokenPool(poolAddress).getRemoteToken(DEST_CHAIN_SELECTOR), + abi.encode(newTokenAddress), + "New Token Address should have been deployed correctly" + ); + } + + function test_createTokenPool_ExistingRemoteToken_AndPredictPool_Success() public { + vm.startPrank(OWNER); + bytes32 dynamicSalt = keccak256(abi.encodePacked(FAKE_SALT, OWNER)); + + FactoryBurnMintERC20 newRemoteToken = new FactoryBurnMintERC20( + "TestToken", + "TT", + 18, + type(uint256).max, + PREMINT_AMOUNT, + OWNER + ); + + // We have to create a new factory, registry module, and token admin registry to simulate the other chain + TokenAdminRegistry newTokenAdminRegistry = new TokenAdminRegistry(); + RegistryModuleOwnerCustom newRegistryModule = new RegistryModuleOwnerCustom(address(newTokenAdminRegistry)); + + // We want to deploy a new factory and Owner Module. + TokenPoolFactory newTokenPoolFactory = new TokenPoolFactory( + newTokenAdminRegistry, + newRegistryModule, + s_rmnProxy, + address(s_destRouter) + ); + + newTokenAdminRegistry.addRegistryModule(address(newRegistryModule)); + + TokenPoolFactory.RemoteChainConfig memory remoteChainConfig = TokenPoolFactory.RemoteChainConfig( + address(newTokenPoolFactory), + address(s_destRouter), + address(s_rmnProxy) + ); + + // Create an array of remote pools where nothing exists yet, but we want to predict the address for + // the new pool and token on DEST_CHAIN_SELECTOR + TokenPoolFactory.RemoteTokenPoolInfo[] memory remoteTokenPools = new TokenPoolFactory.RemoteTokenPoolInfo[](1); + + // The only field that matters is DEST_CHAIN_SELECTOR because we dont want any existing token pool or token + // on the remote chain + remoteTokenPools[0] = TokenPoolFactory.RemoteTokenPoolInfo( + DEST_CHAIN_SELECTOR, // remoteChainSelector + "", // remotePoolAddress + type(BurnMintTokenPool).creationCode, // remotePoolInitCode + remoteChainConfig, // remoteChainConfig + abi.encode(address(newRemoteToken)), // remoteTokenAddress + s_tokenInitCode, // remoteTokenInitCode + RateLimiter.Config(false, 0, 0) // rateLimiterConfig + ); + + // Since the remote chain information was provided, we should be able to get the information from the newly + // deployed token pool using the available getter functions + (address tokenAddress, address poolAddress) = s_tokenPoolFactory.deployTokenAndTokenPool( + remoteTokenPools, + s_tokenInitCode, + s_poolInitCode, + "", + FAKE_SALT + ); + + assertEq(address(TokenPool(poolAddress).getToken()), tokenAddress, "Token Address should have been set locally"); + + // Ensure that the remote Token was set to the one we predicted + assertEq( + abi.encode(address(newRemoteToken)), + TokenPool(poolAddress).getRemoteToken(DEST_CHAIN_SELECTOR), + "Token Address should have been predicted" + ); + + // Create the constructor params for the predicted pool + // The predictedTokenAddress is NOT abi-encoded since the raw evm-address + // is used in the constructor params + bytes memory predictedPoolCreationParams = abi.encode( + address(newRemoteToken), + new address[](0), + s_rmnProxy, + address(s_destRouter) + ); + + // Take the init code and concat the destination params to it, the initCode shouldn't change + bytes memory predictedPoolInitCode = abi.encodePacked(s_poolInitCode, predictedPoolCreationParams); + + // Predict the address of the pool on the DESTINATION chain + address predictedPoolAddress = dynamicSalt.computeAddress( + keccak256(predictedPoolInitCode), + address(newTokenPoolFactory) + ); + + // Assert that the address set for the remote pool is the same as the predicted address + assertEq( + abi.encode(predictedPoolAddress), + TokenPool(poolAddress).getRemotePool(DEST_CHAIN_SELECTOR), + "Pool Address should have been predicted" + ); + + // On the new token pool factory, representing a destination chain, + // deploy a new token and a new pool + address newPoolAddress = newTokenPoolFactory.deployTokenPoolWithExistingToken( + address(newRemoteToken), + new TokenPoolFactory.RemoteTokenPoolInfo[](0), + s_poolInitCode, + "", + FAKE_SALT + ); + + assertEq( + abi.encode(newRemoteToken), + TokenPool(poolAddress).getRemoteToken(DEST_CHAIN_SELECTOR), + "Remote Token Address should have been set correctly" + ); + + assertEq( + TokenPool(poolAddress).getRemotePool(DEST_CHAIN_SELECTOR), + abi.encode(newPoolAddress), + "New Pool Address should have been deployed correctly" + ); + } + + function test_createTokenPool_WithRemoteTokenAndRemotePool_Success() public { + vm.startPrank(OWNER); + + bytes32 dynamicSalt = keccak256(abi.encodePacked(FAKE_SALT, OWNER)); + + bytes memory RANDOM_TOKEN_ADDRESS = abi.encode(makeAddr("RANDOM_TOKEN")); + bytes memory RANDOM_POOL_ADDRESS = abi.encode(makeAddr("RANDOM_POOL")); + + address predictedTokenAddress = dynamicSalt.computeAddress(keccak256(s_tokenInitCode), address(s_tokenPoolFactory)); + + // Create the constructor params for the predicted pool + bytes memory poolCreationParams = abi.encode(predictedTokenAddress, new address[](0), s_rmnProxy, s_sourceRouter); + + // Create an array of remote pools with some fake addresses + TokenPoolFactory.RemoteTokenPoolInfo[] memory remoteTokenPools = new TokenPoolFactory.RemoteTokenPoolInfo[](1); + + remoteTokenPools[0] = TokenPoolFactory.RemoteTokenPoolInfo( + DEST_CHAIN_SELECTOR, // remoteChainSelector + RANDOM_POOL_ADDRESS, // remotePoolAddress + type(BurnMintTokenPool).creationCode, // remotePoolInitCode + TokenPoolFactory.RemoteChainConfig(address(0), address(0), address(0)), // remoteChainConfig + RANDOM_TOKEN_ADDRESS, // remoteTokenAddress + "", // remoteTokenInitCode + RateLimiter.Config(false, 0, 0) // rateLimiterConfig + ); + + (address tokenAddress, address poolAddress) = s_tokenPoolFactory.deployTokenAndTokenPool( + remoteTokenPools, + s_tokenInitCode, + s_poolInitCode, + poolCreationParams, + FAKE_SALT + ); + + assertNotEq(address(0), tokenAddress, "Token Address should not be 0"); + assertNotEq(address(0), poolAddress, "Pool Address should not be 0"); + + s_tokenAdminRegistry.acceptAdminRole(tokenAddress); + OwnerIsCreator(tokenAddress).acceptOwnership(); + OwnerIsCreator(poolAddress).acceptOwnership(); + + assertEq( + TokenPool(poolAddress).getRemoteToken(DEST_CHAIN_SELECTOR), + RANDOM_TOKEN_ADDRESS, + "Remote Token Address should have been set" + ); + + assertEq( + TokenPool(poolAddress).getRemotePool(DEST_CHAIN_SELECTOR), + RANDOM_POOL_ADDRESS, + "Remote Pool Address should have been set" + ); + + assertEq(poolAddress, s_tokenAdminRegistry.getPool(tokenAddress), "Token Pool should be set"); + + assertEq(IOwner(tokenAddress).owner(), OWNER, "Token should be owned by the owner"); + + assertEq(IOwner(poolAddress).owner(), OWNER, "Token should be owned by the owner"); + } +} diff --git a/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory/FactoryBurnMintERC20.sol b/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory/FactoryBurnMintERC20.sol new file mode 100644 index 0000000000..334cc5ed59 --- /dev/null +++ b/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory/FactoryBurnMintERC20.sol @@ -0,0 +1,268 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IBurnMintERC20} from "../../../shared/token/ERC20/IBurnMintERC20.sol"; +import {IOwnable} from "../../../shared/interfaces/IOwnable.sol"; +import {IGetCCIPAdmin} from "../../../ccip/interfaces/IGetCCIPAdmin.sol"; + +import {OwnerIsCreator} from "../../../shared/access/OwnerIsCreator.sol"; + +import {ERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/ERC20.sol"; +import {ERC20Burnable} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/extensions/ERC20Burnable.sol"; +import {IERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol"; +import {IERC165} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/introspection/IERC165.sol"; +import {EnumerableSet} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/structs/EnumerableSet.sol"; + +/// @notice A basic ERC20 compatible token contract with burn and minting roles. +/// @dev The total supply can be limited during deployment. +contract FactoryBurnMintERC20 is IBurnMintERC20, IGetCCIPAdmin, IERC165, ERC20Burnable, OwnerIsCreator { + using EnumerableSet for EnumerableSet.AddressSet; + + error SenderNotMinter(address sender); + error SenderNotBurner(address sender); + error MaxSupplyExceeded(uint256 supplyAfterMint); + + event MintAccessGranted(address indexed minter); + event BurnAccessGranted(address indexed burner); + event MintAccessRevoked(address indexed minter); + event BurnAccessRevoked(address indexed burner); + + event CCIPAdminTransferred(address indexed previousAdmin, address indexed newAdmin); + + /// @dev The number of decimals for the token + uint8 internal immutable i_decimals; + + /// @dev The maximum supply of the token, 0 if unlimited + uint256 internal immutable i_maxSupply; + + /// @dev the CCIPAdmin can be used to register with the CCIP token admin registry, but has no other special powers, + /// and can only be transferred by the owner. + address internal s_ccipAdmin; + + /// @dev the allowed minter addresses + EnumerableSet.AddressSet internal s_minters; + /// @dev the allowed burner addresses + EnumerableSet.AddressSet internal s_burners; + + constructor( + string memory name, + string memory symbol, + uint8 decimals_, + uint256 maxSupply_, + uint256 preMint_, + address newOwner_ + ) ERC20(name, symbol) { + i_decimals = decimals_; + i_maxSupply = maxSupply_; + + s_ccipAdmin = newOwner_; + + // Mint the initial supply to the new Owner, saving gas by not calling if the mint amount is zero + if (preMint_ != 0) _mint(newOwner_, preMint_); + + // Grant the deployer the minter and burner roles. This contract is expected to be deployed by a factory + // contract that will transfer ownership to the correct address after deployment, so granting minting and burning + // privileges here saves gas by not requiring two transactions. + grantMintRole(newOwner_); + grantBurnRole(newOwner_); + } + + function supportsInterface(bytes4 interfaceId) public pure virtual override returns (bool) { + return + interfaceId == type(IERC20).interfaceId || + interfaceId == type(IBurnMintERC20).interfaceId || + interfaceId == type(IERC165).interfaceId || + interfaceId == type(IOwnable).interfaceId; + } + + // ================================================================ + // | ERC20 | + // ================================================================ + + /// @dev Returns the number of decimals used in its user representation. + function decimals() public view virtual override returns (uint8) { + return i_decimals; + } + + /// @dev Returns the max supply of the token, 0 if unlimited. + function maxSupply() public view virtual returns (uint256) { + return i_maxSupply; + } + + /// @dev Uses OZ ERC20 _transfer to disallow sending to address(0). + /// @dev Disallows sending to address(this) + function _transfer(address from, address to, uint256 amount) internal virtual override validAddress(to) { + super._transfer(from, to, amount); + } + + /// @dev Uses OZ ERC20 _approve to disallow approving for address(0). + /// @dev Disallows approving for address(this) + function _approve(address owner, address spender, uint256 amount) internal virtual override validAddress(spender) { + super._approve(owner, spender, amount); + } + + /// @dev Exists to be backwards compatible with the older naming convention. + /// @param spender the account being approved to spend on the users' behalf. + /// @param subtractedValue the amount being removed from the approval. + /// @return success Bool to return if the approval was successfully decreased. + function decreaseApproval(address spender, uint256 subtractedValue) external returns (bool success) { + return decreaseAllowance(spender, subtractedValue); + } + + /// @dev Exists to be backwards compatible with the older naming convention. + /// @param spender the account being approved to spend on the users' behalf. + /// @param addedValue the amount being added to the approval. + function increaseApproval(address spender, uint256 addedValue) external { + increaseAllowance(spender, addedValue); + } + + /// @notice Check if recipient is valid (not this contract address). + /// @param recipient the account we transfer/approve to. + /// @dev Reverts with an empty revert to be compatible with the existing link token when + /// the recipient is this contract address. + modifier validAddress(address recipient) virtual { + // solhint-disable-next-line reason-string, gas-custom-errors + if (recipient == address(this)) revert(); + _; + } + + // ================================================================ + // | Burning & minting | + // ================================================================ + + /// @inheritdoc ERC20Burnable + /// @dev Uses OZ ERC20 _burn to disallow burning from address(0). + /// @dev Decreases the total supply. + function burn(uint256 amount) public override(IBurnMintERC20, ERC20Burnable) onlyBurner { + super.burn(amount); + } + + /// @inheritdoc IBurnMintERC20 + /// @dev Alias for BurnFrom for compatibility with the older naming convention. + /// @dev Uses burnFrom for all validation & logic. + + function burn(address account, uint256 amount) public virtual override { + burnFrom(account, amount); + } + + /// @inheritdoc ERC20Burnable + /// @dev Uses OZ ERC20 _burn to disallow burning from address(0). + /// @dev Decreases the total supply. + function burnFrom(address account, uint256 amount) public override(IBurnMintERC20, ERC20Burnable) onlyBurner { + super.burnFrom(account, amount); + } + + /// @inheritdoc IBurnMintERC20 + /// @dev Uses OZ ERC20 _mint to disallow minting to address(0). + /// @dev Disallows minting to address(this) + /// @dev Increases the total supply. + function mint(address account, uint256 amount) external override onlyMinter validAddress(account) { + if (i_maxSupply != 0 && totalSupply() + amount > i_maxSupply) revert MaxSupplyExceeded(totalSupply() + amount); + + _mint(account, amount); + } + + // ================================================================ + // | Roles | + // ================================================================ + + /// @notice grants both mint and burn roles to `burnAndMinter`. + /// @dev calls public functions so this function does not require + /// access controls. This is handled in the inner functions. + function grantMintAndBurnRoles(address burnAndMinter) external { + grantMintRole(burnAndMinter); + grantBurnRole(burnAndMinter); + } + + /// @notice Grants mint role to the given address. + /// @dev only the owner can call this function. + function grantMintRole(address minter) public onlyOwner { + if (s_minters.add(minter)) { + emit MintAccessGranted(minter); + } + } + + /// @notice Grants burn role to the given address. + /// @dev only the owner can call this function. + /// @param burner the address to grant the burner role to + function grantBurnRole(address burner) public onlyOwner { + if (s_burners.add(burner)) { + emit BurnAccessGranted(burner); + } + } + + /// @notice Revokes mint role for the given address. + /// @dev only the owner can call this function. + /// @param minter the address to revoke the mint role from. + function revokeMintRole(address minter) public onlyOwner { + if (s_minters.remove(minter)) { + emit MintAccessRevoked(minter); + } + } + + /// @notice Revokes burn role from the given address. + /// @dev only the owner can call this function + /// @param burner the address to revoke the burner role from + function revokeBurnRole(address burner) public onlyOwner { + if (s_burners.remove(burner)) { + emit BurnAccessRevoked(burner); + } + } + + /// @notice Returns all permissioned minters + function getMinters() public view returns (address[] memory) { + return s_minters.values(); + } + + /// @notice Returns all permissioned burners + function getBurners() public view returns (address[] memory) { + return s_burners.values(); + } + + /// @notice Returns the current CCIPAdmin + function getCCIPAdmin() public view returns (address) { + return s_ccipAdmin; + } + + /// @notice Transfers the CCIPAdmin role to a new address + /// @dev only the owner can call this function, NOT the current ccipAdmin, and 1-step ownership transfer is used. + /// @param newAdmin The address to transfer the CCIPAdmin role to. Setting to address(0) is a valid way to revoke + /// the role + function setCCIPAdmin(address newAdmin) public onlyOwner { + address currentAdmin = s_ccipAdmin; + + s_ccipAdmin = newAdmin; + + emit CCIPAdminTransferred(currentAdmin, newAdmin); + } + + // ================================================================ + // | Access | + // ================================================================ + + /// @notice Checks whether a given address is a minter for this token. + /// @return true if the address is allowed to mint. + function isMinter(address minter) public view returns (bool) { + return s_minters.contains(minter); + } + + /// @notice Checks whether a given address is a burner for this token. + /// @return true if the address is allowed to burn. + function isBurner(address burner) public view returns (bool) { + return s_burners.contains(burner); + } + + /// @notice Checks whether the msg.sender is a permissioned minter for this token + /// @dev Reverts with a SenderNotMinter if the check fails + modifier onlyMinter() { + if (!isMinter(msg.sender)) revert SenderNotMinter(msg.sender); + _; + } + + /// @notice Checks whether the msg.sender is a permissioned burner for this token + /// @dev Reverts with a SenderNotBurner if the check fails + modifier onlyBurner() { + if (!isBurner(msg.sender)) revert SenderNotBurner(msg.sender); + _; + } +} diff --git a/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory/TokenPoolFactory.sol b/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory/TokenPoolFactory.sol index f129140da3..baef42b20d 100644 --- a/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory/TokenPoolFactory.sol +++ b/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory/TokenPoolFactory.sol @@ -6,12 +6,13 @@ import {ITokenAdminRegistry} from "../../interfaces/ITokenAdminRegistry.sol"; import {OwnerIsCreator} from "../../../shared/access/OwnerIsCreator.sol"; import {RateLimiter} from "../../libraries/RateLimiter.sol"; -import {BurnMintTokenPool} from "../../pools/BurnMintTokenPool.sol"; import {TokenPool} from "../../pools/TokenPool.sol"; -import {RegistryModuleOwnerCustom} from "./../RegistryModuleOwnerCustom.sol"; +import {RegistryModuleOwnerCustom} from "../RegistryModuleOwnerCustom.sol"; import {Create2} from "../../../vendor/openzeppelin-solidity/v5.0.2/contracts/utils/Create2.sol"; +import {console2 as console} from "forge-std/console2.sol"; + /// @notice A contract for deploying new tokens and token pools, and configuring them with the token admin registry /// @dev At the end of the transaction, the ownership transfer process will begin, but the user must accept the /// ownership transfer in a separate transaction. @@ -22,6 +23,12 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { error InvalidZeroAddress(); + enum PoolType { + BurnMint, + LockRelease + Custom + } + struct RemoteTokenPoolInfo { uint64 remoteChainSelector; // The CCIP specific selector for the remote chain // The address of the remote pool to either deploy or use as is. If @@ -29,6 +36,15 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { bytes remotePoolAddress; // The address of the remote token to either deploy or use as is // If the empty parameter flag is provided, the address will be predicted + bytes remotePoolInitCode; + // The addresses of the remote RMNProxy and Router to use as immutable params and the factory to use in + // address calculations + + + bytes remotePoolInitArgs; + // RemoteChainConfig remoteChainConfig; + RemoteChainConfig remoteChainConfig; + // the address of the remote token bytes remoteTokenAddress; // The init code for the remote token if it needs to be deployed // and includes all the constructor params already appended @@ -58,7 +74,7 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { address private immutable i_rmnProxy; address private immutable i_ccipRouter; - mapping(uint64 remoteChainSelector => RemoteChainConfig remoteConfig) private s_remoteChainConfigs; + // mapping(uint64 remoteChainSelector => RemoteChainConfig remoteConfig) private s_remoteChainConfigs; constructor( ITokenAdminRegistry tokenAdminRegistry, @@ -160,7 +176,7 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { RemoteTokenPoolInfo memory remoteTokenPool; for (uint256 i = 0; i < remoteTokenPools.length; i++) { remoteTokenPool = remoteTokenPools[i]; - RemoteChainConfig memory remoteChainConfig = s_remoteChainConfigs[remoteTokenPool.remoteChainSelector]; + // RemoteChainConfig memory remoteChainConfig = s_remoteChainConfigs[remoteTokenPool.remoteChainSelector]; // If the user provides an empty byte string, indicated no token has already been deployed, // then the address of the token needs to be predicted. Otherwise the address provided will be used. @@ -168,7 +184,10 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { // The user must provide the initCode for the remote token, so its address can be predicted correctly. It's // provided in the remoteTokenInitCode field for the remoteTokenPool remoteTokenPool.remoteTokenAddress = abi.encode( - salt.computeAddress(keccak256(remoteTokenPool.remoteTokenInitCode), remoteChainConfig.remotePoolFactory) + salt.computeAddress( + keccak256(remoteTokenPool.remoteTokenInitCode), + remoteTokenPool.remoteChainConfig.remotePoolFactory + ) ); } @@ -181,20 +200,20 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { // Combine the initCode with the initArgs to create the full deployment code bytes32 remotePoolInitcode = keccak256( bytes.concat( - type(BurnMintTokenPool).creationCode, + remoteTokenPool.remotePoolInitCode, // Calculate the remote pool Args with an empty allowList, remote RMN, and Remote Router addresses. abi.encode( abi.decode(remoteTokenPool.remoteTokenAddress, (address)), new address[](0), - remoteChainConfig.remoteRMNProxy, - remoteChainConfig.remoteRouter + remoteTokenPool.remoteChainConfig.remoteRMNProxy, + remoteTokenPool.remoteChainConfig.remoteRouter ) ) ); // Abi encode the computed remote address so it can be used as bytes in the chain update remoteTokenPool.remotePoolAddress = abi.encode( - salt.computeAddress(remotePoolInitcode, remoteChainConfig.remotePoolFactory) + salt.computeAddress(remotePoolInitcode, remoteTokenPool.remoteChainConfig.remotePoolFactory) ); } @@ -240,35 +259,4 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { // Begin the 2 admin transfer process which must be accepted in a separate tx. i_tokenAdminRegistry.transferAdminRole(token, msg.sender); } - - // ================================================================ - // | Remote Chain Configuration | - // ================================================================ - - /// @notice Updates the remote chain config for the given remote chain selector - /// @param remoteChainConfigs An array of remote chain configs to update - /// @dev The function may only be called by the contract owner. - function updateRemoteChainConfig(RemoteChainConfigUpdate[] calldata remoteChainConfigs) external onlyOwner { - for (uint256 i = 0; i < remoteChainConfigs.length; ++i) { - RemoteChainConfig memory remoteConfig = remoteChainConfigs[i].remoteChainConfig; - - // Zero address validation check - if ( - remoteChainConfigs[i].remoteChainSelector == 0 || - remoteConfig.remotePoolFactory == address(0) || - remoteConfig.remoteRouter == address(0) || - remoteConfig.remoteRMNProxy == address(0) - ) revert InvalidZeroAddress(); - - s_remoteChainConfigs[remoteChainConfigs[i].remoteChainSelector] = remoteChainConfigs[i].remoteChainConfig; - emit RemoteChainConfigUpdated(remoteChainConfigs[i].remoteChainSelector, remoteConfig); - } - } - - /// @notice Get the remote chain config for a given remote chain selector - /// @param remoteChainSelector The remote chain selector to get the config for - /// @return remoteChainConfig The remote chain config for the given remote chain selector - function getRemoteChainConfig(uint64 remoteChainSelector) public view returns (RemoteChainConfig memory) { - return s_remoteChainConfigs[remoteChainSelector]; - } } From ba1c74c7798996a7f285002ecb5a5e293c455257 Mon Sep 17 00:00:00 2001 From: Josh Date: Thu, 26 Sep 2024 15:59:43 -0400 Subject: [PATCH 30/48] add support for lock-release pools --- .../tokenAdminRegistry/TokenPoolFactory.t.sol | 146 +++++++++++++++++- .../TokenPoolFactory/TokenPoolFactory.sol | 103 +++++++----- 2 files changed, 204 insertions(+), 45 deletions(-) diff --git a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol index 2a6ba093e3..bf7e04dbe6 100644 --- a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol +++ b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol @@ -7,10 +7,12 @@ import {OwnerIsCreator} from "../../../shared/access/OwnerIsCreator.sol"; import {RateLimiter} from "../../libraries/RateLimiter.sol"; import {BurnMintTokenPool} from "../../pools/BurnMintTokenPool.sol"; +import {LockReleaseTokenPool} from "../../pools/LockReleaseTokenPool.sol"; import {TokenPool} from "../../pools/TokenPool.sol"; -import {FactoryBurnMintERC20} from "../../tokenAdminRegistry/TokenPoolFactory/FactoryBurnMintERC20.sol"; + import {RegistryModuleOwnerCustom} from "../../tokenAdminRegistry/RegistryModuleOwnerCustom.sol"; import {TokenAdminRegistry} from "../../tokenAdminRegistry/TokenAdminRegistry.sol"; +import {FactoryBurnMintERC20} from "../../tokenAdminRegistry/TokenPoolFactory/FactoryBurnMintERC20.sol"; import {TokenPoolFactory} from "../../tokenAdminRegistry/TokenPoolFactory/TokenPoolFactory.sol"; import {TokenAdminRegistrySetup} from "./TokenAdminRegistry.t.sol"; @@ -111,7 +113,8 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { s_tokenInitCode, s_poolInitCode, poolCreationParams, - FAKE_SALT + FAKE_SALT, + TokenPoolFactory.PoolType.BURN_MINT ); assertNotEq(address(0), tokenAddress, "Token Address should not be 0"); @@ -164,6 +167,7 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { "", // remotePoolAddress type(BurnMintTokenPool).creationCode, // remotePoolInitCode remoteChainConfig, // remoteChainConfig + TokenPoolFactory.PoolType.BURN_MINT, // poolType "", // remoteTokenAddress s_tokenInitCode, // remoteTokenInitCode RateLimiter.Config(false, 0, 0) @@ -182,7 +186,8 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { s_tokenInitCode, s_poolInitCode, "", - FAKE_SALT + FAKE_SALT, + TokenPoolFactory.PoolType.BURN_MINT ); // Ensure that the remote Token was set to the one we predicted @@ -227,7 +232,8 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { s_tokenInitCode, s_poolInitCode, "", - FAKE_SALT + FAKE_SALT, + TokenPoolFactory.PoolType.BURN_MINT ); assertEq( @@ -287,6 +293,7 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { "", // remotePoolAddress type(BurnMintTokenPool).creationCode, // remotePoolInitCode remoteChainConfig, // remoteChainConfig + TokenPoolFactory.PoolType.BURN_MINT, // poolType abi.encode(address(newRemoteToken)), // remoteTokenAddress s_tokenInitCode, // remoteTokenInitCode RateLimiter.Config(false, 0, 0) // rateLimiterConfig @@ -299,7 +306,8 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { s_tokenInitCode, s_poolInitCode, "", - FAKE_SALT + FAKE_SALT, + TokenPoolFactory.PoolType.BURN_MINT ); assertEq(address(TokenPool(poolAddress).getToken()), tokenAddress, "Token Address should have been set locally"); @@ -344,7 +352,8 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { new TokenPoolFactory.RemoteTokenPoolInfo[](0), s_poolInitCode, "", - FAKE_SALT + FAKE_SALT, + TokenPoolFactory.PoolType.BURN_MINT ); assertEq( @@ -381,6 +390,7 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { RANDOM_POOL_ADDRESS, // remotePoolAddress type(BurnMintTokenPool).creationCode, // remotePoolInitCode TokenPoolFactory.RemoteChainConfig(address(0), address(0), address(0)), // remoteChainConfig + TokenPoolFactory.PoolType.BURN_MINT, // poolType RANDOM_TOKEN_ADDRESS, // remoteTokenAddress "", // remoteTokenInitCode RateLimiter.Config(false, 0, 0) // rateLimiterConfig @@ -391,7 +401,8 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { s_tokenInitCode, s_poolInitCode, poolCreationParams, - FAKE_SALT + FAKE_SALT, + TokenPoolFactory.PoolType.BURN_MINT ); assertNotEq(address(0), tokenAddress, "Token Address should not be 0"); @@ -419,4 +430,125 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { assertEq(IOwner(poolAddress).owner(), OWNER, "Token should be owned by the owner"); } + + function test_createTokenPoolLockRelease_NoExistingToken_predict_Success() public { + vm.startPrank(OWNER); + bytes32 dynamicSalt = keccak256(abi.encodePacked(FAKE_SALT, OWNER)); + + // We have to create a new factory, registry module, and token admin registry to simulate the other chain + TokenAdminRegistry newTokenAdminRegistry = new TokenAdminRegistry(); + RegistryModuleOwnerCustom newRegistryModule = new RegistryModuleOwnerCustom(address(newTokenAdminRegistry)); + + // We want to deploy a new factory and Owner Module. + TokenPoolFactory newTokenPoolFactory = new TokenPoolFactory( + newTokenAdminRegistry, + newRegistryModule, + s_rmnProxy, + address(s_destRouter) + ); + + newTokenAdminRegistry.addRegistryModule(address(newRegistryModule)); + + TokenPoolFactory.RemoteChainConfig memory remoteChainConfig = TokenPoolFactory.RemoteChainConfig( + address(newTokenPoolFactory), + address(s_destRouter), + address(s_rmnProxy) + ); + + // Create an array of remote pools where nothing exists yet, but we want to predict the address for + // the new pool and token on DEST_CHAIN_SELECTOR + TokenPoolFactory.RemoteTokenPoolInfo[] memory remoteTokenPools = new TokenPoolFactory.RemoteTokenPoolInfo[](1); + + // The only field that matters is DEST_CHAIN_SELECTOR because we dont want any existing token pool or token + // on the remote chain + remoteTokenPools[0] = TokenPoolFactory.RemoteTokenPoolInfo( + DEST_CHAIN_SELECTOR, // remoteChainSelector + "", // remotePoolAddress + type(LockReleaseTokenPool).creationCode, // remotePoolInitCode + remoteChainConfig, // remoteChainConfig + TokenPoolFactory.PoolType.LOCK_RELEASE, // poolType + "", // remoteTokenAddress + s_tokenInitCode, // remoteTokenInitCode + RateLimiter.Config(false, 0, 0) + ); + + // Predict the address of the token and pool on the DESTINATION chain + address predictedTokenAddress = dynamicSalt.computeAddress( + keccak256(s_tokenInitCode), + address(newTokenPoolFactory) + ); + + // Since the remote chain information was provided, we should be able to get the information from the newly + // deployed token pool using the available getter functions + (, address poolAddress) = s_tokenPoolFactory.deployTokenAndTokenPool( + remoteTokenPools, + s_tokenInitCode, + type(LockReleaseTokenPool).creationCode, + "", + FAKE_SALT, + TokenPoolFactory.PoolType.LOCK_RELEASE + ); + + // Ensure that the remote Token was set to the one we predicted + assertEq( + abi.encode(predictedTokenAddress), + TokenPool(poolAddress).getRemoteToken(DEST_CHAIN_SELECTOR), + "Token Address should have been predicted" + ); + + { + // Create the constructor params for the predicted pool + // The predictedTokenAddress is NOT abi-encoded since the raw evm-address + // is used in the constructor params + bytes memory predictedPoolCreationParams = abi.encode( + predictedTokenAddress, + new address[](0), + s_rmnProxy, + true, + address(s_destRouter) + ); + + // Take the init code and concat the destination params to it, the initCode shouldn't change + bytes memory predictedPoolInitCode = abi.encodePacked( + type(LockReleaseTokenPool).creationCode, + predictedPoolCreationParams + ); + + // Predict the address of the pool on the DESTINATION chain + address predictedPoolAddress = dynamicSalt.computeAddress( + keccak256(predictedPoolInitCode), + address(newTokenPoolFactory) + ); + + // Assert that the address set for the remote pool is the same as the predicted address + assertEq( + abi.encode(predictedPoolAddress), + TokenPool(poolAddress).getRemotePool(DEST_CHAIN_SELECTOR), + "Pool Address should have been predicted" + ); + } + + // On the new token pool factory, representing a destination chain, + // deploy a new token and a new pool + (address newTokenAddress, address newPoolAddress) = newTokenPoolFactory.deployTokenAndTokenPool( + new TokenPoolFactory.RemoteTokenPoolInfo[](0), + s_tokenInitCode, + type(LockReleaseTokenPool).creationCode, + "", + FAKE_SALT, + TokenPoolFactory.PoolType.LOCK_RELEASE + ); + + assertEq( + TokenPool(poolAddress).getRemotePool(DEST_CHAIN_SELECTOR), + abi.encode(newPoolAddress), + "New Pool Address should have been deployed correctly" + ); + + assertEq( + TokenPool(poolAddress).getRemoteToken(DEST_CHAIN_SELECTOR), + abi.encode(newTokenAddress), + "New Token Address should have been deployed correctly" + ); + } } diff --git a/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory/TokenPoolFactory.sol b/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory/TokenPoolFactory.sol index baef42b20d..9fadb4ffc5 100644 --- a/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory/TokenPoolFactory.sol +++ b/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory/TokenPoolFactory.sol @@ -24,9 +24,9 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { error InvalidZeroAddress(); enum PoolType { - BurnMint, - LockRelease - Custom + BURN_MINT, + LOCK_RELEASE, + CUSTOM } struct RemoteTokenPoolInfo { @@ -38,12 +38,9 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { // If the empty parameter flag is provided, the address will be predicted bytes remotePoolInitCode; // The addresses of the remote RMNProxy and Router to use as immutable params and the factory to use in - // address calculations - - - bytes remotePoolInitArgs; - // RemoteChainConfig remoteChainConfig; RemoteChainConfig remoteChainConfig; + // The type of pool to deploy, as different pools require different constructor params + PoolType poolType; // the address of the remote token bytes remoteTokenAddress; // The init code for the remote token if it needs to be deployed @@ -61,11 +58,6 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { address remoteRMNProxy; // The RMNProxy contract on the remote chain } - struct RemoteChainConfigUpdate { - uint64 remoteChainSelector; - RemoteChainConfig remoteChainConfig; - } - string public constant typeAndVersion = "TokenPoolFactory 1.0.0-dev"; ITokenAdminRegistry private immutable i_tokenAdminRegistry; @@ -104,7 +96,8 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { bytes memory tokenInitCode, bytes calldata tokenPoolInitCode, bytes memory tokenPoolInitArgs, - bytes32 salt + bytes32 salt, + PoolType poolType ) external returns (address, address) { // Ensure a unique deployment between senders even if the same input parameter is used to prevent // DOS/Frontrunning attacks @@ -114,7 +107,7 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { address token = Create2.deploy(0, salt, tokenInitCode); // Deploy the token pool - address pool = _createTokenPool(token, remoteTokenPools, tokenPoolInitCode, tokenPoolInitArgs, salt); + address pool = _createTokenPool(token, remoteTokenPools, tokenPoolInitCode, tokenPoolInitArgs, salt, poolType); // Set the token pool for token in the token admin registry since this contract is the token and pool owner _setTokenPoolInTokenAdminRegistry(token, pool); @@ -141,14 +134,15 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { RemoteTokenPoolInfo[] calldata remoteTokenPools, bytes calldata tokenPoolInitCode, bytes memory tokenPoolInitArgs, - bytes32 salt + bytes32 salt, + PoolType poolType ) external returns (address poolAddress) { // Ensure a unique deployment between senders even if the same input parameter is used to prevent // DOS/Frontrunning attacks salt = keccak256(abi.encodePacked(salt, msg.sender)); // create the token pool and return the address - return _createTokenPool(token, remoteTokenPools, tokenPoolInitCode, tokenPoolInitArgs, salt); + return _createTokenPool(token, remoteTokenPools, tokenPoolInitCode, tokenPoolInitArgs, salt, poolType); } // ================================================================ @@ -168,7 +162,8 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { RemoteTokenPoolInfo[] calldata remoteTokenPools, bytes calldata tokenPoolInitCode, bytes memory tokenPoolInitArgs, - bytes32 salt + bytes32 salt, + PoolType poolType ) private returns (address) { // Create an array of chain updates to apply to the token pool TokenPool.ChainUpdate[] memory chainUpdates = new TokenPool.ChainUpdate[](remoteTokenPools.length); @@ -194,26 +189,16 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { // If the user provides an empty byte string parameter, indicating the pool has not been deployed yet, // the address of the pool should be predicted. Otherwise use the provided address. if (remoteTokenPool.remotePoolAddress.length == 0) { - // Generate the initCode that will be used on the remote chain. It is assumed that tokenInitCode - // will be the same on all chains, so it can be reused here. - - // Combine the initCode with the initArgs to create the full deployment code - bytes32 remotePoolInitcode = keccak256( - bytes.concat( - remoteTokenPool.remotePoolInitCode, - // Calculate the remote pool Args with an empty allowList, remote RMN, and Remote Router addresses. - abi.encode( - abi.decode(remoteTokenPool.remoteTokenAddress, (address)), - new address[](0), - remoteTokenPool.remoteChainConfig.remoteRMNProxy, - remoteTokenPool.remoteChainConfig.remoteRouter - ) - ) + bytes32 remotePoolInitcodeHash = _generatePoolInitcodeHash( + remoteTokenPool.remotePoolInitCode, + remoteTokenPool.remoteChainConfig, + abi.decode(remoteTokenPool.remoteTokenAddress, (address)), + remoteTokenPool.poolType ); // Abi encode the computed remote address so it can be used as bytes in the chain update remoteTokenPool.remotePoolAddress = abi.encode( - salt.computeAddress(remotePoolInitcode, remoteTokenPool.remoteChainConfig.remotePoolFactory) + salt.computeAddress(remotePoolInitcodeHash, remoteTokenPool.remoteChainConfig.remotePoolFactory) ); } @@ -227,11 +212,12 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { }); } - // If the user doesn't want to provide any special parameters which may be needed for a custom the token pool then - // use the standard burn/mint token pool params. Since the user can provide custom token pool init code, - // they must also provide custom constructor args. if (tokenPoolInitArgs.length == 0) { - tokenPoolInitArgs = abi.encode(token, new address[](0), i_rmnProxy, i_ccipRouter); + if (poolType == PoolType.BURN_MINT) { + tokenPoolInitArgs = abi.encode(token, new address[](0), i_rmnProxy, i_ccipRouter); + } else if (poolType == PoolType.LOCK_RELEASE) + // Lock/Release pools have an additional constructor param that must be accounted for + tokenPoolInitArgs = abi.encode(token, new address[](0), i_rmnProxy, true, i_ccipRouter); } // Construct the deployment code from the initCode and the initArgs and then deploy @@ -246,6 +232,47 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { return poolAddress; } + function _generatePoolInitcodeHash( + bytes memory initCode, + RemoteChainConfig memory remoteChainConfig, + address remoteTokenAddress, + PoolType poolType + ) private pure returns (bytes32) { + if (poolType == PoolType.BURN_MINT) { + return + keccak256( + abi.encodePacked( + initCode, + // constructor(address, address[], address, address) + abi.encode( + remoteTokenAddress, + new address[](0), + remoteChainConfig.remoteRMNProxy, + remoteChainConfig.remoteRouter + ) + ) + ); + } else if (poolType == PoolType.LOCK_RELEASE) { + return + keccak256( + abi.encodePacked( + initCode, + // constructor(address, address[], address, bool, address) + abi.encode( + remoteTokenAddress, + new address[](0), + remoteChainConfig.remoteRMNProxy, + true, + remoteChainConfig.remoteRouter + ) + ) + ); + } else { + // TODO Figure out Custom + return bytes32(0); + } + } + /// @notice Sets the token pool address in the token admin registry for a newly deployed token pool. /// @dev this function should only be called when the token is deployed by this contract as well, otherwise /// the token pool will not be able to be set in the token admin registry, and this function will revert. From b3dc9c174ed1a8448742b642a09c46bdaf719cb4 Mon Sep 17 00:00:00 2001 From: Josh Date: Fri, 27 Sep 2024 10:34:49 -0400 Subject: [PATCH 31/48] add comments and reomve unnec. initArgs parameter --- contracts/gas-snapshots/ccip.gas-snapshot | 264 +++++++++--------- .../tokenAdminRegistry/TokenPoolFactory.t.sol | 191 ++++--------- .../TokenPoolFactory/FactoryBurnMintERC20.sol | 16 +- .../TokenPoolFactory/TokenPoolFactory.sol | 100 +++---- 4 files changed, 231 insertions(+), 340 deletions(-) diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot index 8ae9ad18e3..e026dd1642 100644 --- a/contracts/gas-snapshots/ccip.gas-snapshot +++ b/contracts/gas-snapshots/ccip.gas-snapshot @@ -20,21 +20,21 @@ AggregateTokenLimiter_setRateLimiterConfig:test_OnlyOnlyCallableByAdminOrOwner_R AggregateTokenLimiter_setRateLimiterConfig:test_Owner_Success() (gas: 30393) AggregateTokenLimiter_setRateLimiterConfig:test_TokenLimitAdmin_Success() (gas: 32407) BurnFromMintTokenPool_lockOrBurn:test_ChainNotAllowed_Revert() (gas: 28842) -BurnFromMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 55227) -BurnFromMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 243952) +BurnFromMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 55271) +BurnFromMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 244024) BurnFromMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 24166) BurnMintTokenPool_lockOrBurn:test_ChainNotAllowed_Revert() (gas: 27609) -BurnMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 55227) -BurnMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 241788) +BurnMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 55271) +BurnMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 241912) BurnMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 17851) BurnMintTokenPool_releaseOrMint:test_ChainNotAllowed_Revert() (gas: 28805) -BurnMintTokenPool_releaseOrMint:test_PoolMintNotHealthy_Revert() (gas: 56209) -BurnMintTokenPool_releaseOrMint:test_PoolMint_Success() (gas: 112369) +BurnMintTokenPool_releaseOrMint:test_PoolMintNotHealthy_Revert() (gas: 56253) +BurnMintTokenPool_releaseOrMint:test_PoolMint_Success() (gas: 112391) BurnWithFromMintTokenPool_lockOrBurn:test_ChainNotAllowed_Revert() (gas: 28842) -BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 55227) -BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 243927) +BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 55271) +BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 244050) BurnWithFromMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 24170) -CCIPClientExample_sanity:test_ImmutableExamples_Success() (gas: 2052233) +CCIPClientExample_sanity:test_ImmutableExamples_Success() (gas: 2052431) CCIPConfigSetup:test_getCapabilityConfiguration_Success() (gas: 9508) CCIPConfig_ConfigStateMachine:test__computeConfigDigest_Success() (gas: 87751) CCIPConfig_ConfigStateMachine:test__computeNewConfigWithMeta_InitToRunning_Success() (gas: 359022) @@ -122,30 +122,30 @@ CommitStore_verify:test_Blessed_Success() (gas: 96581) CommitStore_verify:test_NotBlessed_Success() (gas: 61473) CommitStore_verify:test_Paused_Revert() (gas: 18568) CommitStore_verify:test_TooManyLeaves_Revert() (gas: 36848) -DefensiveExampleTest:test_HappyPath_Success() (gas: 200130) -DefensiveExampleTest:test_Recovery() (gas: 424336) -E2E:test_E2E_3MessagesSuccess_gas() (gas: 1106787) +DefensiveExampleTest:test_HappyPath_Success() (gas: 200200) +DefensiveExampleTest:test_Recovery() (gas: 424476) +E2E:test_E2E_3MessagesSuccess_gas() (gas: 1106985) EVM2EVMOffRamp__releaseOrMintToken:test__releaseOrMintToken_NotACompatiblePool_Revert() (gas: 38322) -EVM2EVMOffRamp__releaseOrMintToken:test__releaseOrMintToken_Success() (gas: 104372) -EVM2EVMOffRamp__releaseOrMintToken:test__releaseOrMintToken_TokenHandlingError_transfer_Revert() (gas: 86004) +EVM2EVMOffRamp__releaseOrMintToken:test__releaseOrMintToken_Success() (gas: 104438) +EVM2EVMOffRamp__releaseOrMintToken:test__releaseOrMintToken_TokenHandlingError_transfer_Revert() (gas: 86026) EVM2EVMOffRamp__releaseOrMintToken:test_releaseOrMintToken_InvalidDataLength_Revert() (gas: 37365) -EVM2EVMOffRamp__releaseOrMintToken:test_releaseOrMintToken_ReleaseOrMintBalanceMismatch_Revert() (gas: 95035) +EVM2EVMOffRamp__releaseOrMintToken:test_releaseOrMintToken_ReleaseOrMintBalanceMismatch_Revert() (gas: 95013) EVM2EVMOffRamp__releaseOrMintToken:test_releaseOrMintToken_TokenHandlingError_BalanceOf_Revert() (gas: 40341) EVM2EVMOffRamp__releaseOrMintToken:test_releaseOrMintToken_skip_ReleaseOrMintBalanceMismatch_if_pool_Revert() (gas: 87189) -EVM2EVMOffRamp__releaseOrMintTokens:test_OverValueWithARLOff_Success() (gas: 381462) -EVM2EVMOffRamp__releaseOrMintTokens:test_PriceNotFoundForToken_Reverts() (gas: 140546) -EVM2EVMOffRamp__releaseOrMintTokens:test_RateLimitErrors_Reverts() (gas: 798613) -EVM2EVMOffRamp__releaseOrMintTokens:test_TokenHandlingError_Reverts() (gas: 178356) +EVM2EVMOffRamp__releaseOrMintTokens:test_OverValueWithARLOff_Success() (gas: 381594) +EVM2EVMOffRamp__releaseOrMintTokens:test_PriceNotFoundForToken_Reverts() (gas: 140568) +EVM2EVMOffRamp__releaseOrMintTokens:test_RateLimitErrors_Reverts() (gas: 798833) +EVM2EVMOffRamp__releaseOrMintTokens:test_TokenHandlingError_Reverts() (gas: 178400) EVM2EVMOffRamp__releaseOrMintTokens:test__releaseOrMintTokens_NotACompatiblePool_Reverts() (gas: 29681) -EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_InvalidDataLengthReturnData_Revert() (gas: 67124) +EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_InvalidDataLengthReturnData_Revert() (gas: 67146) EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_InvalidEVMAddress_Revert() (gas: 43605) -EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_Success() (gas: 207958) -EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_destDenominatedDecimals_Success() (gas: 219299) +EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_Success() (gas: 208068) +EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_destDenominatedDecimals_Success() (gas: 219365) EVM2EVMOffRamp__report:test_Report_Success() (gas: 127774) -EVM2EVMOffRamp__trialExecute:test_RateLimitError_Success() (gas: 237362) -EVM2EVMOffRamp__trialExecute:test_TokenHandlingErrorIsCaught_Success() (gas: 245951) -EVM2EVMOffRamp__trialExecute:test_TokenPoolIsNotAContract_Success() (gas: 329217) -EVM2EVMOffRamp__trialExecute:test_trialExecute_Success() (gas: 310056) +EVM2EVMOffRamp__trialExecute:test_RateLimitError_Success() (gas: 237406) +EVM2EVMOffRamp__trialExecute:test_TokenHandlingErrorIsCaught_Success() (gas: 246039) +EVM2EVMOffRamp__trialExecute:test_TokenPoolIsNotAContract_Success() (gas: 329283) +EVM2EVMOffRamp__trialExecute:test_trialExecute_Success() (gas: 310166) EVM2EVMOffRamp_ccipReceive:test_Reverts() (gas: 17048) EVM2EVMOffRamp_constructor:test_CommitStoreAlreadyInUse_Revert() (gas: 153120) EVM2EVMOffRamp_constructor:test_Constructor_Success() (gas: 5212732) @@ -153,7 +153,7 @@ EVM2EVMOffRamp_constructor:test_ZeroOnRampAddress_Revert() (gas: 143845) EVM2EVMOffRamp_execute:test_EmptyReport_Revert() (gas: 21507) EVM2EVMOffRamp_execute:test_InvalidMessageId_Revert() (gas: 36936) EVM2EVMOffRamp_execute:test_InvalidSourceChain_Revert() (gas: 52324) -EVM2EVMOffRamp_execute:test_InvalidSourcePoolAddress_Success() (gas: 473299) +EVM2EVMOffRamp_execute:test_InvalidSourcePoolAddress_Success() (gas: 473387) EVM2EVMOffRamp_execute:test_ManualExecutionNotYetEnabled_Revert() (gas: 48346) EVM2EVMOffRamp_execute:test_MessageTooLarge_Revert() (gas: 153019) EVM2EVMOffRamp_execute:test_Paused_Revert() (gas: 103946) @@ -164,25 +164,25 @@ EVM2EVMOffRamp_execute:test_SingleMessageNoTokensUnordered_Success() (gas: 16011 EVM2EVMOffRamp_execute:test_SingleMessageNoTokens_Success() (gas: 175497) EVM2EVMOffRamp_execute:test_SingleMessageToNonCCIPReceiver_Success() (gas: 237901) EVM2EVMOffRamp_execute:test_SingleMessagesNoTokensSuccess_gas() (gas: 115048) -EVM2EVMOffRamp_execute:test_SkippedIncorrectNonceStillExecutes_Success() (gas: 406540) +EVM2EVMOffRamp_execute:test_SkippedIncorrectNonceStillExecutes_Success() (gas: 406606) EVM2EVMOffRamp_execute:test_SkippedIncorrectNonce_Success() (gas: 54774) EVM2EVMOffRamp_execute:test_StrictUntouchedToSuccess_Success() (gas: 132556) EVM2EVMOffRamp_execute:test_TokenDataMismatch_Revert() (gas: 52786) -EVM2EVMOffRamp_execute:test_TwoMessagesWithTokensAndGE_Success() (gas: 564339) -EVM2EVMOffRamp_execute:test_TwoMessagesWithTokensSuccess_gas() (gas: 494587) +EVM2EVMOffRamp_execute:test_TwoMessagesWithTokensAndGE_Success() (gas: 564471) +EVM2EVMOffRamp_execute:test_TwoMessagesWithTokensSuccess_gas() (gas: 494719) EVM2EVMOffRamp_execute:test_UnexpectedTokenData_Revert() (gas: 35887) -EVM2EVMOffRamp_execute:test_Unhealthy_Revert() (gas: 546201) +EVM2EVMOffRamp_execute:test_Unhealthy_Revert() (gas: 546333) EVM2EVMOffRamp_execute:test_UnsupportedNumberOfTokens_Revert() (gas: 65298) EVM2EVMOffRamp_execute:test__execute_SkippedAlreadyExecutedMessageUnordered_Success() (gas: 124107) EVM2EVMOffRamp_execute:test__execute_SkippedAlreadyExecutedMessage_Success() (gas: 144365) EVM2EVMOffRamp_execute:test_execute_RouterYULCall_Success() (gas: 394187) EVM2EVMOffRamp_executeSingleMessage:test_MessageSender_Revert() (gas: 18685) -EVM2EVMOffRamp_executeSingleMessage:test_NonContractWithTokens_Success() (gas: 275191) +EVM2EVMOffRamp_executeSingleMessage:test_NonContractWithTokens_Success() (gas: 275257) EVM2EVMOffRamp_executeSingleMessage:test_NonContract_Success() (gas: 18815) -EVM2EVMOffRamp_executeSingleMessage:test_TokenHandlingError_Revert() (gas: 223138) +EVM2EVMOffRamp_executeSingleMessage:test_TokenHandlingError_Revert() (gas: 223182) EVM2EVMOffRamp_executeSingleMessage:test_ZeroGasDONExecution_Revert() (gas: 48391) EVM2EVMOffRamp_executeSingleMessage:test_executeSingleMessage_NoTokens_Success() (gas: 47823) -EVM2EVMOffRamp_executeSingleMessage:test_executeSingleMessage_WithTokens_Success() (gas: 311488) +EVM2EVMOffRamp_executeSingleMessage:test_executeSingleMessage_WithTokens_Success() (gas: 311554) EVM2EVMOffRamp_executeSingleMessage:test_executeSingleMessage_ZeroGasZeroData_Success() (gas: 70839) EVM2EVMOffRamp_execute_upgrade:test_V2NonceNewSenderStartsAtZero_Success() (gas: 232136) EVM2EVMOffRamp_execute_upgrade:test_V2NonceStartsAtV1Nonce_Success() (gas: 281170) @@ -196,13 +196,13 @@ EVM2EVMOffRamp_manuallyExecute:test_ManualExecFailedTx_Revert() (gas: 188280) EVM2EVMOffRamp_manuallyExecute:test_ManualExecForkedChain_Revert() (gas: 27574) EVM2EVMOffRamp_manuallyExecute:test_ManualExecGasLimitMismatch_Revert() (gas: 46457) EVM2EVMOffRamp_manuallyExecute:test_ManualExecInvalidGasLimit_Revert() (gas: 27948) -EVM2EVMOffRamp_manuallyExecute:test_ManualExecWithMultipleMessagesAndSourceTokens_Success() (gas: 531198) -EVM2EVMOffRamp_manuallyExecute:test_ManualExecWithSourceTokens_Success() (gas: 344397) +EVM2EVMOffRamp_manuallyExecute:test_ManualExecWithMultipleMessagesAndSourceTokens_Success() (gas: 531330) +EVM2EVMOffRamp_manuallyExecute:test_ManualExecWithSourceTokens_Success() (gas: 344463) EVM2EVMOffRamp_manuallyExecute:test_ManualExec_Success() (gas: 189760) -EVM2EVMOffRamp_manuallyExecute:test_ReentrancyManualExecuteFails_Success() (gas: 2195062) -EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_DestinationGasAmountCountMismatch_Revert() (gas: 361988) +EVM2EVMOffRamp_manuallyExecute:test_ReentrancyManualExecuteFails_Success() (gas: 2195128) +EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_DestinationGasAmountCountMismatch_Revert() (gas: 362054) EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_DoesNotRevertIfUntouched_Success() (gas: 145457) -EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_InvalidTokenGasOverride_Revert() (gas: 365217) +EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_InvalidTokenGasOverride_Revert() (gas: 365283) EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_LowGasLimitManualExec_Success() (gas: 450711) EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_WithGasOverride_Success() (gas: 192223) EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_WithInvalidReceiverExecutionGasOverride_Revert() (gas: 155387) @@ -237,15 +237,15 @@ EVM2EVMOnRamp_forwardFromRouter:test_Permissions_Revert() (gas: 25757) EVM2EVMOnRamp_forwardFromRouter:test_PriceNotFoundForToken_Revert() (gas: 57722) EVM2EVMOnRamp_forwardFromRouter:test_ShouldIncrementNonceOnlyOnOrdered_Success() (gas: 182247) EVM2EVMOnRamp_forwardFromRouter:test_ShouldIncrementSeqNumAndNonce_Success() (gas: 180718) -EVM2EVMOnRamp_forwardFromRouter:test_ShouldStoreNonLinkFees() (gas: 133214) -EVM2EVMOnRamp_forwardFromRouter:test_SourceTokenDataTooLarge_Revert() (gas: 3573565) +EVM2EVMOnRamp_forwardFromRouter:test_ShouldStoreNonLinkFees() (gas: 133236) +EVM2EVMOnRamp_forwardFromRouter:test_SourceTokenDataTooLarge_Revert() (gas: 3573653) EVM2EVMOnRamp_forwardFromRouter:test_TooManyTokens_Revert() (gas: 30472) EVM2EVMOnRamp_forwardFromRouter:test_Unhealthy_Revert() (gas: 43480) EVM2EVMOnRamp_forwardFromRouter:test_UnsupportedToken_Revert() (gas: 110111) EVM2EVMOnRamp_forwardFromRouter:test_ZeroAddressReceiver_Revert() (gas: 316020) -EVM2EVMOnRamp_forwardFromRouter:test_forwardFromRouter_ShouldStoreLinkFees_Success() (gas: 113011) +EVM2EVMOnRamp_forwardFromRouter:test_forwardFromRouter_ShouldStoreLinkFees_Success() (gas: 113033) EVM2EVMOnRamp_forwardFromRouter:test_forwardFromRouter_UnsupportedToken_Revert() (gas: 72824) -EVM2EVMOnRamp_forwardFromRouter:test_forwardFromRouter_correctSourceTokenData_Success() (gas: 714506) +EVM2EVMOnRamp_forwardFromRouter:test_forwardFromRouter_correctSourceTokenData_Success() (gas: 714726) EVM2EVMOnRamp_forwardFromRouter_upgrade:test_V2NonceNewSenderStartsAtZero_Success() (gas: 148808) EVM2EVMOnRamp_forwardFromRouter_upgrade:test_V2NonceStartsAtV1Nonce_Success() (gas: 192679) EVM2EVMOnRamp_forwardFromRouter_upgrade:test_V2SenderNoncesReadsPreviousRamp_Success() (gas: 123243) @@ -274,14 +274,14 @@ EVM2EVMOnRamp_getTokenTransferCost:test_UnsupportedToken_Revert() (gas: 21353) EVM2EVMOnRamp_getTokenTransferCost:test_ZeroAmountTokenTransferChargesMinFeeAndGas_Success() (gas: 28382) EVM2EVMOnRamp_getTokenTransferCost:test_ZeroFeeConfigChargesMinFee_Success() (gas: 38899) EVM2EVMOnRamp_getTokenTransferCost:test__getTokenTransferCost_selfServeUsesDefaults_Success() (gas: 29674) -EVM2EVMOnRamp_linkAvailableForPayment:test_InsufficientLinkBalance_Success() (gas: 32734) -EVM2EVMOnRamp_linkAvailableForPayment:test_LinkAvailableForPayment_Success() (gas: 135225) -EVM2EVMOnRamp_payNops:test_AdminPayNops_Success() (gas: 143638) -EVM2EVMOnRamp_payNops:test_InsufficientBalance_Revert() (gas: 29174) -EVM2EVMOnRamp_payNops:test_NoFeesToPay_Revert() (gas: 127762) -EVM2EVMOnRamp_payNops:test_NoNopsToPay_Revert() (gas: 133615) -EVM2EVMOnRamp_payNops:test_NopPayNops_Success() (gas: 146925) -EVM2EVMOnRamp_payNops:test_OwnerPayNops_Success() (gas: 141500) +EVM2EVMOnRamp_linkAvailableForPayment:test_InsufficientLinkBalance_Success() (gas: 32756) +EVM2EVMOnRamp_linkAvailableForPayment:test_LinkAvailableForPayment_Success() (gas: 135247) +EVM2EVMOnRamp_payNops:test_AdminPayNops_Success() (gas: 143660) +EVM2EVMOnRamp_payNops:test_InsufficientBalance_Revert() (gas: 29196) +EVM2EVMOnRamp_payNops:test_NoFeesToPay_Revert() (gas: 127718) +EVM2EVMOnRamp_payNops:test_NoNopsToPay_Revert() (gas: 133580) +EVM2EVMOnRamp_payNops:test_NopPayNops_Success() (gas: 146947) +EVM2EVMOnRamp_payNops:test_OwnerPayNops_Success() (gas: 141522) EVM2EVMOnRamp_payNops:test_PayNopsSuccessAfterSetNops() (gas: 298719) EVM2EVMOnRamp_payNops:test_WrongPermissions_Revert() (gas: 15378) EVM2EVMOnRamp_setDynamicConfig:test_SetConfigInvalidConfig_Revert() (gas: 42524) @@ -291,10 +291,10 @@ EVM2EVMOnRamp_setFeeTokenConfig:test_OnlyCallableByOwnerOrAdmin_Revert() (gas: 1 EVM2EVMOnRamp_setFeeTokenConfig:test_SetFeeTokenConfigByAdmin_Success() (gas: 16497) EVM2EVMOnRamp_setFeeTokenConfig:test_SetFeeTokenConfig_Success() (gas: 14036) EVM2EVMOnRamp_setNops:test_AdminCanSetNops_Success() (gas: 61872) -EVM2EVMOnRamp_setNops:test_IncludesPayment_Success() (gas: 470769) +EVM2EVMOnRamp_setNops:test_IncludesPayment_Success() (gas: 470835) EVM2EVMOnRamp_setNops:test_LinkTokenCannotBeNop_Revert() (gas: 57370) EVM2EVMOnRamp_setNops:test_NonOwnerOrAdmin_Revert() (gas: 14779) -EVM2EVMOnRamp_setNops:test_NotEnoughFundsForPayout_Revert() (gas: 85178) +EVM2EVMOnRamp_setNops:test_NotEnoughFundsForPayout_Revert() (gas: 85200) EVM2EVMOnRamp_setNops:test_SetNopsRemovesOldNopsCompletely_Success() (gas: 60868) EVM2EVMOnRamp_setNops:test_SetNops_Success() (gas: 174097) EVM2EVMOnRamp_setNops:test_TooManyNops_Revert() (gas: 193503) @@ -303,10 +303,10 @@ EVM2EVMOnRamp_setTokenTransferFeeConfig:test__setTokenTransferFeeConfig_InvalidD EVM2EVMOnRamp_setTokenTransferFeeConfig:test__setTokenTransferFeeConfig_OnlyCallableByOwnerOrAdmin_Revert() (gas: 14427) EVM2EVMOnRamp_setTokenTransferFeeConfig:test__setTokenTransferFeeConfig_Success() (gas: 85487) EVM2EVMOnRamp_setTokenTransferFeeConfig:test__setTokenTransferFeeConfig_byAdmin_Success() (gas: 17468) -EVM2EVMOnRamp_withdrawNonLinkFees:test_LinkBalanceNotSettled_Revert() (gas: 83595) +EVM2EVMOnRamp_withdrawNonLinkFees:test_LinkBalanceNotSettled_Revert() (gas: 83617) EVM2EVMOnRamp_withdrawNonLinkFees:test_NonOwnerOrAdmin_Revert() (gas: 15353) -EVM2EVMOnRamp_withdrawNonLinkFees:test_SettlingBalance_Success() (gas: 272728) -EVM2EVMOnRamp_withdrawNonLinkFees:test_WithdrawNonLinkFees_Success() (gas: 53500) +EVM2EVMOnRamp_withdrawNonLinkFees:test_SettlingBalance_Success() (gas: 272851) +EVM2EVMOnRamp_withdrawNonLinkFees:test_WithdrawNonLinkFees_Success() (gas: 53566) EVM2EVMOnRamp_withdrawNonLinkFees:test_WithdrawToZeroAddress_Revert() (gas: 12875) EtherSenderReceiverTest_ccipReceive:test_ccipReceive_fallbackToWethTransfer() (gas: 96907) EtherSenderReceiverTest_ccipReceive:test_ccipReceive_happyPath() (gas: 49775) @@ -381,20 +381,20 @@ FeeQuoter_getValidatedFee:test_NotAFeeToken_Revert() (gas: 21172) FeeQuoter_getValidatedFee:test_SingleTokenMessage_Success() (gas: 113309) FeeQuoter_getValidatedFee:test_TooManyTokens_Revert() (gas: 22691) FeeQuoter_getValidatedFee:test_ZeroDataAvailabilityMultiplier_Success() (gas: 62714) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedErc20Above18Decimals_Success() (gas: 2045042) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedErc20Below18Decimals_Success() (gas: 2045000) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFeedAt0Decimals_Success() (gas: 2025119) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFeedAt18Decimals_Success() (gas: 2044774) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFlippedDecimals_Success() (gas: 2044978) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedMaxInt224Value_Success() (gas: 2044790) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedErc20Above18Decimals_Success() (gas: 1973907) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedErc20Below18Decimals_Success() (gas: 1973865) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFeedAt0Decimals_Success() (gas: 1953984) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFeedAt18Decimals_Success() (gas: 1973639) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFlippedDecimals_Success() (gas: 1973843) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedMaxInt224Value_Success() (gas: 1973655) FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedOverStalenessPeriod_Success() (gas: 64610) FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeed_Success() (gas: 64490) FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPrice_Success() (gas: 58894) -FeeQuoter_getValidatedTokenPrice:test_OverflowFeedPrice_Revert() (gas: 2044487) +FeeQuoter_getValidatedTokenPrice:test_OverflowFeedPrice_Revert() (gas: 1973352) FeeQuoter_getValidatedTokenPrice:test_StaleFeeToken_Success() (gas: 61764) FeeQuoter_getValidatedTokenPrice:test_TokenNotSupportedFeed_Revert() (gas: 116495) FeeQuoter_getValidatedTokenPrice:test_TokenNotSupported_Revert() (gas: 14037) -FeeQuoter_getValidatedTokenPrice:test_UnderflowFeedPrice_Revert() (gas: 2043164) +FeeQuoter_getValidatedTokenPrice:test_UnderflowFeedPrice_Revert() (gas: 1972029) FeeQuoter_onReport:test_OnReport_StaleUpdate_Revert() (gas: 43631) FeeQuoter_onReport:test_onReport_InvalidForwarder_Reverts() (gas: 23492) FeeQuoter_onReport:test_onReport_Success() (gas: 80094) @@ -433,13 +433,13 @@ FeeQuoter_validateDestFamilyAddress:test_InvalidEVMAddressPrecompiles_Revert() ( FeeQuoter_validateDestFamilyAddress:test_InvalidEVMAddress_Revert() (gas: 10839) FeeQuoter_validateDestFamilyAddress:test_ValidEVMAddress_Success() (gas: 6731) FeeQuoter_validateDestFamilyAddress:test_ValidNonEVMAddress_Success() (gas: 6511) -HybridUSDCTokenPoolMigrationTests:test_LockOrBurn_LockReleaseMechanism_then_switchToPrimary_Success() (gas: 209283) -HybridUSDCTokenPoolMigrationTests:test_LockOrBurn_PrimaryMechanism_Success() (gas: 135896) -HybridUSDCTokenPoolMigrationTests:test_LockOrBurn_WhileMigrationPause_Revert() (gas: 107112) +HybridUSDCTokenPoolMigrationTests:test_LockOrBurn_LockReleaseMechanism_then_switchToPrimary_Success() (gas: 209248) +HybridUSDCTokenPoolMigrationTests:test_LockOrBurn_PrimaryMechanism_Success() (gas: 135879) +HybridUSDCTokenPoolMigrationTests:test_LockOrBurn_WhileMigrationPause_Revert() (gas: 107090) HybridUSDCTokenPoolMigrationTests:test_LockOrBurn_onLockReleaseMechanism_Success() (gas: 144586) -HybridUSDCTokenPoolMigrationTests:test_MintOrRelease_OnLockReleaseMechanism_Success() (gas: 214795) -HybridUSDCTokenPoolMigrationTests:test_MintOrRelease_OnLockReleaseMechanism_then_switchToPrimary_Success() (gas: 423509) -HybridUSDCTokenPoolMigrationTests:test_MintOrRelease_incomingMessageWithPrimaryMechanism() (gas: 268840) +HybridUSDCTokenPoolMigrationTests:test_MintOrRelease_OnLockReleaseMechanism_Success() (gas: 214817) +HybridUSDCTokenPoolMigrationTests:test_MintOrRelease_OnLockReleaseMechanism_then_switchToPrimary_Success() (gas: 423641) +HybridUSDCTokenPoolMigrationTests:test_MintOrRelease_incomingMessageWithPrimaryMechanism() (gas: 268928) HybridUSDCTokenPoolMigrationTests:test_ReleaseOrMint_WhileMigrationPause_Revert() (gas: 111484) HybridUSDCTokenPoolMigrationTests:test_burnLockedUSDC_invalidPermissions_Revert() (gas: 39362) HybridUSDCTokenPoolMigrationTests:test_cancelExistingCCTPMigrationProposal() (gas: 33189) @@ -447,19 +447,19 @@ HybridUSDCTokenPoolMigrationTests:test_cannotCancelANonExistentMigrationProposal HybridUSDCTokenPoolMigrationTests:test_cannotModifyLiquidityWithoutPermissions_Revert() (gas: 13329) HybridUSDCTokenPoolMigrationTests:test_cannotTransferLiquidityDuringPendingMigration_Revert() (gas: 160900) HybridUSDCTokenPoolMigrationTests:test_lockOrBurn_then_BurnInCCTPMigration_Success() (gas: 255982) -HybridUSDCTokenPoolMigrationTests:test_transferLiquidity_Success() (gas: 165904) -HybridUSDCTokenPoolMigrationTests:test_unstickManualTxAfterMigration_destChain_Success() (gas: 154220) -HybridUSDCTokenPoolMigrationTests:test_unstickManualTxAfterMigration_homeChain_Success() (gas: 463617) -HybridUSDCTokenPoolTests:test_LockOrBurn_LockReleaseMechanism_then_switchToPrimary_Success() (gas: 209265) -HybridUSDCTokenPoolTests:test_LockOrBurn_PrimaryMechanism_Success() (gas: 135897) -HybridUSDCTokenPoolTests:test_LockOrBurn_WhileMigrationPause_Revert() (gas: 107157) +HybridUSDCTokenPoolMigrationTests:test_transferLiquidity_Success() (gas: 165921) +HybridUSDCTokenPoolMigrationTests:test_unstickManualTxAfterMigration_destChain_Success() (gas: 154242) +HybridUSDCTokenPoolMigrationTests:test_unstickManualTxAfterMigration_homeChain_Success() (gas: 463740) +HybridUSDCTokenPoolTests:test_LockOrBurn_LockReleaseMechanism_then_switchToPrimary_Success() (gas: 209230) +HybridUSDCTokenPoolTests:test_LockOrBurn_PrimaryMechanism_Success() (gas: 135880) +HybridUSDCTokenPoolTests:test_LockOrBurn_WhileMigrationPause_Revert() (gas: 107135) HybridUSDCTokenPoolTests:test_LockOrBurn_onLockReleaseMechanism_Success() (gas: 144607) -HybridUSDCTokenPoolTests:test_MintOrRelease_OnLockReleaseMechanism_Success() (gas: 214773) -HybridUSDCTokenPoolTests:test_MintOrRelease_OnLockReleaseMechanism_then_switchToPrimary_Success() (gas: 423487) -HybridUSDCTokenPoolTests:test_MintOrRelease_incomingMessageWithPrimaryMechanism() (gas: 268822) +HybridUSDCTokenPoolTests:test_MintOrRelease_OnLockReleaseMechanism_Success() (gas: 214795) +HybridUSDCTokenPoolTests:test_MintOrRelease_OnLockReleaseMechanism_then_switchToPrimary_Success() (gas: 423619) +HybridUSDCTokenPoolTests:test_MintOrRelease_incomingMessageWithPrimaryMechanism() (gas: 268910) HybridUSDCTokenPoolTests:test_ReleaseOrMint_WhileMigrationPause_Revert() (gas: 111528) HybridUSDCTokenPoolTests:test_cannotTransferLiquidityDuringPendingMigration_Revert() (gas: 160845) -HybridUSDCTokenPoolTests:test_transferLiquidity_Success() (gas: 165886) +HybridUSDCTokenPoolTests:test_transferLiquidity_Success() (gas: 165904) LockReleaseTokenPoolAndProxy_setRebalancer:test_SetRebalancer_Revert() (gas: 10989) LockReleaseTokenPoolAndProxy_setRebalancer:test_SetRebalancer_Success() (gas: 18028) LockReleaseTokenPoolPoolAndProxy_canAcceptLiquidity:test_CanAcceptLiquidity_Success() (gas: 3051552) @@ -471,17 +471,17 @@ LockReleaseTokenPoolPoolAndProxy_withdrawalLiquidity:test_Unauthorized_Revert() LockReleaseTokenPool_canAcceptLiquidity:test_CanAcceptLiquidity_Success() (gas: 2836138) LockReleaseTokenPool_lockOrBurn:test_LockOrBurnWithAllowList_Revert() (gas: 30062) LockReleaseTokenPool_lockOrBurn:test_LockOrBurnWithAllowList_Success() (gas: 79943) -LockReleaseTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 59576) +LockReleaseTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 59620) LockReleaseTokenPool_provideLiquidity:test_LiquidityNotAccepted_Revert() (gas: 2832618) LockReleaseTokenPool_provideLiquidity:test_Unauthorized_Revert() (gas: 11489) LockReleaseTokenPool_releaseOrMint:test_ChainNotAllowed_Revert() (gas: 72743) -LockReleaseTokenPool_releaseOrMint:test_PoolMintNotHealthy_Revert() (gas: 56308) -LockReleaseTokenPool_releaseOrMint:test_ReleaseOrMint_Success() (gas: 225477) +LockReleaseTokenPool_releaseOrMint:test_PoolMintNotHealthy_Revert() (gas: 56352) +LockReleaseTokenPool_releaseOrMint:test_ReleaseOrMint_Success() (gas: 225548) LockReleaseTokenPool_setRebalancer:test_SetRebalancer_Revert() (gas: 11011) LockReleaseTokenPool_setRebalancer:test_SetRebalancer_Success() (gas: 18094) LockReleaseTokenPool_supportsInterface:test_SupportsInterface_Success() (gas: 10196) -LockReleaseTokenPool_transferLiquidity:test_transferLiquidity_Success() (gas: 83187) -LockReleaseTokenPool_transferLiquidity:test_transferLiquidity_transferTooMuch_Revert() (gas: 55887) +LockReleaseTokenPool_transferLiquidity:test_transferLiquidity_Success() (gas: 83231) +LockReleaseTokenPool_transferLiquidity:test_transferLiquidity_transferTooMuch_Revert() (gas: 55953) LockReleaseTokenPool_withdrawalLiquidity:test_InsufficientLiquidity_Revert() (gas: 60187) LockReleaseTokenPool_withdrawalLiquidity:test_Unauthorized_Revert() (gas: 11464) LockRelease_setRateLimitAdmin:test_SetRateLimitAdmin_Revert() (gas: 11054) @@ -575,7 +575,7 @@ MultiOCR3Base_transmit:test_UnauthorizedSigner_Revert() (gas: 61275) MultiOCR3Base_transmit:test_UnconfiguredPlugin_Revert() (gas: 39933) MultiOCR3Base_transmit:test_ZeroSignatures_Revert() (gas: 33049) MultiOnRampTokenPoolReentrancy:test_OnRampTokenPoolReentrancy_Success() (gas: 233701) -MultiRampsE2E:test_E2E_3MessagesMMultiOffRampSuccess_gas() (gas: 1500382) +MultiRampsE2E:test_E2E_3MessagesMMultiOffRampSuccess_gas() (gas: 1500580) NonceManager_NonceIncrementation:test_getIncrementedOutboundNonce_Success() (gas: 37934) NonceManager_NonceIncrementation:test_incrementInboundNonce_Skip() (gas: 23706) NonceManager_NonceIncrementation:test_incrementInboundNonce_Success() (gas: 38778) @@ -639,7 +639,7 @@ OffRamp_batchExecute:test_MultipleReportsSameChain_Success() (gas: 278912) OffRamp_batchExecute:test_MultipleReportsSkipDuplicate_Success() (gas: 169308) OffRamp_batchExecute:test_OutOfBoundsGasLimitsAccess_Revert() (gas: 189031) OffRamp_batchExecute:test_SingleReport_Success() (gas: 157132) -OffRamp_batchExecute:test_Unhealthy_Success() (gas: 554076) +OffRamp_batchExecute:test_Unhealthy_Success() (gas: 554208) OffRamp_batchExecute:test_ZeroReports_Revert() (gas: 10600) OffRamp_ccipReceive:test_Reverts() (gas: 15385) OffRamp_commit:test_CommitOnRampMismatch_Revert() (gas: 92905) @@ -681,18 +681,18 @@ OffRamp_execute:test_UnauthorizedTransmitter_Revert() (gas: 148382) OffRamp_execute:test_WrongConfigWithSigners_Revert() (gas: 6672410) OffRamp_execute:test_ZeroReports_Revert() (gas: 17361) OffRamp_executeSingleMessage:test_MessageSender_Revert() (gas: 18511) -OffRamp_executeSingleMessage:test_NonContractWithTokens_Success() (gas: 243991) +OffRamp_executeSingleMessage:test_NonContractWithTokens_Success() (gas: 244057) OffRamp_executeSingleMessage:test_NonContract_Success() (gas: 20759) -OffRamp_executeSingleMessage:test_TokenHandlingError_Revert() (gas: 205050) +OffRamp_executeSingleMessage:test_TokenHandlingError_Revert() (gas: 205094) OffRamp_executeSingleMessage:test_ZeroGasDONExecution_Revert() (gas: 49316) OffRamp_executeSingleMessage:test_executeSingleMessage_NoTokens_Success() (gas: 48760) OffRamp_executeSingleMessage:test_executeSingleMessage_WithFailingValidationNoRouterCall_Revert() (gas: 218081) OffRamp_executeSingleMessage:test_executeSingleMessage_WithFailingValidation_Revert() (gas: 85349) -OffRamp_executeSingleMessage:test_executeSingleMessage_WithTokens_Success() (gas: 274128) +OffRamp_executeSingleMessage:test_executeSingleMessage_WithTokens_Success() (gas: 274194) OffRamp_executeSingleMessage:test_executeSingleMessage_WithVInterception_Success() (gas: 91809) OffRamp_executeSingleReport:test_DisabledSourceChain_Revert() (gas: 28260) OffRamp_executeSingleReport:test_EmptyReport_Revert() (gas: 22062) -OffRamp_executeSingleReport:test_InvalidSourcePoolAddress_Success() (gas: 481660) +OffRamp_executeSingleReport:test_InvalidSourcePoolAddress_Success() (gas: 481748) OffRamp_executeSingleReport:test_ManualExecutionNotYetEnabled_Revert() (gas: 48372) OffRamp_executeSingleReport:test_MismatchingDestChainSelector_Revert() (gas: 33959) OffRamp_executeSingleReport:test_NonExistingSourceChain_Revert() (gas: 28436) @@ -705,15 +705,15 @@ OffRamp_executeSingleReport:test_SingleMessageNoTokensUnordered_Success() (gas: OffRamp_executeSingleReport:test_SingleMessageNoTokens_Success() (gas: 213624) OffRamp_executeSingleReport:test_SingleMessageToNonCCIPReceiver_Success() (gas: 249506) OffRamp_executeSingleReport:test_SingleMessagesNoTokensSuccess_gas() (gas: 142151) -OffRamp_executeSingleReport:test_SkippedIncorrectNonceStillExecutes_Success() (gas: 409223) +OffRamp_executeSingleReport:test_SkippedIncorrectNonceStillExecutes_Success() (gas: 409289) OffRamp_executeSingleReport:test_SkippedIncorrectNonce_Success() (gas: 58293) OffRamp_executeSingleReport:test_TokenDataMismatch_Revert() (gas: 73868) -OffRamp_executeSingleReport:test_TwoMessagesWithTokensAndGE_Success() (gas: 583269) -OffRamp_executeSingleReport:test_TwoMessagesWithTokensSuccess_gas() (gas: 531983) +OffRamp_executeSingleReport:test_TwoMessagesWithTokensAndGE_Success() (gas: 583401) +OffRamp_executeSingleReport:test_TwoMessagesWithTokensSuccess_gas() (gas: 532115) OffRamp_executeSingleReport:test_UnexpectedTokenData_Revert() (gas: 33717) -OffRamp_executeSingleReport:test_UnhealthySingleChainCurse_Revert() (gas: 549606) -OffRamp_executeSingleReport:test_Unhealthy_Success() (gas: 549620) -OffRamp_executeSingleReport:test_WithCurseOnAnotherSourceChain_Success() (gas: 460363) +OffRamp_executeSingleReport:test_UnhealthySingleChainCurse_Revert() (gas: 549738) +OffRamp_executeSingleReport:test_Unhealthy_Success() (gas: 549752) +OffRamp_executeSingleReport:test_WithCurseOnAnotherSourceChain_Success() (gas: 460495) OffRamp_executeSingleReport:test__execute_SkippedAlreadyExecutedMessageUnordered_Success() (gas: 135910) OffRamp_executeSingleReport:test__execute_SkippedAlreadyExecutedMessage_Success() (gas: 165615) OffRamp_getExecutionState:test_FillExecutionState_Success() (gas: 3868658) @@ -729,34 +729,34 @@ OffRamp_manuallyExecute:test_manuallyExecute_InvalidReceiverExecutionGasLimit_Re OffRamp_manuallyExecute:test_manuallyExecute_InvalidTokenGasOverride_Revert() (gas: 55260) OffRamp_manuallyExecute:test_manuallyExecute_LowGasLimit_Success() (gas: 498614) OffRamp_manuallyExecute:test_manuallyExecute_MultipleReportsWithSingleCursedLane_Revert() (gas: 316158) -OffRamp_manuallyExecute:test_manuallyExecute_ReentrancyFails_Success() (gas: 2245294) +OffRamp_manuallyExecute:test_manuallyExecute_ReentrancyFails_Success() (gas: 2245360) OffRamp_manuallyExecute:test_manuallyExecute_SourceChainSelectorMismatch_Revert() (gas: 165602) OffRamp_manuallyExecute:test_manuallyExecute_Success() (gas: 227234) OffRamp_manuallyExecute:test_manuallyExecute_WithGasOverride_Success() (gas: 227774) OffRamp_manuallyExecute:test_manuallyExecute_WithMultiReportGasOverride_Success() (gas: 781510) OffRamp_manuallyExecute:test_manuallyExecute_WithPartialMessages_Success() (gas: 347431) OffRamp_releaseOrMintSingleToken:test__releaseOrMintSingleToken_NotACompatiblePool_Revert() (gas: 37634) -OffRamp_releaseOrMintSingleToken:test__releaseOrMintSingleToken_Success() (gas: 104338) -OffRamp_releaseOrMintSingleToken:test__releaseOrMintSingleToken_TokenHandlingError_transfer_Revert() (gas: 85320) +OffRamp_releaseOrMintSingleToken:test__releaseOrMintSingleToken_Success() (gas: 104404) +OffRamp_releaseOrMintSingleToken:test__releaseOrMintSingleToken_TokenHandlingError_transfer_Revert() (gas: 85342) OffRamp_releaseOrMintSingleToken:test_releaseOrMintToken_InvalidDataLength_Revert() (gas: 36752) -OffRamp_releaseOrMintSingleToken:test_releaseOrMintToken_ReleaseOrMintBalanceMismatch_Revert() (gas: 94404) +OffRamp_releaseOrMintSingleToken:test_releaseOrMintToken_ReleaseOrMintBalanceMismatch_Revert() (gas: 94382) OffRamp_releaseOrMintSingleToken:test_releaseOrMintToken_TokenHandlingError_BalanceOf_Revert() (gas: 39741) OffRamp_releaseOrMintSingleToken:test_releaseOrMintToken_skip_ReleaseOrMintBalanceMismatch_if_pool_Revert() (gas: 86516) -OffRamp_releaseOrMintTokens:test_TokenHandlingError_Reverts() (gas: 162337) +OffRamp_releaseOrMintTokens:test_TokenHandlingError_Reverts() (gas: 162381) OffRamp_releaseOrMintTokens:test__releaseOrMintTokens_PoolIsNotAPool_Reverts() (gas: 23903) -OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_InvalidDataLengthReturnData_Revert() (gas: 62729) -OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_PoolDoesNotSupportDest_Reverts() (gas: 79768) -OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_Success() (gas: 174402) -OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_WithGasOverride_Success() (gas: 176314) -OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_destDenominatedDecimals_Success() (gas: 187657) +OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_InvalidDataLengthReturnData_Revert() (gas: 62751) +OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_PoolDoesNotSupportDest_Reverts() (gas: 79790) +OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_Success() (gas: 174512) +OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_WithGasOverride_Success() (gas: 176424) +OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_destDenominatedDecimals_Success() (gas: 187723) OffRamp_setDynamicConfig:test_FeeQuoterZeroAddress_Revert() (gas: 11269) OffRamp_setDynamicConfig:test_NonOwner_Revert() (gas: 13884) OffRamp_setDynamicConfig:test_SetDynamicConfigWithInterceptor_Success() (gas: 46421) OffRamp_setDynamicConfig:test_SetDynamicConfig_Success() (gas: 24463) -OffRamp_trialExecute:test_RateLimitError_Success() (gas: 219311) -OffRamp_trialExecute:test_TokenHandlingErrorIsCaught_Success() (gas: 227889) -OffRamp_trialExecute:test_TokenPoolIsNotAContract_Success() (gas: 295284) -OffRamp_trialExecute:test_trialExecute_Success() (gas: 277784) +OffRamp_trialExecute:test_RateLimitError_Success() (gas: 219355) +OffRamp_trialExecute:test_TokenHandlingErrorIsCaught_Success() (gas: 227977) +OffRamp_trialExecute:test_TokenPoolIsNotAContract_Success() (gas: 295350) +OffRamp_trialExecute:test_trialExecute_Success() (gas: 277894) OnRampTokenPoolReentrancy:test_OnRampTokenPoolReentrancy_Success() (gas: 390842) OnRamp_applyAllowListUpdates:test_applyAllowListUpdates_InvalidAllowListRequestDisabledAllowListWithAdds() (gas: 18030) OnRamp_applyAllowListUpdates:test_applyAllowListUpdates_Revert() (gas: 67426) @@ -784,9 +784,9 @@ OnRamp_forwardFromRouter:test_Paused_Revert() (gas: 38431) OnRamp_forwardFromRouter:test_Permissions_Revert() (gas: 23640) OnRamp_forwardFromRouter:test_ShouldIncrementNonceOnlyOnOrdered_Success() (gas: 183954) OnRamp_forwardFromRouter:test_ShouldIncrementSeqNumAndNonce_Success() (gas: 210338) -OnRamp_forwardFromRouter:test_ShouldStoreLinkFees() (gas: 146132) -OnRamp_forwardFromRouter:test_ShouldStoreNonLinkFees() (gas: 160237) -OnRamp_forwardFromRouter:test_SourceTokenDataTooLarge_Revert() (gas: 3613854) +OnRamp_forwardFromRouter:test_ShouldStoreLinkFees() (gas: 146154) +OnRamp_forwardFromRouter:test_ShouldStoreNonLinkFees() (gas: 160259) +OnRamp_forwardFromRouter:test_SourceTokenDataTooLarge_Revert() (gas: 3613942) OnRamp_forwardFromRouter:test_UnAllowedOriginalSender_Revert() (gas: 24010) OnRamp_forwardFromRouter:test_UnsupportedToken_Revert() (gas: 75866) OnRamp_forwardFromRouter:test_forwardFromRouter_UnsupportedToken_Revert() (gas: 38599) @@ -805,7 +805,7 @@ OnRamp_setDynamicConfig:test_setDynamicConfig_InvalidConfigInvalidConfig_Revert( OnRamp_setDynamicConfig:test_setDynamicConfig_InvalidConfigOnlyOwner_Revert() (gas: 16850) OnRamp_setDynamicConfig:test_setDynamicConfig_InvalidConfigReentrancyGuardEnteredEqTrue_Revert() (gas: 13265) OnRamp_setDynamicConfig:test_setDynamicConfig_Success() (gas: 56369) -OnRamp_withdrawFeeTokens:test_WithdrawFeeTokens_Success() (gas: 97258) +OnRamp_withdrawFeeTokens:test_WithdrawFeeTokens_Success() (gas: 97302) PingPong_ccipReceive:test_CcipReceive_Success() (gas: 151349) PingPong_plumbing:test_OutOfOrderExecution_Success() (gas: 20310) PingPong_plumbing:test_Pausing_Success() (gas: 17810) @@ -904,8 +904,8 @@ RateLimiter_currentTokenBucketState:test_CurrentTokenBucketState_Success() (gas: RateLimiter_currentTokenBucketState:test_Refill_Success() (gas: 46849) RateLimiter_setTokenBucketConfig:test_SetRateLimiterConfig_Success() (gas: 38506) RegistryModuleOwnerCustom_constructor:test_constructor_Revert() (gas: 36033) -RegistryModuleOwnerCustom_registerAdminViaGetCCIPAdmin:test_registerAdminViaGetCCIPAdmin_Revert() (gas: 19663) -RegistryModuleOwnerCustom_registerAdminViaGetCCIPAdmin:test_registerAdminViaGetCCIPAdmin_Success() (gas: 130010) +RegistryModuleOwnerCustom_registerAdminViaGetCCIPAdmin:test_registerAdminViaGetCCIPAdmin_Revert() (gas: 19739) +RegistryModuleOwnerCustom_registerAdminViaGetCCIPAdmin:test_registerAdminViaGetCCIPAdmin_Success() (gas: 130086) RegistryModuleOwnerCustom_registerAdminViaOwner:test_registerAdminViaOwner_Revert() (gas: 19559) RegistryModuleOwnerCustom_registerAdminViaOwner:test_registerAdminViaOwner_Success() (gas: 129905) Router_applyRampUpdates:test_OffRampMismatch_Revert() (gas: 89366) @@ -936,7 +936,7 @@ Router_recoverTokens:test_RecoverTokensInvalidRecipient_Revert() (gas: 11334) Router_recoverTokens:test_RecoverTokensNoFunds_Revert() (gas: 20267) Router_recoverTokens:test_RecoverTokensNonOwner_Revert() (gas: 11171) Router_recoverTokens:test_RecoverTokensValueReceiver_Revert() (gas: 358049) -Router_recoverTokens:test_RecoverTokens_Success() (gas: 52445) +Router_recoverTokens:test_RecoverTokens_Success() (gas: 52480) Router_routeMessage:test_AutoExec_Success() (gas: 42816) Router_routeMessage:test_ExecutionEvent_Success() (gas: 158520) Router_routeMessage:test_ManualExec_Success() (gas: 35546) @@ -968,18 +968,18 @@ TokenAdminRegistry_setPool:test_setPool_Success() (gas: 36135) TokenAdminRegistry_setPool:test_setPool_ZeroAddressRemovesPool_Success() (gas: 30842) TokenAdminRegistry_transferAdminRole:test_transferAdminRole_OnlyAdministrator_Revert() (gas: 18103) TokenAdminRegistry_transferAdminRole:test_transferAdminRole_Success() (gas: 49438) -TokenPoolAndProxy:test_lockOrBurn_burnMint_Success() (gas: 5586367) -TokenPoolAndProxy:test_lockOrBurn_burnWithFromMint_Success() (gas: 5617902) -TokenPoolAndProxy:test_lockOrBurn_lockRelease_Success() (gas: 5793136) +TokenPoolAndProxy:test_lockOrBurn_burnMint_Success() (gas: 5586499) +TokenPoolAndProxy:test_lockOrBurn_burnWithFromMint_Success() (gas: 5617969) +TokenPoolAndProxy:test_lockOrBurn_lockRelease_Success() (gas: 5793246) TokenPoolAndProxy:test_setPreviousPool_Success() (gas: 3070731) -TokenPoolAndProxyMigration:test_tokenPoolMigration_Success_1_2() (gas: 6434669) -TokenPoolAndProxyMigration:test_tokenPoolMigration_Success_1_4() (gas: 6634802) -TokenPoolFactoryTests:test_TokenPoolFactory_Constructor_Revert() (gas: 4108300) -TokenPoolFactoryTests:test_createTokenPool_ExistingRemoteToken_AndPredictPool_Success() (gas: 15388758) -TokenPoolFactoryTests:test_createTokenPool_WithNoExistingRemoteContracts_predict_Success() (gas: 15658396) -TokenPoolFactoryTests:test_createTokenPool_WithNoExistingTokenOnRemoteChain_Success() (gas: 5743209) -TokenPoolFactoryTests:test_createTokenPool_WithRemoteTokenAndRemotePool_Success() (gas: 5897047) -TokenPoolFactoryTests:test_updateRemoteChainConfig_Success() (gas: 86214) +TokenPoolAndProxyMigration:test_tokenPoolMigration_Success_1_2() (gas: 6434801) +TokenPoolAndProxyMigration:test_tokenPoolMigration_Success_1_4() (gas: 6634934) +TokenPoolFactoryTests:test_TokenPoolFactory_Constructor_Revert() (gas: 1188046) +TokenPoolFactoryTests:test_createTokenPoolLockRelease_NoExistingToken_predict_Success() (gas: 12420072) +TokenPoolFactoryTests:test_createTokenPool_ExistingRemoteToken_AndPredictPool_Success() (gas: 12434881) +TokenPoolFactoryTests:test_createTokenPool_WithNoExistingRemoteContracts_predict_Success() (gas: 12702418) +TokenPoolFactoryTests:test_createTokenPool_WithNoExistingTokenOnRemoteChain_Success() (gas: 5740593) +TokenPoolFactoryTests:test_createTokenPool_WithRemoteTokenAndRemotePool_Success() (gas: 5880940) TokenPoolWithAllowList_applyAllowListUpdates:test_AllowListNotEnabled_Revert() (gas: 1979943) TokenPoolWithAllowList_applyAllowListUpdates:test_OnlyOwner_Revert() (gas: 12113) TokenPoolWithAllowList_applyAllowListUpdates:test_SetAllowListSkipsZero_Success() (gas: 23476) @@ -1021,9 +1021,9 @@ TokenProxy_getFee:test_GetFee_Success() (gas: 85240) USDCTokenPool__validateMessage:test_ValidateInvalidMessage_Revert() (gas: 25704) USDCTokenPool_lockOrBurn:test_CallerIsNotARampOnRouter_Revert() (gas: 35481) USDCTokenPool_lockOrBurn:test_LockOrBurnWithAllowList_Revert() (gas: 30235) -USDCTokenPool_lockOrBurn:test_LockOrBurn_Success() (gas: 133525) -USDCTokenPool_lockOrBurn:test_UnknownDomain_Revert() (gas: 478072) -USDCTokenPool_releaseOrMint:test_ReleaseOrMintRealTx_Success() (gas: 268584) +USDCTokenPool_lockOrBurn:test_LockOrBurn_Success() (gas: 133508) +USDCTokenPool_lockOrBurn:test_UnknownDomain_Revert() (gas: 478182) +USDCTokenPool_releaseOrMint:test_ReleaseOrMintRealTx_Success() (gas: 268672) USDCTokenPool_releaseOrMint:test_TokenMaxCapacityExceeded_Revert() (gas: 50952) USDCTokenPool_releaseOrMint:test_UnlockingUSDCFailed_Revert() (gas: 98987) USDCTokenPool_setDomains:test_InvalidDomain_Revert() (gas: 66393) diff --git a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol index bf7e04dbe6..0a1f2a66f3 100644 --- a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol +++ b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol @@ -18,8 +18,6 @@ import {TokenAdminRegistrySetup} from "./TokenAdminRegistry.t.sol"; import {Create2} from "../../../vendor/openzeppelin-solidity/v5.0.2/contracts/utils/Create2.sol"; -import {console2 as console} from "forge-std/console2.sol"; - contract TokenPoolFactorySetup is TokenAdminRegistrySetup { using Create2 for bytes32; @@ -44,12 +42,8 @@ contract TokenPoolFactorySetup is TokenAdminRegistrySetup { s_registryModuleOwnerCustom = new RegistryModuleOwnerCustom(address(s_tokenAdminRegistry)); s_tokenAdminRegistry.addRegistryModule(address(s_registryModuleOwnerCustom)); - s_tokenPoolFactory = new TokenPoolFactory( - s_tokenAdminRegistry, - s_registryModuleOwnerCustom, - s_rmnProxy, - address(s_sourceRouter) - ); + s_tokenPoolFactory = + new TokenPoolFactory(s_tokenAdminRegistry, s_registryModuleOwnerCustom, s_rmnProxy, address(s_sourceRouter)); // Create Init Code for BurnMintERC20 TestToken with 18 decimals and supply cap of max uint256 value s_tokenCreationParams = abi.encode("TestToken", "TT", 18, type(uint256).max, PREMINT_AMOUNT, OWNER); @@ -71,12 +65,7 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { function test_TokenPoolFactory_Constructor_Revert() public { // Revert cause the tokenAdminRegistry is address(0) vm.expectRevert(TokenPoolFactory.InvalidZeroAddress.selector); - new TokenPoolFactory( - ITokenAdminRegistry(address(0)), - RegistryModuleOwnerCustom(address(0)), - address(0), - address(0) - ); + new TokenPoolFactory(ITokenAdminRegistry(address(0)), RegistryModuleOwnerCustom(address(0)), address(0), address(0)); new TokenPoolFactory( ITokenAdminRegistry(address(0xdeadbeef)), @@ -91,11 +80,8 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { bytes32 dynamicSalt = keccak256(abi.encodePacked(FAKE_SALT, OWNER)); - address predictedTokenAddress = Create2.computeAddress( - dynamicSalt, - keccak256(s_tokenInitCode), - address(s_tokenPoolFactory) - ); + address predictedTokenAddress = + Create2.computeAddress(dynamicSalt, keccak256(s_tokenInitCode), address(s_tokenPoolFactory)); // Create the constructor params for the predicted pool bytes memory poolCreationParams = abi.encode(predictedTokenAddress, new address[](0), s_rmnProxy, s_sourceRouter); @@ -103,16 +89,13 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { // Predict the address of the pool before we make the tx by using the init code and the params bytes memory predictedPoolInitCode = abi.encodePacked(s_poolInitCode, poolCreationParams); - address predictedPoolAddress = dynamicSalt.computeAddress( - keccak256(predictedPoolInitCode), - address(s_tokenPoolFactory) - ); + address predictedPoolAddress = + dynamicSalt.computeAddress(keccak256(predictedPoolInitCode), address(s_tokenPoolFactory)); (address tokenAddress, address poolAddress) = s_tokenPoolFactory.deployTokenAndTokenPool( new TokenPoolFactory.RemoteTokenPoolInfo[](0), s_tokenInitCode, s_poolInitCode, - poolCreationParams, FAKE_SALT, TokenPoolFactory.PoolType.BURN_MINT ); @@ -141,20 +124,13 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { RegistryModuleOwnerCustom newRegistryModule = new RegistryModuleOwnerCustom(address(newTokenAdminRegistry)); // We want to deploy a new factory and Owner Module. - TokenPoolFactory newTokenPoolFactory = new TokenPoolFactory( - newTokenAdminRegistry, - newRegistryModule, - s_rmnProxy, - address(s_destRouter) - ); + TokenPoolFactory newTokenPoolFactory = + new TokenPoolFactory(newTokenAdminRegistry, newRegistryModule, s_rmnProxy, address(s_destRouter)); newTokenAdminRegistry.addRegistryModule(address(newRegistryModule)); - TokenPoolFactory.RemoteChainConfig memory remoteChainConfig = TokenPoolFactory.RemoteChainConfig( - address(newTokenPoolFactory), - address(s_destRouter), - address(s_rmnProxy) - ); + TokenPoolFactory.RemoteChainConfig memory remoteChainConfig = + TokenPoolFactory.RemoteChainConfig(address(newTokenPoolFactory), address(s_destRouter), address(s_rmnProxy)); // Create an array of remote pools where nothing exists yet, but we want to predict the address for // the new pool and token on DEST_CHAIN_SELECTOR @@ -174,20 +150,16 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { ); // Predict the address of the token and pool on the DESTINATION chain - address predictedTokenAddress = dynamicSalt.computeAddress( - keccak256(s_tokenInitCode), - address(newTokenPoolFactory) - ); + address predictedTokenAddress = dynamicSalt.computeAddress(keccak256(s_tokenInitCode), address(newTokenPoolFactory)); // Since the remote chain information was provided, we should be able to get the information from the newly // deployed token pool using the available getter functions (, address poolAddress) = s_tokenPoolFactory.deployTokenAndTokenPool( - remoteTokenPools, - s_tokenInitCode, - s_poolInitCode, - "", - FAKE_SALT, - TokenPoolFactory.PoolType.BURN_MINT + remoteTokenPools, // No existing remote pools + s_tokenInitCode, // Token Init Code + s_poolInitCode, // Pool Init Code + FAKE_SALT, // Salt + TokenPoolFactory.PoolType.BURN_MINT // Pool Type ); // Ensure that the remote Token was set to the one we predicted @@ -201,21 +173,15 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { // Create the constructor params for the predicted pool // The predictedTokenAddress is NOT abi-encoded since the raw evm-address // is used in the constructor params - bytes memory predictedPoolCreationParams = abi.encode( - predictedTokenAddress, - new address[](0), - s_rmnProxy, - address(s_destRouter) - ); + bytes memory predictedPoolCreationParams = + abi.encode(predictedTokenAddress, new address[](0), s_rmnProxy, address(s_destRouter)); // Take the init code and concat the destination params to it, the initCode shouldn't change bytes memory predictedPoolInitCode = abi.encodePacked(s_poolInitCode, predictedPoolCreationParams); // Predict the address of the pool on the DESTINATION chain - address predictedPoolAddress = dynamicSalt.computeAddress( - keccak256(predictedPoolInitCode), - address(newTokenPoolFactory) - ); + address predictedPoolAddress = + dynamicSalt.computeAddress(keccak256(predictedPoolInitCode), address(newTokenPoolFactory)); // Assert that the address set for the remote pool is the same as the predicted address assertEq( @@ -231,7 +197,6 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { new TokenPoolFactory.RemoteTokenPoolInfo[](0), s_tokenInitCode, s_poolInitCode, - "", FAKE_SALT, TokenPoolFactory.PoolType.BURN_MINT ); @@ -253,34 +218,21 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { vm.startPrank(OWNER); bytes32 dynamicSalt = keccak256(abi.encodePacked(FAKE_SALT, OWNER)); - FactoryBurnMintERC20 newRemoteToken = new FactoryBurnMintERC20( - "TestToken", - "TT", - 18, - type(uint256).max, - PREMINT_AMOUNT, - OWNER - ); + FactoryBurnMintERC20 newRemoteToken = + new FactoryBurnMintERC20("TestToken", "TT", 18, type(uint256).max, PREMINT_AMOUNT, OWNER); // We have to create a new factory, registry module, and token admin registry to simulate the other chain TokenAdminRegistry newTokenAdminRegistry = new TokenAdminRegistry(); RegistryModuleOwnerCustom newRegistryModule = new RegistryModuleOwnerCustom(address(newTokenAdminRegistry)); // We want to deploy a new factory and Owner Module. - TokenPoolFactory newTokenPoolFactory = new TokenPoolFactory( - newTokenAdminRegistry, - newRegistryModule, - s_rmnProxy, - address(s_destRouter) - ); + TokenPoolFactory newTokenPoolFactory = + new TokenPoolFactory(newTokenAdminRegistry, newRegistryModule, s_rmnProxy, address(s_destRouter)); newTokenAdminRegistry.addRegistryModule(address(newRegistryModule)); - TokenPoolFactory.RemoteChainConfig memory remoteChainConfig = TokenPoolFactory.RemoteChainConfig( - address(newTokenPoolFactory), - address(s_destRouter), - address(s_rmnProxy) - ); + TokenPoolFactory.RemoteChainConfig memory remoteChainConfig = + TokenPoolFactory.RemoteChainConfig(address(newTokenPoolFactory), address(s_destRouter), address(s_rmnProxy)); // Create an array of remote pools where nothing exists yet, but we want to predict the address for // the new pool and token on DEST_CHAIN_SELECTOR @@ -302,12 +254,7 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { // Since the remote chain information was provided, we should be able to get the information from the newly // deployed token pool using the available getter functions (address tokenAddress, address poolAddress) = s_tokenPoolFactory.deployTokenAndTokenPool( - remoteTokenPools, - s_tokenInitCode, - s_poolInitCode, - "", - FAKE_SALT, - TokenPoolFactory.PoolType.BURN_MINT + remoteTokenPools, s_tokenInitCode, s_poolInitCode, FAKE_SALT, TokenPoolFactory.PoolType.BURN_MINT ); assertEq(address(TokenPool(poolAddress).getToken()), tokenAddress, "Token Address should have been set locally"); @@ -322,21 +269,15 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { // Create the constructor params for the predicted pool // The predictedTokenAddress is NOT abi-encoded since the raw evm-address // is used in the constructor params - bytes memory predictedPoolCreationParams = abi.encode( - address(newRemoteToken), - new address[](0), - s_rmnProxy, - address(s_destRouter) - ); + bytes memory predictedPoolCreationParams = + abi.encode(address(newRemoteToken), new address[](0), s_rmnProxy, address(s_destRouter)); // Take the init code and concat the destination params to it, the initCode shouldn't change bytes memory predictedPoolInitCode = abi.encodePacked(s_poolInitCode, predictedPoolCreationParams); // Predict the address of the pool on the DESTINATION chain - address predictedPoolAddress = dynamicSalt.computeAddress( - keccak256(predictedPoolInitCode), - address(newTokenPoolFactory) - ); + address predictedPoolAddress = + dynamicSalt.computeAddress(keccak256(predictedPoolInitCode), address(newTokenPoolFactory)); // Assert that the address set for the remote pool is the same as the predicted address assertEq( @@ -351,7 +292,6 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { address(newRemoteToken), new TokenPoolFactory.RemoteTokenPoolInfo[](0), s_poolInitCode, - "", FAKE_SALT, TokenPoolFactory.PoolType.BURN_MINT ); @@ -372,16 +312,9 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { function test_createTokenPool_WithRemoteTokenAndRemotePool_Success() public { vm.startPrank(OWNER); - bytes32 dynamicSalt = keccak256(abi.encodePacked(FAKE_SALT, OWNER)); - bytes memory RANDOM_TOKEN_ADDRESS = abi.encode(makeAddr("RANDOM_TOKEN")); bytes memory RANDOM_POOL_ADDRESS = abi.encode(makeAddr("RANDOM_POOL")); - address predictedTokenAddress = dynamicSalt.computeAddress(keccak256(s_tokenInitCode), address(s_tokenPoolFactory)); - - // Create the constructor params for the predicted pool - bytes memory poolCreationParams = abi.encode(predictedTokenAddress, new address[](0), s_rmnProxy, s_sourceRouter); - // Create an array of remote pools with some fake addresses TokenPoolFactory.RemoteTokenPoolInfo[] memory remoteTokenPools = new TokenPoolFactory.RemoteTokenPoolInfo[](1); @@ -397,12 +330,7 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { ); (address tokenAddress, address poolAddress) = s_tokenPoolFactory.deployTokenAndTokenPool( - remoteTokenPools, - s_tokenInitCode, - s_poolInitCode, - poolCreationParams, - FAKE_SALT, - TokenPoolFactory.PoolType.BURN_MINT + remoteTokenPools, s_tokenInitCode, s_poolInitCode, FAKE_SALT, TokenPoolFactory.PoolType.BURN_MINT ); assertNotEq(address(0), tokenAddress, "Token Address should not be 0"); @@ -440,20 +368,13 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { RegistryModuleOwnerCustom newRegistryModule = new RegistryModuleOwnerCustom(address(newTokenAdminRegistry)); // We want to deploy a new factory and Owner Module. - TokenPoolFactory newTokenPoolFactory = new TokenPoolFactory( - newTokenAdminRegistry, - newRegistryModule, - s_rmnProxy, - address(s_destRouter) - ); + TokenPoolFactory newTokenPoolFactory = + new TokenPoolFactory(newTokenAdminRegistry, newRegistryModule, s_rmnProxy, address(s_destRouter)); newTokenAdminRegistry.addRegistryModule(address(newRegistryModule)); - TokenPoolFactory.RemoteChainConfig memory remoteChainConfig = TokenPoolFactory.RemoteChainConfig( - address(newTokenPoolFactory), - address(s_destRouter), - address(s_rmnProxy) - ); + TokenPoolFactory.RemoteChainConfig memory remoteChainConfig = + TokenPoolFactory.RemoteChainConfig(address(newTokenPoolFactory), address(s_destRouter), address(s_rmnProxy)); // Create an array of remote pools where nothing exists yet, but we want to predict the address for // the new pool and token on DEST_CHAIN_SELECTOR @@ -473,10 +394,7 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { ); // Predict the address of the token and pool on the DESTINATION chain - address predictedTokenAddress = dynamicSalt.computeAddress( - keccak256(s_tokenInitCode), - address(newTokenPoolFactory) - ); + address predictedTokenAddress = dynamicSalt.computeAddress(keccak256(s_tokenInitCode), address(newTokenPoolFactory)); // Since the remote chain information was provided, we should be able to get the information from the newly // deployed token pool using the available getter functions @@ -484,7 +402,6 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { remoteTokenPools, s_tokenInitCode, type(LockReleaseTokenPool).creationCode, - "", FAKE_SALT, TokenPoolFactory.PoolType.LOCK_RELEASE ); @@ -500,25 +417,16 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { // Create the constructor params for the predicted pool // The predictedTokenAddress is NOT abi-encoded since the raw evm-address // is used in the constructor params - bytes memory predictedPoolCreationParams = abi.encode( - predictedTokenAddress, - new address[](0), - s_rmnProxy, - true, - address(s_destRouter) - ); + bytes memory predictedPoolCreationParams = + abi.encode(predictedTokenAddress, new address[](0), s_rmnProxy, true, address(s_destRouter)); // Take the init code and concat the destination params to it, the initCode shouldn't change - bytes memory predictedPoolInitCode = abi.encodePacked( - type(LockReleaseTokenPool).creationCode, - predictedPoolCreationParams - ); + bytes memory predictedPoolInitCode = + abi.encodePacked(type(LockReleaseTokenPool).creationCode, predictedPoolCreationParams); // Predict the address of the pool on the DESTINATION chain - address predictedPoolAddress = dynamicSalt.computeAddress( - keccak256(predictedPoolInitCode), - address(newTokenPoolFactory) - ); + address predictedPoolAddress = + dynamicSalt.computeAddress(keccak256(predictedPoolInitCode), address(newTokenPoolFactory)); // Assert that the address set for the remote pool is the same as the predicted address assertEq( @@ -531,12 +439,11 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { // On the new token pool factory, representing a destination chain, // deploy a new token and a new pool (address newTokenAddress, address newPoolAddress) = newTokenPoolFactory.deployTokenAndTokenPool( - new TokenPoolFactory.RemoteTokenPoolInfo[](0), - s_tokenInitCode, - type(LockReleaseTokenPool).creationCode, - "", - FAKE_SALT, - TokenPoolFactory.PoolType.LOCK_RELEASE + new TokenPoolFactory.RemoteTokenPoolInfo[](0), // No existing remote pools + s_tokenInitCode, // Token Init Code + type(LockReleaseTokenPool).creationCode, // Pool Init Code + FAKE_SALT, // Salt + TokenPoolFactory.PoolType.LOCK_RELEASE // Pool Type ); assertEq( diff --git a/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory/FactoryBurnMintERC20.sol b/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory/FactoryBurnMintERC20.sol index 334cc5ed59..c59be5775d 100644 --- a/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory/FactoryBurnMintERC20.sol +++ b/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory/FactoryBurnMintERC20.sol @@ -1,19 +1,22 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import {IBurnMintERC20} from "../../../shared/token/ERC20/IBurnMintERC20.sol"; -import {IOwnable} from "../../../shared/interfaces/IOwnable.sol"; import {IGetCCIPAdmin} from "../../../ccip/interfaces/IGetCCIPAdmin.sol"; +import {IOwnable} from "../../../shared/interfaces/IOwnable.sol"; +import {IBurnMintERC20} from "../../../shared/token/ERC20/IBurnMintERC20.sol"; import {OwnerIsCreator} from "../../../shared/access/OwnerIsCreator.sol"; import {ERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/ERC20.sol"; -import {ERC20Burnable} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/extensions/ERC20Burnable.sol"; + import {IERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol"; +import {ERC20Burnable} from + "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/extensions/ERC20Burnable.sol"; import {IERC165} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/introspection/IERC165.sol"; import {EnumerableSet} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/structs/EnumerableSet.sol"; /// @notice A basic ERC20 compatible token contract with burn and minting roles. +/// @dev The constructor has been modified to support the deployment pattern used by a factory contract. /// @dev The total supply can be limited during deployment. contract FactoryBurnMintERC20 is IBurnMintERC20, IGetCCIPAdmin, IERC165, ERC20Burnable, OwnerIsCreator { using EnumerableSet for EnumerableSet.AddressSet; @@ -68,11 +71,8 @@ contract FactoryBurnMintERC20 is IBurnMintERC20, IGetCCIPAdmin, IERC165, ERC20Bu } function supportsInterface(bytes4 interfaceId) public pure virtual override returns (bool) { - return - interfaceId == type(IERC20).interfaceId || - interfaceId == type(IBurnMintERC20).interfaceId || - interfaceId == type(IERC165).interfaceId || - interfaceId == type(IOwnable).interfaceId; + return interfaceId == type(IERC20).interfaceId || interfaceId == type(IBurnMintERC20).interfaceId + || interfaceId == type(IERC165).interfaceId || interfaceId == type(IOwnable).interfaceId; } // ================================================================ diff --git a/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory/TokenPoolFactory.sol b/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory/TokenPoolFactory.sol index 9fadb4ffc5..ec4299df2f 100644 --- a/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory/TokenPoolFactory.sol +++ b/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory/TokenPoolFactory.sol @@ -11,8 +11,6 @@ import {RegistryModuleOwnerCustom} from "../RegistryModuleOwnerCustom.sol"; import {Create2} from "../../../vendor/openzeppelin-solidity/v5.0.2/contracts/utils/Create2.sol"; -import {console2 as console} from "forge-std/console2.sol"; - /// @notice A contract for deploying new tokens and token pools, and configuring them with the token admin registry /// @dev At the end of the transaction, the ownership transfer process will begin, but the user must accept the /// ownership transfer in a separate transaction. @@ -23,10 +21,10 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { error InvalidZeroAddress(); + /// @notice The type of pool to deploy. Types may be expanded in future versions enum PoolType { BURN_MINT, - LOCK_RELEASE, - CUSTOM + LOCK_RELEASE } struct RemoteTokenPoolInfo { @@ -75,10 +73,8 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { address ccipRouter ) { if ( - address(tokenAdminRegistry) == address(0) || - address(tokenAdminModule) == address(0) || - rmnProxy == address(0) || - ccipRouter == address(0) + address(tokenAdminRegistry) == address(0) || address(tokenAdminModule) == address(0) || rmnProxy == address(0) + || ccipRouter == address(0) ) revert InvalidZeroAddress(); i_tokenAdminRegistry = ITokenAdminRegistry(tokenAdminRegistry); @@ -95,7 +91,6 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { RemoteTokenPoolInfo[] calldata remoteTokenPools, bytes memory tokenInitCode, bytes calldata tokenPoolInitCode, - bytes memory tokenPoolInitArgs, bytes32 salt, PoolType poolType ) external returns (address, address) { @@ -107,7 +102,7 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { address token = Create2.deploy(0, salt, tokenInitCode); // Deploy the token pool - address pool = _createTokenPool(token, remoteTokenPools, tokenPoolInitCode, tokenPoolInitArgs, salt, poolType); + address pool = _createTokenPool(token, remoteTokenPools, tokenPoolInitCode, salt, poolType); // Set the token pool for token in the token admin registry since this contract is the token and pool owner _setTokenPoolInTokenAdminRegistry(token, pool); @@ -125,15 +120,12 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { /// @param token The address of the existing token to be used in the token pool /// @param remoteTokenPools An array of remote token pools info to be used in the pool's applyChainUpdates function /// @param tokenPoolInitCode The creation code for the token pool - /// @param tokenPoolInitArgs The arguments to be passed to the token pool's constructor and concatenated with the - /// initCode to be passed into the deployer function /// @param salt The salt to be used in the create2 deployment of the token pool /// @return poolAddress The address of the token pool that was deployed function deployTokenPoolWithExistingToken( address token, RemoteTokenPoolInfo[] calldata remoteTokenPools, bytes calldata tokenPoolInitCode, - bytes memory tokenPoolInitArgs, bytes32 salt, PoolType poolType ) external returns (address poolAddress) { @@ -142,7 +134,7 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { salt = keccak256(abi.encodePacked(salt, msg.sender)); // create the token pool and return the address - return _createTokenPool(token, remoteTokenPools, tokenPoolInitCode, tokenPoolInitArgs, salt, poolType); + return _createTokenPool(token, remoteTokenPools, tokenPoolInitCode, salt, poolType); } // ================================================================ @@ -153,15 +145,12 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { /// @param token The token to be used in the token pool /// @param remoteTokenPools An array of remote token pools info to be used in the pool's applyChainUpdates function /// @param tokenPoolInitCode The creation code for the token pool - /// @param tokenPoolInitArgs The arguments to be passed to the token pool's constructor and concatenated with the - /// initCode to be passed into the deployer function /// @param salt The salt to be used in the create2 deployment of the token pool /// @return poolAddress The address of the token pool that was deployed function _createTokenPool( address token, RemoteTokenPoolInfo[] calldata remoteTokenPools, bytes calldata tokenPoolInitCode, - bytes memory tokenPoolInitArgs, bytes32 salt, PoolType poolType ) private returns (address) { @@ -171,7 +160,6 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { RemoteTokenPoolInfo memory remoteTokenPool; for (uint256 i = 0; i < remoteTokenPools.length; i++) { remoteTokenPool = remoteTokenPools[i]; - // RemoteChainConfig memory remoteChainConfig = s_remoteChainConfigs[remoteTokenPool.remoteChainSelector]; // If the user provides an empty byte string, indicated no token has already been deployed, // then the address of the token needs to be predicted. Otherwise the address provided will be used. @@ -180,8 +168,7 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { // provided in the remoteTokenInitCode field for the remoteTokenPool remoteTokenPool.remoteTokenAddress = abi.encode( salt.computeAddress( - keccak256(remoteTokenPool.remoteTokenInitCode), - remoteTokenPool.remoteChainConfig.remotePoolFactory + keccak256(remoteTokenPool.remoteTokenInitCode), remoteTokenPool.remoteChainConfig.remotePoolFactory ) ); } @@ -197,9 +184,8 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { ); // Abi encode the computed remote address so it can be used as bytes in the chain update - remoteTokenPool.remotePoolAddress = abi.encode( - salt.computeAddress(remotePoolInitcodeHash, remoteTokenPool.remoteChainConfig.remotePoolFactory) - ); + remoteTokenPool.remotePoolAddress = + abi.encode(salt.computeAddress(remotePoolInitcodeHash, remoteTokenPool.remoteChainConfig.remotePoolFactory)); } chainUpdates[i] = TokenPool.ChainUpdate({ @@ -212,12 +198,13 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { }); } - if (tokenPoolInitArgs.length == 0) { - if (poolType == PoolType.BURN_MINT) { - tokenPoolInitArgs = abi.encode(token, new address[](0), i_rmnProxy, i_ccipRouter); - } else if (poolType == PoolType.LOCK_RELEASE) - // Lock/Release pools have an additional constructor param that must be accounted for - tokenPoolInitArgs = abi.encode(token, new address[](0), i_rmnProxy, true, i_ccipRouter); + // Construct the initArgs for the token pool using the immutable contracts for CCIP on the local chain + bytes memory tokenPoolInitArgs; + if (poolType == PoolType.BURN_MINT) { + tokenPoolInitArgs = abi.encode(token, new address[](0), i_rmnProxy, i_ccipRouter); + } else if (poolType == PoolType.LOCK_RELEASE) { + // Lock/Release pools have an additional boolean constructor param that must be accounted for + tokenPoolInitArgs = abi.encode(token, new address[](0), i_rmnProxy, true, i_ccipRouter); } // Construct the deployment code from the initCode and the initArgs and then deploy @@ -232,6 +219,13 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { return poolAddress; } + /// @notice Generates the hash of the init code the pool will be deployed with + /// @dev The init code hash is used with Create2 to predict the address of the pool on the remote chain + /// @param initCode The init code of the pool + /// @param remoteChainConfig The remote chain config for the pool + /// @param remoteTokenAddress The address of the remote token + /// @param poolType The type of pool to deploy + /// @return The hash of the init code function _generatePoolInitcodeHash( bytes memory initCode, RemoteChainConfig memory remoteChainConfig, @@ -239,38 +233,28 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { PoolType poolType ) private pure returns (bytes32) { if (poolType == PoolType.BURN_MINT) { - return - keccak256( - abi.encodePacked( - initCode, - // constructor(address, address[], address, address) - abi.encode( - remoteTokenAddress, - new address[](0), - remoteChainConfig.remoteRMNProxy, - remoteChainConfig.remoteRouter - ) + return keccak256( + abi.encodePacked( + initCode, + // constructor(address, address[], address, address) + abi.encode( + remoteTokenAddress, new address[](0), remoteChainConfig.remoteRMNProxy, remoteChainConfig.remoteRouter ) - ); - } else if (poolType == PoolType.LOCK_RELEASE) { - return - keccak256( - abi.encodePacked( - initCode, - // constructor(address, address[], address, bool, address) - abi.encode( - remoteTokenAddress, - new address[](0), - remoteChainConfig.remoteRMNProxy, - true, - remoteChainConfig.remoteRouter - ) - ) - ); + ) + ); } else { - // TODO Figure out Custom - return bytes32(0); + // if poolType == PoolType.LOCK_RELEASE + return keccak256( + abi.encodePacked( + initCode, + // constructor(address, address[], address, bool, address) + abi.encode( + remoteTokenAddress, new address[](0), remoteChainConfig.remoteRMNProxy, true, remoteChainConfig.remoteRouter + ) + ) + ); } + // Note: Future factory versions may have additional pool types which will need to be added here } /// @notice Sets the token pool address in the token admin registry for a newly deployed token pool. From e78543bf7430f6840a518eb71d17a5cee2035ab5 Mon Sep 17 00:00:00 2001 From: Josh Date: Mon, 30 Sep 2024 12:31:20 -0400 Subject: [PATCH 32/48] comment cleanup --- contracts/gas-snapshots/shared.gas-snapshot | 4 +- .../TokenPoolFactory/TokenPoolFactory.sol | 73 +++++++++++-------- 2 files changed, 46 insertions(+), 31 deletions(-) diff --git a/contracts/gas-snapshots/shared.gas-snapshot b/contracts/gas-snapshots/shared.gas-snapshot index d7a4e21978..0848baa098 100644 --- a/contracts/gas-snapshots/shared.gas-snapshot +++ b/contracts/gas-snapshots/shared.gas-snapshot @@ -39,10 +39,10 @@ CallWithExactGas__callWithExactGas:test_CallWithExactGasSafeReturnDataExactGas() CallWithExactGas__callWithExactGas:test_NoContractReverts() (gas: 11559) CallWithExactGas__callWithExactGas:test_NoGasForCallExactCheckReverts() (gas: 15788) CallWithExactGas__callWithExactGas:test_NotEnoughGasForCallReverts() (gas: 16241) -CallWithExactGas__callWithExactGas:test_callWithExactGasSuccess(bytes,bytes4) (runs: 257, μ: 15766, ~: 15719) +CallWithExactGas__callWithExactGas:test_callWithExactGasSuccess(bytes,bytes4) (runs: 257, μ: 15767, ~: 15719) CallWithExactGas__callWithExactGasEvenIfTargetIsNoContract:test_CallWithExactGasEvenIfTargetIsNoContractExactGasSuccess() (gas: 20116) CallWithExactGas__callWithExactGasEvenIfTargetIsNoContract:test_CallWithExactGasEvenIfTargetIsNoContractReceiverErrorSuccess() (gas: 67721) -CallWithExactGas__callWithExactGasEvenIfTargetIsNoContract:test_CallWithExactGasEvenIfTargetIsNoContractSuccess(bytes,bytes4) (runs: 257, μ: 16276, ~: 16229) +CallWithExactGas__callWithExactGasEvenIfTargetIsNoContract:test_CallWithExactGasEvenIfTargetIsNoContractSuccess(bytes,bytes4) (runs: 257, μ: 16277, ~: 16229) CallWithExactGas__callWithExactGasEvenIfTargetIsNoContract:test_NoContractSuccess() (gas: 12962) CallWithExactGas__callWithExactGasEvenIfTargetIsNoContract:test_NoGasForCallExactCheckReturnFalseSuccess() (gas: 13005) CallWithExactGas__callWithExactGasEvenIfTargetIsNoContract:test_NotEnoughGasForCallReturnsFalseSuccess() (gas: 13317) diff --git a/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory/TokenPoolFactory.sol b/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory/TokenPoolFactory.sol index ec4299df2f..abedff9a6d 100644 --- a/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory/TokenPoolFactory.sol +++ b/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory/TokenPoolFactory.sol @@ -14,6 +14,8 @@ import {Create2} from "../../../vendor/openzeppelin-solidity/v5.0.2/contracts/ut /// @notice A contract for deploying new tokens and token pools, and configuring them with the token admin registry /// @dev At the end of the transaction, the ownership transfer process will begin, but the user must accept the /// ownership transfer in a separate transaction. +/// @dev The address prediction mechanism is only capable of deploying and predicting addresses for EVM based chains. +/// adding compatibility for other chains will require additional offchain computation. contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { using Create2 for bytes32; @@ -29,34 +31,26 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { struct RemoteTokenPoolInfo { uint64 remoteChainSelector; // The CCIP specific selector for the remote chain - // The address of the remote pool to either deploy or use as is. If - // the empty parameter flag is provided, the address will be predicted - bytes remotePoolAddress; - // The address of the remote token to either deploy or use as is - // If the empty parameter flag is provided, the address will be predicted - bytes remotePoolInitCode; - // The addresses of the remote RMNProxy and Router to use as immutable params and the factory to use in - RemoteChainConfig remoteChainConfig; - // The type of pool to deploy, as different pools require different constructor params - PoolType poolType; - // the address of the remote token - bytes remoteTokenAddress; - // The init code for the remote token if it needs to be deployed - // and includes all the constructor params already appended - bytes remoteTokenInitCode; - // The rate limiter config for token messages to be used in the pool. - // The specified rate limit will also be applied to the token pool's inbound messages as well. - RateLimiter.Config rateLimiterConfig; + bytes remotePoolAddress; // The address of the remote pool to either deploy or use as is. If empty, address + // will be predicted + bytes remotePoolInitCode; // Remote pool creation code if it needs to be deployed, without constructor params + // appended to the end. + RemoteChainConfig remoteChainConfig; // The addresses of the remote RMNProxy, Router, and factory for determining + // the remote address + PoolType poolType; // The type of pool to deploy, either Burn/Mint or Lock/Release + bytes remoteTokenAddress; // EVM address for remote token. If empty, the address will be predicted + bytes remoteTokenInitCode; // The init code to be deployed on the remote chain and includes constructor params + RateLimiter.Config rateLimiterConfig; // Token Pool rate limit. Values will be applied on incoming an outgoing messages } // solhint-disable-next-line gas-struct-packing struct RemoteChainConfig { - address remotePoolFactory; // The factory contract on the remote chain - address remoteRouter; // The router contract on the remote chain + address remotePoolFactory; // The factory contract on the remote chain which will make the deployment + address remoteRouter; // The router on the remote chain address remoteRMNProxy; // The RMNProxy contract on the remote chain } - string public constant typeAndVersion = "TokenPoolFactory 1.0.0-dev"; + string public constant typeAndVersion = "TokenPoolFactory 1.7.0-dev"; ITokenAdminRegistry private immutable i_tokenAdminRegistry; RegistryModuleOwnerCustom private immutable i_registryModuleOwnerCustom; @@ -64,8 +58,11 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { address private immutable i_rmnProxy; address private immutable i_ccipRouter; - // mapping(uint64 remoteChainSelector => RemoteChainConfig remoteConfig) private s_remoteChainConfigs; - + /// @notice Construct the TokenPoolFactory + /// @param tokenAdminRegistry The address of the token admin registry + /// @param tokenAdminModule The address of the token admin module which can register the token via ownership module + /// @param rmnProxy The address of the RMNProxy contract token pools will be deployed with + /// @param ccipRouter The address of the CCIPRouter contract token pools will be deployed with constructor( ITokenAdminRegistry tokenAdminRegistry, RegistryModuleOwnerCustom tokenAdminModule, @@ -87,6 +84,18 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { // | Top-Level Deployment | // ================================================================ + /// @notice Deploys a token and token pool with the given token information and configures it with remote token pools + /// @dev The token and token pool are deployed in the same transaction, and the token pool is configured with the + /// remote token pools. The token pool is then set in the token admin registry. Ownership of the everything is transferred + /// to the msg.sender, but must be accepted in a separate transaction due to 2-step ownership transfer. + /// @param remoteTokenPools An array of remote token pools info to be used in the pool's applyChainUpdates function + /// or to be predicted if the pool has not been deployed yet on the remote chain + /// @param tokenInitCode The creation code for the token, which includes the constructor parameters already appended + /// @param tokenPoolInitCode The creation code for the token pool, without the constructor parameters appended + /// @param salt The salt to be used in the create2 deployment of the token and token pool to ensure a unique address + /// @param poolType The type of pool to deploy, either Burn/Mint or Lock/Release + /// @return token The address of the token that was deployed + /// @return pool The address of the token pool that was deployed function deployTokenAndTokenPool( RemoteTokenPoolInfo[] calldata remoteTokenPools, bytes memory tokenInitCode, @@ -158,7 +167,7 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { TokenPool.ChainUpdate[] memory chainUpdates = new TokenPool.ChainUpdate[](remoteTokenPools.length); RemoteTokenPoolInfo memory remoteTokenPool; - for (uint256 i = 0; i < remoteTokenPools.length; i++) { + for (uint256 i = 0; i < remoteTokenPools.length; ++i) { remoteTokenPool = remoteTokenPools[i]; // If the user provides an empty byte string, indicated no token has already been deployed, @@ -176,6 +185,9 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { // If the user provides an empty byte string parameter, indicating the pool has not been deployed yet, // the address of the pool should be predicted. Otherwise use the provided address. if (remoteTokenPool.remotePoolAddress.length == 0) { + + // Address is predicted based on the init code hash and the deployer, so the hash must first be computed + // using the initCode and a concatenated set of constructor parameters. bytes32 remotePoolInitcodeHash = _generatePoolInitcodeHash( remoteTokenPool.remotePoolInitCode, remoteTokenPool.remoteChainConfig, @@ -203,7 +215,8 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { if (poolType == PoolType.BURN_MINT) { tokenPoolInitArgs = abi.encode(token, new address[](0), i_rmnProxy, i_ccipRouter); } else if (poolType == PoolType.LOCK_RELEASE) { - // Lock/Release pools have an additional boolean constructor param that must be accounted for + // Lock/Release pools have an additional boolean constructor parameter that must be accounted for, acceptLiquidity, + // which is set to true by default in this case. Users wishing to set it to false must deploy the pool manually. tokenPoolInitArgs = abi.encode(token, new address[](0), i_rmnProxy, true, i_ccipRouter); } @@ -221,17 +234,19 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { /// @notice Generates the hash of the init code the pool will be deployed with /// @dev The init code hash is used with Create2 to predict the address of the pool on the remote chain + /// @dev ABI-encoding limitations prevent arbitrary constructor parameters from being used, so pool type must be + /// restricted to those with known types in the constructor. This function should be updated if new pool types are needed. /// @param initCode The init code of the pool /// @param remoteChainConfig The remote chain config for the pool /// @param remoteTokenAddress The address of the remote token /// @param poolType The type of pool to deploy - /// @return The hash of the init code + /// @return bytes32 hash of the init code to be used in the deterministic address calculation function _generatePoolInitcodeHash( bytes memory initCode, RemoteChainConfig memory remoteChainConfig, address remoteTokenAddress, PoolType poolType - ) private pure returns (bytes32) { + ) internal virtual pure returns (bytes32) { if (poolType == PoolType.BURN_MINT) { return keccak256( abi.encodePacked( @@ -243,7 +258,7 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { ) ); } else { - // if poolType == PoolType.LOCK_RELEASE + // if poolType is PoolType.LOCK_RELEASE, but may be expanded in future versions return keccak256( abi.encodePacked( initCode, @@ -254,7 +269,7 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { ) ); } - // Note: Future factory versions may have additional pool types which will need to be added here + } /// @notice Sets the token pool address in the token admin registry for a newly deployed token pool. From bbabb8d101401245c4c4c94981ad68987a35c429 Mon Sep 17 00:00:00 2001 From: Josh Date: Mon, 30 Sep 2024 12:34:52 -0400 Subject: [PATCH 33/48] forge fmt --- .../TokenPoolFactory/TokenPoolFactory.sol | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory/TokenPoolFactory.sol b/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory/TokenPoolFactory.sol index abedff9a6d..f76a0f63eb 100644 --- a/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory/TokenPoolFactory.sol +++ b/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory/TokenPoolFactory.sol @@ -185,7 +185,6 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { // If the user provides an empty byte string parameter, indicating the pool has not been deployed yet, // the address of the pool should be predicted. Otherwise use the provided address. if (remoteTokenPool.remotePoolAddress.length == 0) { - // Address is predicted based on the init code hash and the deployer, so the hash must first be computed // using the initCode and a concatenated set of constructor parameters. bytes32 remotePoolInitcodeHash = _generatePoolInitcodeHash( @@ -215,7 +214,7 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { if (poolType == PoolType.BURN_MINT) { tokenPoolInitArgs = abi.encode(token, new address[](0), i_rmnProxy, i_ccipRouter); } else if (poolType == PoolType.LOCK_RELEASE) { - // Lock/Release pools have an additional boolean constructor parameter that must be accounted for, acceptLiquidity, + // Lock/Release pools have an additional boolean constructor parameter that must be accounted for, acceptLiquidity, // which is set to true by default in this case. Users wishing to set it to false must deploy the pool manually. tokenPoolInitArgs = abi.encode(token, new address[](0), i_rmnProxy, true, i_ccipRouter); } @@ -246,7 +245,7 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { RemoteChainConfig memory remoteChainConfig, address remoteTokenAddress, PoolType poolType - ) internal virtual pure returns (bytes32) { + ) internal pure virtual returns (bytes32) { if (poolType == PoolType.BURN_MINT) { return keccak256( abi.encodePacked( @@ -269,7 +268,6 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { ) ); } - } /// @notice Sets the token pool address in the token admin registry for a newly deployed token pool. From bf6d75d59916fbeba289524e8c8ed6602a7dc004 Mon Sep 17 00:00:00 2001 From: Josh Date: Fri, 4 Oct 2024 10:27:26 -0400 Subject: [PATCH 34/48] CI cleanup --- contracts/gas-snapshots/ccip.gas-snapshot | 27 ++ .../operatorforwarder.gas-snapshot | 18 +- .../ccip/test/legacy/TokenPoolAndProxy.t.sol | 76 +--- .../FactoryBurnMintERC20.t.sol | 360 ++++++++++++++++++ 4 files changed, 414 insertions(+), 67 deletions(-) create mode 100644 contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20.t.sol diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot index 38e3a72dfc..a361de5134 100644 --- a/contracts/gas-snapshots/ccip.gas-snapshot +++ b/contracts/gas-snapshots/ccip.gas-snapshot @@ -329,6 +329,33 @@ EtherSenderReceiverTest_validatedMessage:test_validatedMessage_emptyDataOverwrit EtherSenderReceiverTest_validatedMessage:test_validatedMessage_invalidTokenAmounts() (gas: 17925) EtherSenderReceiverTest_validatedMessage:test_validatedMessage_tokenOverwrittenToWeth() (gas: 25329) EtherSenderReceiverTest_validatedMessage:test_validatedMessage_validMessage_extraArgs() (gas: 26370) +FactoryBurnMintERC20approve:testApproveSuccess() (gas: 55767) +FactoryBurnMintERC20approve:testInvalidAddressReverts() (gas: 10709) +FactoryBurnMintERC20burn:testBasicBurnSuccess() (gas: 172380) +FactoryBurnMintERC20burn:testBurnFromZeroAddressReverts() (gas: 47384) +FactoryBurnMintERC20burn:testExceedsBalanceReverts() (gas: 21962) +FactoryBurnMintERC20burn:testSenderNotBurnerReverts() (gas: 13491) +FactoryBurnMintERC20burnFrom:testBurnFromSuccess() (gas: 58212) +FactoryBurnMintERC20burnFrom:testExceedsBalanceReverts() (gas: 36130) +FactoryBurnMintERC20burnFrom:testInsufficientAllowanceReverts() (gas: 22054) +FactoryBurnMintERC20burnFrom:testSenderNotBurnerReverts() (gas: 13491) +FactoryBurnMintERC20burnFromAlias:testBurnFromSuccess() (gas: 58187) +FactoryBurnMintERC20burnFromAlias:testExceedsBalanceReverts() (gas: 36094) +FactoryBurnMintERC20burnFromAlias:testInsufficientAllowanceReverts() (gas: 22009) +FactoryBurnMintERC20burnFromAlias:testSenderNotBurnerReverts() (gas: 13446) +FactoryBurnMintERC20constructor:testConstructorSuccess() (gas: 1495659) +FactoryBurnMintERC20decreaseApproval:testDecreaseApprovalSuccess() (gas: 31323) +FactoryBurnMintERC20grantMintAndBurnRoles:testGrantMintAndBurnRolesSuccess() (gas: 121439) +FactoryBurnMintERC20grantRole:testGrantBurnAccessSuccess() (gas: 53612) +FactoryBurnMintERC20grantRole:testGrantManySuccess() (gas: 963184) +FactoryBurnMintERC20grantRole:testGrantMintAccessSuccess() (gas: 94434) +FactoryBurnMintERC20increaseApproval:testIncreaseApprovalSuccess() (gas: 44368) +FactoryBurnMintERC20mint:testBasicMintSuccess() (gas: 149987) +FactoryBurnMintERC20mint:testMaxSupplyExceededReverts() (gas: 50703) +FactoryBurnMintERC20mint:testSenderNotMinterReverts() (gas: 11328) +FactoryBurnMintERC20supportsInterface:testConstructorSuccess() (gas: 11345) +FactoryBurnMintERC20transfer:testInvalidAddressReverts() (gas: 10707) +FactoryBurnMintERC20transfer:testTransferSuccess() (gas: 42427) FeeQuoter_applyDestChainConfigUpdates:test_InvalidChainFamilySelector_Revert() (gas: 16686) FeeQuoter_applyDestChainConfigUpdates:test_InvalidDestChainConfigDestChainSelectorEqZero_Revert() (gas: 16588) FeeQuoter_applyDestChainConfigUpdates:test_applyDestChainConfigUpdatesDefaultTxGasLimitEqZero_Revert() (gas: 16630) diff --git a/contracts/gas-snapshots/operatorforwarder.gas-snapshot b/contracts/gas-snapshots/operatorforwarder.gas-snapshot index 0414f500c2..551fde38f3 100644 --- a/contracts/gas-snapshots/operatorforwarder.gas-snapshot +++ b/contracts/gas-snapshots/operatorforwarder.gas-snapshot @@ -2,14 +2,14 @@ FactoryTest:test_DeployNewForwarderAndTransferOwnership_Success() (gas: 1059722) FactoryTest:test_DeployNewForwarder_Success() (gas: 1048209) FactoryTest:test_DeployNewOperatorAndForwarder_Success() (gas: 4069305) FactoryTest:test_DeployNewOperator_Success() (gas: 3020464) -ForwarderTest:test_Forward_Success(uint256) (runs: 257, μ: 226979, ~: 227289) -ForwarderTest:test_MultiForward_Success(uint256,uint256) (runs: 257, μ: 258577, ~: 259120) -ForwarderTest:test_OwnerForward_Success() (gas: 30096) +ForwarderTest:test_Forward_Success(uint256) (runs: 256, μ: 226978, ~: 227289) +ForwarderTest:test_MultiForward_Success(uint256,uint256) (runs: 256, μ: 258575, ~: 259120) +ForwarderTest:test_OwnerForward_Success() (gas: 30118) ForwarderTest:test_SetAuthorizedSenders_Success() (gas: 160524) ForwarderTest:test_TransferOwnershipWithMessage_Success() (gas: 35123) -OperatorTest:test_CancelOracleRequest_Success() (gas: 274295) -OperatorTest:test_FulfillOracleRequest_Success() (gas: 330480) -OperatorTest:test_NotAuthorizedSender_Revert() (gas: 246628) -OperatorTest:test_OracleRequest_Success() (gas: 249843) -OperatorTest:test_SendRequestAndCancelRequest_Success(uint96) (runs: 257, μ: 386787, ~: 386790) -OperatorTest:test_SendRequest_Success(uint96) (runs: 257, μ: 303436, ~: 303439) \ No newline at end of file +OperatorTest:test_CancelOracleRequest_Success() (gas: 274436) +OperatorTest:test_FulfillOracleRequest_Success() (gas: 330603) +OperatorTest:test_NotAuthorizedSender_Revert() (gas: 246716) +OperatorTest:test_OracleRequest_Success() (gas: 250019) +OperatorTest:test_SendRequestAndCancelRequest_Success(uint96) (runs: 256, μ: 387121, ~: 387124) +OperatorTest:test_SendRequest_Success(uint96) (runs: 256, μ: 303612, ~: 303615) \ No newline at end of file diff --git a/contracts/src/v0.8/ccip/test/legacy/TokenPoolAndProxy.t.sol b/contracts/src/v0.8/ccip/test/legacy/TokenPoolAndProxy.t.sol index a721d37c64..9645d70b7a 100644 --- a/contracts/src/v0.8/ccip/test/legacy/TokenPoolAndProxy.t.sol +++ b/contracts/src/v0.8/ccip/test/legacy/TokenPoolAndProxy.t.sol @@ -361,12 +361,8 @@ contract TokenPoolAndProxy is EVM2EVMOnRampSetup { } function test_lockOrBurn_burnWithFromMint_Success() public { - s_pool = new BurnWithFromMintTokenPoolAndProxy( - s_token, - new address[](0), - address(s_mockRMN), - address(s_sourceRouter) - ); + s_pool = + new BurnWithFromMintTokenPoolAndProxy(s_token, new address[](0), address(s_mockRMN), address(s_sourceRouter)); _configurePool(); _deployOldPool(); _assertLockOrBurnCorrect(); @@ -378,13 +374,8 @@ contract TokenPoolAndProxy is EVM2EVMOnRampSetup { } function test_lockOrBurn_lockRelease_Success() public { - s_pool = new LockReleaseTokenPoolAndProxy( - s_token, - new address[](0), - address(s_mockRMN), - false, - address(s_sourceRouter) - ); + s_pool = + new LockReleaseTokenPoolAndProxy(s_token, new address[](0), address(s_mockRMN), false, address(s_sourceRouter)); _configurePool(); _deployOldPool(); _assertLockOrBurnCorrect(); @@ -400,17 +391,11 @@ contract TokenPoolAndProxy is EVM2EVMOnRampSetup { s_token.grantMintAndBurnRoles(address(s_legacyPool)); TokenPool1_2.RampUpdate[] memory onRampUpdates = new TokenPool1_2.RampUpdate[](1); - onRampUpdates[0] = TokenPool1_2.RampUpdate({ - ramp: address(s_pool), - allowed: true, - rateLimiterConfig: _getInboundRateLimiterConfig() - }); + onRampUpdates[0] = + TokenPool1_2.RampUpdate({ramp: address(s_pool), allowed: true, rateLimiterConfig: _getInboundRateLimiterConfig()}); TokenPool1_2.RampUpdate[] memory offRampUpdates = new TokenPool1_2.RampUpdate[](1); - offRampUpdates[0] = TokenPool1_2.RampUpdate({ - ramp: address(s_pool), - allowed: true, - rateLimiterConfig: _getInboundRateLimiterConfig() - }); + offRampUpdates[0] = + TokenPool1_2.RampUpdate({ramp: address(s_pool), allowed: true, rateLimiterConfig: _getInboundRateLimiterConfig()}); BurnMintTokenPool1_2(address(s_legacyPool)).applyRampUpdates(onRampUpdates, offRampUpdates); } @@ -521,13 +506,8 @@ contract TokenPoolAndProxy is EVM2EVMOnRampSetup { } function test_setPreviousPool_Success() public { - LockReleaseTokenPoolAndProxy pool = new LockReleaseTokenPoolAndProxy( - s_token, - new address[](0), - address(s_mockRMN), - true, - address(s_sourceRouter) - ); + LockReleaseTokenPoolAndProxy pool = + new LockReleaseTokenPoolAndProxy(s_token, new address[](0), address(s_mockRMN), true, address(s_sourceRouter)); assertEq(pool.getPreviousPool(), address(0)); @@ -559,23 +539,13 @@ contract LockReleaseTokenPoolAndProxySetup is RouterSetup { RouterSetup.setUp(); s_token = new BurnMintERC677("LINK", "LNK", 18, 0); deal(address(s_token), OWNER, type(uint256).max); - s_lockReleaseTokenPoolAndProxy = new LockReleaseTokenPoolAndProxy( - s_token, - new address[](0), - address(s_mockRMN), - true, - address(s_sourceRouter) - ); + s_lockReleaseTokenPoolAndProxy = + new LockReleaseTokenPoolAndProxy(s_token, new address[](0), address(s_mockRMN), true, address(s_sourceRouter)); s_allowedList.push(USER_1); s_allowedList.push(DUMMY_CONTRACT_ADDRESS); - s_lockReleaseTokenPoolAndProxyWithAllowList = new LockReleaseTokenPoolAndProxy( - s_token, - s_allowedList, - address(s_mockRMN), - true, - address(s_sourceRouter) - ); + s_lockReleaseTokenPoolAndProxyWithAllowList = + new LockReleaseTokenPoolAndProxy(s_token, s_allowedList, address(s_mockRMN), true, address(s_sourceRouter)); TokenPool.ChainUpdate[] memory chainUpdate = new TokenPool.ChainUpdate[](1); chainUpdate[0] = TokenPool.ChainUpdate({ @@ -618,13 +588,8 @@ contract LockReleaseTokenPoolPoolAndProxy_canAcceptLiquidity is LockReleaseToken function test_CanAcceptLiquidity_Success() public { assertEq(true, s_lockReleaseTokenPoolAndProxy.canAcceptLiquidity()); - s_lockReleaseTokenPoolAndProxy = new LockReleaseTokenPoolAndProxy( - s_token, - new address[](0), - address(s_mockRMN), - false, - address(s_sourceRouter) - ); + s_lockReleaseTokenPoolAndProxy = + new LockReleaseTokenPoolAndProxy(s_token, new address[](0), address(s_mockRMN), false, address(s_sourceRouter)); assertEq(false, s_lockReleaseTokenPoolAndProxy.canAcceptLiquidity()); } } @@ -656,13 +621,8 @@ contract LockReleaseTokenPoolPoolAndProxy_provideLiquidity is LockReleaseTokenPo } function test_LiquidityNotAccepted_Revert() public { - s_lockReleaseTokenPoolAndProxy = new LockReleaseTokenPoolAndProxy( - s_token, - new address[](0), - address(s_mockRMN), - false, - address(s_sourceRouter) - ); + s_lockReleaseTokenPoolAndProxy = + new LockReleaseTokenPoolAndProxy(s_token, new address[](0), address(s_mockRMN), false, address(s_sourceRouter)); vm.expectRevert(LockReleaseTokenPoolAndProxy.LiquidityNotAccepted.selector); s_lockReleaseTokenPoolAndProxy.provideLiquidity(1); diff --git a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20.t.sol b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20.t.sol new file mode 100644 index 0000000000..f64e4985f0 --- /dev/null +++ b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20.t.sol @@ -0,0 +1,360 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IBurnMintERC20} from "../../../shared/token/ERC20/IBurnMintERC20.sol"; + +import {FactoryBurnMintERC20} from "../../tokenAdminRegistry/TokenPoolFactory/FactoryBurnMintERC20.sol"; +import {BaseTest} from "../BaseTest.t.sol"; + +import {IERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol"; +import {IERC165} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/introspection/IERC165.sol"; + +contract BurnMintERC20Setup is BaseTest { + event Transfer(address indexed from, address indexed to, uint256 value); + event MintAccessGranted(address indexed minter); + event BurnAccessGranted(address indexed burner); + event MintAccessRevoked(address indexed minter); + event BurnAccessRevoked(address indexed burner); + + FactoryBurnMintERC20 internal s_burnMintERC20; + + address internal s_mockPool = address(6243783892); + uint256 internal s_amount = 1e18; + + address internal s_alice; + + function setUp() public virtual override { + BaseTest.setUp(); + + s_alice = makeAddr("alice"); + + s_burnMintERC20 = new FactoryBurnMintERC20("Chainlink Token", "LINK", 18, 1e27, 0, s_alice); + + // Set s_mockPool to be a burner and minter + s_burnMintERC20.grantMintAndBurnRoles(s_mockPool); + deal(address(s_burnMintERC20), OWNER, s_amount); + } +} + +contract FactoryBurnMintERC20constructor is BurnMintERC20Setup { + function testConstructorSuccess() public { + string memory name = "Chainlink token v2"; + string memory symbol = "LINK2"; + uint8 decimals = 19; + uint256 maxSupply = 1e33; + + s_burnMintERC20 = new FactoryBurnMintERC20(name, symbol, decimals, maxSupply, 1e18, s_alice); + + assertEq(name, s_burnMintERC20.name()); + assertEq(symbol, s_burnMintERC20.symbol()); + assertEq(decimals, s_burnMintERC20.decimals()); + assertEq(maxSupply, s_burnMintERC20.maxSupply()); + + assertTrue(s_burnMintERC20.isMinter(s_alice)); + assertTrue(s_burnMintERC20.isBurner(s_alice)); + assertEq(s_burnMintERC20.balanceOf(s_alice), 1e18); + assertEq(s_burnMintERC20.totalSupply(), 1e18); + + } +} + +contract FactoryBurnMintERC20approve is BurnMintERC20Setup { + function testApproveSuccess() public { + uint256 balancePre = s_burnMintERC20.balanceOf(STRANGER); + uint256 sendingAmount = s_amount / 2; + + s_burnMintERC20.approve(STRANGER, sendingAmount); + + changePrank(STRANGER); + + s_burnMintERC20.transferFrom(OWNER, STRANGER, sendingAmount); + + assertEq(sendingAmount + balancePre, s_burnMintERC20.balanceOf(STRANGER)); + } + + // Reverts + + function testInvalidAddressReverts() public { + vm.expectRevert(); + + s_burnMintERC20.approve(address(s_burnMintERC20), s_amount); + } +} + +contract FactoryBurnMintERC20transfer is BurnMintERC20Setup { + function testTransferSuccess() public { + uint256 balancePre = s_burnMintERC20.balanceOf(STRANGER); + uint256 sendingAmount = s_amount / 2; + + s_burnMintERC20.transfer(STRANGER, sendingAmount); + + assertEq(sendingAmount + balancePre, s_burnMintERC20.balanceOf(STRANGER)); + } + + // Reverts + + function testInvalidAddressReverts() public { + vm.expectRevert(); + + s_burnMintERC20.transfer(address(s_burnMintERC20), s_amount); + } +} + +contract FactoryBurnMintERC20mint is BurnMintERC20Setup { + function testBasicMintSuccess() public { + uint256 balancePre = s_burnMintERC20.balanceOf(OWNER); + + s_burnMintERC20.grantMintAndBurnRoles(OWNER); + + vm.expectEmit(); + emit Transfer(address(0), OWNER, s_amount); + + s_burnMintERC20.mint(OWNER, s_amount); + + assertEq(balancePre + s_amount, s_burnMintERC20.balanceOf(OWNER)); + } + + // Revert + + function testSenderNotMinterReverts() public { + vm.expectRevert(abi.encodeWithSelector(FactoryBurnMintERC20.SenderNotMinter.selector, OWNER)); + s_burnMintERC20.mint(STRANGER, 1e18); + } + + function testMaxSupplyExceededReverts() public { + changePrank(s_mockPool); + + // Mint max supply + s_burnMintERC20.mint(OWNER, s_burnMintERC20.maxSupply()); + + vm.expectRevert(abi.encodeWithSelector(FactoryBurnMintERC20.MaxSupplyExceeded.selector, s_burnMintERC20.maxSupply() + 1)); + + // Attempt to mint 1 more than max supply + s_burnMintERC20.mint(OWNER, 1); + } +} + +contract FactoryBurnMintERC20burn is BurnMintERC20Setup { + function testBasicBurnSuccess() public { + s_burnMintERC20.grantBurnRole(OWNER); + deal(address(s_burnMintERC20), OWNER, s_amount); + + vm.expectEmit(); + emit Transfer(OWNER, address(0), s_amount); + + s_burnMintERC20.burn(s_amount); + + assertEq(0, s_burnMintERC20.balanceOf(OWNER)); + } + + // Revert + + function testSenderNotBurnerReverts() public { + vm.expectRevert(abi.encodeWithSelector(FactoryBurnMintERC20.SenderNotBurner.selector, OWNER)); + + s_burnMintERC20.burnFrom(STRANGER, s_amount); + } + + function testExceedsBalanceReverts() public { + changePrank(s_mockPool); + + vm.expectRevert("ERC20: burn amount exceeds balance"); + + s_burnMintERC20.burn(s_amount * 2); + } + + function testBurnFromZeroAddressReverts() public { + s_burnMintERC20.grantBurnRole(address(0)); + changePrank(address(0)); + + vm.expectRevert("ERC20: burn from the zero address"); + + s_burnMintERC20.burn(0); + } +} + +contract FactoryBurnMintERC20burnFromAlias is BurnMintERC20Setup { + function setUp() public virtual override { + BurnMintERC20Setup.setUp(); + } + + function testBurnFromSuccess() public { + s_burnMintERC20.approve(s_mockPool, s_amount); + + changePrank(s_mockPool); + + s_burnMintERC20.burn(OWNER, s_amount); + + assertEq(0, s_burnMintERC20.balanceOf(OWNER)); + } + + // Reverts + + function testSenderNotBurnerReverts() public { + vm.expectRevert(abi.encodeWithSelector(FactoryBurnMintERC20.SenderNotBurner.selector, OWNER)); + + s_burnMintERC20.burn(OWNER, s_amount); + } + + function testInsufficientAllowanceReverts() public { + changePrank(s_mockPool); + + vm.expectRevert("ERC20: insufficient allowance"); + + s_burnMintERC20.burn(OWNER, s_amount); + } + + function testExceedsBalanceReverts() public { + s_burnMintERC20.approve(s_mockPool, s_amount * 2); + + changePrank(s_mockPool); + + vm.expectRevert("ERC20: burn amount exceeds balance"); + + s_burnMintERC20.burn(OWNER, s_amount * 2); + } +} + +contract FactoryBurnMintERC20burnFrom is BurnMintERC20Setup { + function setUp() public virtual override { + BurnMintERC20Setup.setUp(); + } + + function testBurnFromSuccess() public { + s_burnMintERC20.approve(s_mockPool, s_amount); + + changePrank(s_mockPool); + + s_burnMintERC20.burnFrom(OWNER, s_amount); + + assertEq(0, s_burnMintERC20.balanceOf(OWNER)); + } + + // Reverts + + function testSenderNotBurnerReverts() public { + vm.expectRevert(abi.encodeWithSelector(FactoryBurnMintERC20.SenderNotBurner.selector, OWNER)); + + s_burnMintERC20.burnFrom(OWNER, s_amount); + } + + function testInsufficientAllowanceReverts() public { + changePrank(s_mockPool); + + vm.expectRevert("ERC20: insufficient allowance"); + + s_burnMintERC20.burnFrom(OWNER, s_amount); + } + + function testExceedsBalanceReverts() public { + s_burnMintERC20.approve(s_mockPool, s_amount * 2); + + changePrank(s_mockPool); + + vm.expectRevert("ERC20: burn amount exceeds balance"); + + s_burnMintERC20.burnFrom(OWNER, s_amount * 2); + } +} + +contract FactoryBurnMintERC20grantRole is BurnMintERC20Setup { + function testGrantMintAccessSuccess() public { + assertFalse(s_burnMintERC20.isMinter(STRANGER)); + + vm.expectEmit(); + emit MintAccessGranted(STRANGER); + + s_burnMintERC20.grantMintAndBurnRoles(STRANGER); + + assertTrue(s_burnMintERC20.isMinter(STRANGER)); + + vm.expectEmit(); + emit MintAccessRevoked(STRANGER); + + s_burnMintERC20.revokeMintRole(STRANGER); + + assertFalse(s_burnMintERC20.isMinter(STRANGER)); + } + + function testGrantBurnAccessSuccess() public { + assertFalse(s_burnMintERC20.isBurner(STRANGER)); + + vm.expectEmit(); + emit BurnAccessGranted(STRANGER); + + s_burnMintERC20.grantBurnRole(STRANGER); + + assertTrue(s_burnMintERC20.isBurner(STRANGER)); + + vm.expectEmit(); + emit BurnAccessRevoked(STRANGER); + + s_burnMintERC20.revokeBurnRole(STRANGER); + + assertFalse(s_burnMintERC20.isBurner(STRANGER)); + } + + function testGrantManySuccess() public { + // Since alice was already granted mint and burn roles in the setup, we will revoke them + // and then grant them again for the purposes of the test + s_burnMintERC20.revokeMintRole(s_alice); + s_burnMintERC20.revokeBurnRole(s_alice); + + uint256 numberOfPools = 10; + address[] memory permissionedAddresses = new address[](numberOfPools + 1); + permissionedAddresses[0] = s_mockPool; + + for (uint160 i = 0; i < numberOfPools; ++i) { + permissionedAddresses[i + 1] = address(i); + s_burnMintERC20.grantMintAndBurnRoles(address(i)); + } + + assertEq(permissionedAddresses, s_burnMintERC20.getBurners()); + assertEq(permissionedAddresses, s_burnMintERC20.getMinters()); + } +} + +contract FactoryBurnMintERC20grantMintAndBurnRoles is BurnMintERC20Setup { + function testGrantMintAndBurnRolesSuccess() public { + assertFalse(s_burnMintERC20.isMinter(STRANGER)); + assertFalse(s_burnMintERC20.isBurner(STRANGER)); + + vm.expectEmit(); + emit MintAccessGranted(STRANGER); + vm.expectEmit(); + emit BurnAccessGranted(STRANGER); + + s_burnMintERC20.grantMintAndBurnRoles(STRANGER); + + assertTrue(s_burnMintERC20.isMinter(STRANGER)); + assertTrue(s_burnMintERC20.isBurner(STRANGER)); + } +} + +contract FactoryBurnMintERC20decreaseApproval is BurnMintERC20Setup { + function testDecreaseApprovalSuccess() public { + s_burnMintERC20.approve(s_mockPool, s_amount); + uint256 allowance = s_burnMintERC20.allowance(OWNER, s_mockPool); + assertEq(allowance, s_amount); + s_burnMintERC20.decreaseApproval(s_mockPool, s_amount); + assertEq(s_burnMintERC20.allowance(OWNER, s_mockPool), allowance - s_amount); + } +} + +contract FactoryBurnMintERC20increaseApproval is BurnMintERC20Setup { + function testIncreaseApprovalSuccess() public { + s_burnMintERC20.approve(s_mockPool, s_amount); + uint256 allowance = s_burnMintERC20.allowance(OWNER, s_mockPool); + assertEq(allowance, s_amount); + s_burnMintERC20.increaseApproval(s_mockPool, s_amount); + assertEq(s_burnMintERC20.allowance(OWNER, s_mockPool), allowance + s_amount); + } +} + +contract FactoryBurnMintERC20supportsInterface is BurnMintERC20Setup { + function testConstructorSuccess() public view { + assertTrue(s_burnMintERC20.supportsInterface(type(IERC20).interfaceId)); + assertTrue(s_burnMintERC20.supportsInterface(type(IBurnMintERC20).interfaceId)); + assertTrue(s_burnMintERC20.supportsInterface(type(IERC165).interfaceId)); + } +} From ae8a3c0475cc018ee563c2dedeec6cab0ec69ac1 Mon Sep 17 00:00:00 2001 From: Josh Date: Fri, 4 Oct 2024 10:33:37 -0400 Subject: [PATCH 35/48] formatting CI is the bane of my existence --- .../ccip/test/tokenAdminRegistry/FactoryBurnMintERC20.t.sol | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20.t.sol b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20.t.sol index f64e4985f0..49e309c0a4 100644 --- a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20.t.sol +++ b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20.t.sol @@ -54,7 +54,6 @@ contract FactoryBurnMintERC20constructor is BurnMintERC20Setup { assertTrue(s_burnMintERC20.isBurner(s_alice)); assertEq(s_burnMintERC20.balanceOf(s_alice), 1e18); assertEq(s_burnMintERC20.totalSupply(), 1e18); - } } @@ -127,7 +126,9 @@ contract FactoryBurnMintERC20mint is BurnMintERC20Setup { // Mint max supply s_burnMintERC20.mint(OWNER, s_burnMintERC20.maxSupply()); - vm.expectRevert(abi.encodeWithSelector(FactoryBurnMintERC20.MaxSupplyExceeded.selector, s_burnMintERC20.maxSupply() + 1)); + vm.expectRevert( + abi.encodeWithSelector(FactoryBurnMintERC20.MaxSupplyExceeded.selector, s_burnMintERC20.maxSupply() + 1) + ); // Attempt to mint 1 more than max supply s_burnMintERC20.mint(OWNER, 1); From 5fda354fd533a641c7f1b8b3a1716876808b3572 Mon Sep 17 00:00:00 2001 From: Josh Date: Fri, 4 Oct 2024 15:49:57 -0400 Subject: [PATCH 36/48] fill in end-to-end coverage gaps --- contracts/gas-snapshots/ccip.gas-snapshot | 30 +++++++-------- .../tokenAdminRegistry/TokenPoolFactory.t.sol | 37 ++++++++++++++++++- .../TokenPoolFactory/TokenPoolFactory.sol | 6 +++ .../shared/token/ERC20/IBurnMintERC20.sol | 2 + 4 files changed, 59 insertions(+), 16 deletions(-) diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot index a361de5134..3a717c5235 100644 --- a/contracts/gas-snapshots/ccip.gas-snapshot +++ b/contracts/gas-snapshots/ccip.gas-snapshot @@ -343,7 +343,7 @@ FactoryBurnMintERC20burnFromAlias:testBurnFromSuccess() (gas: 58187) FactoryBurnMintERC20burnFromAlias:testExceedsBalanceReverts() (gas: 36094) FactoryBurnMintERC20burnFromAlias:testInsufficientAllowanceReverts() (gas: 22009) FactoryBurnMintERC20burnFromAlias:testSenderNotBurnerReverts() (gas: 13446) -FactoryBurnMintERC20constructor:testConstructorSuccess() (gas: 1495659) +FactoryBurnMintERC20constructor:testConstructorSuccess() (gas: 1495459) FactoryBurnMintERC20decreaseApproval:testDecreaseApprovalSuccess() (gas: 31323) FactoryBurnMintERC20grantMintAndBurnRoles:testGrantMintAndBurnRolesSuccess() (gas: 121439) FactoryBurnMintERC20grantRole:testGrantBurnAccessSuccess() (gas: 53612) @@ -408,20 +408,20 @@ FeeQuoter_getValidatedFee:test_NotAFeeToken_Revert() (gas: 21172) FeeQuoter_getValidatedFee:test_SingleTokenMessage_Success() (gas: 113309) FeeQuoter_getValidatedFee:test_TooManyTokens_Revert() (gas: 22691) FeeQuoter_getValidatedFee:test_ZeroDataAvailabilityMultiplier_Success() (gas: 62714) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedErc20Above18Decimals_Success() (gas: 1973907) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedErc20Below18Decimals_Success() (gas: 1973865) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFeedAt0Decimals_Success() (gas: 1953984) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFeedAt18Decimals_Success() (gas: 1973639) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFlippedDecimals_Success() (gas: 1973843) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedMaxInt224Value_Success() (gas: 1973655) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedErc20Above18Decimals_Success() (gas: 1973707) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedErc20Below18Decimals_Success() (gas: 1973665) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFeedAt0Decimals_Success() (gas: 1953784) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFeedAt18Decimals_Success() (gas: 1973439) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFlippedDecimals_Success() (gas: 1973643) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedMaxInt224Value_Success() (gas: 1973455) FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedOverStalenessPeriod_Success() (gas: 64610) FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeed_Success() (gas: 64490) FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPrice_Success() (gas: 58894) -FeeQuoter_getValidatedTokenPrice:test_OverflowFeedPrice_Revert() (gas: 1973352) +FeeQuoter_getValidatedTokenPrice:test_OverflowFeedPrice_Revert() (gas: 1973152) FeeQuoter_getValidatedTokenPrice:test_StaleFeeToken_Success() (gas: 61764) FeeQuoter_getValidatedTokenPrice:test_TokenNotSupportedFeed_Revert() (gas: 116495) FeeQuoter_getValidatedTokenPrice:test_TokenNotSupported_Revert() (gas: 14037) -FeeQuoter_getValidatedTokenPrice:test_UnderflowFeedPrice_Revert() (gas: 1972029) +FeeQuoter_getValidatedTokenPrice:test_UnderflowFeedPrice_Revert() (gas: 1971829) FeeQuoter_onReport:test_OnReport_StaleUpdate_Revert() (gas: 43631) FeeQuoter_onReport:test_onReport_InvalidForwarder_Reverts() (gas: 23492) FeeQuoter_onReport:test_onReport_Success() (gas: 80094) @@ -1023,12 +1023,12 @@ TokenPoolAndProxy:test_lockOrBurn_lockRelease_Success() (gas: 5793246) TokenPoolAndProxy:test_setPreviousPool_Success() (gas: 3070731) TokenPoolAndProxyMigration:test_tokenPoolMigration_Success_1_2() (gas: 6434801) TokenPoolAndProxyMigration:test_tokenPoolMigration_Success_1_4() (gas: 6634934) -TokenPoolFactoryTests:test_TokenPoolFactory_Constructor_Revert() (gas: 1188046) -TokenPoolFactoryTests:test_createTokenPoolLockRelease_NoExistingToken_predict_Success() (gas: 12420072) -TokenPoolFactoryTests:test_createTokenPool_ExistingRemoteToken_AndPredictPool_Success() (gas: 12434881) -TokenPoolFactoryTests:test_createTokenPool_WithNoExistingRemoteContracts_predict_Success() (gas: 12702418) -TokenPoolFactoryTests:test_createTokenPool_WithNoExistingTokenOnRemoteChain_Success() (gas: 5740593) -TokenPoolFactoryTests:test_createTokenPool_WithRemoteTokenAndRemotePool_Success() (gas: 5880940) +TokenPoolFactoryTests:test_TokenPoolFactory_Constructor_Revert() (gas: 1206695) +TokenPoolFactoryTests:test_createTokenPoolLockRelease_NoExistingToken_predict_Success() (gas: 12624842) +TokenPoolFactoryTests:test_createTokenPool_ExistingRemoteToken_AndPredictPool_Success() (gas: 12546380) +TokenPoolFactoryTests:test_createTokenPool_WithNoExistingRemoteContracts_predict_Success() (gas: 12887535) +TokenPoolFactoryTests:test_createTokenPool_WithNoExistingTokenOnRemoteChain_Success() (gas: 5833663) +TokenPoolFactoryTests:test_createTokenPool_WithRemoteTokenAndRemotePool_Success() (gas: 5974010) TokenPoolWithAllowList_applyAllowListUpdates:test_AllowListNotEnabled_Revert() (gas: 1979943) TokenPoolWithAllowList_applyAllowListUpdates:test_OnlyOwner_Revert() (gas: 12113) TokenPoolWithAllowList_applyAllowListUpdates:test_SetAllowListSkipsZero_Success() (gas: 23476) diff --git a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol index 0a1f2a66f3..b7e9adf599 100644 --- a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol +++ b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol @@ -1,5 +1,7 @@ +// SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.24; +import {IBurnMintERC20} from "../../../shared/token/ERC20/IBurnMintERC20.sol"; import {IOwner} from "../../interfaces/IOwner.sol"; import {ITokenAdminRegistry} from "../../interfaces/ITokenAdminRegistry.sol"; @@ -154,7 +156,7 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { // Since the remote chain information was provided, we should be able to get the information from the newly // deployed token pool using the available getter functions - (, address poolAddress) = s_tokenPoolFactory.deployTokenAndTokenPool( + (address tokenAddress, address poolAddress) = s_tokenPoolFactory.deployTokenAndTokenPool( remoteTokenPools, // No existing remote pools s_tokenInitCode, // Token Init Code s_poolInitCode, // Pool Init Code @@ -212,6 +214,39 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { abi.encode(newTokenAddress), "New Token Address should have been deployed correctly" ); + + // Check that the token pool has the correct permissions + vm.startPrank(poolAddress); + IBurnMintERC20(tokenAddress).mint(poolAddress, 1e18); + + assertEq(1e18, IBurnMintERC20(tokenAddress).balanceOf(poolAddress), "Balance should be 1e18"); + + IBurnMintERC20(tokenAddress).burn(1e18); + assertEq(0, IBurnMintERC20(tokenAddress).balanceOf(poolAddress), "Balance should be 0"); + + vm.stopPrank(); + + assertEq(s_tokenAdminRegistry.getPool(tokenAddress), poolAddress, "Token Pool should be set"); + + // Check the token admin registry for config + TokenAdminRegistry.TokenConfig memory tokenConfig = s_tokenAdminRegistry.getTokenConfig(tokenAddress); + assertEq(tokenConfig.administrator, address(s_tokenPoolFactory), "Administrator should be set"); + assertEq(tokenConfig.pendingAdministrator, OWNER, "Pending Administrator should be 0"); + assertEq(tokenConfig.tokenPool, poolAddress, "Pool Address should be set"); + + // Accept Ownership of the token, pool, and adminRegistry + vm.startPrank(OWNER); + s_tokenAdminRegistry.acceptAdminRole(tokenAddress); + assertEq(s_tokenAdminRegistry.getTokenConfig(tokenAddress).administrator, OWNER, "Administrator should be set"); + assertEq( + s_tokenAdminRegistry.getTokenConfig(tokenAddress).pendingAdministrator, address(0), "Administrator should be set" + ); + + OwnerIsCreator(tokenAddress).acceptOwnership(); + OwnerIsCreator(poolAddress).acceptOwnership(); + + assertEq(IOwner(tokenAddress).owner(), OWNER, "Token should be controlled by the OWNER"); + assertEq(IOwner(poolAddress).owner(), OWNER, "Pool should be controlled by the OWNER"); } function test_createTokenPool_ExistingRemoteToken_AndPredictPool_Success() public { diff --git a/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory/TokenPoolFactory.sol b/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory/TokenPoolFactory.sol index f76a0f63eb..b545a601e2 100644 --- a/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory/TokenPoolFactory.sol +++ b/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory/TokenPoolFactory.sol @@ -1,7 +1,9 @@ +// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.8.24; import {IOwnable} from "../../../shared/interfaces/IOwnable.sol"; import {ITypeAndVersion} from "../../../shared/interfaces/ITypeAndVersion.sol"; +import {IBurnMintERC20} from "../../../shared/token/ERC20/IBurnMintERC20.sol"; import {ITokenAdminRegistry} from "../../interfaces/ITokenAdminRegistry.sol"; import {OwnerIsCreator} from "../../../shared/access/OwnerIsCreator.sol"; @@ -113,6 +115,9 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { // Deploy the token pool address pool = _createTokenPool(token, remoteTokenPools, tokenPoolInitCode, salt, poolType); + // Grant the mint and burn roles to the pool for the token + IBurnMintERC20(token).grantMintAndBurnRoles(pool); + // Set the token pool for token in the token admin registry since this contract is the token and pool owner _setTokenPoolInTokenAdminRegistry(token, pool); @@ -126,6 +131,7 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { /// @dev Since the token already exists, this contract is not the owner and therefore cannot configure the /// token pool in the token admin registry in the same transaction. The user must invoke the calls to the /// tokenAdminRegistry manually + /// @dev since the token already exists, the owner must grant the mint and burn roles to the pool manually /// @param token The address of the existing token to be used in the token pool /// @param remoteTokenPools An array of remote token pools info to be used in the pool's applyChainUpdates function /// @param tokenPoolInitCode The creation code for the token pool diff --git a/contracts/src/v0.8/shared/token/ERC20/IBurnMintERC20.sol b/contracts/src/v0.8/shared/token/ERC20/IBurnMintERC20.sol index b9b3b54bf7..0ee844d34f 100644 --- a/contracts/src/v0.8/shared/token/ERC20/IBurnMintERC20.sol +++ b/contracts/src/v0.8/shared/token/ERC20/IBurnMintERC20.sol @@ -26,4 +26,6 @@ interface IBurnMintERC20 is IERC20 { /// @param amount The number of tokens to be burned. /// @dev this function decreases the total supply. function burnFrom(address account, uint256 amount) external; + + function grantMintAndBurnRoles(address account) external; } From 9f287400ea11aecaf814a3a4b3b0451641559cef Mon Sep 17 00:00:00 2001 From: "app-token-issuer-infra-releng[bot]" <120227048+app-token-issuer-infra-releng[bot]@users.noreply.github.com> Date: Mon, 7 Oct 2024 13:06:19 +0000 Subject: [PATCH 37/48] Update gethwrappers --- .../shared/generated/burn_mint_erc677/burn_mint_erc677.go | 2 +- core/gethwrappers/shared/generated/link_token/link_token.go | 2 +- .../generated-wrapper-dependency-versions-do-not-edit.txt | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/core/gethwrappers/shared/generated/burn_mint_erc677/burn_mint_erc677.go b/core/gethwrappers/shared/generated/burn_mint_erc677/burn_mint_erc677.go index 1d5b1c4ab1..c56b873a60 100644 --- a/core/gethwrappers/shared/generated/burn_mint_erc677/burn_mint_erc677.go +++ b/core/gethwrappers/shared/generated/burn_mint_erc677/burn_mint_erc677.go @@ -32,7 +32,7 @@ var ( var BurnMintERC677MetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"decimals_\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"maxSupply_\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"supplyAfterMint\",\"type\":\"uint256\"}],\"name\":\"MaxSupplyExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SenderNotBurner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SenderNotMinter\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"}],\"name\":\"BurnAccessGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"}],\"name\":\"BurnAccessRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"MintAccessGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"MintAccessRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseApproval\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getBurners\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMinters\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"}],\"name\":\"grantBurnRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"burnAndMinter\",\"type\":\"address\"}],\"name\":\"grantMintAndBurnRoles\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"grantMintRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseApproval\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"}],\"name\":\"isBurner\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"isMinter\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"}],\"name\":\"revokeBurnRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"revokeMintRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"transferAndCall\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x60c06040523480156200001157600080fd5b50604051620022dd380380620022dd833981016040819052620000349162000277565b338060008686818160036200004a838262000391565b50600462000059828262000391565b5050506001600160a01b0384169150620000bc90505760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600580546001600160a01b0319166001600160a01b0384811691909117909155811615620000ef57620000ef8162000106565b50505060ff90911660805260a052506200045d9050565b336001600160a01b03821603620001605760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401620000b3565b600680546001600160a01b0319166001600160a01b03838116918217909255600554604051919216907fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae127890600090a350565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001da57600080fd5b81516001600160401b0380821115620001f757620001f7620001b2565b604051601f8301601f19908116603f01168101908282118183101715620002225762000222620001b2565b816040528381526020925086838588010111156200023f57600080fd5b600091505b8382101562000263578582018301518183018401529082019062000244565b600093810190920192909252949350505050565b600080600080608085870312156200028e57600080fd5b84516001600160401b0380821115620002a657600080fd5b620002b488838901620001c8565b95506020870151915080821115620002cb57600080fd5b50620002da87828801620001c8565b935050604085015160ff81168114620002f257600080fd5b6060959095015193969295505050565b600181811c908216806200031757607f821691505b6020821081036200033857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200038c57600081815260208120601f850160051c81016020861015620003675750805b601f850160051c820191505b81811015620003885782815560010162000373565b5050505b505050565b81516001600160401b03811115620003ad57620003ad620001b2565b620003c581620003be845462000302565b846200033e565b602080601f831160018114620003fd5760008415620003e45750858301515b600019600386901b1c1916600185901b17855562000388565b600085815260208120601f198616915b828110156200042e578886015182559484019460019091019084016200040d565b50858210156200044d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a051611e4c6200049160003960008181610447015281816108c301526108ed015260006102710152611e4c6000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c806379cc67901161010f578063c2e3273d116100a2578063d73dd62311610071578063d73dd6231461046b578063dd62ed3e1461047e578063f2fde38b146104c4578063f81094f3146104d757600080fd5b8063c2e3273d1461040c578063c630948d1461041f578063c64d0ebc14610432578063d5abeb011461044557600080fd5b80639dc29fac116100de5780639dc29fac146103c0578063a457c2d7146103d3578063a9059cbb146103e6578063aa271e1a146103f957600080fd5b806379cc67901461037557806386fe8b43146103885780638da5cb5b1461039057806395d89b41146103b857600080fd5b806340c10f19116101875780636618846311610156578063661884631461030f5780636b32810b1461032257806370a082311461033757806379ba50971461036d57600080fd5b806340c10f19146102c157806342966c68146102d65780634334614a146102e95780634f5632f8146102fc57600080fd5b806323b872dd116101c357806323b872dd14610257578063313ce5671461026a578063395093511461029b5780634000aea0146102ae57600080fd5b806301ffc9a7146101f557806306fdde031461021d578063095ea7b31461023257806318160ddd14610245575b600080fd5b6102086102033660046119b9565b6104ea565b60405190151581526020015b60405180910390f35b61022561061b565b6040516102149190611a5f565b610208610240366004611a9b565b6106ad565b6002545b604051908152602001610214565b610208610265366004611ac5565b6106c5565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610214565b6102086102a9366004611a9b565b6106e9565b6102086102bc366004611b30565b610735565b6102d46102cf366004611a9b565b610858565b005b6102d46102e4366004611c19565b61097f565b6102086102f7366004611c32565b6109cc565b6102d461030a366004611c32565b6109d9565b61020861031d366004611a9b565b610a35565b61032a610a48565b6040516102149190611c4d565b610249610345366004611c32565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6102d4610a59565b6102d4610383366004611a9b565b610b5a565b61032a610ba9565b60055460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610214565b610225610bb5565b6102d46103ce366004611a9b565b610bc4565b6102086103e1366004611a9b565b610bce565b6102086103f4366004611a9b565b610c9f565b610208610407366004611c32565b610cad565b6102d461041a366004611c32565b610cba565b6102d461042d366004611c32565b610d16565b6102d4610440366004611c32565b610d24565b7f0000000000000000000000000000000000000000000000000000000000000000610249565b6102d4610479366004611a9b565b610d80565b61024961048c366004611ca7565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6102d46104d2366004611c32565b610d8a565b6102d46104e5366004611c32565b610d9b565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f36372b0700000000000000000000000000000000000000000000000000000000148061057d57507fffffffff0000000000000000000000000000000000000000000000000000000082167f4000aea000000000000000000000000000000000000000000000000000000000145b806105c957507fffffffff0000000000000000000000000000000000000000000000000000000082167fe6599b4d00000000000000000000000000000000000000000000000000000000145b8061061557507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b60606003805461062a90611cda565b80601f016020809104026020016040519081016040528092919081815260200182805461065690611cda565b80156106a35780601f10610678576101008083540402835291602001916106a3565b820191906000526020600020905b81548152906001019060200180831161068657829003601f168201915b5050505050905090565b6000336106bb818585610df7565b5060019392505050565b6000336106d3858285610e2b565b6106de858585610efc565b506001949350505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906106bb9082908690610730908790611d5c565b610df7565b60006107418484610c9f565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fe19260aff97b920c7df27010903aeb9c8d2be5d310a2c67824cf3f15396e4c1685856040516107a1929190611d6f565b60405180910390a373ffffffffffffffffffffffffffffffffffffffff84163b156106bb576040517fa4c0ed3600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063a4c0ed369061081c90339087908790600401611d90565b600060405180830381600087803b15801561083657600080fd5b505af115801561084a573d6000803e3d6000fd5b505050505060019392505050565b61086133610cad565b61089e576040517fe2c8c9d50000000000000000000000000000000000000000000000000000000081523360048201526024015b60405180910390fd5b813073ffffffffffffffffffffffffffffffffffffffff8216036108c157600080fd5b7f00000000000000000000000000000000000000000000000000000000000000001580159061092257507f00000000000000000000000000000000000000000000000000000000000000008261091660025490565b6109209190611d5c565b115b15610970578161093160025490565b61093b9190611d5c565b6040517fcbbf111300000000000000000000000000000000000000000000000000000000815260040161089591815260200190565b61097a8383610f2a565b505050565b610988336109cc565b6109c0576040517fc820b10b000000000000000000000000000000000000000000000000000000008152336004820152602401610895565b6109c98161101d565b50565b6000610615600983611027565b6109e1611056565b6109ec6009826110d9565b156109c95760405173ffffffffffffffffffffffffffffffffffffffff8216907f0a675452746933cefe3d74182e78db7afe57ba60eaa4234b5d85e9aa41b0610c90600090a250565b6000610a418383610bce565b9392505050565b6060610a5460076110fb565b905090565b60065473ffffffffffffffffffffffffffffffffffffffff163314610ada576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610895565b600580547fffffffffffffffffffffffff00000000000000000000000000000000000000008082163390811790935560068054909116905560405173ffffffffffffffffffffffffffffffffffffffff909116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b610b63336109cc565b610b9b576040517fc820b10b000000000000000000000000000000000000000000000000000000008152336004820152602401610895565b610ba58282611108565b5050565b6060610a5460096110fb565b60606004805461062a90611cda565b610ba58282610b5a565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610c92576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610895565b6106de8286868403610df7565b6000336106bb818585610efc565b6000610615600783611027565b610cc2611056565b610ccd60078261111d565b156109c95760405173ffffffffffffffffffffffffffffffffffffffff8216907fe46fef8bbff1389d9010703cf8ebb363fb3daf5bf56edc27080b67bc8d9251ea90600090a250565b610d1f81610cba565b6109c9815b610d2c611056565b610d3760098261111d565b156109c95760405173ffffffffffffffffffffffffffffffffffffffff8216907f92308bb7573b2a3d17ddb868b39d8ebec433f3194421abc22d084f89658c9bad90600090a250565b61097a82826106e9565b610d92611056565b6109c98161113f565b610da3611056565b610dae6007826110d9565b156109c95760405173ffffffffffffffffffffffffffffffffffffffff8216907fed998b960f6340d045f620c119730f7aa7995e7425c2401d3a5b64ff998a59e990600090a250565b813073ffffffffffffffffffffffffffffffffffffffff821603610e1a57600080fd5b610e25848484611235565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610e255781811015610eef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610895565b610e258484848403610df7565b813073ffffffffffffffffffffffffffffffffffffffff821603610f1f57600080fd5b610e258484846113e8565b73ffffffffffffffffffffffffffffffffffffffff8216610fa7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610895565b8060026000828254610fb99190611d5c565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6109c93382611657565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001830160205260408120541515610a41565b60055473ffffffffffffffffffffffffffffffffffffffff1633146110d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610895565b565b6000610a418373ffffffffffffffffffffffffffffffffffffffff841661181b565b60606000610a418361190e565b611113823383610e2b565b610ba58282611657565b6000610a418373ffffffffffffffffffffffffffffffffffffffff841661196a565b3373ffffffffffffffffffffffffffffffffffffffff8216036111be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610895565b600680547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff838116918217909255600554604051919216907fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae127890600090a350565b73ffffffffffffffffffffffffffffffffffffffff83166112d7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff821661137a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff831661148b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff821661152e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040902054818110156115e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610e25565b73ffffffffffffffffffffffffffffffffffffffff82166116fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040902054818110156117b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b6000818152600183016020526040812054801561190457600061183f600183611dce565b855490915060009061185390600190611dce565b90508181146118b857600086600001828154811061187357611873611de1565b906000526020600020015490508087600001848154811061189657611896611de1565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806118c9576118c9611e10565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610615565b6000915050610615565b60608160000180548060200260200160405190810160405280929190818152602001828054801561195e57602002820191906000526020600020905b81548152602001906001019080831161194a575b50505050509050919050565b60008181526001830160205260408120546119b157508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610615565b506000610615565b6000602082840312156119cb57600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610a4157600080fd5b6000815180845260005b81811015611a2157602081850181015186830182015201611a05565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081526000610a4160208301846119fb565b803573ffffffffffffffffffffffffffffffffffffffff81168114611a9657600080fd5b919050565b60008060408385031215611aae57600080fd5b611ab783611a72565b946020939093013593505050565b600080600060608486031215611ada57600080fd5b611ae384611a72565b9250611af160208501611a72565b9150604084013590509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080600060608486031215611b4557600080fd5b611b4e84611a72565b925060208401359150604084013567ffffffffffffffff80821115611b7257600080fd5b818601915086601f830112611b8657600080fd5b813581811115611b9857611b98611b01565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611bde57611bde611b01565b81604052828152896020848701011115611bf757600080fd5b8260208601602083013760006020848301015280955050505050509250925092565b600060208284031215611c2b57600080fd5b5035919050565b600060208284031215611c4457600080fd5b610a4182611a72565b6020808252825182820181905260009190848201906040850190845b81811015611c9b57835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101611c69565b50909695505050505050565b60008060408385031215611cba57600080fd5b611cc383611a72565b9150611cd160208401611a72565b90509250929050565b600181811c90821680611cee57607f821691505b602082108103611d27577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561061557610615611d2d565b828152604060208201526000611d8860408301846119fb565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000611dc560608301846119fb565b95945050505050565b8181038181111561061557610615611d2d565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000813000a", + Bin: "0x60c06040523480156200001157600080fd5b50604051620022dd380380620022dd833981016040819052620000349162000277565b338060008686818160036200004a838262000391565b50600462000059828262000391565b5050506001600160a01b0384169150620000bc90505760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600580546001600160a01b0319166001600160a01b0384811691909117909155811615620000ef57620000ef8162000106565b50505060ff90911660805260a052506200045d9050565b336001600160a01b03821603620001605760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401620000b3565b600680546001600160a01b0319166001600160a01b03838116918217909255600554604051919216907fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae127890600090a350565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001da57600080fd5b81516001600160401b0380821115620001f757620001f7620001b2565b604051601f8301601f19908116603f01168101908282118183101715620002225762000222620001b2565b816040528381526020925086838588010111156200023f57600080fd5b600091505b8382101562000263578582018301518183018401529082019062000244565b600093810190920192909252949350505050565b600080600080608085870312156200028e57600080fd5b84516001600160401b0380821115620002a657600080fd5b620002b488838901620001c8565b95506020870151915080821115620002cb57600080fd5b50620002da87828801620001c8565b935050604085015160ff81168114620002f257600080fd5b6060959095015193969295505050565b600181811c908216806200031757607f821691505b6020821081036200033857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200038c57600081815260208120601f850160051c81016020861015620003675750805b601f850160051c820191505b81811015620003885782815560010162000373565b5050505b505050565b81516001600160401b03811115620003ad57620003ad620001b2565b620003c581620003be845462000302565b846200033e565b602080601f831160018114620003fd5760008415620003e45750858301515b600019600386901b1c1916600185901b17855562000388565b600085815260208120601f198616915b828110156200042e578886015182559484019460019091019084016200040d565b50858210156200044d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a051611e4c6200049160003960008181610447015281816108c301526108ed015260006102710152611e4c6000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c806379cc67901161010f578063c2e3273d116100a2578063d73dd62311610071578063d73dd6231461046b578063dd62ed3e1461047e578063f2fde38b146104c4578063f81094f3146104d757600080fd5b8063c2e3273d1461040c578063c630948d1461041f578063c64d0ebc14610432578063d5abeb011461044557600080fd5b80639dc29fac116100de5780639dc29fac146103c0578063a457c2d7146103d3578063a9059cbb146103e6578063aa271e1a146103f957600080fd5b806379cc67901461037557806386fe8b43146103885780638da5cb5b1461039057806395d89b41146103b857600080fd5b806340c10f19116101875780636618846311610156578063661884631461030f5780636b32810b1461032257806370a082311461033757806379ba50971461036d57600080fd5b806340c10f19146102c157806342966c68146102d65780634334614a146102e95780634f5632f8146102fc57600080fd5b806323b872dd116101c357806323b872dd14610257578063313ce5671461026a578063395093511461029b5780634000aea0146102ae57600080fd5b806301ffc9a7146101f557806306fdde031461021d578063095ea7b31461023257806318160ddd14610245575b600080fd5b6102086102033660046119b9565b6104ea565b60405190151581526020015b60405180910390f35b61022561061b565b6040516102149190611a5f565b610208610240366004611a9b565b6106ad565b6002545b604051908152602001610214565b610208610265366004611ac5565b6106c5565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610214565b6102086102a9366004611a9b565b6106e9565b6102086102bc366004611b30565b610735565b6102d46102cf366004611a9b565b610858565b005b6102d46102e4366004611c19565b61097f565b6102086102f7366004611c32565b6109cc565b6102d461030a366004611c32565b6109d9565b61020861031d366004611a9b565b610a35565b61032a610a48565b6040516102149190611c4d565b610249610345366004611c32565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6102d4610a59565b6102d4610383366004611a9b565b610b5a565b61032a610ba9565b60055460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610214565b610225610bb5565b6102d46103ce366004611a9b565b610bc4565b6102086103e1366004611a9b565b610bce565b6102086103f4366004611a9b565b610c9f565b610208610407366004611c32565b610cad565b6102d461041a366004611c32565b610cba565b6102d461042d366004611c32565b610d16565b6102d4610440366004611c32565b610d24565b7f0000000000000000000000000000000000000000000000000000000000000000610249565b6102d4610479366004611a9b565b610d80565b61024961048c366004611ca7565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6102d46104d2366004611c32565b610d8a565b6102d46104e5366004611c32565b610d9b565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f36372b0700000000000000000000000000000000000000000000000000000000148061057d57507fffffffff0000000000000000000000000000000000000000000000000000000082167f4000aea000000000000000000000000000000000000000000000000000000000145b806105c957507fffffffff0000000000000000000000000000000000000000000000000000000082167f20690fc000000000000000000000000000000000000000000000000000000000145b8061061557507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b60606003805461062a90611cda565b80601f016020809104026020016040519081016040528092919081815260200182805461065690611cda565b80156106a35780601f10610678576101008083540402835291602001916106a3565b820191906000526020600020905b81548152906001019060200180831161068657829003601f168201915b5050505050905090565b6000336106bb818585610df7565b5060019392505050565b6000336106d3858285610e2b565b6106de858585610efc565b506001949350505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906106bb9082908690610730908790611d5c565b610df7565b60006107418484610c9f565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fe19260aff97b920c7df27010903aeb9c8d2be5d310a2c67824cf3f15396e4c1685856040516107a1929190611d6f565b60405180910390a373ffffffffffffffffffffffffffffffffffffffff84163b156106bb576040517fa4c0ed3600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063a4c0ed369061081c90339087908790600401611d90565b600060405180830381600087803b15801561083657600080fd5b505af115801561084a573d6000803e3d6000fd5b505050505060019392505050565b61086133610cad565b61089e576040517fe2c8c9d50000000000000000000000000000000000000000000000000000000081523360048201526024015b60405180910390fd5b813073ffffffffffffffffffffffffffffffffffffffff8216036108c157600080fd5b7f00000000000000000000000000000000000000000000000000000000000000001580159061092257507f00000000000000000000000000000000000000000000000000000000000000008261091660025490565b6109209190611d5c565b115b15610970578161093160025490565b61093b9190611d5c565b6040517fcbbf111300000000000000000000000000000000000000000000000000000000815260040161089591815260200190565b61097a8383610f2a565b505050565b610988336109cc565b6109c0576040517fc820b10b000000000000000000000000000000000000000000000000000000008152336004820152602401610895565b6109c98161101d565b50565b6000610615600983611027565b6109e1611056565b6109ec6009826110d9565b156109c95760405173ffffffffffffffffffffffffffffffffffffffff8216907f0a675452746933cefe3d74182e78db7afe57ba60eaa4234b5d85e9aa41b0610c90600090a250565b6000610a418383610bce565b9392505050565b6060610a5460076110fb565b905090565b60065473ffffffffffffffffffffffffffffffffffffffff163314610ada576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610895565b600580547fffffffffffffffffffffffff00000000000000000000000000000000000000008082163390811790935560068054909116905560405173ffffffffffffffffffffffffffffffffffffffff909116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b610b63336109cc565b610b9b576040517fc820b10b000000000000000000000000000000000000000000000000000000008152336004820152602401610895565b610ba58282611108565b5050565b6060610a5460096110fb565b60606004805461062a90611cda565b610ba58282610b5a565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610c92576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610895565b6106de8286868403610df7565b6000336106bb818585610efc565b6000610615600783611027565b610cc2611056565b610ccd60078261111d565b156109c95760405173ffffffffffffffffffffffffffffffffffffffff8216907fe46fef8bbff1389d9010703cf8ebb363fb3daf5bf56edc27080b67bc8d9251ea90600090a250565b610d1f81610cba565b6109c9815b610d2c611056565b610d3760098261111d565b156109c95760405173ffffffffffffffffffffffffffffffffffffffff8216907f92308bb7573b2a3d17ddb868b39d8ebec433f3194421abc22d084f89658c9bad90600090a250565b61097a82826106e9565b610d92611056565b6109c98161113f565b610da3611056565b610dae6007826110d9565b156109c95760405173ffffffffffffffffffffffffffffffffffffffff8216907fed998b960f6340d045f620c119730f7aa7995e7425c2401d3a5b64ff998a59e990600090a250565b813073ffffffffffffffffffffffffffffffffffffffff821603610e1a57600080fd5b610e25848484611235565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610e255781811015610eef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610895565b610e258484848403610df7565b813073ffffffffffffffffffffffffffffffffffffffff821603610f1f57600080fd5b610e258484846113e8565b73ffffffffffffffffffffffffffffffffffffffff8216610fa7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610895565b8060026000828254610fb99190611d5c565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6109c93382611657565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001830160205260408120541515610a41565b60055473ffffffffffffffffffffffffffffffffffffffff1633146110d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610895565b565b6000610a418373ffffffffffffffffffffffffffffffffffffffff841661181b565b60606000610a418361190e565b611113823383610e2b565b610ba58282611657565b6000610a418373ffffffffffffffffffffffffffffffffffffffff841661196a565b3373ffffffffffffffffffffffffffffffffffffffff8216036111be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610895565b600680547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff838116918217909255600554604051919216907fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae127890600090a350565b73ffffffffffffffffffffffffffffffffffffffff83166112d7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff821661137a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff831661148b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff821661152e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040902054818110156115e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610e25565b73ffffffffffffffffffffffffffffffffffffffff82166116fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040902054818110156117b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b6000818152600183016020526040812054801561190457600061183f600183611dce565b855490915060009061185390600190611dce565b90508181146118b857600086600001828154811061187357611873611de1565b906000526020600020015490508087600001848154811061189657611896611de1565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806118c9576118c9611e10565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610615565b6000915050610615565b60608160000180548060200260200160405190810160405280929190818152602001828054801561195e57602002820191906000526020600020905b81548152602001906001019080831161194a575b50505050509050919050565b60008181526001830160205260408120546119b157508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610615565b506000610615565b6000602082840312156119cb57600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610a4157600080fd5b6000815180845260005b81811015611a2157602081850181015186830182015201611a05565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081526000610a4160208301846119fb565b803573ffffffffffffffffffffffffffffffffffffffff81168114611a9657600080fd5b919050565b60008060408385031215611aae57600080fd5b611ab783611a72565b946020939093013593505050565b600080600060608486031215611ada57600080fd5b611ae384611a72565b9250611af160208501611a72565b9150604084013590509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080600060608486031215611b4557600080fd5b611b4e84611a72565b925060208401359150604084013567ffffffffffffffff80821115611b7257600080fd5b818601915086601f830112611b8657600080fd5b813581811115611b9857611b98611b01565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611bde57611bde611b01565b81604052828152896020848701011115611bf757600080fd5b8260208601602083013760006020848301015280955050505050509250925092565b600060208284031215611c2b57600080fd5b5035919050565b600060208284031215611c4457600080fd5b610a4182611a72565b6020808252825182820181905260009190848201906040850190845b81811015611c9b57835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101611c69565b50909695505050505050565b60008060408385031215611cba57600080fd5b611cc383611a72565b9150611cd160208401611a72565b90509250929050565b600181811c90821680611cee57607f821691505b602082108103611d27577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561061557610615611d2d565b828152604060208201526000611d8860408301846119fb565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000611dc560608301846119fb565b95945050505050565b8181038181111561061557610615611d2d565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000813000a", } var BurnMintERC677ABI = BurnMintERC677MetaData.ABI diff --git a/core/gethwrappers/shared/generated/link_token/link_token.go b/core/gethwrappers/shared/generated/link_token/link_token.go index 1467680626..6f9dd62134 100644 --- a/core/gethwrappers/shared/generated/link_token/link_token.go +++ b/core/gethwrappers/shared/generated/link_token/link_token.go @@ -32,7 +32,7 @@ var ( var LinkTokenMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"supplyAfterMint\",\"type\":\"uint256\"}],\"name\":\"MaxSupplyExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SenderNotBurner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SenderNotMinter\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"}],\"name\":\"BurnAccessGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"}],\"name\":\"BurnAccessRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"MintAccessGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"MintAccessRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseApproval\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getBurners\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMinters\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"}],\"name\":\"grantBurnRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"burnAndMinter\",\"type\":\"address\"}],\"name\":\"grantMintAndBurnRoles\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"grantMintRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseApproval\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"}],\"name\":\"isBurner\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"isMinter\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"}],\"name\":\"revokeBurnRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"revokeMintRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"transferAndCall\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x60c06040523480156200001157600080fd5b506040518060400160405280600f81526020016e21b430b4b72634b735902a37b5b2b760891b815250604051806040016040528060048152602001634c494e4b60e01b81525060126b033b2e3c9fd0803ce8000000338060008686818181600390816200007f91906200028c565b5060046200008e82826200028c565b5050506001600160a01b0384169150620000f190505760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600580546001600160a01b0319166001600160a01b0384811691909117909155811615620001245762000124816200013b565b50505060ff90911660805260a05250620003589050565b336001600160a01b03821603620001955760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401620000e8565b600680546001600160a01b0319166001600160a01b03838116918217909255600554604051919216907fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae127890600090a350565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200021257607f821691505b6020821081036200023357634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200028757600081815260208120601f850160051c81016020861015620002625750805b601f850160051c820191505b8181101562000283578281556001016200026e565b5050505b505050565b81516001600160401b03811115620002a857620002a8620001e7565b620002c081620002b98454620001fd565b8462000239565b602080601f831160018114620002f85760008415620002df5750858301515b600019600386901b1c1916600185901b17855562000283565b600085815260208120601f198616915b82811015620003295788860151825594840194600190910190840162000308565b5085821015620003485787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a051611e4c6200038c60003960008181610447015281816108c301526108ed015260006102710152611e4c6000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c806379cc67901161010f578063c2e3273d116100a2578063d73dd62311610071578063d73dd6231461046b578063dd62ed3e1461047e578063f2fde38b146104c4578063f81094f3146104d757600080fd5b8063c2e3273d1461040c578063c630948d1461041f578063c64d0ebc14610432578063d5abeb011461044557600080fd5b80639dc29fac116100de5780639dc29fac146103c0578063a457c2d7146103d3578063a9059cbb146103e6578063aa271e1a146103f957600080fd5b806379cc67901461037557806386fe8b43146103885780638da5cb5b1461039057806395d89b41146103b857600080fd5b806340c10f19116101875780636618846311610156578063661884631461030f5780636b32810b1461032257806370a082311461033757806379ba50971461036d57600080fd5b806340c10f19146102c157806342966c68146102d65780634334614a146102e95780634f5632f8146102fc57600080fd5b806323b872dd116101c357806323b872dd14610257578063313ce5671461026a578063395093511461029b5780634000aea0146102ae57600080fd5b806301ffc9a7146101f557806306fdde031461021d578063095ea7b31461023257806318160ddd14610245575b600080fd5b6102086102033660046119b9565b6104ea565b60405190151581526020015b60405180910390f35b61022561061b565b6040516102149190611a5f565b610208610240366004611a9b565b6106ad565b6002545b604051908152602001610214565b610208610265366004611ac5565b6106c5565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610214565b6102086102a9366004611a9b565b6106e9565b6102086102bc366004611b30565b610735565b6102d46102cf366004611a9b565b610858565b005b6102d46102e4366004611c19565b61097f565b6102086102f7366004611c32565b6109cc565b6102d461030a366004611c32565b6109d9565b61020861031d366004611a9b565b610a35565b61032a610a48565b6040516102149190611c4d565b610249610345366004611c32565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6102d4610a59565b6102d4610383366004611a9b565b610b5a565b61032a610ba9565b60055460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610214565b610225610bb5565b6102d46103ce366004611a9b565b610bc4565b6102086103e1366004611a9b565b610bce565b6102086103f4366004611a9b565b610c9f565b610208610407366004611c32565b610cad565b6102d461041a366004611c32565b610cba565b6102d461042d366004611c32565b610d16565b6102d4610440366004611c32565b610d24565b7f0000000000000000000000000000000000000000000000000000000000000000610249565b6102d4610479366004611a9b565b610d80565b61024961048c366004611ca7565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6102d46104d2366004611c32565b610d8a565b6102d46104e5366004611c32565b610d9b565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f36372b0700000000000000000000000000000000000000000000000000000000148061057d57507fffffffff0000000000000000000000000000000000000000000000000000000082167f4000aea000000000000000000000000000000000000000000000000000000000145b806105c957507fffffffff0000000000000000000000000000000000000000000000000000000082167fe6599b4d00000000000000000000000000000000000000000000000000000000145b8061061557507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b60606003805461062a90611cda565b80601f016020809104026020016040519081016040528092919081815260200182805461065690611cda565b80156106a35780601f10610678576101008083540402835291602001916106a3565b820191906000526020600020905b81548152906001019060200180831161068657829003601f168201915b5050505050905090565b6000336106bb818585610df7565b5060019392505050565b6000336106d3858285610e2b565b6106de858585610efc565b506001949350505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906106bb9082908690610730908790611d5c565b610df7565b60006107418484610c9f565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fe19260aff97b920c7df27010903aeb9c8d2be5d310a2c67824cf3f15396e4c1685856040516107a1929190611d6f565b60405180910390a373ffffffffffffffffffffffffffffffffffffffff84163b156106bb576040517fa4c0ed3600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063a4c0ed369061081c90339087908790600401611d90565b600060405180830381600087803b15801561083657600080fd5b505af115801561084a573d6000803e3d6000fd5b505050505060019392505050565b61086133610cad565b61089e576040517fe2c8c9d50000000000000000000000000000000000000000000000000000000081523360048201526024015b60405180910390fd5b813073ffffffffffffffffffffffffffffffffffffffff8216036108c157600080fd5b7f00000000000000000000000000000000000000000000000000000000000000001580159061092257507f00000000000000000000000000000000000000000000000000000000000000008261091660025490565b6109209190611d5c565b115b15610970578161093160025490565b61093b9190611d5c565b6040517fcbbf111300000000000000000000000000000000000000000000000000000000815260040161089591815260200190565b61097a8383610f2a565b505050565b610988336109cc565b6109c0576040517fc820b10b000000000000000000000000000000000000000000000000000000008152336004820152602401610895565b6109c98161101d565b50565b6000610615600983611027565b6109e1611056565b6109ec6009826110d9565b156109c95760405173ffffffffffffffffffffffffffffffffffffffff8216907f0a675452746933cefe3d74182e78db7afe57ba60eaa4234b5d85e9aa41b0610c90600090a250565b6000610a418383610bce565b9392505050565b6060610a5460076110fb565b905090565b60065473ffffffffffffffffffffffffffffffffffffffff163314610ada576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610895565b600580547fffffffffffffffffffffffff00000000000000000000000000000000000000008082163390811790935560068054909116905560405173ffffffffffffffffffffffffffffffffffffffff909116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b610b63336109cc565b610b9b576040517fc820b10b000000000000000000000000000000000000000000000000000000008152336004820152602401610895565b610ba58282611108565b5050565b6060610a5460096110fb565b60606004805461062a90611cda565b610ba58282610b5a565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610c92576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610895565b6106de8286868403610df7565b6000336106bb818585610efc565b6000610615600783611027565b610cc2611056565b610ccd60078261111d565b156109c95760405173ffffffffffffffffffffffffffffffffffffffff8216907fe46fef8bbff1389d9010703cf8ebb363fb3daf5bf56edc27080b67bc8d9251ea90600090a250565b610d1f81610cba565b6109c9815b610d2c611056565b610d3760098261111d565b156109c95760405173ffffffffffffffffffffffffffffffffffffffff8216907f92308bb7573b2a3d17ddb868b39d8ebec433f3194421abc22d084f89658c9bad90600090a250565b61097a82826106e9565b610d92611056565b6109c98161113f565b610da3611056565b610dae6007826110d9565b156109c95760405173ffffffffffffffffffffffffffffffffffffffff8216907fed998b960f6340d045f620c119730f7aa7995e7425c2401d3a5b64ff998a59e990600090a250565b813073ffffffffffffffffffffffffffffffffffffffff821603610e1a57600080fd5b610e25848484611235565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610e255781811015610eef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610895565b610e258484848403610df7565b813073ffffffffffffffffffffffffffffffffffffffff821603610f1f57600080fd5b610e258484846113e8565b73ffffffffffffffffffffffffffffffffffffffff8216610fa7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610895565b8060026000828254610fb99190611d5c565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6109c93382611657565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001830160205260408120541515610a41565b60055473ffffffffffffffffffffffffffffffffffffffff1633146110d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610895565b565b6000610a418373ffffffffffffffffffffffffffffffffffffffff841661181b565b60606000610a418361190e565b611113823383610e2b565b610ba58282611657565b6000610a418373ffffffffffffffffffffffffffffffffffffffff841661196a565b3373ffffffffffffffffffffffffffffffffffffffff8216036111be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610895565b600680547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff838116918217909255600554604051919216907fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae127890600090a350565b73ffffffffffffffffffffffffffffffffffffffff83166112d7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff821661137a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff831661148b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff821661152e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040902054818110156115e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610e25565b73ffffffffffffffffffffffffffffffffffffffff82166116fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040902054818110156117b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b6000818152600183016020526040812054801561190457600061183f600183611dce565b855490915060009061185390600190611dce565b90508181146118b857600086600001828154811061187357611873611de1565b906000526020600020015490508087600001848154811061189657611896611de1565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806118c9576118c9611e10565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610615565b6000915050610615565b60608160000180548060200260200160405190810160405280929190818152602001828054801561195e57602002820191906000526020600020905b81548152602001906001019080831161194a575b50505050509050919050565b60008181526001830160205260408120546119b157508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610615565b506000610615565b6000602082840312156119cb57600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610a4157600080fd5b6000815180845260005b81811015611a2157602081850181015186830182015201611a05565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081526000610a4160208301846119fb565b803573ffffffffffffffffffffffffffffffffffffffff81168114611a9657600080fd5b919050565b60008060408385031215611aae57600080fd5b611ab783611a72565b946020939093013593505050565b600080600060608486031215611ada57600080fd5b611ae384611a72565b9250611af160208501611a72565b9150604084013590509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080600060608486031215611b4557600080fd5b611b4e84611a72565b925060208401359150604084013567ffffffffffffffff80821115611b7257600080fd5b818601915086601f830112611b8657600080fd5b813581811115611b9857611b98611b01565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611bde57611bde611b01565b81604052828152896020848701011115611bf757600080fd5b8260208601602083013760006020848301015280955050505050509250925092565b600060208284031215611c2b57600080fd5b5035919050565b600060208284031215611c4457600080fd5b610a4182611a72565b6020808252825182820181905260009190848201906040850190845b81811015611c9b57835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101611c69565b50909695505050505050565b60008060408385031215611cba57600080fd5b611cc383611a72565b9150611cd160208401611a72565b90509250929050565b600181811c90821680611cee57607f821691505b602082108103611d27577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561061557610615611d2d565b828152604060208201526000611d8860408301846119fb565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000611dc560608301846119fb565b95945050505050565b8181038181111561061557610615611d2d565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000813000a", + Bin: "0x60c06040523480156200001157600080fd5b506040518060400160405280600f81526020016e21b430b4b72634b735902a37b5b2b760891b815250604051806040016040528060048152602001634c494e4b60e01b81525060126b033b2e3c9fd0803ce8000000338060008686818181600390816200007f91906200028c565b5060046200008e82826200028c565b5050506001600160a01b0384169150620000f190505760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600580546001600160a01b0319166001600160a01b0384811691909117909155811615620001245762000124816200013b565b50505060ff90911660805260a05250620003589050565b336001600160a01b03821603620001955760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401620000e8565b600680546001600160a01b0319166001600160a01b03838116918217909255600554604051919216907fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae127890600090a350565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200021257607f821691505b6020821081036200023357634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200028757600081815260208120601f850160051c81016020861015620002625750805b601f850160051c820191505b8181101562000283578281556001016200026e565b5050505b505050565b81516001600160401b03811115620002a857620002a8620001e7565b620002c081620002b98454620001fd565b8462000239565b602080601f831160018114620002f85760008415620002df5750858301515b600019600386901b1c1916600185901b17855562000283565b600085815260208120601f198616915b82811015620003295788860151825594840194600190910190840162000308565b5085821015620003485787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a051611e4c6200038c60003960008181610447015281816108c301526108ed015260006102710152611e4c6000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c806379cc67901161010f578063c2e3273d116100a2578063d73dd62311610071578063d73dd6231461046b578063dd62ed3e1461047e578063f2fde38b146104c4578063f81094f3146104d757600080fd5b8063c2e3273d1461040c578063c630948d1461041f578063c64d0ebc14610432578063d5abeb011461044557600080fd5b80639dc29fac116100de5780639dc29fac146103c0578063a457c2d7146103d3578063a9059cbb146103e6578063aa271e1a146103f957600080fd5b806379cc67901461037557806386fe8b43146103885780638da5cb5b1461039057806395d89b41146103b857600080fd5b806340c10f19116101875780636618846311610156578063661884631461030f5780636b32810b1461032257806370a082311461033757806379ba50971461036d57600080fd5b806340c10f19146102c157806342966c68146102d65780634334614a146102e95780634f5632f8146102fc57600080fd5b806323b872dd116101c357806323b872dd14610257578063313ce5671461026a578063395093511461029b5780634000aea0146102ae57600080fd5b806301ffc9a7146101f557806306fdde031461021d578063095ea7b31461023257806318160ddd14610245575b600080fd5b6102086102033660046119b9565b6104ea565b60405190151581526020015b60405180910390f35b61022561061b565b6040516102149190611a5f565b610208610240366004611a9b565b6106ad565b6002545b604051908152602001610214565b610208610265366004611ac5565b6106c5565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610214565b6102086102a9366004611a9b565b6106e9565b6102086102bc366004611b30565b610735565b6102d46102cf366004611a9b565b610858565b005b6102d46102e4366004611c19565b61097f565b6102086102f7366004611c32565b6109cc565b6102d461030a366004611c32565b6109d9565b61020861031d366004611a9b565b610a35565b61032a610a48565b6040516102149190611c4d565b610249610345366004611c32565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6102d4610a59565b6102d4610383366004611a9b565b610b5a565b61032a610ba9565b60055460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610214565b610225610bb5565b6102d46103ce366004611a9b565b610bc4565b6102086103e1366004611a9b565b610bce565b6102086103f4366004611a9b565b610c9f565b610208610407366004611c32565b610cad565b6102d461041a366004611c32565b610cba565b6102d461042d366004611c32565b610d16565b6102d4610440366004611c32565b610d24565b7f0000000000000000000000000000000000000000000000000000000000000000610249565b6102d4610479366004611a9b565b610d80565b61024961048c366004611ca7565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6102d46104d2366004611c32565b610d8a565b6102d46104e5366004611c32565b610d9b565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f36372b0700000000000000000000000000000000000000000000000000000000148061057d57507fffffffff0000000000000000000000000000000000000000000000000000000082167f4000aea000000000000000000000000000000000000000000000000000000000145b806105c957507fffffffff0000000000000000000000000000000000000000000000000000000082167f20690fc000000000000000000000000000000000000000000000000000000000145b8061061557507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b60606003805461062a90611cda565b80601f016020809104026020016040519081016040528092919081815260200182805461065690611cda565b80156106a35780601f10610678576101008083540402835291602001916106a3565b820191906000526020600020905b81548152906001019060200180831161068657829003601f168201915b5050505050905090565b6000336106bb818585610df7565b5060019392505050565b6000336106d3858285610e2b565b6106de858585610efc565b506001949350505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906106bb9082908690610730908790611d5c565b610df7565b60006107418484610c9f565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fe19260aff97b920c7df27010903aeb9c8d2be5d310a2c67824cf3f15396e4c1685856040516107a1929190611d6f565b60405180910390a373ffffffffffffffffffffffffffffffffffffffff84163b156106bb576040517fa4c0ed3600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063a4c0ed369061081c90339087908790600401611d90565b600060405180830381600087803b15801561083657600080fd5b505af115801561084a573d6000803e3d6000fd5b505050505060019392505050565b61086133610cad565b61089e576040517fe2c8c9d50000000000000000000000000000000000000000000000000000000081523360048201526024015b60405180910390fd5b813073ffffffffffffffffffffffffffffffffffffffff8216036108c157600080fd5b7f00000000000000000000000000000000000000000000000000000000000000001580159061092257507f00000000000000000000000000000000000000000000000000000000000000008261091660025490565b6109209190611d5c565b115b15610970578161093160025490565b61093b9190611d5c565b6040517fcbbf111300000000000000000000000000000000000000000000000000000000815260040161089591815260200190565b61097a8383610f2a565b505050565b610988336109cc565b6109c0576040517fc820b10b000000000000000000000000000000000000000000000000000000008152336004820152602401610895565b6109c98161101d565b50565b6000610615600983611027565b6109e1611056565b6109ec6009826110d9565b156109c95760405173ffffffffffffffffffffffffffffffffffffffff8216907f0a675452746933cefe3d74182e78db7afe57ba60eaa4234b5d85e9aa41b0610c90600090a250565b6000610a418383610bce565b9392505050565b6060610a5460076110fb565b905090565b60065473ffffffffffffffffffffffffffffffffffffffff163314610ada576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610895565b600580547fffffffffffffffffffffffff00000000000000000000000000000000000000008082163390811790935560068054909116905560405173ffffffffffffffffffffffffffffffffffffffff909116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b610b63336109cc565b610b9b576040517fc820b10b000000000000000000000000000000000000000000000000000000008152336004820152602401610895565b610ba58282611108565b5050565b6060610a5460096110fb565b60606004805461062a90611cda565b610ba58282610b5a565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610c92576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610895565b6106de8286868403610df7565b6000336106bb818585610efc565b6000610615600783611027565b610cc2611056565b610ccd60078261111d565b156109c95760405173ffffffffffffffffffffffffffffffffffffffff8216907fe46fef8bbff1389d9010703cf8ebb363fb3daf5bf56edc27080b67bc8d9251ea90600090a250565b610d1f81610cba565b6109c9815b610d2c611056565b610d3760098261111d565b156109c95760405173ffffffffffffffffffffffffffffffffffffffff8216907f92308bb7573b2a3d17ddb868b39d8ebec433f3194421abc22d084f89658c9bad90600090a250565b61097a82826106e9565b610d92611056565b6109c98161113f565b610da3611056565b610dae6007826110d9565b156109c95760405173ffffffffffffffffffffffffffffffffffffffff8216907fed998b960f6340d045f620c119730f7aa7995e7425c2401d3a5b64ff998a59e990600090a250565b813073ffffffffffffffffffffffffffffffffffffffff821603610e1a57600080fd5b610e25848484611235565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610e255781811015610eef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610895565b610e258484848403610df7565b813073ffffffffffffffffffffffffffffffffffffffff821603610f1f57600080fd5b610e258484846113e8565b73ffffffffffffffffffffffffffffffffffffffff8216610fa7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610895565b8060026000828254610fb99190611d5c565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6109c93382611657565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001830160205260408120541515610a41565b60055473ffffffffffffffffffffffffffffffffffffffff1633146110d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610895565b565b6000610a418373ffffffffffffffffffffffffffffffffffffffff841661181b565b60606000610a418361190e565b611113823383610e2b565b610ba58282611657565b6000610a418373ffffffffffffffffffffffffffffffffffffffff841661196a565b3373ffffffffffffffffffffffffffffffffffffffff8216036111be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610895565b600680547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff838116918217909255600554604051919216907fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae127890600090a350565b73ffffffffffffffffffffffffffffffffffffffff83166112d7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff821661137a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff831661148b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff821661152e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040902054818110156115e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610e25565b73ffffffffffffffffffffffffffffffffffffffff82166116fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040902054818110156117b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b6000818152600183016020526040812054801561190457600061183f600183611dce565b855490915060009061185390600190611dce565b90508181146118b857600086600001828154811061187357611873611de1565b906000526020600020015490508087600001848154811061189657611896611de1565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806118c9576118c9611e10565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610615565b6000915050610615565b60608160000180548060200260200160405190810160405280929190818152602001828054801561195e57602002820191906000526020600020905b81548152602001906001019080831161194a575b50505050509050919050565b60008181526001830160205260408120546119b157508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610615565b506000610615565b6000602082840312156119cb57600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610a4157600080fd5b6000815180845260005b81811015611a2157602081850181015186830182015201611a05565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081526000610a4160208301846119fb565b803573ffffffffffffffffffffffffffffffffffffffff81168114611a9657600080fd5b919050565b60008060408385031215611aae57600080fd5b611ab783611a72565b946020939093013593505050565b600080600060608486031215611ada57600080fd5b611ae384611a72565b9250611af160208501611a72565b9150604084013590509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080600060608486031215611b4557600080fd5b611b4e84611a72565b925060208401359150604084013567ffffffffffffffff80821115611b7257600080fd5b818601915086601f830112611b8657600080fd5b813581811115611b9857611b98611b01565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611bde57611bde611b01565b81604052828152896020848701011115611bf757600080fd5b8260208601602083013760006020848301015280955050505050509250925092565b600060208284031215611c2b57600080fd5b5035919050565b600060208284031215611c4457600080fd5b610a4182611a72565b6020808252825182820181905260009190848201906040850190845b81811015611c9b57835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101611c69565b50909695505050505050565b60008060408385031215611cba57600080fd5b611cc383611a72565b9150611cd160208401611a72565b90509250929050565b600181811c90821680611cee57607f821691505b602082108103611d27577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561061557610615611d2d565b828152604060208201526000611d8860408301846119fb565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000611dc560608301846119fb565b95945050505050565b8181038181111561061557610615611d2d565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000813000a", } var LinkTokenABI = LinkTokenMetaData.ABI diff --git a/core/gethwrappers/shared/generation/generated-wrapper-dependency-versions-do-not-edit.txt b/core/gethwrappers/shared/generation/generated-wrapper-dependency-versions-do-not-edit.txt index 3268bb55bd..03414421c7 100644 --- a/core/gethwrappers/shared/generation/generated-wrapper-dependency-versions-do-not-edit.txt +++ b/core/gethwrappers/shared/generation/generated-wrapper-dependency-versions-do-not-edit.txt @@ -1,5 +1,5 @@ GETH_VERSION: 1.13.8 -burn_mint_erc677: ../../../contracts/solc/v0.8.19/BurnMintERC677/BurnMintERC677.abi ../../../contracts/solc/v0.8.19/BurnMintERC677/BurnMintERC677.bin 405c9016171e614b17e10588653ef8d33dcea21dd569c3fddc596a46fcff68a3 +burn_mint_erc677: ../../../contracts/solc/v0.8.19/BurnMintERC677/BurnMintERC677.abi ../../../contracts/solc/v0.8.19/BurnMintERC677/BurnMintERC677.bin 38eb38ae083b00ca93912ad687745fc8e3735449354ffea58cc5b0db5faa8b39 erc20: ../../../contracts/solc/v0.8.19/ERC20/ERC20.abi ../../../contracts/solc/v0.8.19/ERC20/ERC20.bin 5b1a93d9b24f250e49a730c96335a8113c3f7010365cba578f313b483001d4fc -link_token: ../../../contracts/solc/v0.8.19/LinkToken/LinkToken.abi ../../../contracts/solc/v0.8.19/LinkToken/LinkToken.bin c0ef9b507103aae541ebc31d87d051c2764ba9d843076b30ec505d37cdfffaba +link_token: ../../../contracts/solc/v0.8.19/LinkToken/LinkToken.abi ../../../contracts/solc/v0.8.19/LinkToken/LinkToken.bin 87be5670a484afd3e246c521154e36151f20ab5da633f620ae626b5b72d163a4 werc20_mock: ../../../contracts/solc/v0.8.19/WERC20Mock/WERC20Mock.abi ../../../contracts/solc/v0.8.19/WERC20Mock/WERC20Mock.bin ff2ca3928b2aa9c412c892cb8226c4d754c73eeb291bb7481c32c48791b2aa94 From e9da1dfb1ce3eaae573afe44b8714410e67d7cf1 Mon Sep 17 00:00:00 2001 From: Josh Date: Thu, 10 Oct 2024 11:49:55 -0400 Subject: [PATCH 38/48] rework lock-release pool deployment to be more stringent --- .../tokenAdminRegistry/TokenPoolFactory.t.sol | 89 ++++++++----------- .../TokenPoolFactory/FactoryBurnMintERC20.sol | 5 +- .../TokenPoolFactory/TokenPoolFactory.sol | 9 +- 3 files changed, 45 insertions(+), 58 deletions(-) diff --git a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol index b7e9adf599..ccf8f342b1 100644 --- a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol +++ b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol @@ -20,6 +20,8 @@ import {TokenAdminRegistrySetup} from "./TokenAdminRegistry.t.sol"; import {Create2} from "../../../vendor/openzeppelin-solidity/v5.0.2/contracts/utils/Create2.sol"; +import {console2 as console} from "forge-std/console2.sol"; + contract TokenPoolFactorySetup is TokenAdminRegistrySetup { using Create2 for bytes32; @@ -98,8 +100,7 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { new TokenPoolFactory.RemoteTokenPoolInfo[](0), s_tokenInitCode, s_poolInitCode, - FAKE_SALT, - TokenPoolFactory.PoolType.BURN_MINT + FAKE_SALT ); assertNotEq(address(0), tokenAddress, "Token Address should not be 0"); @@ -160,8 +161,7 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { remoteTokenPools, // No existing remote pools s_tokenInitCode, // Token Init Code s_poolInitCode, // Pool Init Code - FAKE_SALT, // Salt - TokenPoolFactory.PoolType.BURN_MINT // Pool Type + FAKE_SALT // Salt ); // Ensure that the remote Token was set to the one we predicted @@ -199,8 +199,7 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { new TokenPoolFactory.RemoteTokenPoolInfo[](0), s_tokenInitCode, s_poolInitCode, - FAKE_SALT, - TokenPoolFactory.PoolType.BURN_MINT + FAKE_SALT ); assertEq( @@ -289,7 +288,7 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { // Since the remote chain information was provided, we should be able to get the information from the newly // deployed token pool using the available getter functions (address tokenAddress, address poolAddress) = s_tokenPoolFactory.deployTokenAndTokenPool( - remoteTokenPools, s_tokenInitCode, s_poolInitCode, FAKE_SALT, TokenPoolFactory.PoolType.BURN_MINT + remoteTokenPools, s_tokenInitCode, s_poolInitCode, FAKE_SALT ); assertEq(address(TokenPool(poolAddress).getToken()), tokenAddress, "Token Address should have been set locally"); @@ -365,7 +364,7 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { ); (address tokenAddress, address poolAddress) = s_tokenPoolFactory.deployTokenAndTokenPool( - remoteTokenPools, s_tokenInitCode, s_poolInitCode, FAKE_SALT, TokenPoolFactory.PoolType.BURN_MINT + remoteTokenPools, s_tokenInitCode, s_poolInitCode, FAKE_SALT ); assertNotEq(address(0), tokenAddress, "Token Address should not be 0"); @@ -394,7 +393,7 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { assertEq(IOwner(poolAddress).owner(), OWNER, "Token should be owned by the owner"); } - function test_createTokenPoolLockRelease_NoExistingToken_predict_Success() public { + function test_createTokenPoolLockRelease_ExistingToken_predict_Success() public { vm.startPrank(OWNER); bytes32 dynamicSalt = keccak256(abi.encodePacked(FAKE_SALT, OWNER)); @@ -411,6 +410,12 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { TokenPoolFactory.RemoteChainConfig memory remoteChainConfig = TokenPoolFactory.RemoteChainConfig(address(newTokenPoolFactory), address(s_destRouter), address(s_rmnProxy)); + FactoryBurnMintERC20 newLocalToken = + new FactoryBurnMintERC20("TestToken", "TEST", 18, type(uint256).max, PREMINT_AMOUNT, OWNER); + + FactoryBurnMintERC20 newRemoteToken = + new FactoryBurnMintERC20("TestToken", "TEST", 18, type(uint256).max, PREMINT_AMOUNT, OWNER); + // Create an array of remote pools where nothing exists yet, but we want to predict the address for // the new pool and token on DEST_CHAIN_SELECTOR TokenPoolFactory.RemoteTokenPoolInfo[] memory remoteTokenPools = new TokenPoolFactory.RemoteTokenPoolInfo[](1); @@ -423,74 +428,58 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { type(LockReleaseTokenPool).creationCode, // remotePoolInitCode remoteChainConfig, // remoteChainConfig TokenPoolFactory.PoolType.LOCK_RELEASE, // poolType - "", // remoteTokenAddress + abi.encode(address(newRemoteToken)), // remoteTokenAddress s_tokenInitCode, // remoteTokenInitCode RateLimiter.Config(false, 0, 0) ); - - // Predict the address of the token and pool on the DESTINATION chain - address predictedTokenAddress = dynamicSalt.computeAddress(keccak256(s_tokenInitCode), address(newTokenPoolFactory)); - + // Since the remote chain information was provided, we should be able to get the information from the newly // deployed token pool using the available getter functions - (, address poolAddress) = s_tokenPoolFactory.deployTokenAndTokenPool( + address poolAddress = s_tokenPoolFactory.deployTokenPoolWithExistingToken( + address(newLocalToken), remoteTokenPools, - s_tokenInitCode, type(LockReleaseTokenPool).creationCode, FAKE_SALT, TokenPoolFactory.PoolType.LOCK_RELEASE ); - // Ensure that the remote Token was set to the one we predicted - assertEq( - abi.encode(predictedTokenAddress), - TokenPool(poolAddress).getRemoteToken(DEST_CHAIN_SELECTOR), - "Token Address should have been predicted" - ); - - { - // Create the constructor params for the predicted pool - // The predictedTokenAddress is NOT abi-encoded since the raw evm-address - // is used in the constructor params - bytes memory predictedPoolCreationParams = - abi.encode(predictedTokenAddress, new address[](0), s_rmnProxy, true, address(s_destRouter)); + // Check that the pool was correctly deployed on the local chain first - // Take the init code and concat the destination params to it, the initCode shouldn't change - bytes memory predictedPoolInitCode = - abi.encodePacked(type(LockReleaseTokenPool).creationCode, predictedPoolCreationParams); + // Accept the ownership which was transfered + OwnerIsCreator(poolAddress).acceptOwnership(); - // Predict the address of the pool on the DESTINATION chain - address predictedPoolAddress = - dynamicSalt.computeAddress(keccak256(predictedPoolInitCode), address(newTokenPoolFactory)); + // Ensure that the remote Token was set to the one we predicted + assertEq(address(LockReleaseTokenPool(poolAddress).getToken()), address(newLocalToken), "Token Address should have been set"); - // Assert that the address set for the remote pool is the same as the predicted address - assertEq( - abi.encode(predictedPoolAddress), - TokenPool(poolAddress).getRemotePool(DEST_CHAIN_SELECTOR), - "Pool Address should have been predicted" - ); - } + LockReleaseTokenPool(poolAddress).setRebalancer(OWNER); + assertEq(OWNER, LockReleaseTokenPool(poolAddress).getRebalancer(), "Rebalancer should be set"); - // On the new token pool factory, representing a destination chain, - // deploy a new token and a new pool - (address newTokenAddress, address newPoolAddress) = newTokenPoolFactory.deployTokenAndTokenPool( + // Deploy the Lock-Release Token Pool on the destination chain with the existing remote token + (address newPoolAddress) = newTokenPoolFactory.deployTokenPoolWithExistingToken( + address(newRemoteToken), new TokenPoolFactory.RemoteTokenPoolInfo[](0), // No existing remote pools - s_tokenInitCode, // Token Init Code type(LockReleaseTokenPool).creationCode, // Pool Init Code FAKE_SALT, // Salt - TokenPoolFactory.PoolType.LOCK_RELEASE // Pool Type + TokenPoolFactory.PoolType.LOCK_RELEASE ); assertEq( - TokenPool(poolAddress).getRemotePool(DEST_CHAIN_SELECTOR), + LockReleaseTokenPool(poolAddress).getRemotePool(DEST_CHAIN_SELECTOR), abi.encode(newPoolAddress), "New Pool Address should have been deployed correctly" ); assertEq( - TokenPool(poolAddress).getRemoteToken(DEST_CHAIN_SELECTOR), - abi.encode(newTokenAddress), + LockReleaseTokenPool(poolAddress).getRemoteToken(DEST_CHAIN_SELECTOR), + abi.encode(address(newRemoteToken)), "New Token Address should have been deployed correctly" ); + + assertEq( + address(LockReleaseTokenPool(newPoolAddress).getToken()), + address(newRemoteToken), + "New Remote Token should be set correctly" + ); + } } diff --git a/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory/FactoryBurnMintERC20.sol b/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory/FactoryBurnMintERC20.sol index c59be5775d..e22aa339c6 100644 --- a/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory/FactoryBurnMintERC20.sol +++ b/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory/FactoryBurnMintERC20.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; +pragma solidity 0.8.24; import {IGetCCIPAdmin} from "../../../ccip/interfaces/IGetCCIPAdmin.sol"; import {IOwnable} from "../../../shared/interfaces/IOwnable.sol"; @@ -70,9 +70,10 @@ contract FactoryBurnMintERC20 is IBurnMintERC20, IGetCCIPAdmin, IERC165, ERC20Bu grantBurnRole(newOwner_); } + /// @inheritdoc IERC165 function supportsInterface(bytes4 interfaceId) public pure virtual override returns (bool) { return interfaceId == type(IERC20).interfaceId || interfaceId == type(IBurnMintERC20).interfaceId - || interfaceId == type(IERC165).interfaceId || interfaceId == type(IOwnable).interfaceId; + || interfaceId == type(IERC165).interfaceId || interfaceId == type(IOwnable).interfaceId || interfaceId == type(IGetCCIPAdmin).interfaceId; } // ================================================================ diff --git a/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory/TokenPoolFactory.sol b/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory/TokenPoolFactory.sol index b545a601e2..7be091d5d2 100644 --- a/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory/TokenPoolFactory.sol +++ b/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory/TokenPoolFactory.sol @@ -6,7 +6,6 @@ import {ITypeAndVersion} from "../../../shared/interfaces/ITypeAndVersion.sol"; import {IBurnMintERC20} from "../../../shared/token/ERC20/IBurnMintERC20.sol"; import {ITokenAdminRegistry} from "../../interfaces/ITokenAdminRegistry.sol"; -import {OwnerIsCreator} from "../../../shared/access/OwnerIsCreator.sol"; import {RateLimiter} from "../../libraries/RateLimiter.sol"; import {TokenPool} from "../../pools/TokenPool.sol"; import {RegistryModuleOwnerCustom} from "../RegistryModuleOwnerCustom.sol"; @@ -18,7 +17,7 @@ import {Create2} from "../../../vendor/openzeppelin-solidity/v5.0.2/contracts/ut /// ownership transfer in a separate transaction. /// @dev The address prediction mechanism is only capable of deploying and predicting addresses for EVM based chains. /// adding compatibility for other chains will require additional offchain computation. -contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { +contract TokenPoolFactory is ITypeAndVersion { using Create2 for bytes32; event RemoteChainConfigUpdated(uint64 indexed remoteChainSelector, RemoteChainConfig remoteChainConfig); @@ -95,15 +94,13 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { /// @param tokenInitCode The creation code for the token, which includes the constructor parameters already appended /// @param tokenPoolInitCode The creation code for the token pool, without the constructor parameters appended /// @param salt The salt to be used in the create2 deployment of the token and token pool to ensure a unique address - /// @param poolType The type of pool to deploy, either Burn/Mint or Lock/Release /// @return token The address of the token that was deployed /// @return pool The address of the token pool that was deployed function deployTokenAndTokenPool( RemoteTokenPoolInfo[] calldata remoteTokenPools, bytes memory tokenInitCode, bytes calldata tokenPoolInitCode, - bytes32 salt, - PoolType poolType + bytes32 salt ) external returns (address, address) { // Ensure a unique deployment between senders even if the same input parameter is used to prevent // DOS/Frontrunning attacks @@ -113,7 +110,7 @@ contract TokenPoolFactory is OwnerIsCreator, ITypeAndVersion { address token = Create2.deploy(0, salt, tokenInitCode); // Deploy the token pool - address pool = _createTokenPool(token, remoteTokenPools, tokenPoolInitCode, salt, poolType); + address pool = _createTokenPool(token, remoteTokenPools, tokenPoolInitCode, salt, PoolType.BURN_MINT); // Grant the mint and burn roles to the pool for the token IBurnMintERC20(token).grantMintAndBurnRoles(pool); From 752c2902aea0528fd86afd1af9deb1714dc323e0 Mon Sep 17 00:00:00 2001 From: Josh Date: Thu, 10 Oct 2024 11:52:49 -0400 Subject: [PATCH 39/48] when you forget to run the formatter before committing --- contracts/gas-snapshots/ccip.gas-snapshot | 2134 ++++++++--------- .../tokenAdminRegistry/TokenPoolFactory.t.sol | 31 +- .../TokenPoolFactory/FactoryBurnMintERC20.sol | 3 +- 3 files changed, 1082 insertions(+), 1086 deletions(-) diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot index a83ff6f4c8..c58710cefb 100644 --- a/contracts/gas-snapshots/ccip.gas-snapshot +++ b/contracts/gas-snapshots/ccip.gas-snapshot @@ -1,1067 +1,1067 @@ -ARMProxyStandaloneTest:test_ARMCallEmptyContractRevert() (gas: 19675) -ARMProxyStandaloneTest:test_Constructor() (gas: 310043) -ARMProxyStandaloneTest:test_SetARM() (gas: 16587) -ARMProxyStandaloneTest:test_SetARMzero() (gas: 11297) -ARMProxyTest:test_ARMCallRevertReasonForwarded() (gas: 47898) -ARMProxyTest:test_ARMIsBlessed_Success() (gas: 36363) -ARMProxyTest:test_ARMIsCursed_Success() (gas: 49851) -AggregateTokenLimiter_constructor:test_Constructor_Success() (gas: 27118) -AggregateTokenLimiter_getTokenBucket:test_GetTokenBucket_Success() (gas: 19871) -AggregateTokenLimiter_getTokenBucket:test_Refill_Success() (gas: 41586) -AggregateTokenLimiter_getTokenBucket:test_TimeUnderflow_Revert() (gas: 15452) -AggregateTokenLimiter_getTokenLimitAdmin:test_GetTokenLimitAdmin_Success() (gas: 10537) -AggregateTokenLimiter_getTokenValue:test_GetTokenValue_Success() (gas: 17531) -AggregateTokenLimiter_getTokenValue:test_NoTokenPrice_Reverts() (gas: 21414) -AggregateTokenLimiter_rateLimitValue:test_AggregateValueMaxCapacityExceeded_Revert() (gas: 16586) -AggregateTokenLimiter_rateLimitValue:test_RateLimitValueSuccess_gas() (gas: 18357) -AggregateTokenLimiter_setAdmin:test_OnlyOwnerOrAdmin_Revert() (gas: 13078) -AggregateTokenLimiter_setAdmin:test_Owner_Success() (gas: 19016) -AggregateTokenLimiter_setRateLimiterConfig:test_OnlyOnlyCallableByAdminOrOwner_Revert() (gas: 17546) -AggregateTokenLimiter_setRateLimiterConfig:test_Owner_Success() (gas: 30393) -AggregateTokenLimiter_setRateLimiterConfig:test_TokenLimitAdmin_Success() (gas: 32407) -BurnFromMintTokenPool_lockOrBurn:test_ChainNotAllowed_Revert() (gas: 28842) -BurnFromMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 55271) -BurnFromMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 244024) -BurnFromMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 24166) -BurnMintTokenPool_lockOrBurn:test_ChainNotAllowed_Revert() (gas: 27609) -BurnMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 55271) -BurnMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 241912) -BurnMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 17851) -BurnMintTokenPool_releaseOrMint:test_ChainNotAllowed_Revert() (gas: 28805) -BurnMintTokenPool_releaseOrMint:test_PoolMintNotHealthy_Revert() (gas: 56253) -BurnMintTokenPool_releaseOrMint:test_PoolMint_Success() (gas: 112391) -BurnWithFromMintTokenPool_lockOrBurn:test_ChainNotAllowed_Revert() (gas: 28842) -BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 55271) -BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 244050) -BurnWithFromMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 24170) -CCIPClientExample_sanity:test_ImmutableExamples_Success() (gas: 2052431) -CCIPHome__validateConfig:test__validateConfigLessTransmittersThanSigners_Success() (gas: 334693) -CCIPHome__validateConfig:test__validateConfigSmallerFChain_Success() (gas: 466117) -CCIPHome__validateConfig:test__validateConfig_ABIEncodedAddress_OfframpAddressCannotBeZero_Reverts() (gas: 289739) -CCIPHome__validateConfig:test__validateConfig_ABIEncodedAddress_RMNHomeAddressCannotBeZero_Reverts() (gas: 290034) -CCIPHome__validateConfig:test__validateConfig_ChainSelectorNotFound_Reverts() (gas: 292771) -CCIPHome__validateConfig:test__validateConfig_ChainSelectorNotSet_Reverts() (gas: 289373) -CCIPHome__validateConfig:test__validateConfig_FChainTooHigh_Reverts() (gas: 337311) -CCIPHome__validateConfig:test__validateConfig_FMustBePositive_Reverts() (gas: 291145) -CCIPHome__validateConfig:test__validateConfig_FTooHigh_Reverts() (gas: 290604) -CCIPHome__validateConfig:test__validateConfig_NodeNotInRegistry_Reverts() (gas: 344238) -CCIPHome__validateConfig:test__validateConfig_NotEnoughTransmittersEmptyAddresses_Reverts() (gas: 309179) -CCIPHome__validateConfig:test__validateConfig_NotEnoughTransmitters_Reverts() (gas: 1212133) -CCIPHome__validateConfig:test__validateConfig_OfframpAddressCannotBeZero_Reverts() (gas: 289400) -CCIPHome__validateConfig:test__validateConfig_RMNHomeAddressCannotBeZero_Reverts() (gas: 289661) -CCIPHome__validateConfig:test__validateConfig_Success() (gas: 300616) -CCIPHome__validateConfig:test__validateConfig_TooManySigners_Reverts() (gas: 773237) -CCIPHome__validateConfig:test__validateConfig_ZeroP2PId_Reverts() (gas: 293988) -CCIPHome__validateConfig:test__validateConfig_ZeroSignerKey_Reverts() (gas: 294035) -CCIPHome_applyChainConfigUpdates:test__applyChainConfigUpdates_FChainNotPositive_Reverts() (gas: 185242) -CCIPHome_applyChainConfigUpdates:test_applyChainConfigUpdates_addChainConfigs_Success() (gas: 347249) -CCIPHome_applyChainConfigUpdates:test_applyChainConfigUpdates_nodeNotInRegistry_Reverts() (gas: 20631) -CCIPHome_applyChainConfigUpdates:test_applyChainConfigUpdates_removeChainConfigs_Success() (gas: 270824) -CCIPHome_applyChainConfigUpdates:test_applyChainConfigUpdates_selectorNotFound_Reverts() (gas: 14952) -CCIPHome_applyChainConfigUpdates:test_getPaginatedCCIPHomes_Success() (gas: 370980) -CCIPHome_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_DONIdMismatch_reverts() (gas: 27137) -CCIPHome_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_InnerCallReverts_reverts() (gas: 11783) -CCIPHome_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_InvalidSelector_reverts() (gas: 11038) -CCIPHome_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_OnlyCapabilitiesRegistryCanCall_reverts() (gas: 26150) -CCIPHome_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_success() (gas: 1436726) -CCIPHome_constructor:test_constructor_CapabilitiesRegistryAddressZero_reverts() (gas: 63878) -CCIPHome_constructor:test_constructor_success() (gas: 3521034) -CCIPHome_constructor:test_getCapabilityConfiguration_success() (gas: 9173) -CCIPHome_constructor:test_supportsInterface_success() (gas: 9865) -CCIPHome_getAllConfigs:test_getAllConfigs_success() (gas: 2765282) -CCIPHome_getConfigDigests:test_getConfigDigests_success() (gas: 2539724) -CCIPHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_CanOnlySelfCall_reverts() (gas: 9110) -CCIPHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_ConfigDigestMismatch_reverts() (gas: 23052) -CCIPHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_NoOpStateTransitionNotAllowed_reverts() (gas: 8818) -CCIPHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_multiplePlugins_success() (gas: 5096112) -CCIPHome_revokeCandidate:test_revokeCandidate_CanOnlySelfCall_reverts() (gas: 9068) -CCIPHome_revokeCandidate:test_revokeCandidate_ConfigDigestMismatch_reverts() (gas: 19128) -CCIPHome_revokeCandidate:test_revokeCandidate_RevokingZeroDigestNotAllowed_reverts() (gas: 8773) -CCIPHome_revokeCandidate:test_revokeCandidate_success() (gas: 30676) -CCIPHome_setCandidate:test_setCandidate_CanOnlySelfCall_reverts() (gas: 19051) -CCIPHome_setCandidate:test_setCandidate_ConfigDigestMismatch_reverts() (gas: 1388198) -CCIPHome_setCandidate:test_setCandidate_success() (gas: 1357740) -CommitStore_constructor:test_Constructor_Success() (gas: 2855567) -CommitStore_isUnpausedAndRMNHealthy:test_RMN_Success() (gas: 73954) -CommitStore_report:test_InvalidIntervalMinLargerThanMax_Revert() (gas: 28739) -CommitStore_report:test_InvalidInterval_Revert() (gas: 28679) -CommitStore_report:test_InvalidRootRevert() (gas: 27912) -CommitStore_report:test_OnlyGasPriceUpdates_Success() (gas: 53448) -CommitStore_report:test_OnlyPriceUpdateStaleReport_Revert() (gas: 59286) -CommitStore_report:test_OnlyTokenPriceUpdates_Success() (gas: 53446) -CommitStore_report:test_Paused_Revert() (gas: 21319) -CommitStore_report:test_ReportAndPriceUpdate_Success() (gas: 84485) -CommitStore_report:test_ReportOnlyRootSuccess_gas() (gas: 56342) -CommitStore_report:test_RootAlreadyCommitted_Revert() (gas: 64077) -CommitStore_report:test_StaleReportWithRoot_Success() (gas: 117309) -CommitStore_report:test_Unhealthy_Revert() (gas: 44823) -CommitStore_report:test_ValidPriceUpdateThenStaleReportWithRoot_Success() (gas: 98929) -CommitStore_report:test_ZeroEpochAndRound_Revert() (gas: 27707) -CommitStore_resetUnblessedRoots:test_OnlyOwner_Revert() (gas: 11376) -CommitStore_resetUnblessedRoots:test_ResetUnblessedRoots_Success() (gas: 144186) -CommitStore_setDynamicConfig:test_InvalidCommitStoreConfig_Revert() (gas: 37314) -CommitStore_setDynamicConfig:test_OnlyOwner_Revert() (gas: 37483) -CommitStore_setDynamicConfig:test_PriceEpochCleared_Success() (gas: 129329) -CommitStore_setLatestPriceEpochAndRound:test_OnlyOwner_Revert() (gas: 11099) -CommitStore_setLatestPriceEpochAndRound:test_SetLatestPriceEpochAndRound_Success() (gas: 20690) -CommitStore_setMinSeqNr:test_OnlyOwner_Revert() (gas: 11098) -CommitStore_verify:test_Blessed_Success() (gas: 96581) -CommitStore_verify:test_NotBlessed_Success() (gas: 61473) -CommitStore_verify:test_Paused_Revert() (gas: 18568) -CommitStore_verify:test_TooManyLeaves_Revert() (gas: 36848) -DefensiveExampleTest:test_HappyPath_Success() (gas: 200200) -DefensiveExampleTest:test_Recovery() (gas: 424476) -E2E:test_E2E_3MessagesSuccess_gas() (gas: 1106985) -EVM2EVMOffRamp__releaseOrMintToken:test__releaseOrMintToken_NotACompatiblePool_Revert() (gas: 38322) -EVM2EVMOffRamp__releaseOrMintToken:test__releaseOrMintToken_Success() (gas: 104438) -EVM2EVMOffRamp__releaseOrMintToken:test__releaseOrMintToken_TokenHandlingError_transfer_Revert() (gas: 86026) -EVM2EVMOffRamp__releaseOrMintToken:test_releaseOrMintToken_InvalidDataLength_Revert() (gas: 37365) -EVM2EVMOffRamp__releaseOrMintToken:test_releaseOrMintToken_ReleaseOrMintBalanceMismatch_Revert() (gas: 95013) -EVM2EVMOffRamp__releaseOrMintToken:test_releaseOrMintToken_TokenHandlingError_BalanceOf_Revert() (gas: 40341) -EVM2EVMOffRamp__releaseOrMintToken:test_releaseOrMintToken_skip_ReleaseOrMintBalanceMismatch_if_pool_Revert() (gas: 87189) -EVM2EVMOffRamp__releaseOrMintTokens:test_OverValueWithARLOff_Success() (gas: 381594) -EVM2EVMOffRamp__releaseOrMintTokens:test_PriceNotFoundForToken_Reverts() (gas: 140568) -EVM2EVMOffRamp__releaseOrMintTokens:test_RateLimitErrors_Reverts() (gas: 798833) -EVM2EVMOffRamp__releaseOrMintTokens:test_TokenHandlingError_Reverts() (gas: 178400) -EVM2EVMOffRamp__releaseOrMintTokens:test__releaseOrMintTokens_NotACompatiblePool_Reverts() (gas: 29681) -EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_InvalidDataLengthReturnData_Revert() (gas: 67146) -EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_InvalidEVMAddress_Revert() (gas: 43605) -EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_Success() (gas: 208068) -EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_destDenominatedDecimals_Success() (gas: 219365) -EVM2EVMOffRamp__report:test_Report_Success() (gas: 127774) -EVM2EVMOffRamp__trialExecute:test_RateLimitError_Success() (gas: 237406) -EVM2EVMOffRamp__trialExecute:test_TokenHandlingErrorIsCaught_Success() (gas: 246039) -EVM2EVMOffRamp__trialExecute:test_TokenPoolIsNotAContract_Success() (gas: 329283) -EVM2EVMOffRamp__trialExecute:test_trialExecute_Success() (gas: 310166) -EVM2EVMOffRamp_ccipReceive:test_Reverts() (gas: 17048) -EVM2EVMOffRamp_constructor:test_CommitStoreAlreadyInUse_Revert() (gas: 153120) -EVM2EVMOffRamp_constructor:test_Constructor_Success() (gas: 5212732) -EVM2EVMOffRamp_constructor:test_ZeroOnRampAddress_Revert() (gas: 143845) -EVM2EVMOffRamp_execute:test_EmptyReport_Revert() (gas: 21507) -EVM2EVMOffRamp_execute:test_InvalidMessageId_Revert() (gas: 36936) -EVM2EVMOffRamp_execute:test_InvalidSourceChain_Revert() (gas: 52324) -EVM2EVMOffRamp_execute:test_InvalidSourcePoolAddress_Success() (gas: 473387) -EVM2EVMOffRamp_execute:test_ManualExecutionNotYetEnabled_Revert() (gas: 48346) -EVM2EVMOffRamp_execute:test_MessageTooLarge_Revert() (gas: 153019) -EVM2EVMOffRamp_execute:test_Paused_Revert() (gas: 103946) -EVM2EVMOffRamp_execute:test_ReceiverError_Success() (gas: 165358) -EVM2EVMOffRamp_execute:test_RetryFailedMessageWithoutManualExecution_Success() (gas: 180107) -EVM2EVMOffRamp_execute:test_RootNotCommitted_Revert() (gas: 43157) -EVM2EVMOffRamp_execute:test_SingleMessageNoTokensUnordered_Success() (gas: 160119) -EVM2EVMOffRamp_execute:test_SingleMessageNoTokens_Success() (gas: 175497) -EVM2EVMOffRamp_execute:test_SingleMessageToNonCCIPReceiver_Success() (gas: 237901) -EVM2EVMOffRamp_execute:test_SingleMessagesNoTokensSuccess_gas() (gas: 115048) -EVM2EVMOffRamp_execute:test_SkippedIncorrectNonceStillExecutes_Success() (gas: 406606) -EVM2EVMOffRamp_execute:test_SkippedIncorrectNonce_Success() (gas: 54774) -EVM2EVMOffRamp_execute:test_StrictUntouchedToSuccess_Success() (gas: 132556) -EVM2EVMOffRamp_execute:test_TokenDataMismatch_Revert() (gas: 52786) -EVM2EVMOffRamp_execute:test_TwoMessagesWithTokensAndGE_Success() (gas: 564471) -EVM2EVMOffRamp_execute:test_TwoMessagesWithTokensSuccess_gas() (gas: 494719) -EVM2EVMOffRamp_execute:test_UnexpectedTokenData_Revert() (gas: 35887) -EVM2EVMOffRamp_execute:test_Unhealthy_Revert() (gas: 546333) -EVM2EVMOffRamp_execute:test_UnsupportedNumberOfTokens_Revert() (gas: 65298) -EVM2EVMOffRamp_execute:test__execute_SkippedAlreadyExecutedMessageUnordered_Success() (gas: 124107) -EVM2EVMOffRamp_execute:test__execute_SkippedAlreadyExecutedMessage_Success() (gas: 144365) -EVM2EVMOffRamp_execute:test_execute_RouterYULCall_Success() (gas: 394187) -EVM2EVMOffRamp_executeSingleMessage:test_MessageSender_Revert() (gas: 18685) -EVM2EVMOffRamp_executeSingleMessage:test_NonContractWithTokens_Success() (gas: 275257) -EVM2EVMOffRamp_executeSingleMessage:test_NonContract_Success() (gas: 18815) -EVM2EVMOffRamp_executeSingleMessage:test_TokenHandlingError_Revert() (gas: 223182) -EVM2EVMOffRamp_executeSingleMessage:test_ZeroGasDONExecution_Revert() (gas: 48391) -EVM2EVMOffRamp_executeSingleMessage:test_executeSingleMessage_NoTokens_Success() (gas: 47823) -EVM2EVMOffRamp_executeSingleMessage:test_executeSingleMessage_WithTokens_Success() (gas: 311554) -EVM2EVMOffRamp_executeSingleMessage:test_executeSingleMessage_ZeroGasZeroData_Success() (gas: 70839) -EVM2EVMOffRamp_execute_upgrade:test_V2NonceNewSenderStartsAtZero_Success() (gas: 232136) -EVM2EVMOffRamp_execute_upgrade:test_V2NonceStartsAtV1Nonce_Success() (gas: 281170) -EVM2EVMOffRamp_execute_upgrade:test_V2OffRampNonceSkipsIfMsgInFlight_Success() (gas: 262488) -EVM2EVMOffRamp_execute_upgrade:test_V2SenderNoncesReadsPreviousRamp_Success() (gas: 230645) -EVM2EVMOffRamp_execute_upgrade:test_V2_Success() (gas: 132092) -EVM2EVMOffRamp_getAllRateLimitTokens:test_GetAllRateLimitTokens_Success() (gas: 38626) -EVM2EVMOffRamp_getExecutionState:test_FillExecutionState_Success() (gas: 3397486) -EVM2EVMOffRamp_getExecutionState:test_GetExecutionState_Success() (gas: 84833) -EVM2EVMOffRamp_manuallyExecute:test_ManualExecFailedTx_Revert() (gas: 188280) -EVM2EVMOffRamp_manuallyExecute:test_ManualExecForkedChain_Revert() (gas: 27574) -EVM2EVMOffRamp_manuallyExecute:test_ManualExecGasLimitMismatch_Revert() (gas: 46457) -EVM2EVMOffRamp_manuallyExecute:test_ManualExecInvalidGasLimit_Revert() (gas: 27948) -EVM2EVMOffRamp_manuallyExecute:test_ManualExecWithMultipleMessagesAndSourceTokens_Success() (gas: 531330) -EVM2EVMOffRamp_manuallyExecute:test_ManualExecWithSourceTokens_Success() (gas: 344463) -EVM2EVMOffRamp_manuallyExecute:test_ManualExec_Success() (gas: 189760) -EVM2EVMOffRamp_manuallyExecute:test_ReentrancyManualExecuteFails_Success() (gas: 2195128) -EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_DestinationGasAmountCountMismatch_Revert() (gas: 362054) -EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_DoesNotRevertIfUntouched_Success() (gas: 145457) -EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_InvalidTokenGasOverride_Revert() (gas: 365283) -EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_LowGasLimitManualExec_Success() (gas: 450711) -EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_WithGasOverride_Success() (gas: 192223) -EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_WithInvalidReceiverExecutionGasOverride_Revert() (gas: 155387) -EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_WithInvalidSourceTokenDataCount_Revert() (gas: 60494) -EVM2EVMOffRamp_metadataHash:test_MetadataHash_Success() (gas: 8895) -EVM2EVMOffRamp_setDynamicConfig:test_NonOwner_Revert() (gas: 40357) -EVM2EVMOffRamp_setDynamicConfig:test_RouterZeroAddress_Revert() (gas: 38419) -EVM2EVMOffRamp_setDynamicConfig:test_SetDynamicConfig_Success() (gas: 142469) -EVM2EVMOffRamp_updateRateLimitTokens:test_updateRateLimitTokens_AddsAndRemoves_Success() (gas: 162818) -EVM2EVMOffRamp_updateRateLimitTokens:test_updateRateLimitTokens_NonOwner_Revert() (gas: 16936) -EVM2EVMOffRamp_updateRateLimitTokens:test_updateRateLimitTokens_Success() (gas: 197985) -EVM2EVMOnRamp_constructor:test_Constructor_Success() (gas: 5056698) -EVM2EVMOnRamp_forwardFromRouter:test_CannotSendZeroTokens_Revert() (gas: 36063) -EVM2EVMOnRamp_forwardFromRouter:test_EnforceOutOfOrder_Revert() (gas: 99010) -EVM2EVMOnRamp_forwardFromRouter:test_ForwardFromRouterExtraArgsV2AllowOutOfOrderTrue_Success() (gas: 114925) -EVM2EVMOnRamp_forwardFromRouter:test_ForwardFromRouterExtraArgsV2_Success() (gas: 114967) -EVM2EVMOnRamp_forwardFromRouter:test_ForwardFromRouterSuccessCustomExtraArgs() (gas: 130991) -EVM2EVMOnRamp_forwardFromRouter:test_ForwardFromRouterSuccessLegacyExtraArgs() (gas: 139431) -EVM2EVMOnRamp_forwardFromRouter:test_ForwardFromRouter_Success() (gas: 130607) -EVM2EVMOnRamp_forwardFromRouter:test_InvalidAddressEncodePacked_Revert() (gas: 38647) -EVM2EVMOnRamp_forwardFromRouter:test_InvalidAddress_Revert() (gas: 38830) -EVM2EVMOnRamp_forwardFromRouter:test_InvalidChainSelector_Revert() (gas: 25726) -EVM2EVMOnRamp_forwardFromRouter:test_InvalidExtraArgsTag_Revert() (gas: 25545) -EVM2EVMOnRamp_forwardFromRouter:test_MaxCapacityExceeded_Revert() (gas: 84266) -EVM2EVMOnRamp_forwardFromRouter:test_MaxFeeBalanceReached_Revert() (gas: 36847) -EVM2EVMOnRamp_forwardFromRouter:test_MessageGasLimitTooHigh_Revert() (gas: 29327) -EVM2EVMOnRamp_forwardFromRouter:test_MessageTooLarge_Revert() (gas: 107850) -EVM2EVMOnRamp_forwardFromRouter:test_OriginalSender_Revert() (gas: 22823) -EVM2EVMOnRamp_forwardFromRouter:test_OverValueWithARLOff_Success() (gas: 226568) -EVM2EVMOnRamp_forwardFromRouter:test_Paused_Revert() (gas: 53432) -EVM2EVMOnRamp_forwardFromRouter:test_Permissions_Revert() (gas: 25757) -EVM2EVMOnRamp_forwardFromRouter:test_PriceNotFoundForToken_Revert() (gas: 57722) -EVM2EVMOnRamp_forwardFromRouter:test_ShouldIncrementNonceOnlyOnOrdered_Success() (gas: 182247) -EVM2EVMOnRamp_forwardFromRouter:test_ShouldIncrementSeqNumAndNonce_Success() (gas: 180718) -EVM2EVMOnRamp_forwardFromRouter:test_ShouldStoreNonLinkFees() (gas: 133236) -EVM2EVMOnRamp_forwardFromRouter:test_SourceTokenDataTooLarge_Revert() (gas: 3573653) -EVM2EVMOnRamp_forwardFromRouter:test_TooManyTokens_Revert() (gas: 30472) -EVM2EVMOnRamp_forwardFromRouter:test_Unhealthy_Revert() (gas: 43480) -EVM2EVMOnRamp_forwardFromRouter:test_UnsupportedToken_Revert() (gas: 110111) -EVM2EVMOnRamp_forwardFromRouter:test_ZeroAddressReceiver_Revert() (gas: 316020) -EVM2EVMOnRamp_forwardFromRouter:test_forwardFromRouter_ShouldStoreLinkFees_Success() (gas: 113033) -EVM2EVMOnRamp_forwardFromRouter:test_forwardFromRouter_UnsupportedToken_Revert() (gas: 72824) -EVM2EVMOnRamp_forwardFromRouter:test_forwardFromRouter_correctSourceTokenData_Success() (gas: 714726) -EVM2EVMOnRamp_forwardFromRouter_upgrade:test_V2NonceNewSenderStartsAtZero_Success() (gas: 148808) -EVM2EVMOnRamp_forwardFromRouter_upgrade:test_V2NonceStartsAtV1Nonce_Success() (gas: 192679) -EVM2EVMOnRamp_forwardFromRouter_upgrade:test_V2SenderNoncesReadsPreviousRamp_Success() (gas: 123243) -EVM2EVMOnRamp_forwardFromRouter_upgrade:test_V2_Success() (gas: 96028) -EVM2EVMOnRamp_getDataAvailabilityCost:test_EmptyMessageCalculatesDataAvailabilityCost_Success() (gas: 20598) -EVM2EVMOnRamp_getDataAvailabilityCost:test_SimpleMessageCalculatesDataAvailabilityCost_Success() (gas: 20966) -EVM2EVMOnRamp_getFee:test_EmptyMessage_Success() (gas: 74894) -EVM2EVMOnRamp_getFee:test_GetFeeOfZeroForTokenMessage_Success() (gas: 80393) -EVM2EVMOnRamp_getFee:test_HighGasMessage_Success() (gas: 230742) -EVM2EVMOnRamp_getFee:test_MessageGasLimitTooHigh_Revert() (gas: 16943) -EVM2EVMOnRamp_getFee:test_MessageTooLarge_Revert() (gas: 95505) -EVM2EVMOnRamp_getFee:test_MessageWithDataAndTokenTransfer_Success() (gas: 154010) -EVM2EVMOnRamp_getFee:test_NotAFeeToken_Revert() (gas: 24323) -EVM2EVMOnRamp_getFee:test_SingleTokenMessage_Success() (gas: 114740) -EVM2EVMOnRamp_getFee:test_TooManyTokens_Revert() (gas: 20142) -EVM2EVMOnRamp_getFee:test_ZeroDataAvailabilityMultiplier_Success() (gas: 63070) -EVM2EVMOnRamp_getSupportedTokens:test_GetSupportedTokens_Revert() (gas: 10532) -EVM2EVMOnRamp_getTokenPool:test_GetTokenPool_Success() (gas: 35297) -EVM2EVMOnRamp_getTokenTransferCost:test_CustomTokenBpsFee_Success() (gas: 43218) -EVM2EVMOnRamp_getTokenTransferCost:test_FeeTokenBpsFee_Success() (gas: 33280) -EVM2EVMOnRamp_getTokenTransferCost:test_LargeTokenTransferChargesMaxFeeAndGas_Success() (gas: 28551) -EVM2EVMOnRamp_getTokenTransferCost:test_MixedTokenTransferFee_Success() (gas: 122690) -EVM2EVMOnRamp_getTokenTransferCost:test_NoTokenTransferChargesZeroFee_Success() (gas: 15403) -EVM2EVMOnRamp_getTokenTransferCost:test_SmallTokenTransferChargesMinFeeAndGas_Success() (gas: 28359) -EVM2EVMOnRamp_getTokenTransferCost:test_UnsupportedToken_Revert() (gas: 21353) -EVM2EVMOnRamp_getTokenTransferCost:test_ZeroAmountTokenTransferChargesMinFeeAndGas_Success() (gas: 28382) -EVM2EVMOnRamp_getTokenTransferCost:test_ZeroFeeConfigChargesMinFee_Success() (gas: 38899) -EVM2EVMOnRamp_getTokenTransferCost:test__getTokenTransferCost_selfServeUsesDefaults_Success() (gas: 29674) -EVM2EVMOnRamp_linkAvailableForPayment:test_InsufficientLinkBalance_Success() (gas: 32756) -EVM2EVMOnRamp_linkAvailableForPayment:test_LinkAvailableForPayment_Success() (gas: 135247) -EVM2EVMOnRamp_payNops:test_AdminPayNops_Success() (gas: 143660) -EVM2EVMOnRamp_payNops:test_InsufficientBalance_Revert() (gas: 29196) -EVM2EVMOnRamp_payNops:test_NoFeesToPay_Revert() (gas: 127718) -EVM2EVMOnRamp_payNops:test_NoNopsToPay_Revert() (gas: 133580) -EVM2EVMOnRamp_payNops:test_NopPayNops_Success() (gas: 146947) -EVM2EVMOnRamp_payNops:test_OwnerPayNops_Success() (gas: 141522) -EVM2EVMOnRamp_payNops:test_PayNopsSuccessAfterSetNops() (gas: 298719) -EVM2EVMOnRamp_payNops:test_WrongPermissions_Revert() (gas: 15378) -EVM2EVMOnRamp_setDynamicConfig:test_SetConfigInvalidConfig_Revert() (gas: 42524) -EVM2EVMOnRamp_setDynamicConfig:test_SetConfigOnlyOwner_Revert() (gas: 21426) -EVM2EVMOnRamp_setDynamicConfig:test_SetDynamicConfig_Success() (gas: 54301) -EVM2EVMOnRamp_setFeeTokenConfig:test_OnlyCallableByOwnerOrAdmin_Revert() (gas: 13530) -EVM2EVMOnRamp_setFeeTokenConfig:test_SetFeeTokenConfigByAdmin_Success() (gas: 16497) -EVM2EVMOnRamp_setFeeTokenConfig:test_SetFeeTokenConfig_Success() (gas: 14036) -EVM2EVMOnRamp_setNops:test_AdminCanSetNops_Success() (gas: 61872) -EVM2EVMOnRamp_setNops:test_IncludesPayment_Success() (gas: 470835) -EVM2EVMOnRamp_setNops:test_LinkTokenCannotBeNop_Revert() (gas: 57370) -EVM2EVMOnRamp_setNops:test_NonOwnerOrAdmin_Revert() (gas: 14779) -EVM2EVMOnRamp_setNops:test_NotEnoughFundsForPayout_Revert() (gas: 85200) -EVM2EVMOnRamp_setNops:test_SetNopsRemovesOldNopsCompletely_Success() (gas: 60868) -EVM2EVMOnRamp_setNops:test_SetNops_Success() (gas: 174097) -EVM2EVMOnRamp_setNops:test_TooManyNops_Revert() (gas: 193503) -EVM2EVMOnRamp_setNops:test_ZeroAddressCannotBeNop_Revert() (gas: 53711) -EVM2EVMOnRamp_setTokenTransferFeeConfig:test__setTokenTransferFeeConfig_InvalidDestBytesOverhead_Revert() (gas: 14616) -EVM2EVMOnRamp_setTokenTransferFeeConfig:test__setTokenTransferFeeConfig_OnlyCallableByOwnerOrAdmin_Revert() (gas: 14427) -EVM2EVMOnRamp_setTokenTransferFeeConfig:test__setTokenTransferFeeConfig_Success() (gas: 85487) -EVM2EVMOnRamp_setTokenTransferFeeConfig:test__setTokenTransferFeeConfig_byAdmin_Success() (gas: 17468) -EVM2EVMOnRamp_withdrawNonLinkFees:test_LinkBalanceNotSettled_Revert() (gas: 83617) -EVM2EVMOnRamp_withdrawNonLinkFees:test_NonOwnerOrAdmin_Revert() (gas: 15353) -EVM2EVMOnRamp_withdrawNonLinkFees:test_SettlingBalance_Success() (gas: 272851) -EVM2EVMOnRamp_withdrawNonLinkFees:test_WithdrawNonLinkFees_Success() (gas: 53566) -EVM2EVMOnRamp_withdrawNonLinkFees:test_WithdrawToZeroAddress_Revert() (gas: 12875) -EtherSenderReceiverTest_ccipReceive:test_ccipReceive_fallbackToWethTransfer() (gas: 96907) -EtherSenderReceiverTest_ccipReceive:test_ccipReceive_happyPath() (gas: 49775) -EtherSenderReceiverTest_ccipReceive:test_ccipReceive_wrongToken() (gas: 17435) -EtherSenderReceiverTest_ccipReceive:test_ccipReceive_wrongTokenAmount() (gas: 15728) -EtherSenderReceiverTest_ccipSend:test_ccipSend_reverts_insufficientFee_feeToken() (gas: 99909) -EtherSenderReceiverTest_ccipSend:test_ccipSend_reverts_insufficientFee_native() (gas: 76138) -EtherSenderReceiverTest_ccipSend:test_ccipSend_reverts_insufficientFee_weth() (gas: 99931) -EtherSenderReceiverTest_ccipSend:test_ccipSend_success_feeToken() (gas: 145010) -EtherSenderReceiverTest_ccipSend:test_ccipSend_success_native() (gas: 80373) -EtherSenderReceiverTest_ccipSend:test_ccipSend_success_nativeExcess() (gas: 80560) -EtherSenderReceiverTest_ccipSend:test_ccipSend_success_weth() (gas: 96064) -EtherSenderReceiverTest_constructor:test_constructor() (gas: 17553) -EtherSenderReceiverTest_getFee:test_getFee() (gas: 27346) -EtherSenderReceiverTest_validateFeeToken:test_validateFeeToken_reverts_feeToken_tokenAmountNotEqualToMsgValue() (gas: 20375) -EtherSenderReceiverTest_validateFeeToken:test_validateFeeToken_valid_feeToken() (gas: 16724) -EtherSenderReceiverTest_validateFeeToken:test_validateFeeToken_valid_native() (gas: 16657) -EtherSenderReceiverTest_validatedMessage:test_validatedMessage_dataOverwrittenToMsgSender() (gas: 25457) -EtherSenderReceiverTest_validatedMessage:test_validatedMessage_emptyDataOverwrittenToMsgSender() (gas: 25307) -EtherSenderReceiverTest_validatedMessage:test_validatedMessage_invalidTokenAmounts() (gas: 17925) -EtherSenderReceiverTest_validatedMessage:test_validatedMessage_tokenOverwrittenToWeth() (gas: 25329) -EtherSenderReceiverTest_validatedMessage:test_validatedMessage_validMessage_extraArgs() (gas: 26370) -FactoryBurnMintERC20approve:testApproveSuccess() (gas: 55767) -FactoryBurnMintERC20approve:testInvalidAddressReverts() (gas: 10709) -FactoryBurnMintERC20burn:testBasicBurnSuccess() (gas: 172380) -FactoryBurnMintERC20burn:testBurnFromZeroAddressReverts() (gas: 47384) -FactoryBurnMintERC20burn:testExceedsBalanceReverts() (gas: 21962) -FactoryBurnMintERC20burn:testSenderNotBurnerReverts() (gas: 13491) -FactoryBurnMintERC20burnFrom:testBurnFromSuccess() (gas: 58212) -FactoryBurnMintERC20burnFrom:testExceedsBalanceReverts() (gas: 36130) -FactoryBurnMintERC20burnFrom:testInsufficientAllowanceReverts() (gas: 22054) -FactoryBurnMintERC20burnFrom:testSenderNotBurnerReverts() (gas: 13491) -FactoryBurnMintERC20burnFromAlias:testBurnFromSuccess() (gas: 58187) -FactoryBurnMintERC20burnFromAlias:testExceedsBalanceReverts() (gas: 36094) -FactoryBurnMintERC20burnFromAlias:testInsufficientAllowanceReverts() (gas: 22009) -FactoryBurnMintERC20burnFromAlias:testSenderNotBurnerReverts() (gas: 13446) -FactoryBurnMintERC20constructor:testConstructorSuccess() (gas: 1495459) -FactoryBurnMintERC20decreaseApproval:testDecreaseApprovalSuccess() (gas: 31323) -FactoryBurnMintERC20grantMintAndBurnRoles:testGrantMintAndBurnRolesSuccess() (gas: 121439) -FactoryBurnMintERC20grantRole:testGrantBurnAccessSuccess() (gas: 53612) -FactoryBurnMintERC20grantRole:testGrantManySuccess() (gas: 963184) -FactoryBurnMintERC20grantRole:testGrantMintAccessSuccess() (gas: 94434) -FactoryBurnMintERC20increaseApproval:testIncreaseApprovalSuccess() (gas: 44368) -FactoryBurnMintERC20mint:testBasicMintSuccess() (gas: 149987) -FactoryBurnMintERC20mint:testMaxSupplyExceededReverts() (gas: 50703) -FactoryBurnMintERC20mint:testSenderNotMinterReverts() (gas: 11328) -FactoryBurnMintERC20supportsInterface:testConstructorSuccess() (gas: 11345) -FactoryBurnMintERC20transfer:testInvalidAddressReverts() (gas: 10707) -FactoryBurnMintERC20transfer:testTransferSuccess() (gas: 42427) -FeeQuoter_applyDestChainConfigUpdates:test_InvalidChainFamilySelector_Revert() (gas: 16686) -FeeQuoter_applyDestChainConfigUpdates:test_InvalidDestChainConfigDestChainSelectorEqZero_Revert() (gas: 16588) -FeeQuoter_applyDestChainConfigUpdates:test_applyDestChainConfigUpdatesDefaultTxGasLimitEqZero_Revert() (gas: 16630) -FeeQuoter_applyDestChainConfigUpdates:test_applyDestChainConfigUpdatesDefaultTxGasLimitGtMaxPerMessageGasLimit_Revert() (gas: 40326) -FeeQuoter_applyDestChainConfigUpdates:test_applyDestChainConfigUpdatesZeroIntput_Success() (gas: 12483) -FeeQuoter_applyDestChainConfigUpdates:test_applyDestChainConfigUpdates_Success() (gas: 137553) -FeeQuoter_applyFeeTokensUpdates:test_ApplyFeeTokensUpdates_Success() (gas: 80348) -FeeQuoter_applyFeeTokensUpdates:test_OnlyCallableByOwner_Revert() (gas: 12687) -FeeQuoter_applyPremiumMultiplierWeiPerEthUpdates:test_OnlyCallableByOwnerOrAdmin_Revert() (gas: 11547) -FeeQuoter_applyPremiumMultiplierWeiPerEthUpdates:test_applyPremiumMultiplierWeiPerEthUpdatesMultipleTokens_Success() (gas: 54684) -FeeQuoter_applyPremiumMultiplierWeiPerEthUpdates:test_applyPremiumMultiplierWeiPerEthUpdatesSingleToken_Success() (gas: 45130) -FeeQuoter_applyPremiumMultiplierWeiPerEthUpdates:test_applyPremiumMultiplierWeiPerEthUpdatesZeroInput() (gas: 12332) -FeeQuoter_applyTokenTransferFeeConfigUpdates:test_ApplyTokenTransferFeeConfig_Success() (gas: 87721) -FeeQuoter_applyTokenTransferFeeConfigUpdates:test_ApplyTokenTransferFeeZeroInput() (gas: 13233) -FeeQuoter_applyTokenTransferFeeConfigUpdates:test_InvalidDestBytesOverhead_Revert() (gas: 17278) -FeeQuoter_applyTokenTransferFeeConfigUpdates:test_OnlyCallableByOwnerOrAdmin_Revert() (gas: 12330) -FeeQuoter_constructor:test_InvalidLinkTokenEqZeroAddress_Revert() (gas: 106501) -FeeQuoter_constructor:test_InvalidMaxFeeJuelsPerMsg_Revert() (gas: 110851) -FeeQuoter_constructor:test_InvalidStalenessThreshold_Revert() (gas: 110904) -FeeQuoter_constructor:test_Setup_Success() (gas: 4972944) -FeeQuoter_convertTokenAmount:test_ConvertTokenAmount_Success() (gas: 68383) -FeeQuoter_convertTokenAmount:test_LinkTokenNotSupported_Revert() (gas: 29076) -FeeQuoter_getDataAvailabilityCost:test_EmptyMessageCalculatesDataAvailabilityCost_Success() (gas: 94781) -FeeQuoter_getDataAvailabilityCost:test_SimpleMessageCalculatesDataAvailabilityCostUnsupportedDestChainSelector_Success() (gas: 14670) -FeeQuoter_getDataAvailabilityCost:test_SimpleMessageCalculatesDataAvailabilityCost_Success() (gas: 20550) -FeeQuoter_getTokenAndGasPrices:test_GetFeeTokenAndGasPrices_Success() (gas: 68298) -FeeQuoter_getTokenAndGasPrices:test_StaleGasPrice_Revert() (gas: 16892) -FeeQuoter_getTokenAndGasPrices:test_UnsupportedChain_Revert() (gas: 16188) -FeeQuoter_getTokenAndGasPrices:test_ZeroGasPrice_Success() (gas: 43667) -FeeQuoter_getTokenPrice:test_GetTokenPriceFromFeed_Success() (gas: 66273) -FeeQuoter_getTokenPrices:test_GetTokenPrices_Success() (gas: 78322) -FeeQuoter_getTokenTransferCost:test_CustomTokenBpsFee_Success() (gas: 39244) -FeeQuoter_getTokenTransferCost:test_FeeTokenBpsFee_Success() (gas: 34880) -FeeQuoter_getTokenTransferCost:test_LargeTokenTransferChargesMaxFeeAndGas_Success() (gas: 27954) -FeeQuoter_getTokenTransferCost:test_MixedTokenTransferFee_Success() (gas: 97513) -FeeQuoter_getTokenTransferCost:test_NoTokenTransferChargesZeroFee_Success() (gas: 20468) -FeeQuoter_getTokenTransferCost:test_SmallTokenTransferChargesMinFeeAndGas_Success() (gas: 27829) -FeeQuoter_getTokenTransferCost:test_ZeroAmountTokenTransferChargesMinFeeAndGas_Success() (gas: 27785) -FeeQuoter_getTokenTransferCost:test_ZeroFeeConfigChargesMinFee_Success() (gas: 40376) -FeeQuoter_getTokenTransferCost:test_getTokenTransferCost_selfServeUsesDefaults_Success() (gas: 29503) -FeeQuoter_getValidatedFee:test_DestinationChainNotEnabled_Revert() (gas: 18315) -FeeQuoter_getValidatedFee:test_EmptyMessage_Success() (gas: 82344) -FeeQuoter_getValidatedFee:test_EnforceOutOfOrder_Revert() (gas: 52638) -FeeQuoter_getValidatedFee:test_HighGasMessage_Success() (gas: 238762) -FeeQuoter_getValidatedFee:test_InvalidEVMAddress_Revert() (gas: 22555) -FeeQuoter_getValidatedFee:test_MessageGasLimitTooHigh_Revert() (gas: 29847) -FeeQuoter_getValidatedFee:test_MessageTooLarge_Revert() (gas: 100292) -FeeQuoter_getValidatedFee:test_MessageWithDataAndTokenTransfer_Success() (gas: 141892) -FeeQuoter_getValidatedFee:test_NotAFeeToken_Revert() (gas: 21172) -FeeQuoter_getValidatedFee:test_SingleTokenMessage_Success() (gas: 113309) -FeeQuoter_getValidatedFee:test_TooManyTokens_Revert() (gas: 22691) -FeeQuoter_getValidatedFee:test_ZeroDataAvailabilityMultiplier_Success() (gas: 62714) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedErc20Above18Decimals_Success() (gas: 1973707) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedErc20Below18Decimals_Success() (gas: 1973665) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFeedAt0Decimals_Success() (gas: 1953784) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFeedAt18Decimals_Success() (gas: 1973439) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFlippedDecimals_Success() (gas: 1973643) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedMaxInt224Value_Success() (gas: 1973455) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedOverStalenessPeriod_Success() (gas: 64610) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeed_Success() (gas: 64490) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPrice_Success() (gas: 58894) -FeeQuoter_getValidatedTokenPrice:test_OverflowFeedPrice_Revert() (gas: 1973152) -FeeQuoter_getValidatedTokenPrice:test_StaleFeeToken_Success() (gas: 61764) -FeeQuoter_getValidatedTokenPrice:test_TokenNotSupportedFeed_Revert() (gas: 116495) -FeeQuoter_getValidatedTokenPrice:test_TokenNotSupported_Revert() (gas: 14037) -FeeQuoter_getValidatedTokenPrice:test_UnderflowFeedPrice_Revert() (gas: 1971829) -FeeQuoter_onReport:test_OnReport_StaleUpdate_Revert() (gas: 43631) -FeeQuoter_onReport:test_onReport_InvalidForwarder_Reverts() (gas: 23492) -FeeQuoter_onReport:test_onReport_Success() (gas: 80094) -FeeQuoter_onReport:test_onReport_UnsupportedToken_Reverts() (gas: 26860) -FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsDefault_Success() (gas: 17284) -FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsEnforceOutOfOrder_Revert() (gas: 21428) -FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsGasLimitTooHigh_Revert() (gas: 18516) -FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsInvalidExtraArgsTag_Revert() (gas: 18034) -FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsV1_Success() (gas: 18390) -FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsV2_Success() (gas: 18512) -FeeQuoter_processMessageArgs:test_processMessageArgs_InvalidEVMAddressDestToken_Revert() (gas: 44703) -FeeQuoter_processMessageArgs:test_processMessageArgs_InvalidExtraArgs_Revert() (gas: 19914) -FeeQuoter_processMessageArgs:test_processMessageArgs_MalformedEVMExtraArgs_Revert() (gas: 20333) -FeeQuoter_processMessageArgs:test_processMessageArgs_MessageFeeTooHigh_Revert() (gas: 17904) -FeeQuoter_processMessageArgs:test_processMessageArgs_SourceTokenDataTooLarge_Revert() (gas: 122709) -FeeQuoter_processMessageArgs:test_processMessageArgs_TokenAmountArraysMismatching_Revert() (gas: 42032) -FeeQuoter_processMessageArgs:test_processMessageArgs_WitEVMExtraArgsV2_Success() (gas: 28518) -FeeQuoter_processMessageArgs:test_processMessageArgs_WithConvertedTokenAmount_Success() (gas: 29949) -FeeQuoter_processMessageArgs:test_processMessageArgs_WithCorrectPoolReturnData_Success() (gas: 76145) -FeeQuoter_processMessageArgs:test_processMessageArgs_WithEVMExtraArgsV1_Success() (gas: 28116) -FeeQuoter_processMessageArgs:test_processMessageArgs_WithEmptyEVMExtraArgs_Success() (gas: 25987) -FeeQuoter_processMessageArgs:test_processMessageArgs_WithLinkTokenAmount_Success() (gas: 19523) -FeeQuoter_updatePrices:test_OnlyCallableByUpdater_Revert() (gas: 12176) -FeeQuoter_updatePrices:test_OnlyGasPrice_Success() (gas: 23730) -FeeQuoter_updatePrices:test_OnlyTokenPrice_Success() (gas: 28505) -FeeQuoter_updatePrices:test_UpdatableByAuthorizedCaller_Success() (gas: 74598) -FeeQuoter_updatePrices:test_UpdateMultiplePrices_Success() (gas: 145320) -FeeQuoter_updateTokenPriceFeeds:test_FeedNotUpdated() (gas: 50875) -FeeQuoter_updateTokenPriceFeeds:test_FeedUnset_Success() (gas: 63847) -FeeQuoter_updateTokenPriceFeeds:test_FeedUpdatedByNonOwner_Revert() (gas: 20142) -FeeQuoter_updateTokenPriceFeeds:test_MultipleFeedUpdate_Success() (gas: 89470) -FeeQuoter_updateTokenPriceFeeds:test_SingleFeedUpdate_Success() (gas: 51121) -FeeQuoter_updateTokenPriceFeeds:test_ZeroFeeds_Success() (gas: 12437) -FeeQuoter_validateDestFamilyAddress:test_InvalidEVMAddressEncodePacked_Revert() (gas: 10655) -FeeQuoter_validateDestFamilyAddress:test_InvalidEVMAddressPrecompiles_Revert() (gas: 4001603) -FeeQuoter_validateDestFamilyAddress:test_InvalidEVMAddress_Revert() (gas: 10839) -FeeQuoter_validateDestFamilyAddress:test_ValidEVMAddress_Success() (gas: 6731) -FeeQuoter_validateDestFamilyAddress:test_ValidNonEVMAddress_Success() (gas: 6511) -HybridUSDCTokenPoolMigrationTests:test_LockOrBurn_LockReleaseMechanism_then_switchToPrimary_Success() (gas: 209248) -HybridUSDCTokenPoolMigrationTests:test_LockOrBurn_PrimaryMechanism_Success() (gas: 135879) -HybridUSDCTokenPoolMigrationTests:test_LockOrBurn_WhileMigrationPause_Revert() (gas: 107090) -HybridUSDCTokenPoolMigrationTests:test_LockOrBurn_onLockReleaseMechanism_Success() (gas: 144586) -HybridUSDCTokenPoolMigrationTests:test_MintOrRelease_OnLockReleaseMechanism_Success() (gas: 214817) -HybridUSDCTokenPoolMigrationTests:test_MintOrRelease_OnLockReleaseMechanism_then_switchToPrimary_Success() (gas: 423641) -HybridUSDCTokenPoolMigrationTests:test_MintOrRelease_incomingMessageWithPrimaryMechanism() (gas: 268928) -HybridUSDCTokenPoolMigrationTests:test_ReleaseOrMint_WhileMigrationPause_Revert() (gas: 111484) -HybridUSDCTokenPoolMigrationTests:test_burnLockedUSDC_invalidPermissions_Revert() (gas: 39362) -HybridUSDCTokenPoolMigrationTests:test_cancelExistingCCTPMigrationProposal() (gas: 33189) -HybridUSDCTokenPoolMigrationTests:test_cannotCancelANonExistentMigrationProposal() (gas: 12669) -HybridUSDCTokenPoolMigrationTests:test_cannotModifyLiquidityWithoutPermissions_Revert() (gas: 13329) -HybridUSDCTokenPoolMigrationTests:test_cannotTransferLiquidityDuringPendingMigration_Revert() (gas: 160900) -HybridUSDCTokenPoolMigrationTests:test_lockOrBurn_then_BurnInCCTPMigration_Success() (gas: 255982) -HybridUSDCTokenPoolMigrationTests:test_transferLiquidity_Success() (gas: 165921) -HybridUSDCTokenPoolMigrationTests:test_unstickManualTxAfterMigration_destChain_Success() (gas: 154242) -HybridUSDCTokenPoolMigrationTests:test_unstickManualTxAfterMigration_homeChain_Success() (gas: 463740) -HybridUSDCTokenPoolTests:test_LockOrBurn_LockReleaseMechanism_then_switchToPrimary_Success() (gas: 209230) -HybridUSDCTokenPoolTests:test_LockOrBurn_PrimaryMechanism_Success() (gas: 135880) -HybridUSDCTokenPoolTests:test_LockOrBurn_WhileMigrationPause_Revert() (gas: 107135) -HybridUSDCTokenPoolTests:test_LockOrBurn_onLockReleaseMechanism_Success() (gas: 144607) -HybridUSDCTokenPoolTests:test_MintOrRelease_OnLockReleaseMechanism_Success() (gas: 214795) -HybridUSDCTokenPoolTests:test_MintOrRelease_OnLockReleaseMechanism_then_switchToPrimary_Success() (gas: 423619) -HybridUSDCTokenPoolTests:test_MintOrRelease_incomingMessageWithPrimaryMechanism() (gas: 268910) -HybridUSDCTokenPoolTests:test_ReleaseOrMint_WhileMigrationPause_Revert() (gas: 111528) -HybridUSDCTokenPoolTests:test_cannotTransferLiquidityDuringPendingMigration_Revert() (gas: 160845) -HybridUSDCTokenPoolTests:test_transferLiquidity_Success() (gas: 165904) -LockReleaseTokenPoolAndProxy_setRebalancer:test_SetRebalancer_Revert() (gas: 10989) -LockReleaseTokenPoolAndProxy_setRebalancer:test_SetRebalancer_Success() (gas: 18028) -LockReleaseTokenPoolPoolAndProxy_canAcceptLiquidity:test_CanAcceptLiquidity_Success() (gas: 3051552) -LockReleaseTokenPoolPoolAndProxy_provideLiquidity:test_LiquidityNotAccepted_Revert() (gas: 3047988) -LockReleaseTokenPoolPoolAndProxy_provideLiquidity:test_Unauthorized_Revert() (gas: 11489) -LockReleaseTokenPoolPoolAndProxy_supportsInterface:test_SupportsInterface_Success() (gas: 10196) -LockReleaseTokenPoolPoolAndProxy_withdrawalLiquidity:test_InsufficientLiquidity_Revert() (gas: 60187) -LockReleaseTokenPoolPoolAndProxy_withdrawalLiquidity:test_Unauthorized_Revert() (gas: 11464) -LockReleaseTokenPool_canAcceptLiquidity:test_CanAcceptLiquidity_Success() (gas: 2836138) -LockReleaseTokenPool_lockOrBurn:test_LockOrBurnWithAllowList_Revert() (gas: 30062) -LockReleaseTokenPool_lockOrBurn:test_LockOrBurnWithAllowList_Success() (gas: 79943) -LockReleaseTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 59620) -LockReleaseTokenPool_provideLiquidity:test_LiquidityNotAccepted_Revert() (gas: 2832618) -LockReleaseTokenPool_provideLiquidity:test_Unauthorized_Revert() (gas: 11489) -LockReleaseTokenPool_releaseOrMint:test_ChainNotAllowed_Revert() (gas: 72743) -LockReleaseTokenPool_releaseOrMint:test_PoolMintNotHealthy_Revert() (gas: 56352) -LockReleaseTokenPool_releaseOrMint:test_ReleaseOrMint_Success() (gas: 225548) -LockReleaseTokenPool_setRebalancer:test_SetRebalancer_Revert() (gas: 11011) -LockReleaseTokenPool_setRebalancer:test_SetRebalancer_Success() (gas: 18094) -LockReleaseTokenPool_supportsInterface:test_SupportsInterface_Success() (gas: 10196) -LockReleaseTokenPool_transferLiquidity:test_transferLiquidity_Success() (gas: 83231) -LockReleaseTokenPool_transferLiquidity:test_transferLiquidity_transferTooMuch_Revert() (gas: 55953) -LockReleaseTokenPool_withdrawalLiquidity:test_InsufficientLiquidity_Revert() (gas: 60187) -LockReleaseTokenPool_withdrawalLiquidity:test_Unauthorized_Revert() (gas: 11464) -LockRelease_setRateLimitAdmin:test_SetRateLimitAdmin_Revert() (gas: 11054) -LockRelease_setRateLimitAdmin:test_SetRateLimitAdmin_Success() (gas: 35060) -MerkleMultiProofTest:test_CVE_2023_34459() (gas: 5478) -MerkleMultiProofTest:test_EmptyLeaf_Revert() (gas: 3585) -MerkleMultiProofTest:test_MerkleRoot256() (gas: 394891) -MerkleMultiProofTest:test_MerkleRootSingleLeaf_Success() (gas: 3661) -MerkleMultiProofTest:test_SpecSync_gas() (gas: 34129) -MockRouterTest:test_ccipSendWithInsufficientNativeTokens_Revert() (gas: 34037) -MockRouterTest:test_ccipSendWithInvalidMsgValue_Revert() (gas: 60842) -MockRouterTest:test_ccipSendWithLinkFeeTokenAndValidMsgValue_Success() (gas: 126576) -MockRouterTest:test_ccipSendWithLinkFeeTokenbutInsufficientAllowance_Revert() (gas: 63455) -MockRouterTest:test_ccipSendWithSufficientNativeFeeTokens_Success() (gas: 44012) -MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_MultipleConfigsBothLanes_Success() (gas: 133528) -MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_MultipleConfigs_Success() (gas: 315630) -MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_OnlyCallableByOwner_Revert() (gas: 17864) -MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_SingleConfigOutbound_Success() (gas: 76453) -MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_SingleConfig_Success() (gas: 76369) -MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_UpdateExistingConfigWithNoDifference_Success() (gas: 38736) -MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_UpdateExistingConfig_Success() (gas: 53869) -MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_ZeroChainSelector_Revert() (gas: 17109) -MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_ZeroConfigs_Success() (gas: 12436) -MultiAggregateRateLimiter_constructor:test_ConstructorNoAuthorizedCallers_Success() (gas: 1958738) -MultiAggregateRateLimiter_constructor:test_Constructor_Success() (gas: 2075046) -MultiAggregateRateLimiter_getTokenBucket:test_GetTokenBucket_Success() (gas: 30794) -MultiAggregateRateLimiter_getTokenBucket:test_Refill_Success() (gas: 48099) -MultiAggregateRateLimiter_getTokenBucket:test_TimeUnderflow_Revert() (gas: 15929) -MultiAggregateRateLimiter_getTokenValue:test_GetTokenValue_Success() (gas: 17525) -MultiAggregateRateLimiter_getTokenValue:test_NoTokenPrice_Reverts() (gas: 21408) -MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageFromUnauthorizedCaller_Revert() (gas: 14617) -MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithDifferentTokensOnDifferentChains_Success() (gas: 210107) -MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithDisabledRateLimitToken_Success() (gas: 58416) -MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithNoTokens_Success() (gas: 17743) -MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithRateLimitDisabled_Success() (gas: 45162) -MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithRateLimitExceeded_Revert() (gas: 46370) -MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithRateLimitReset_Success() (gas: 76561) -MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithTokensOnDifferentChains_Success() (gas: 308233) -MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithTokens_Success() (gas: 50558) -MultiAggregateRateLimiter_onOutboundMessage:test_RateLimitValueDifferentLanes_Success() (gas: 1073669578) -MultiAggregateRateLimiter_onOutboundMessage:test_ValidateMessageWithNoTokens_Success() (gas: 19302) -MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageFromUnauthorizedCaller_Revert() (gas: 15913) -MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithDifferentTokensOnDifferentChains_Success() (gas: 209885) -MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithDisabledRateLimitToken_Success() (gas: 60182) -MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithRateLimitDisabled_Success() (gas: 46935) -MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithRateLimitExceeded_Revert() (gas: 48179) -MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithRateLimitReset_Success() (gas: 77728) -MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithTokensOnDifferentChains_Success() (gas: 308237) -MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithTokens_Success() (gas: 52346) -MultiAggregateRateLimiter_setFeeQuoter:test_OnlyOwner_Revert() (gas: 11337) -MultiAggregateRateLimiter_setFeeQuoter:test_Owner_Success() (gas: 19090) -MultiAggregateRateLimiter_setFeeQuoter:test_ZeroAddress_Revert() (gas: 10609) -MultiAggregateRateLimiter_updateRateLimitTokens:test_NonOwner_Revert() (gas: 18878) -MultiAggregateRateLimiter_updateRateLimitTokens:test_UpdateRateLimitTokensMultipleChains_Success() (gas: 280256) -MultiAggregateRateLimiter_updateRateLimitTokens:test_UpdateRateLimitTokensSingleChain_Success() (gas: 254729) -MultiAggregateRateLimiter_updateRateLimitTokens:test_UpdateRateLimitTokens_AddsAndRemoves_Success() (gas: 204595) -MultiAggregateRateLimiter_updateRateLimitTokens:test_UpdateRateLimitTokens_RemoveNonExistentToken_Success() (gas: 28826) -MultiAggregateRateLimiter_updateRateLimitTokens:test_ZeroDestToken_Revert() (gas: 18324) -MultiAggregateRateLimiter_updateRateLimitTokens:test_ZeroSourceToken_Revert() (gas: 18253) -MultiOCR3Base_setOCR3Configs:test_FMustBePositive_Revert() (gas: 59397) -MultiOCR3Base_setOCR3Configs:test_FTooHigh_Revert() (gas: 44190) -MultiOCR3Base_setOCR3Configs:test_MoreTransmittersThanSigners_Revert() (gas: 104822) -MultiOCR3Base_setOCR3Configs:test_NoTransmitters_Revert() (gas: 18886) -MultiOCR3Base_setOCR3Configs:test_RepeatSignerAddress_Revert() (gas: 283736) -MultiOCR3Base_setOCR3Configs:test_RepeatTransmitterAddress_Revert() (gas: 422361) -MultiOCR3Base_setOCR3Configs:test_SetConfigIgnoreSigners_Success() (gas: 511918) -MultiOCR3Base_setOCR3Configs:test_SetConfigWithSignersMismatchingTransmitters_Success() (gas: 680323) -MultiOCR3Base_setOCR3Configs:test_SetConfigWithSigners_Success() (gas: 828900) -MultiOCR3Base_setOCR3Configs:test_SetConfigWithoutSigners_Success() (gas: 457292) -MultiOCR3Base_setOCR3Configs:test_SetConfigsZeroInput_Success() (gas: 12481) -MultiOCR3Base_setOCR3Configs:test_SetMultipleConfigs_Success() (gas: 2141722) -MultiOCR3Base_setOCR3Configs:test_SignerCannotBeZeroAddress_Revert() (gas: 141835) -MultiOCR3Base_setOCR3Configs:test_StaticConfigChange_Revert() (gas: 807623) -MultiOCR3Base_setOCR3Configs:test_TooManySigners_Revert() (gas: 158867) -MultiOCR3Base_setOCR3Configs:test_TooManyTransmitters_Revert() (gas: 112335) -MultiOCR3Base_setOCR3Configs:test_TransmitterCannotBeZeroAddress_Revert() (gas: 254201) -MultiOCR3Base_setOCR3Configs:test_UpdateConfigSigners_Success() (gas: 861206) -MultiOCR3Base_setOCR3Configs:test_UpdateConfigTransmittersWithoutSigners_Success() (gas: 475852) -MultiOCR3Base_transmit:test_ConfigDigestMismatch_Revert() (gas: 42956) -MultiOCR3Base_transmit:test_ForkedChain_Revert() (gas: 48639) -MultiOCR3Base_transmit:test_InsufficientSignatures_Revert() (gas: 77138) -MultiOCR3Base_transmit:test_NonUniqueSignature_Revert() (gas: 65912) -MultiOCR3Base_transmit:test_SignatureOutOfRegistration_Revert() (gas: 33495) -MultiOCR3Base_transmit:test_TooManySignatures_Revert() (gas: 79795) -MultiOCR3Base_transmit:test_TransmitSigners_gas_Success() (gas: 33664) -MultiOCR3Base_transmit:test_TransmitWithExtraCalldataArgs_Revert() (gas: 47200) -MultiOCR3Base_transmit:test_TransmitWithLessCalldataArgs_Revert() (gas: 25768) -MultiOCR3Base_transmit:test_TransmitWithoutSignatureVerification_gas_Success() (gas: 18745) -MultiOCR3Base_transmit:test_UnAuthorizedTransmitter_Revert() (gas: 24234) -MultiOCR3Base_transmit:test_UnauthorizedSigner_Revert() (gas: 61275) -MultiOCR3Base_transmit:test_UnconfiguredPlugin_Revert() (gas: 39933) -MultiOCR3Base_transmit:test_ZeroSignatures_Revert() (gas: 33049) -MultiOnRampTokenPoolReentrancy:test_OnRampTokenPoolReentrancy_Success() (gas: 233701) -MultiRampsE2E:test_E2E_3MessagesMMultiOffRampSuccess_gas() (gas: 1501791) -NonceManager_NonceIncrementation:test_getIncrementedOutboundNonce_Success() (gas: 37934) -NonceManager_NonceIncrementation:test_incrementInboundNonce_Skip() (gas: 23706) -NonceManager_NonceIncrementation:test_incrementInboundNonce_Success() (gas: 38778) -NonceManager_NonceIncrementation:test_incrementNoncesInboundAndOutbound_Success() (gas: 71901) -NonceManager_OffRampUpgrade:test_NoPrevOffRampForChain_Success() (gas: 262171) -NonceManager_OffRampUpgrade:test_UpgradedNonceNewSenderStartsAtZero_Success() (gas: 265848) -NonceManager_OffRampUpgrade:test_UpgradedNonceStartsAtV1Nonce_Success() (gas: 329848) -NonceManager_OffRampUpgrade:test_UpgradedOffRampNonceSkipsIfMsgInFlight_Success() (gas: 300818) -NonceManager_OffRampUpgrade:test_UpgradedSenderNoncesReadsPreviousRampTransitive_Success() (gas: 249120) -NonceManager_OffRampUpgrade:test_UpgradedSenderNoncesReadsPreviousRamp_Success() (gas: 237027) -NonceManager_OffRampUpgrade:test_Upgraded_Success() (gas: 153760) -NonceManager_OnRampUpgrade:test_UpgradeNonceNewSenderStartsAtZero_Success() (gas: 169036) -NonceManager_OnRampUpgrade:test_UpgradeNonceStartsAtV1Nonce_Success() (gas: 221191) -NonceManager_OnRampUpgrade:test_UpgradeSenderNoncesReadsPreviousRamp_Success() (gas: 126745) -NonceManager_OnRampUpgrade:test_Upgrade_Success() (gas: 107755) -NonceManager_applyPreviousRampsUpdates:test_MultipleRampsUpdates() (gas: 123102) -NonceManager_applyPreviousRampsUpdates:test_PreviousRampAlreadySetOffRamp_Revert() (gas: 43079) -NonceManager_applyPreviousRampsUpdates:test_PreviousRampAlreadySetOnRampAndOffRamp_Revert() (gas: 64408) -NonceManager_applyPreviousRampsUpdates:test_PreviousRampAlreadySetOnRamp_Revert() (gas: 42943) -NonceManager_applyPreviousRampsUpdates:test_SingleRampUpdate() (gas: 66666) -NonceManager_applyPreviousRampsUpdates:test_ZeroInput() (gas: 12070) -NonceManager_typeAndVersion:test_typeAndVersion() (gas: 9705) -OCR2BaseNoChecks_setOCR2Config:test_FMustBePositive_Revert() (gas: 12210) -OCR2BaseNoChecks_setOCR2Config:test_RepeatAddress_Revert() (gas: 42431) -OCR2BaseNoChecks_setOCR2Config:test_SetConfigSuccess_gas() (gas: 84597) -OCR2BaseNoChecks_setOCR2Config:test_TooManyTransmitter_Revert() (gas: 38177) -OCR2BaseNoChecks_setOCR2Config:test_TransmitterCannotBeZeroAddress_Revert() (gas: 24308) -OCR2BaseNoChecks_transmit:test_ConfigDigestMismatch_Revert() (gas: 17499) -OCR2BaseNoChecks_transmit:test_ForkedChain_Revert() (gas: 26798) -OCR2BaseNoChecks_transmit:test_TransmitSuccess_gas() (gas: 27499) -OCR2BaseNoChecks_transmit:test_UnAuthorizedTransmitter_Revert() (gas: 21335) -OCR2Base_setOCR2Config:test_FMustBePositive_Revert() (gas: 12216) -OCR2Base_setOCR2Config:test_FTooHigh_Revert() (gas: 12372) -OCR2Base_setOCR2Config:test_OracleOutOfRegister_Revert() (gas: 14919) -OCR2Base_setOCR2Config:test_RepeatAddress_Revert() (gas: 45469) -OCR2Base_setOCR2Config:test_SetConfigSuccess_gas() (gas: 155220) -OCR2Base_setOCR2Config:test_SingerCannotBeZeroAddress_Revert() (gas: 24425) -OCR2Base_setOCR2Config:test_TooManySigners_Revert() (gas: 20535) -OCR2Base_setOCR2Config:test_TransmitterCannotBeZeroAddress_Revert() (gas: 47316) -OCR2Base_transmit:test_ConfigDigestMismatch_Revert() (gas: 19668) -OCR2Base_transmit:test_ForkedChain_Revert() (gas: 37749) -OCR2Base_transmit:test_NonUniqueSignature_Revert() (gas: 55360) -OCR2Base_transmit:test_SignatureOutOfRegistration_Revert() (gas: 20989) -OCR2Base_transmit:test_Transmit2SignersSuccess_gas() (gas: 51689) -OCR2Base_transmit:test_UnAuthorizedTransmitter_Revert() (gas: 23511) -OCR2Base_transmit:test_UnauthorizedSigner_Revert() (gas: 39707) -OCR2Base_transmit:test_WrongNumberOfSignatures_Revert() (gas: 20584) -OffRamp_afterOC3ConfigSet:test_afterOCR3ConfigSet_SignatureVerificationDisabled_Revert() (gas: 5913989) -OffRamp_applySourceChainConfigUpdates:test_AddMultipleChains_Success() (gas: 626106) -OffRamp_applySourceChainConfigUpdates:test_AddNewChain_Success() (gas: 166490) -OffRamp_applySourceChainConfigUpdates:test_ApplyZeroUpdates_Success() (gas: 16763) -OffRamp_applySourceChainConfigUpdates:test_InvalidOnRampUpdate_Revert() (gas: 272148) -OffRamp_applySourceChainConfigUpdates:test_ReplaceExistingChainOnRamp_Success() (gas: 168572) -OffRamp_applySourceChainConfigUpdates:test_ReplaceExistingChain_Success() (gas: 181027) -OffRamp_applySourceChainConfigUpdates:test_RouterAddress_Revert() (gas: 13463) -OffRamp_applySourceChainConfigUpdates:test_ZeroOnRampAddress_Revert() (gas: 72746) -OffRamp_applySourceChainConfigUpdates:test_ZeroSourceChainSelector_Revert() (gas: 15519) -OffRamp_batchExecute:test_MultipleReportsDifferentChainsSkipCursedChain_Success() (gas: 177991) -OffRamp_batchExecute:test_MultipleReportsDifferentChains_Success() (gas: 335638) -OffRamp_batchExecute:test_MultipleReportsSameChain_Success() (gas: 278904) -OffRamp_batchExecute:test_MultipleReportsSkipDuplicate_Success() (gas: 169320) -OffRamp_batchExecute:test_OutOfBoundsGasLimitsAccess_Revert() (gas: 189033) -OffRamp_batchExecute:test_SingleReport_Success() (gas: 157144) -OffRamp_batchExecute:test_Unhealthy_Success() (gas: 554256) -OffRamp_batchExecute:test_ZeroReports_Revert() (gas: 10622) -OffRamp_ccipReceive:test_Reverts() (gas: 15407) -OffRamp_commit:test_CommitOnRampMismatch_Revert() (gas: 92905) -OffRamp_commit:test_FailedRMNVerification_Reverts() (gas: 64099) -OffRamp_commit:test_InvalidIntervalMinLargerThanMax_Revert() (gas: 68173) -OffRamp_commit:test_InvalidInterval_Revert() (gas: 64291) -OffRamp_commit:test_InvalidRootRevert() (gas: 63356) -OffRamp_commit:test_NoConfigWithOtherConfigPresent_Revert() (gas: 6674717) -OffRamp_commit:test_NoConfig_Revert() (gas: 6258389) -OffRamp_commit:test_OnlyGasPriceUpdates_Success() (gas: 113042) -OffRamp_commit:test_OnlyPriceUpdateStaleReport_Revert() (gas: 121403) -OffRamp_commit:test_OnlyTokenPriceUpdates_Success() (gas: 113063) -OffRamp_commit:test_PriceSequenceNumberCleared_Success() (gas: 355198) -OffRamp_commit:test_ReportAndPriceUpdate_Success() (gas: 164400) -OffRamp_commit:test_ReportOnlyRootSuccess_gas() (gas: 139413) -OffRamp_commit:test_RootAlreadyCommitted_Revert() (gas: 146555) -OffRamp_commit:test_SourceChainNotEnabled_Revert() (gas: 59858) -OffRamp_commit:test_StaleReportWithRoot_Success() (gas: 232042) -OffRamp_commit:test_UnauthorizedTransmitter_Revert() (gas: 125409) -OffRamp_commit:test_Unhealthy_Revert() (gas: 58633) -OffRamp_commit:test_ValidPriceUpdateThenStaleReportWithRoot_Success() (gas: 206713) -OffRamp_commit:test_ZeroEpochAndRound_Revert() (gas: 51722) -OffRamp_constructor:test_Constructor_Success() (gas: 6219782) -OffRamp_constructor:test_SourceChainSelector_Revert() (gas: 135943) -OffRamp_constructor:test_ZeroChainSelector_Revert() (gas: 103375) -OffRamp_constructor:test_ZeroNonceManager_Revert() (gas: 101269) -OffRamp_constructor:test_ZeroOnRampAddress_Revert() (gas: 161468) -OffRamp_constructor:test_ZeroRMNRemote_Revert() (gas: 101189) -OffRamp_constructor:test_ZeroTokenAdminRegistry_Revert() (gas: 101227) -OffRamp_execute:test_IncorrectArrayType_Revert() (gas: 17639) -OffRamp_execute:test_LargeBatch_Success() (gas: 3426335) -OffRamp_execute:test_MultipleReportsWithPartialValidationFailures_Success() (gas: 372990) -OffRamp_execute:test_MultipleReports_Success() (gas: 300979) -OffRamp_execute:test_NoConfigWithOtherConfigPresent_Revert() (gas: 7083612) -OffRamp_execute:test_NoConfig_Revert() (gas: 6308087) -OffRamp_execute:test_NonArray_Revert() (gas: 27562) -OffRamp_execute:test_SingleReport_Success() (gas: 176354) -OffRamp_execute:test_UnauthorizedTransmitter_Revert() (gas: 148372) -OffRamp_execute:test_WrongConfigWithSigners_Revert() (gas: 7086361) -OffRamp_execute:test_ZeroReports_Revert() (gas: 17361) -OffRamp_executeSingleMessage:test_MessageSender_Revert() (gas: 18533) -OffRamp_executeSingleMessage:test_NonContractWithTokens_Success() (gas: 244079) -OffRamp_executeSingleMessage:test_NonContract_Success() (gas: 20781) -OffRamp_executeSingleMessage:test_TokenHandlingError_Revert() (gas: 205116) -OffRamp_executeSingleMessage:test_ZeroGasDONExecution_Revert() (gas: 49306) -OffRamp_executeSingleMessage:test_executeSingleMessage_NoTokens_Success() (gas: 48750) -OffRamp_executeSingleMessage:test_executeSingleMessage_WithFailingValidationNoRouterCall_Revert() (gas: 218028) -OffRamp_executeSingleMessage:test_executeSingleMessage_WithFailingValidation_Revert() (gas: 85296) -OffRamp_executeSingleMessage:test_executeSingleMessage_WithTokens_Success() (gas: 274196) -OffRamp_executeSingleMessage:test_executeSingleMessage_WithVInterception_Success() (gas: 91724) -OffRamp_executeSingleReport:test_DisabledSourceChain_Revert() (gas: 28282) -OffRamp_executeSingleReport:test_EmptyReport_Revert() (gas: 22084) -OffRamp_executeSingleReport:test_InvalidSourcePoolAddress_Success() (gas: 481794) -OffRamp_executeSingleReport:test_ManualExecutionNotYetEnabled_Revert() (gas: 48394) -OffRamp_executeSingleReport:test_MismatchingDestChainSelector_Revert() (gas: 33981) -OffRamp_executeSingleReport:test_NonExistingSourceChain_Revert() (gas: 28458) -OffRamp_executeSingleReport:test_ReceiverError_Success() (gas: 188096) -OffRamp_executeSingleReport:test_RetryFailedMessageWithoutManualExecution_Revert() (gas: 198552) -OffRamp_executeSingleReport:test_RootNotCommitted_Revert() (gas: 40763) -OffRamp_executeSingleReport:test_RouterYULCall_Revert() (gas: 413245) -OffRamp_executeSingleReport:test_SingleMessageNoTokensOtherChain_Success() (gas: 249800) -OffRamp_executeSingleReport:test_SingleMessageNoTokensUnordered_Success() (gas: 193614) -OffRamp_executeSingleReport:test_SingleMessageNoTokens_Success() (gas: 213648) -OffRamp_executeSingleReport:test_SingleMessageToNonCCIPReceiver_Success() (gas: 249550) -OffRamp_executeSingleReport:test_SingleMessagesNoTokensSuccess_gas() (gas: 142163) -OffRamp_executeSingleReport:test_SkippedIncorrectNonceStillExecutes_Success() (gas: 409313) -OffRamp_executeSingleReport:test_SkippedIncorrectNonce_Success() (gas: 58315) -OffRamp_executeSingleReport:test_TokenDataMismatch_Revert() (gas: 73890) -OffRamp_executeSingleReport:test_TwoMessagesWithTokensAndGE_Success() (gas: 583427) -OffRamp_executeSingleReport:test_TwoMessagesWithTokensSuccess_gas() (gas: 532141) -OffRamp_executeSingleReport:test_UnexpectedTokenData_Revert() (gas: 33739) -OffRamp_executeSingleReport:test_UnhealthySingleChainCurse_Revert() (gas: 549786) -OffRamp_executeSingleReport:test_Unhealthy_Success() (gas: 549800) -OffRamp_executeSingleReport:test_WithCurseOnAnotherSourceChain_Success() (gas: 460521) -OffRamp_executeSingleReport:test__execute_SkippedAlreadyExecutedMessageUnordered_Success() (gas: 135944) -OffRamp_executeSingleReport:test__execute_SkippedAlreadyExecutedMessage_Success() (gas: 165649) -OffRamp_getExecutionState:test_FillExecutionState_Success() (gas: 3885554) -OffRamp_getExecutionState:test_GetDifferentChainExecutionState_Success() (gas: 120606) -OffRamp_getExecutionState:test_GetExecutionState_Success() (gas: 89288) -OffRamp_manuallyExecute:test_ManualExecGasLimitMismatchSingleReport_Revert() (gas: 81016) -OffRamp_manuallyExecute:test_manuallyExecute_DestinationGasAmountCountMismatch_Revert() (gas: 74027) -OffRamp_manuallyExecute:test_manuallyExecute_DoesNotRevertIfUntouched_Success() (gas: 173167) -OffRamp_manuallyExecute:test_manuallyExecute_FailedTx_Revert() (gas: 214124) -OffRamp_manuallyExecute:test_manuallyExecute_ForkedChain_Revert() (gas: 27085) -OffRamp_manuallyExecute:test_manuallyExecute_GasLimitMismatchMultipleReports_Revert() (gas: 164696) -OffRamp_manuallyExecute:test_manuallyExecute_InvalidReceiverExecutionGasLimit_Revert() (gas: 27622) -OffRamp_manuallyExecute:test_manuallyExecute_InvalidTokenGasOverride_Revert() (gas: 55193) -OffRamp_manuallyExecute:test_manuallyExecute_LowGasLimit_Success() (gas: 498549) -OffRamp_manuallyExecute:test_manuallyExecute_MultipleReportsWithSingleCursedLane_Revert() (gas: 316061) -OffRamp_manuallyExecute:test_manuallyExecute_ReentrancyFails_Success() (gas: 2245222) -OffRamp_manuallyExecute:test_manuallyExecute_SourceChainSelectorMismatch_Revert() (gas: 165525) -OffRamp_manuallyExecute:test_manuallyExecute_Success() (gas: 227169) -OffRamp_manuallyExecute:test_manuallyExecute_WithGasOverride_Success() (gas: 227709) -OffRamp_manuallyExecute:test_manuallyExecute_WithMultiReportGasOverride_Success() (gas: 781365) -OffRamp_manuallyExecute:test_manuallyExecute_WithPartialMessages_Success() (gas: 347346) -OffRamp_releaseOrMintSingleToken:test__releaseOrMintSingleToken_NotACompatiblePool_Revert() (gas: 37656) -OffRamp_releaseOrMintSingleToken:test__releaseOrMintSingleToken_Success() (gas: 104404) -OffRamp_releaseOrMintSingleToken:test__releaseOrMintSingleToken_TokenHandlingError_transfer_Revert() (gas: 85342) -OffRamp_releaseOrMintSingleToken:test_releaseOrMintToken_InvalidDataLength_Revert() (gas: 36752) -OffRamp_releaseOrMintSingleToken:test_releaseOrMintToken_ReleaseOrMintBalanceMismatch_Revert() (gas: 94382) -OffRamp_releaseOrMintSingleToken:test_releaseOrMintToken_TokenHandlingError_BalanceOf_Revert() (gas: 39741) -OffRamp_releaseOrMintSingleToken:test_releaseOrMintToken_skip_ReleaseOrMintBalanceMismatch_if_pool_Revert() (gas: 86516) -OffRamp_releaseOrMintTokens:test_TokenHandlingError_Reverts() (gas: 162381) -OffRamp_releaseOrMintTokens:test__releaseOrMintTokens_PoolIsNotAPool_Reverts() (gas: 23903) -OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_InvalidDataLengthReturnData_Revert() (gas: 62751) -OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_PoolDoesNotSupportDest_Reverts() (gas: 79790) -OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_Success() (gas: 174468) -OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_WithGasOverride_Success() (gas: 176380) -OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_destDenominatedDecimals_Success() (gas: 187679) -OffRamp_setDynamicConfig:test_FeeQuoterZeroAddress_Revert() (gas: 11291) -OffRamp_setDynamicConfig:test_NonOwner_Revert() (gas: 13906) -OffRamp_setDynamicConfig:test_SetDynamicConfigWithInterceptor_Success() (gas: 46378) -OffRamp_setDynamicConfig:test_SetDynamicConfig_Success() (gas: 24420) -OffRamp_trialExecute:test_RateLimitError_Success() (gas: 219377) -OffRamp_trialExecute:test_TokenHandlingErrorIsCaught_Success() (gas: 227999) -OffRamp_trialExecute:test_TokenPoolIsNotAContract_Success() (gas: 295396) -OffRamp_trialExecute:test_trialExecute_Success() (gas: 277896) -OnRampTokenPoolReentrancy:test_OnRampTokenPoolReentrancy_Success() (gas: 390842) -OnRamp_applyAllowListUpdates:test_applyAllowListUpdates_InvalidAllowListRequestDisabledAllowListWithAdds() (gas: 18030) -OnRamp_applyAllowListUpdates:test_applyAllowListUpdates_Revert() (gas: 67426) -OnRamp_applyAllowListUpdates:test_applyAllowListUpdates_Success() (gas: 325083) -OnRamp_applyDestChainConfigUpdates:test_ApplyDestChainConfigUpdates_Success() (gas: 65095) -OnRamp_applyDestChainConfigUpdates:test_ApplyDestChainConfigUpdates_WithInvalidChainSelector_Revert() (gas: 13422) -OnRamp_constructor:test_Constructor_InvalidConfigChainSelectorEqZero_Revert() (gas: 94996) -OnRamp_constructor:test_Constructor_InvalidConfigNonceManagerEqAddressZero_Revert() (gas: 92938) -OnRamp_constructor:test_Constructor_InvalidConfigRMNProxyEqAddressZero_Revert() (gas: 97971) -OnRamp_constructor:test_Constructor_InvalidConfigTokenAdminRegistryEqAddressZero_Revert() (gas: 92972) -OnRamp_constructor:test_Constructor_Success() (gas: 2736399) -OnRamp_forwardFromRouter:test_ForwardFromRouterExtraArgsV2AllowOutOfOrderTrue_Success() (gas: 115307) -OnRamp_forwardFromRouter:test_ForwardFromRouterExtraArgsV2_Success() (gas: 146108) -OnRamp_forwardFromRouter:test_ForwardFromRouterSuccessCustomExtraArgs() (gas: 145705) -OnRamp_forwardFromRouter:test_ForwardFromRouterSuccessEmptyExtraArgs() (gas: 143866) -OnRamp_forwardFromRouter:test_ForwardFromRouterSuccessLegacyExtraArgs() (gas: 145902) -OnRamp_forwardFromRouter:test_ForwardFromRouter_Success() (gas: 145300) -OnRamp_forwardFromRouter:test_ForwardFromRouter_Success_ConfigurableSourceRouter() (gas: 145006) -OnRamp_forwardFromRouter:test_InvalidExtraArgsTag_Revert() (gas: 38554) -OnRamp_forwardFromRouter:test_MessageInterceptionError_Revert() (gas: 143051) -OnRamp_forwardFromRouter:test_MesssageFeeTooHigh_Revert() (gas: 36596) -OnRamp_forwardFromRouter:test_MultiCannotSendZeroTokens_Revert() (gas: 36527) -OnRamp_forwardFromRouter:test_OriginalSender_Revert() (gas: 18291) -OnRamp_forwardFromRouter:test_Paused_Revert() (gas: 38431) -OnRamp_forwardFromRouter:test_Permissions_Revert() (gas: 23640) -OnRamp_forwardFromRouter:test_ShouldIncrementNonceOnlyOnOrdered_Success() (gas: 186348) -OnRamp_forwardFromRouter:test_ShouldIncrementSeqNumAndNonce_Success() (gas: 212732) -OnRamp_forwardFromRouter:test_ShouldStoreLinkFees() (gas: 146934) -OnRamp_forwardFromRouter:test_ShouldStoreNonLinkFees() (gas: 161039) -OnRamp_forwardFromRouter:test_SourceTokenDataTooLarge_Revert() (gas: 3615148) -OnRamp_forwardFromRouter:test_UnAllowedOriginalSender_Revert() (gas: 24010) -OnRamp_forwardFromRouter:test_UnsupportedToken_Revert() (gas: 75866) -OnRamp_forwardFromRouter:test_forwardFromRouter_UnsupportedToken_Revert() (gas: 38599) -OnRamp_forwardFromRouter:test_forwardFromRouter_WithInterception_Success() (gas: 280170) -OnRamp_getFee:test_EmptyMessage_Success() (gas: 98513) -OnRamp_getFee:test_EnforceOutOfOrder_Revert() (gas: 64645) -OnRamp_getFee:test_GetFeeOfZeroForTokenMessage_Success() (gas: 86177) -OnRamp_getFee:test_NotAFeeTokenButPricedToken_Revert() (gas: 35097) -OnRamp_getFee:test_SingleTokenMessage_Success() (gas: 113639) -OnRamp_getFee:test_Unhealthy_Revert() (gas: 17061) -OnRamp_getSupportedTokens:test_GetSupportedTokens_Revert() (gas: 10474) -OnRamp_getTokenPool:test_GetTokenPool_Success() (gas: 35348) -OnRamp_setDynamicConfig:test_setDynamicConfig_InvalidConfigFeeAggregatorEqAddressZero_Revert() (gas: 11536) -OnRamp_setDynamicConfig:test_setDynamicConfig_InvalidConfigFeeQuoterEqAddressZero_Revert() (gas: 13195) -OnRamp_setDynamicConfig:test_setDynamicConfig_InvalidConfigInvalidConfig_Revert() (gas: 11522) -OnRamp_setDynamicConfig:test_setDynamicConfig_InvalidConfigOnlyOwner_Revert() (gas: 16850) -OnRamp_setDynamicConfig:test_setDynamicConfig_InvalidConfigReentrancyGuardEnteredEqTrue_Revert() (gas: 13265) -OnRamp_setDynamicConfig:test_setDynamicConfig_Success() (gas: 56369) -OnRamp_withdrawFeeTokens:test_WithdrawFeeTokens_Success() (gas: 97302) -PingPong_ccipReceive:test_CcipReceive_Success() (gas: 151349) -PingPong_plumbing:test_OutOfOrderExecution_Success() (gas: 20310) -PingPong_plumbing:test_Pausing_Success() (gas: 17810) -PingPong_startPingPong:test_StartPingPong_With_OOO_Success() (gas: 162091) -PingPong_startPingPong:test_StartPingPong_With_Sequenced_Ordered_Success() (gas: 181509) -RMNHome__validateStaticAndDynamicConfig:test_validateStaticAndDynamicConfig_DuplicateOffchainPublicKey_reverts() (gas: 18822) -RMNHome__validateStaticAndDynamicConfig:test_validateStaticAndDynamicConfig_DuplicatePeerId_reverts() (gas: 18682) -RMNHome__validateStaticAndDynamicConfig:test_validateStaticAndDynamicConfig_DuplicateSourceChain_reverts() (gas: 20371) -RMNHome__validateStaticAndDynamicConfig:test_validateStaticAndDynamicConfig_MinObserversTooHigh_reverts() (gas: 20810) -RMNHome__validateStaticAndDynamicConfig:test_validateStaticAndDynamicConfig_OutOfBoundsNodesLength_reverts() (gas: 137268) -RMNHome__validateStaticAndDynamicConfig:test_validateStaticAndDynamicConfig_OutOfBoundsObserverNodeIndex_reverts() (gas: 20472) -RMNHome_getConfigDigests:test_getConfigDigests_success() (gas: 1077745) -RMNHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_ConfigDigestMismatch_reverts() (gas: 23857) -RMNHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_NoOpStateTransitionNotAllowed_reverts() (gas: 10575) -RMNHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_OnlyOwner_reverts() (gas: 10936) -RMNHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_success() (gas: 1083071) -RMNHome_revokeCandidate:test_revokeCandidate_ConfigDigestMismatch_reverts() (gas: 19063) -RMNHome_revokeCandidate:test_revokeCandidate_OnlyOwner_reverts() (gas: 10963) -RMNHome_revokeCandidate:test_revokeCandidate_RevokingZeroDigestNotAllowed_reverts() (gas: 10606) -RMNHome_revokeCandidate:test_revokeCandidate_success() (gas: 28147) -RMNHome_setCandidate:test_setCandidate_ConfigDigestMismatch_reverts() (gas: 594679) -RMNHome_setCandidate:test_setCandidate_OnlyOwner_reverts() (gas: 15177) -RMNHome_setCandidate:test_setCandidate_success() (gas: 588379) -RMNHome_setDynamicConfig:test_setDynamicConfig_DigestNotFound_reverts() (gas: 30159) -RMNHome_setDynamicConfig:test_setDynamicConfig_MinObserversTooHigh_reverts() (gas: 18848) -RMNHome_setDynamicConfig:test_setDynamicConfig_OnlyOwner_reverts() (gas: 14115) -RMNHome_setDynamicConfig:test_setDynamicConfig_success() (gas: 103911) -RMNRemote_constructor:test_constructor_success() (gas: 8334) -RMNRemote_constructor:test_constructor_zeroChainSelector_reverts() (gas: 59165) -RMNRemote_curse:test_curse_AlreadyCursed_duplicateSubject_reverts() (gas: 154457) -RMNRemote_curse:test_curse_calledByNonOwner_reverts() (gas: 18780) -RMNRemote_curse:test_curse_success() (gas: 149365) -RMNRemote_global_and_legacy_curses:test_global_and_legacy_curses_success() (gas: 133464) -RMNRemote_setConfig:test_setConfig_addSigner_removeSigner_success() (gas: 976479) -RMNRemote_setConfig:test_setConfig_duplicateOnChainPublicKey_reverts() (gas: 323272) -RMNRemote_setConfig:test_setConfig_invalidSignerOrder_reverts() (gas: 80138) -RMNRemote_setConfig:test_setConfig_minSignersIs0_success() (gas: 700548) -RMNRemote_setConfig:test_setConfig_minSignersTooHigh_reverts() (gas: 54024) -RMNRemote_uncurse:test_uncurse_NotCursed_duplicatedUncurseSubject_reverts() (gas: 51912) -RMNRemote_uncurse:test_uncurse_calledByNonOwner_reverts() (gas: 18748) -RMNRemote_uncurse:test_uncurse_success() (gas: 40151) -RMNRemote_verify_withConfigNotSet:test_verify_reverts() (gas: 13650) -RMNRemote_verify_withConfigSet:test_verify_InvalidSignature_reverts() (gas: 78519) -RMNRemote_verify_withConfigSet:test_verify_OutOfOrderSignatures_duplicateSignature_reverts() (gas: 76336) -RMNRemote_verify_withConfigSet:test_verify_OutOfOrderSignatures_not_sorted_reverts() (gas: 83399) -RMNRemote_verify_withConfigSet:test_verify_ThresholdNotMet_reverts() (gas: 153002) -RMNRemote_verify_withConfigSet:test_verify_UnexpectedSigner_reverts() (gas: 387667) -RMNRemote_verify_withConfigSet:test_verify_minSignersIsZero_success() (gas: 184524) -RMNRemote_verify_withConfigSet:test_verify_success() (gas: 68207) -RMN_constructor:test_Constructor_Success() (gas: 48994) -RMN_getRecordedCurseRelatedOps:test_OpsPostDeployment() (gas: 19732) -RMN_lazyVoteToCurseUpdate_Benchmark:test_VoteToCurseLazilyRetain3VotersUponConfigChange_gas() (gas: 152296) -RMN_ownerUnbless:test_Unbless_Success() (gas: 74936) -RMN_ownerUnvoteToCurse:test_CanBlessAndCurseAfterGlobalCurseIsLifted() (gas: 471829) -RMN_ownerUnvoteToCurse:test_IsIdempotent() (gas: 398492) -RMN_ownerUnvoteToCurse:test_NonOwner_Revert() (gas: 18723) -RMN_ownerUnvoteToCurse:test_OwnerUnvoteToCurseSuccess_gas() (gas: 358084) -RMN_ownerUnvoteToCurse:test_UnknownVoter_Revert() (gas: 33190) -RMN_ownerUnvoteToCurse_Benchmark:test_OwnerUnvoteToCurse_1Voter_LiftsCurse_gas() (gas: 262408) -RMN_permaBlessing:test_PermaBlessing() (gas: 202777) -RMN_setConfig:test_BlessVoterIsZeroAddress_Revert() (gas: 15500) -RMN_setConfig:test_EitherThresholdIsZero_Revert() (gas: 21107) -RMN_setConfig:test_NonOwner_Revert() (gas: 14725) -RMN_setConfig:test_RepeatedAddress_Revert() (gas: 18219) -RMN_setConfig:test_SetConfigSuccess_gas() (gas: 104154) -RMN_setConfig:test_TotalWeightsSmallerThanEachThreshold_Revert() (gas: 30185) -RMN_setConfig:test_VoteToBlessByEjectedVoter_Revert() (gas: 130461) -RMN_setConfig:test_VotersLengthIsZero_Revert() (gas: 12149) -RMN_setConfig:test_WeightIsZeroAddress_Revert() (gas: 15740) -RMN_setConfig_Benchmark_1:test_SetConfig_7Voters_gas() (gas: 659600) -RMN_setConfig_Benchmark_2:test_ResetConfig_7Voters_gas() (gas: 212652) -RMN_unvoteToCurse:test_InvalidCursesHash() (gas: 26430) -RMN_unvoteToCurse:test_OwnerSkips() (gas: 33831) -RMN_unvoteToCurse:test_OwnerSucceeds() (gas: 64005) -RMN_unvoteToCurse:test_UnauthorizedVoter() (gas: 47715) -RMN_unvoteToCurse:test_ValidCursesHash() (gas: 61145) -RMN_unvoteToCurse:test_VotersCantLiftCurseButOwnerCan() (gas: 629190) -RMN_voteToBless:test_Curse_Revert() (gas: 473408) -RMN_voteToBless:test_IsAlreadyBlessed_Revert() (gas: 115435) -RMN_voteToBless:test_RootSuccess() (gas: 558661) -RMN_voteToBless:test_SenderAlreadyVoted_Revert() (gas: 97234) -RMN_voteToBless:test_UnauthorizedVoter_Revert() (gas: 17126) -RMN_voteToBless_Benchmark:test_1RootSuccess_gas() (gas: 44718) -RMN_voteToBless_Benchmark:test_3RootSuccess_gas() (gas: 98694) -RMN_voteToBless_Benchmark:test_5RootSuccess_gas() (gas: 152608) -RMN_voteToBless_Blessed_Benchmark:test_1RootSuccessBecameBlessed_gas() (gas: 29682) -RMN_voteToBless_Blessed_Benchmark:test_1RootSuccess_gas() (gas: 27628) -RMN_voteToBless_Blessed_Benchmark:test_3RootSuccess_gas() (gas: 81626) -RMN_voteToBless_Blessed_Benchmark:test_5RootSuccess_gas() (gas: 135518) -RMN_voteToCurse:test_CurseOnlyWhenThresholdReached_Success() (gas: 1651170) -RMN_voteToCurse:test_EmptySubjects_Revert() (gas: 14061) -RMN_voteToCurse:test_EvenIfAlreadyCursed_Success() (gas: 535124) -RMN_voteToCurse:test_OwnerCanCurseAndUncurse() (gas: 400060) -RMN_voteToCurse:test_RepeatedSubject_Revert() (gas: 144405) -RMN_voteToCurse:test_ReusedCurseId_Revert() (gas: 146972) -RMN_voteToCurse:test_UnauthorizedVoter_Revert() (gas: 12666) -RMN_voteToCurse:test_VoteToCurse_NoCurse_Success() (gas: 187556) -RMN_voteToCurse:test_VoteToCurse_YesCurse_Success() (gas: 473079) -RMN_voteToCurse_2:test_VotesAreDroppedIfSubjectIsNotCursedDuringConfigChange() (gas: 371083) -RMN_voteToCurse_2:test_VotesAreRetainedIfSubjectIsCursedDuringConfigChange() (gas: 1154362) -RMN_voteToCurse_Benchmark_1:test_VoteToCurse_NewSubject_NewVoter_NoCurse_gas() (gas: 141118) -RMN_voteToCurse_Benchmark_1:test_VoteToCurse_NewSubject_NewVoter_YesCurse_gas() (gas: 165258) -RMN_voteToCurse_Benchmark_2:test_VoteToCurse_OldSubject_NewVoter_NoCurse_gas() (gas: 121437) -RMN_voteToCurse_Benchmark_2:test_VoteToCurse_OldSubject_OldVoter_NoCurse_gas() (gas: 98373) -RMN_voteToCurse_Benchmark_3:test_VoteToCurse_OldSubject_NewVoter_YesCurse_gas() (gas: 145784) -RateLimiter_constructor:test_Constructor_Success() (gas: 19734) -RateLimiter_consume:test_AggregateValueMaxCapacityExceeded_Revert() (gas: 16042) -RateLimiter_consume:test_AggregateValueRateLimitReached_Revert() (gas: 22390) -RateLimiter_consume:test_ConsumeAggregateValue_Success() (gas: 31518) -RateLimiter_consume:test_ConsumeTokens_Success() (gas: 20381) -RateLimiter_consume:test_ConsumeUnlimited_Success() (gas: 40687) -RateLimiter_consume:test_ConsumingMoreThanUint128_Revert() (gas: 15822) -RateLimiter_consume:test_RateLimitReachedOverConsecutiveBlocks_Revert() (gas: 25798) -RateLimiter_consume:test_Refill_Success() (gas: 37444) -RateLimiter_consume:test_TokenMaxCapacityExceeded_Revert() (gas: 18388) -RateLimiter_consume:test_TokenRateLimitReached_Revert() (gas: 24886) -RateLimiter_currentTokenBucketState:test_CurrentTokenBucketState_Success() (gas: 38944) -RateLimiter_currentTokenBucketState:test_Refill_Success() (gas: 46849) -RateLimiter_setTokenBucketConfig:test_SetRateLimiterConfig_Success() (gas: 38506) -RegistryModuleOwnerCustom_constructor:test_constructor_Revert() (gas: 36033) -RegistryModuleOwnerCustom_registerAdminViaGetCCIPAdmin:test_registerAdminViaGetCCIPAdmin_Revert() (gas: 19739) -RegistryModuleOwnerCustom_registerAdminViaGetCCIPAdmin:test_registerAdminViaGetCCIPAdmin_Success() (gas: 130086) -RegistryModuleOwnerCustom_registerAdminViaOwner:test_registerAdminViaOwner_Revert() (gas: 19559) -RegistryModuleOwnerCustom_registerAdminViaOwner:test_registerAdminViaOwner_Success() (gas: 129905) -Router_applyRampUpdates:test_OffRampMismatch_Revert() (gas: 89366) -Router_applyRampUpdates:test_OffRampUpdatesWithRouting() (gas: 10662612) -Router_applyRampUpdates:test_OnRampDisable() (gas: 56007) -Router_applyRampUpdates:test_OnlyOwner_Revert() (gas: 12356) -Router_ccipSend:test_CCIPSendLinkFeeNoTokenSuccess_gas() (gas: 114599) -Router_ccipSend:test_CCIPSendLinkFeeOneTokenSuccess_gas() (gas: 202430) -Router_ccipSend:test_CCIPSendNativeFeeNoTokenSuccess_gas() (gas: 126968) -Router_ccipSend:test_CCIPSendNativeFeeOneTokenSuccess_gas() (gas: 214801) -Router_ccipSend:test_FeeTokenAmountTooLow_Revert() (gas: 64520) -Router_ccipSend:test_InvalidMsgValue() (gas: 32155) -Router_ccipSend:test_NativeFeeTokenInsufficientValue() (gas: 67177) -Router_ccipSend:test_NativeFeeTokenOverpay_Success() (gas: 170385) -Router_ccipSend:test_NativeFeeTokenZeroValue() (gas: 54279) -Router_ccipSend:test_NativeFeeToken_Success() (gas: 168901) -Router_ccipSend:test_NonLinkFeeToken_Success() (gas: 239227) -Router_ccipSend:test_UnsupportedDestinationChain_Revert() (gas: 24854) -Router_ccipSend:test_WhenNotHealthy_Revert() (gas: 44811) -Router_ccipSend:test_WrappedNativeFeeToken_Success() (gas: 171189) -Router_ccipSend:test_ZeroFeeAndGasPrice_Success() (gas: 241701) -Router_constructor:test_Constructor_Success() (gas: 13128) -Router_getArmProxy:test_getArmProxy() (gas: 10573) -Router_getFee:test_GetFeeSupportedChain_Success() (gas: 44673) -Router_getFee:test_UnsupportedDestinationChain_Revert() (gas: 17192) -Router_getSupportedTokens:test_GetSupportedTokens_Revert() (gas: 10532) -Router_recoverTokens:test_RecoverTokensInvalidRecipient_Revert() (gas: 11334) -Router_recoverTokens:test_RecoverTokensNoFunds_Revert() (gas: 20267) -Router_recoverTokens:test_RecoverTokensNonOwner_Revert() (gas: 11171) -Router_recoverTokens:test_RecoverTokensValueReceiver_Revert() (gas: 358049) -Router_recoverTokens:test_RecoverTokens_Success() (gas: 52480) -Router_routeMessage:test_AutoExec_Success() (gas: 42816) -Router_routeMessage:test_ExecutionEvent_Success() (gas: 158520) -Router_routeMessage:test_ManualExec_Success() (gas: 35546) -Router_routeMessage:test_OnlyOffRamp_Revert() (gas: 25224) -Router_routeMessage:test_WhenNotHealthy_Revert() (gas: 44799) -Router_setWrappedNative:test_OnlyOwner_Revert() (gas: 10998) -SelfFundedPingPong_ccipReceive:test_FundingIfNotANop_Revert() (gas: 55660) -SelfFundedPingPong_ccipReceive:test_Funding_Success() (gas: 421258) -SelfFundedPingPong_setCountIncrBeforeFunding:test_setCountIncrBeforeFunding() (gas: 20181) -TokenAdminRegistry_acceptAdminRole:test_acceptAdminRole_OnlyPendingAdministrator_Revert() (gas: 51163) -TokenAdminRegistry_acceptAdminRole:test_acceptAdminRole_Success() (gas: 44004) -TokenAdminRegistry_addRegistryModule:test_addRegistryModule_OnlyOwner_Revert() (gas: 12653) -TokenAdminRegistry_addRegistryModule:test_addRegistryModule_Success() (gas: 67056) -TokenAdminRegistry_getAllConfiguredTokens:test_getAllConfiguredTokens_outOfBounds_Success() (gas: 11362) -TokenAdminRegistry_getPool:test_getPool_Success() (gas: 17602) -TokenAdminRegistry_getPools:test_getPools_Success() (gas: 39962) -TokenAdminRegistry_isAdministrator:test_isAdministrator_Success() (gas: 106006) -TokenAdminRegistry_proposeAdministrator:test_proposeAdministrator_AlreadyRegistered_Revert() (gas: 104346) -TokenAdminRegistry_proposeAdministrator:test_proposeAdministrator_OnlyRegistryModule_Revert() (gas: 15610) -TokenAdminRegistry_proposeAdministrator:test_proposeAdministrator_ZeroAddress_Revert() (gas: 15155) -TokenAdminRegistry_proposeAdministrator:test_proposeAdministrator_module_Success() (gas: 112962) -TokenAdminRegistry_proposeAdministrator:test_proposeAdministrator_owner_Success() (gas: 107965) -TokenAdminRegistry_proposeAdministrator:test_proposeAdministrator_reRegisterWhileUnclaimed_Success() (gas: 116067) -TokenAdminRegistry_removeRegistryModule:test_removeRegistryModule_OnlyOwner_Revert() (gas: 12609) -TokenAdminRegistry_removeRegistryModule:test_removeRegistryModule_Success() (gas: 54524) -TokenAdminRegistry_setPool:test_setPool_InvalidTokenPoolToken_Revert() (gas: 19316) -TokenAdminRegistry_setPool:test_setPool_OnlyAdministrator_Revert() (gas: 18137) -TokenAdminRegistry_setPool:test_setPool_Success() (gas: 36135) -TokenAdminRegistry_setPool:test_setPool_ZeroAddressRemovesPool_Success() (gas: 30842) -TokenAdminRegistry_transferAdminRole:test_transferAdminRole_OnlyAdministrator_Revert() (gas: 18103) -TokenAdminRegistry_transferAdminRole:test_transferAdminRole_Success() (gas: 49438) -TokenPoolAndProxy:test_lockOrBurn_burnMint_Success() (gas: 5586499) -TokenPoolAndProxy:test_lockOrBurn_burnWithFromMint_Success() (gas: 5618769) -TokenPoolAndProxy:test_lockOrBurn_lockRelease_Success() (gas: 5793246) -TokenPoolAndProxy:test_setPreviousPool_Success() (gas: 3070731) -TokenPoolAndProxyMigration:test_tokenPoolMigration_Success_1_2() (gas: 6434801) -TokenPoolAndProxyMigration:test_tokenPoolMigration_Success_1_4() (gas: 6634934) -TokenPoolFactoryTests:test_TokenPoolFactory_Constructor_Revert() (gas: 1206695) -TokenPoolFactoryTests:test_createTokenPoolLockRelease_NoExistingToken_predict_Success() (gas: 12624842) -TokenPoolFactoryTests:test_createTokenPool_ExistingRemoteToken_AndPredictPool_Success() (gas: 12546380) -TokenPoolFactoryTests:test_createTokenPool_WithNoExistingRemoteContracts_predict_Success() (gas: 12887535) -TokenPoolFactoryTests:test_createTokenPool_WithNoExistingTokenOnRemoteChain_Success() (gas: 5833663) -TokenPoolFactoryTests:test_createTokenPool_WithRemoteTokenAndRemotePool_Success() (gas: 5974010) -TokenPoolWithAllowList_applyAllowListUpdates:test_AllowListNotEnabled_Revert() (gas: 1979943) -TokenPoolWithAllowList_applyAllowListUpdates:test_OnlyOwner_Revert() (gas: 12113) -TokenPoolWithAllowList_applyAllowListUpdates:test_SetAllowListSkipsZero_Success() (gas: 23476) -TokenPoolWithAllowList_applyAllowListUpdates:test_SetAllowList_Success() (gas: 177848) -TokenPoolWithAllowList_getAllowList:test_GetAllowList_Success() (gas: 23764) -TokenPoolWithAllowList_getAllowListEnabled:test_GetAllowListEnabled_Success() (gas: 8375) -TokenPoolWithAllowList_setRouter:test_SetRouter_Success() (gas: 24867) -TokenPool_applyChainUpdates:test_applyChainUpdates_DisabledNonZeroRateLimit_Revert() (gas: 271569) -TokenPool_applyChainUpdates:test_applyChainUpdates_InvalidRateLimitRate_Revert() (gas: 542359) -TokenPool_applyChainUpdates:test_applyChainUpdates_NonExistentChain_Revert() (gas: 18449) -TokenPool_applyChainUpdates:test_applyChainUpdates_OnlyCallableByOwner_Revert() (gas: 11469) -TokenPool_applyChainUpdates:test_applyChainUpdates_Success() (gas: 479160) -TokenPool_applyChainUpdates:test_applyChainUpdates_ZeroAddressNotAllowed_Revert() (gas: 157422) -TokenPool_constructor:test_ZeroAddressNotAllowed_Revert() (gas: 70484) -TokenPool_constructor:test_immutableFields_Success() (gas: 20586) -TokenPool_getRemotePool:test_getRemotePool_Success() (gas: 274181) -TokenPool_onlyOffRamp:test_CallerIsNotARampOnRouter_Revert() (gas: 277296) -TokenPool_onlyOffRamp:test_ChainNotAllowed_Revert() (gas: 290028) -TokenPool_onlyOffRamp:test_onlyOffRamp_Success() (gas: 350050) -TokenPool_onlyOnRamp:test_CallerIsNotARampOnRouter_Revert() (gas: 277036) -TokenPool_onlyOnRamp:test_ChainNotAllowed_Revert() (gas: 254065) -TokenPool_onlyOnRamp:test_onlyOnRamp_Success() (gas: 305106) -TokenPool_setChainRateLimiterConfig:test_NonExistentChain_Revert() (gas: 17187) -TokenPool_setChainRateLimiterConfig:test_OnlyOwnerOrRateLimitAdmin_Revert() (gas: 15227) -TokenPool_setRemotePool:test_setRemotePool_NonExistentChain_Reverts() (gas: 15671) -TokenPool_setRemotePool:test_setRemotePool_OnlyOwner_Reverts() (gas: 13219) -TokenPool_setRemotePool:test_setRemotePool_Success() (gas: 282125) -TokenProxy_ccipSend:test_CcipSendGasShouldBeZero_Revert() (gas: 17226) -TokenProxy_ccipSend:test_CcipSendInsufficientAllowance_Revert() (gas: 134605) -TokenProxy_ccipSend:test_CcipSendInvalidToken_Revert() (gas: 16000) -TokenProxy_ccipSend:test_CcipSendNative_Success() (gas: 244013) -TokenProxy_ccipSend:test_CcipSendNoDataAllowed_Revert() (gas: 16384) -TokenProxy_ccipSend:test_CcipSend_Success() (gas: 262651) -TokenProxy_constructor:test_Constructor() (gas: 13836) -TokenProxy_getFee:test_GetFeeGasShouldBeZero_Revert() (gas: 16899) -TokenProxy_getFee:test_GetFeeInvalidToken_Revert() (gas: 12706) -TokenProxy_getFee:test_GetFeeNoDataAllowed_Revert() (gas: 15885) -TokenProxy_getFee:test_GetFee_Success() (gas: 85240) -USDCTokenPool__validateMessage:test_ValidateInvalidMessage_Revert() (gas: 25704) -USDCTokenPool_lockOrBurn:test_CallerIsNotARampOnRouter_Revert() (gas: 35481) -USDCTokenPool_lockOrBurn:test_LockOrBurnWithAllowList_Revert() (gas: 30235) -USDCTokenPool_lockOrBurn:test_LockOrBurn_Success() (gas: 133508) -USDCTokenPool_lockOrBurn:test_UnknownDomain_Revert() (gas: 478182) -USDCTokenPool_releaseOrMint:test_ReleaseOrMintRealTx_Success() (gas: 268672) -USDCTokenPool_releaseOrMint:test_TokenMaxCapacityExceeded_Revert() (gas: 50952) -USDCTokenPool_releaseOrMint:test_UnlockingUSDCFailed_Revert() (gas: 98987) -USDCTokenPool_setDomains:test_InvalidDomain_Revert() (gas: 66393) -USDCTokenPool_setDomains:test_OnlyOwner_Revert() (gas: 11363) -USDCTokenPool_supportsInterface:test_SupportsInterface_Success() (gas: 10041) \ No newline at end of file +ARMProxyStandaloneTest:test_ARMCallEmptyContractRevert() (gas: 20673) +ARMProxyStandaloneTest:test_Constructor() (gas: 543485) +ARMProxyStandaloneTest:test_SetARM() (gas: 18216) +ARMProxyStandaloneTest:test_SetARMzero() (gas: 12144) +ARMProxyTest:test_ARMCallRevertReasonForwarded() (gas: 49764) +ARMProxyTest:test_ARMIsBlessed_Success() (gas: 39781) +ARMProxyTest:test_ARMIsCursed_Success() (gas: 51846) +AggregateTokenLimiter_constructor:test_Constructor_Success() (gas: 31944) +AggregateTokenLimiter_getTokenBucket:test_GetTokenBucket_Success() (gas: 23227) +AggregateTokenLimiter_getTokenBucket:test_Refill_Success() (gas: 55032) +AggregateTokenLimiter_getTokenBucket:test_TimeUnderflow_Revert() (gas: 17640) +AggregateTokenLimiter_getTokenLimitAdmin:test_GetTokenLimitAdmin_Success() (gas: 11188) +AggregateTokenLimiter_getTokenValue:test_GetTokenValue_Success() (gas: 21368) +AggregateTokenLimiter_getTokenValue:test_NoTokenPrice_Reverts() (gas: 25888) +AggregateTokenLimiter_rateLimitValue:test_AggregateValueMaxCapacityExceeded_Revert() (gas: 20854) +AggregateTokenLimiter_rateLimitValue:test_RateLimitValueSuccess_gas() (gas: 19835) +AggregateTokenLimiter_setAdmin:test_OnlyOwnerOrAdmin_Revert() (gas: 13880) +AggregateTokenLimiter_setAdmin:test_Owner_Success() (gas: 20448) +AggregateTokenLimiter_setRateLimiterConfig:test_OnlyOnlyCallableByAdminOrOwner_Revert() (gas: 19396) +AggregateTokenLimiter_setRateLimiterConfig:test_Owner_Success() (gas: 38776) +AggregateTokenLimiter_setRateLimiterConfig:test_TokenLimitAdmin_Success() (gas: 41521) +BurnFromMintTokenPool_lockOrBurn:test_ChainNotAllowed_Revert() (gas: 34256) +BurnFromMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 60604) +BurnFromMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 293700) +BurnFromMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 28203) +BurnMintTokenPool_lockOrBurn:test_ChainNotAllowed_Revert() (gas: 31296) +BurnMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 60604) +BurnMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 291204) +BurnMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 20610) +BurnMintTokenPool_releaseOrMint:test_ChainNotAllowed_Revert() (gas: 34256) +BurnMintTokenPool_releaseOrMint:test_PoolMintNotHealthy_Revert() (gas: 63377) +BurnMintTokenPool_releaseOrMint:test_PoolMint_Success() (gas: 122166) +BurnWithFromMintTokenPool_lockOrBurn:test_ChainNotAllowed_Revert() (gas: 34256) +BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 60604) +BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 293726) +BurnWithFromMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 28207) +CCIPClientExample_sanity:test_ImmutableExamples_Success() (gas: 3189509) +CCIPHome__validateConfig:test__validateConfigLessTransmittersThanSigners_Success() (gas: 380435) +CCIPHome__validateConfig:test__validateConfigSmallerFChain_Success() (gas: 563820) +CCIPHome__validateConfig:test__validateConfig_ABIEncodedAddress_OfframpAddressCannotBeZero_Reverts() (gas: 322845) +CCIPHome__validateConfig:test__validateConfig_ABIEncodedAddress_RMNHomeAddressCannotBeZero_Reverts() (gas: 323318) +CCIPHome__validateConfig:test__validateConfig_ChainSelectorNotFound_Reverts() (gas: 326388) +CCIPHome__validateConfig:test__validateConfig_ChainSelectorNotSet_Reverts() (gas: 322093) +CCIPHome__validateConfig:test__validateConfig_FChainTooHigh_Reverts() (gas: 394935) +CCIPHome__validateConfig:test__validateConfig_FMustBePositive_Reverts() (gas: 325101) +CCIPHome__validateConfig:test__validateConfig_FTooHigh_Reverts() (gas: 324000) +CCIPHome__validateConfig:test__validateConfig_NodeNotInRegistry_Reverts() (gas: 404874) +CCIPHome__validateConfig:test__validateConfig_NotEnoughTransmittersEmptyAddresses_Reverts() (gas: 353950) +CCIPHome__validateConfig:test__validateConfig_NotEnoughTransmitters_Reverts() (gas: 1444130) +CCIPHome__validateConfig:test__validateConfig_OfframpAddressCannotBeZero_Reverts() (gas: 322144) +CCIPHome__validateConfig:test__validateConfig_RMNHomeAddressCannotBeZero_Reverts() (gas: 322594) +CCIPHome__validateConfig:test__validateConfig_Success() (gas: 338936) +CCIPHome__validateConfig:test__validateConfig_TooManySigners_Reverts() (gas: 1176311) +CCIPHome__validateConfig:test__validateConfig_ZeroP2PId_Reverts() (gas: 328508) +CCIPHome__validateConfig:test__validateConfig_ZeroSignerKey_Reverts() (gas: 328620) +CCIPHome_applyChainConfigUpdates:test__applyChainConfigUpdates_FChainNotPositive_Reverts() (gas: 194886) +CCIPHome_applyChainConfigUpdates:test_applyChainConfigUpdates_addChainConfigs_Success() (gas: 367588) +CCIPHome_applyChainConfigUpdates:test_applyChainConfigUpdates_nodeNotInRegistry_Reverts() (gas: 27219) +CCIPHome_applyChainConfigUpdates:test_applyChainConfigUpdates_removeChainConfigs_Success() (gas: 283157) +CCIPHome_applyChainConfigUpdates:test_applyChainConfigUpdates_selectorNotFound_Reverts() (gas: 16607) +CCIPHome_applyChainConfigUpdates:test_getPaginatedCCIPHomes_Success() (gas: 407992) +CCIPHome_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_DONIdMismatch_reverts() (gas: 35872) +CCIPHome_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_InnerCallReverts_reverts() (gas: 13995) +CCIPHome_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_InvalidSelector_reverts() (gas: 12740) +CCIPHome_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_OnlyCapabilitiesRegistryCanCall_reverts() (gas: 33934) +CCIPHome_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_success() (gas: 1519499) +CCIPHome_constructor:test_constructor_CapabilitiesRegistryAddressZero_reverts() (gas: 67189) +CCIPHome_constructor:test_constructor_success() (gas: 5365115) +CCIPHome_constructor:test_getCapabilityConfiguration_success() (gas: 10244) +CCIPHome_constructor:test_supportsInterface_success() (gas: 11297) +CCIPHome_getAllConfigs:test_getAllConfigs_success() (gas: 2901092) +CCIPHome_getConfigDigests:test_getConfigDigests_success() (gas: 2615935) +CCIPHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_CanOnlySelfCall_reverts() (gas: 10152) +CCIPHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_ConfigDigestMismatch_reverts() (gas: 27337) +CCIPHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_NoOpStateTransitionNotAllowed_reverts() (gas: 9902) +CCIPHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_multiplePlugins_success() (gas: 5284426) +CCIPHome_revokeCandidate:test_revokeCandidate_CanOnlySelfCall_reverts() (gas: 10119) +CCIPHome_revokeCandidate:test_revokeCandidate_ConfigDigestMismatch_reverts() (gas: 21547) +CCIPHome_revokeCandidate:test_revokeCandidate_RevokingZeroDigestNotAllowed_reverts() (gas: 9666) +CCIPHome_revokeCandidate:test_revokeCandidate_success() (gas: 39075) +CCIPHome_setCandidate:test_setCandidate_CanOnlySelfCall_reverts() (gas: 26729) +CCIPHome_setCandidate:test_setCandidate_ConfigDigestMismatch_reverts() (gas: 1472425) +CCIPHome_setCandidate:test_setCandidate_success() (gas: 1419718) +CommitStore_constructor:test_Constructor_Success() (gas: 4361942) +CommitStore_isUnpausedAndRMNHealthy:test_RMN_Success() (gas: 83130) +CommitStore_report:test_InvalidIntervalMinLargerThanMax_Revert() (gas: 32885) +CommitStore_report:test_InvalidInterval_Revert() (gas: 32781) +CommitStore_report:test_InvalidRootRevert() (gas: 31537) +CommitStore_report:test_OnlyGasPriceUpdates_Success() (gas: 61004) +CommitStore_report:test_OnlyPriceUpdateStaleReport_Revert() (gas: 70437) +CommitStore_report:test_OnlyTokenPriceUpdates_Success() (gas: 61025) +CommitStore_report:test_Paused_Revert() (gas: 22402) +CommitStore_report:test_ReportAndPriceUpdate_Success() (gas: 94701) +CommitStore_report:test_ReportOnlyRootSuccess_gas() (gas: 60020) +CommitStore_report:test_RootAlreadyCommitted_Revert() (gas: 72243) +CommitStore_report:test_StaleReportWithRoot_Success() (gas: 136763) +CommitStore_report:test_Unhealthy_Revert() (gas: 46665) +CommitStore_report:test_ValidPriceUpdateThenStaleReportWithRoot_Success() (gas: 116937) +CommitStore_report:test_ZeroEpochAndRound_Revert() (gas: 32226) +CommitStore_resetUnblessedRoots:test_OnlyOwner_Revert() (gas: 12082) +CommitStore_resetUnblessedRoots:test_ResetUnblessedRoots_Success() (gas: 172098) +CommitStore_setDynamicConfig:test_InvalidCommitStoreConfig_Revert() (gas: 44708) +CommitStore_setDynamicConfig:test_OnlyOwner_Revert() (gas: 44671) +CommitStore_setDynamicConfig:test_PriceEpochCleared_Success() (gas: 150735) +CommitStore_setLatestPriceEpochAndRound:test_OnlyOwner_Revert() (gas: 11970) +CommitStore_setLatestPriceEpochAndRound:test_SetLatestPriceEpochAndRound_Success() (gas: 22566) +CommitStore_setMinSeqNr:test_OnlyOwner_Revert() (gas: 11969) +CommitStore_verify:test_Blessed_Success() (gas: 108814) +CommitStore_verify:test_NotBlessed_Success() (gas: 69299) +CommitStore_verify:test_Paused_Revert() (gas: 19843) +CommitStore_verify:test_TooManyLeaves_Revert() (gas: 85894) +DefensiveExampleTest:test_HappyPath_Success() (gas: 247055) +DefensiveExampleTest:test_Recovery() (gas: 483144) +E2E:test_E2E_3MessagesSuccess_gas() (gas: 1459037) +EVM2EVMOffRamp__releaseOrMintToken:test__releaseOrMintToken_NotACompatiblePool_Revert() (gas: 48827) +EVM2EVMOffRamp__releaseOrMintToken:test__releaseOrMintToken_Success() (gas: 122487) +EVM2EVMOffRamp__releaseOrMintToken:test__releaseOrMintToken_TokenHandlingError_transfer_Revert() (gas: 100439) +EVM2EVMOffRamp__releaseOrMintToken:test_releaseOrMintToken_InvalidDataLength_Revert() (gas: 45166) +EVM2EVMOffRamp__releaseOrMintToken:test_releaseOrMintToken_ReleaseOrMintBalanceMismatch_Revert() (gas: 110906) +EVM2EVMOffRamp__releaseOrMintToken:test_releaseOrMintToken_TokenHandlingError_BalanceOf_Revert() (gas: 47409) +EVM2EVMOffRamp__releaseOrMintToken:test_releaseOrMintToken_skip_ReleaseOrMintBalanceMismatch_if_pool_Revert() (gas: 102213) +EVM2EVMOffRamp__releaseOrMintTokens:test_OverValueWithARLOff_Success() (gas: 452793) +EVM2EVMOffRamp__releaseOrMintTokens:test_PriceNotFoundForToken_Reverts() (gas: 163533) +EVM2EVMOffRamp__releaseOrMintTokens:test_RateLimitErrors_Reverts() (gas: 947445) +EVM2EVMOffRamp__releaseOrMintTokens:test_TokenHandlingError_Reverts() (gas: 207677) +EVM2EVMOffRamp__releaseOrMintTokens:test__releaseOrMintTokens_NotACompatiblePool_Reverts() (gas: 37420) +EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_InvalidDataLengthReturnData_Revert() (gas: 81689) +EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_InvalidEVMAddress_Revert() (gas: 52840) +EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_Success() (gas: 248387) +EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_destDenominatedDecimals_Success() (gas: 256427) +EVM2EVMOffRamp__report:test_Report_Success() (gas: 150186) +EVM2EVMOffRamp__trialExecute:test_RateLimitError_Success() (gas: 280928) +EVM2EVMOffRamp__trialExecute:test_TokenHandlingErrorIsCaught_Success() (gas: 291045) +EVM2EVMOffRamp__trialExecute:test_TokenPoolIsNotAContract_Success() (gas: 425921) +EVM2EVMOffRamp__trialExecute:test_trialExecute_Success() (gas: 368465) +EVM2EVMOffRamp_ccipReceive:test_Reverts() (gas: 20655) +EVM2EVMOffRamp_constructor:test_CommitStoreAlreadyInUse_Revert() (gas: 162623) +EVM2EVMOffRamp_constructor:test_Constructor_Success() (gas: 7939916) +EVM2EVMOffRamp_constructor:test_ZeroOnRampAddress_Revert() (gas: 152500) +EVM2EVMOffRamp_execute:test_EmptyReport_Revert() (gas: 24199) +EVM2EVMOffRamp_execute:test_InvalidMessageId_Revert() (gas: 47203) +EVM2EVMOffRamp_execute:test_InvalidSourceChain_Revert() (gas: 67004) +EVM2EVMOffRamp_execute:test_InvalidSourcePoolAddress_Success() (gas: 578501) +EVM2EVMOffRamp_execute:test_ManualExecutionNotYetEnabled_Revert() (gas: 61423) +EVM2EVMOffRamp_execute:test_MessageTooLarge_Revert() (gas: 175550) +EVM2EVMOffRamp_execute:test_Paused_Revert() (gas: 139288) +EVM2EVMOffRamp_execute:test_ReceiverError_Success() (gas: 192927) +EVM2EVMOffRamp_execute:test_RetryFailedMessageWithoutManualExecution_Success() (gas: 215419) +EVM2EVMOffRamp_execute:test_RootNotCommitted_Revert() (gas: 55720) +EVM2EVMOffRamp_execute:test_SingleMessageNoTokensUnordered_Success() (gas: 208494) +EVM2EVMOffRamp_execute:test_SingleMessageNoTokens_Success() (gas: 220462) +EVM2EVMOffRamp_execute:test_SingleMessageToNonCCIPReceiver_Success() (gas: 290662) +EVM2EVMOffRamp_execute:test_SingleMessagesNoTokensSuccess_gas() (gas: 134108) +EVM2EVMOffRamp_execute:test_SkippedIncorrectNonceStillExecutes_Success() (gas: 490970) +EVM2EVMOffRamp_execute:test_SkippedIncorrectNonce_Success() (gas: 68824) +EVM2EVMOffRamp_execute:test_StrictUntouchedToSuccess_Success() (gas: 158417) +EVM2EVMOffRamp_execute:test_TokenDataMismatch_Revert() (gas: 65640) +EVM2EVMOffRamp_execute:test_TwoMessagesWithTokensAndGE_Success() (gas: 699587) +EVM2EVMOffRamp_execute:test_TwoMessagesWithTokensSuccess_gas() (gas: 607548) +EVM2EVMOffRamp_execute:test_UnexpectedTokenData_Revert() (gas: 45035) +EVM2EVMOffRamp_execute:test_Unhealthy_Revert() (gas: 699898) +EVM2EVMOffRamp_execute:test_UnsupportedNumberOfTokens_Revert() (gas: 91821) +EVM2EVMOffRamp_execute:test__execute_SkippedAlreadyExecutedMessageUnordered_Success() (gas: 157284) +EVM2EVMOffRamp_execute:test__execute_SkippedAlreadyExecutedMessage_Success() (gas: 175420) +EVM2EVMOffRamp_execute:test_execute_RouterYULCall_Success() (gas: 601571) +EVM2EVMOffRamp_executeSingleMessage:test_MessageSender_Revert() (gas: 23052) +EVM2EVMOffRamp_executeSingleMessage:test_NonContractWithTokens_Success() (gas: 315290) +EVM2EVMOffRamp_executeSingleMessage:test_NonContract_Success() (gas: 23338) +EVM2EVMOffRamp_executeSingleMessage:test_TokenHandlingError_Revert() (gas: 258353) +EVM2EVMOffRamp_executeSingleMessage:test_ZeroGasDONExecution_Revert() (gas: 59576) +EVM2EVMOffRamp_executeSingleMessage:test_executeSingleMessage_NoTokens_Success() (gas: 58690) +EVM2EVMOffRamp_executeSingleMessage:test_executeSingleMessage_WithTokens_Success() (gas: 368147) +EVM2EVMOffRamp_executeSingleMessage:test_executeSingleMessage_ZeroGasZeroData_Success() (gas: 93587) +EVM2EVMOffRamp_execute_upgrade:test_V2NonceNewSenderStartsAtZero_Success() (gas: 279051) +EVM2EVMOffRamp_execute_upgrade:test_V2NonceStartsAtV1Nonce_Success() (gas: 351951) +EVM2EVMOffRamp_execute_upgrade:test_V2OffRampNonceSkipsIfMsgInFlight_Success() (gas: 326170) +EVM2EVMOffRamp_execute_upgrade:test_V2SenderNoncesReadsPreviousRamp_Success() (gas: 303514) +EVM2EVMOffRamp_execute_upgrade:test_V2_Success() (gas: 154916) +EVM2EVMOffRamp_getAllRateLimitTokens:test_GetAllRateLimitTokens_Success() (gas: 42076) +EVM2EVMOffRamp_getExecutionState:test_FillExecutionState_Success() (gas: 5016070) +EVM2EVMOffRamp_getExecutionState:test_GetExecutionState_Success() (gas: 104111) +EVM2EVMOffRamp_manuallyExecute:test_ManualExecFailedTx_Revert() (gas: 234610) +EVM2EVMOffRamp_manuallyExecute:test_ManualExecForkedChain_Revert() (gas: 37344) +EVM2EVMOffRamp_manuallyExecute:test_ManualExecGasLimitMismatch_Revert() (gas: 67784) +EVM2EVMOffRamp_manuallyExecute:test_ManualExecInvalidGasLimit_Revert() (gas: 37732) +EVM2EVMOffRamp_manuallyExecute:test_ManualExecWithMultipleMessagesAndSourceTokens_Success() (gas: 673237) +EVM2EVMOffRamp_manuallyExecute:test_ManualExecWithSourceTokens_Success() (gas: 416742) +EVM2EVMOffRamp_manuallyExecute:test_ManualExec_Success() (gas: 235356) +EVM2EVMOffRamp_manuallyExecute:test_ReentrancyManualExecuteFails_Success() (gas: 3548576) +EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_DestinationGasAmountCountMismatch_Revert() (gas: 442167) +EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_DoesNotRevertIfUntouched_Success() (gas: 173700) +EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_InvalidTokenGasOverride_Revert() (gas: 447336) +EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_LowGasLimitManualExec_Success() (gas: 681724) +EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_WithGasOverride_Success() (gas: 239038) +EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_WithInvalidReceiverExecutionGasOverride_Revert() (gas: 188679) +EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_WithInvalidSourceTokenDataCount_Revert() (gas: 80150) +EVM2EVMOffRamp_metadataHash:test_MetadataHash_Success() (gas: 10174) +EVM2EVMOffRamp_setDynamicConfig:test_NonOwner_Revert() (gas: 47737) +EVM2EVMOffRamp_setDynamicConfig:test_RouterZeroAddress_Revert() (gas: 46206) +EVM2EVMOffRamp_setDynamicConfig:test_SetDynamicConfig_Success() (gas: 182870) +EVM2EVMOffRamp_updateRateLimitTokens:test_updateRateLimitTokens_AddsAndRemoves_Success() (gas: 171983) +EVM2EVMOffRamp_updateRateLimitTokens:test_updateRateLimitTokens_NonOwner_Revert() (gas: 25219) +EVM2EVMOffRamp_updateRateLimitTokens:test_updateRateLimitTokens_Success() (gas: 205572) +EVM2EVMOnRamp_constructor:test_Constructor_Success() (gas: 7995985) +EVM2EVMOnRamp_forwardFromRouter:test_CannotSendZeroTokens_Revert() (gas: 40118) +EVM2EVMOnRamp_forwardFromRouter:test_EnforceOutOfOrder_Revert() (gas: 112063) +EVM2EVMOnRamp_forwardFromRouter:test_ForwardFromRouterExtraArgsV2AllowOutOfOrderTrue_Success() (gas: 136127) +EVM2EVMOnRamp_forwardFromRouter:test_ForwardFromRouterExtraArgsV2_Success() (gas: 136125) +EVM2EVMOnRamp_forwardFromRouter:test_ForwardFromRouterSuccessCustomExtraArgs() (gas: 147732) +EVM2EVMOnRamp_forwardFromRouter:test_ForwardFromRouterSuccessLegacyExtraArgs() (gas: 160359) +EVM2EVMOnRamp_forwardFromRouter:test_ForwardFromRouter_Success() (gas: 146970) +EVM2EVMOnRamp_forwardFromRouter:test_InvalidAddressEncodePacked_Revert() (gas: 43162) +EVM2EVMOnRamp_forwardFromRouter:test_InvalidAddress_Revert() (gas: 43265) +EVM2EVMOnRamp_forwardFromRouter:test_InvalidChainSelector_Revert() (gas: 28899) +EVM2EVMOnRamp_forwardFromRouter:test_InvalidExtraArgsTag_Revert() (gas: 28541) +EVM2EVMOnRamp_forwardFromRouter:test_MaxCapacityExceeded_Revert() (gas: 93166) +EVM2EVMOnRamp_forwardFromRouter:test_MaxFeeBalanceReached_Revert() (gas: 40651) +EVM2EVMOnRamp_forwardFromRouter:test_MessageGasLimitTooHigh_Revert() (gas: 33116) +EVM2EVMOnRamp_forwardFromRouter:test_MessageTooLarge_Revert() (gas: 119271) +EVM2EVMOnRamp_forwardFromRouter:test_OriginalSender_Revert() (gas: 25711) +EVM2EVMOnRamp_forwardFromRouter:test_OverValueWithARLOff_Success() (gas: 263611) +EVM2EVMOnRamp_forwardFromRouter:test_Paused_Revert() (gas: 60811) +EVM2EVMOnRamp_forwardFromRouter:test_Permissions_Revert() (gas: 28656) +EVM2EVMOnRamp_forwardFromRouter:test_PriceNotFoundForToken_Revert() (gas: 66594) +EVM2EVMOnRamp_forwardFromRouter:test_ShouldIncrementNonceOnlyOnOrdered_Success() (gas: 246017) +EVM2EVMOnRamp_forwardFromRouter:test_ShouldIncrementSeqNumAndNonce_Success() (gas: 231059) +EVM2EVMOnRamp_forwardFromRouter:test_ShouldStoreNonLinkFees() (gas: 148693) +EVM2EVMOnRamp_forwardFromRouter:test_SourceTokenDataTooLarge_Revert() (gas: 5451750) +EVM2EVMOnRamp_forwardFromRouter:test_TooManyTokens_Revert() (gas: 36372) +EVM2EVMOnRamp_forwardFromRouter:test_Unhealthy_Revert() (gas: 46651) +EVM2EVMOnRamp_forwardFromRouter:test_UnsupportedToken_Revert() (gas: 119388) +EVM2EVMOnRamp_forwardFromRouter:test_ZeroAddressReceiver_Revert() (gas: 357179) +EVM2EVMOnRamp_forwardFromRouter:test_forwardFromRouter_ShouldStoreLinkFees_Success() (gas: 122802) +EVM2EVMOnRamp_forwardFromRouter:test_forwardFromRouter_UnsupportedToken_Revert() (gas: 79581) +EVM2EVMOnRamp_forwardFromRouter:test_forwardFromRouter_correctSourceTokenData_Success() (gas: 931861) +EVM2EVMOnRamp_forwardFromRouter_upgrade:test_V2NonceNewSenderStartsAtZero_Success() (gas: 170805) +EVM2EVMOnRamp_forwardFromRouter_upgrade:test_V2NonceStartsAtV1Nonce_Success() (gas: 233734) +EVM2EVMOnRamp_forwardFromRouter_upgrade:test_V2SenderNoncesReadsPreviousRamp_Success() (gas: 149106) +EVM2EVMOnRamp_forwardFromRouter_upgrade:test_V2_Success() (gas: 111551) +EVM2EVMOnRamp_getDataAvailabilityCost:test_EmptyMessageCalculatesDataAvailabilityCost_Success() (gas: 28790) +EVM2EVMOnRamp_getDataAvailabilityCost:test_SimpleMessageCalculatesDataAvailabilityCost_Success() (gas: 29664) +EVM2EVMOnRamp_getFee:test_EmptyMessage_Success() (gas: 103386) +EVM2EVMOnRamp_getFee:test_GetFeeOfZeroForTokenMessage_Success() (gas: 102775) +EVM2EVMOnRamp_getFee:test_HighGasMessage_Success() (gas: 274795) +EVM2EVMOnRamp_getFee:test_MessageGasLimitTooHigh_Revert() (gas: 19531) +EVM2EVMOnRamp_getFee:test_MessageTooLarge_Revert() (gas: 105736) +EVM2EVMOnRamp_getFee:test_MessageWithDataAndTokenTransfer_Success() (gas: 246841) +EVM2EVMOnRamp_getFee:test_NotAFeeToken_Revert() (gas: 28335) +EVM2EVMOnRamp_getFee:test_SingleTokenMessage_Success() (gas: 174801) +EVM2EVMOnRamp_getFee:test_TooManyTokens_Revert() (gas: 24852) +EVM2EVMOnRamp_getFee:test_ZeroDataAvailabilityMultiplier_Success() (gas: 81035) +EVM2EVMOnRamp_getSupportedTokens:test_GetSupportedTokens_Revert() (gas: 11166) +EVM2EVMOnRamp_getTokenPool:test_GetTokenPool_Success() (gas: 41957) +EVM2EVMOnRamp_getTokenTransferCost:test_CustomTokenBpsFee_Success() (gas: 54001) +EVM2EVMOnRamp_getTokenTransferCost:test_FeeTokenBpsFee_Success() (gas: 43066) +EVM2EVMOnRamp_getTokenTransferCost:test_LargeTokenTransferChargesMaxFeeAndGas_Success() (gas: 37875) +EVM2EVMOnRamp_getTokenTransferCost:test_MixedTokenTransferFee_Success() (gas: 190349) +EVM2EVMOnRamp_getTokenTransferCost:test_NoTokenTransferChargesZeroFee_Success() (gas: 17641) +EVM2EVMOnRamp_getTokenTransferCost:test_SmallTokenTransferChargesMinFeeAndGas_Success() (gas: 37525) +EVM2EVMOnRamp_getTokenTransferCost:test_UnsupportedToken_Revert() (gas: 24786) +EVM2EVMOnRamp_getTokenTransferCost:test_ZeroAmountTokenTransferChargesMinFeeAndGas_Success() (gas: 37548) +EVM2EVMOnRamp_getTokenTransferCost:test_ZeroFeeConfigChargesMinFee_Success() (gas: 49698) +EVM2EVMOnRamp_getTokenTransferCost:test__getTokenTransferCost_selfServeUsesDefaults_Success() (gas: 38218) +EVM2EVMOnRamp_linkAvailableForPayment:test_InsufficientLinkBalance_Success() (gas: 36639) +EVM2EVMOnRamp_linkAvailableForPayment:test_LinkAvailableForPayment_Success() (gas: 145939) +EVM2EVMOnRamp_payNops:test_AdminPayNops_Success() (gas: 157645) +EVM2EVMOnRamp_payNops:test_InsufficientBalance_Revert() (gas: 32428) +EVM2EVMOnRamp_payNops:test_NoFeesToPay_Revert() (gas: 135001) +EVM2EVMOnRamp_payNops:test_NoNopsToPay_Revert() (gas: 141695) +EVM2EVMOnRamp_payNops:test_NopPayNops_Success() (gas: 161181) +EVM2EVMOnRamp_payNops:test_OwnerPayNops_Success() (gas: 155453) +EVM2EVMOnRamp_payNops:test_PayNopsSuccessAfterSetNops() (gas: 328800) +EVM2EVMOnRamp_payNops:test_WrongPermissions_Revert() (gas: 15878) +EVM2EVMOnRamp_setDynamicConfig:test_SetConfigInvalidConfig_Revert() (gas: 49643) +EVM2EVMOnRamp_setDynamicConfig:test_SetConfigOnlyOwner_Revert() (gas: 28163) +EVM2EVMOnRamp_setDynamicConfig:test_SetDynamicConfig_Success() (gas: 68220) +EVM2EVMOnRamp_setFeeTokenConfig:test_OnlyCallableByOwnerOrAdmin_Revert() (gas: 14432) +EVM2EVMOnRamp_setFeeTokenConfig:test_SetFeeTokenConfigByAdmin_Success() (gas: 17635) +EVM2EVMOnRamp_setFeeTokenConfig:test_SetFeeTokenConfig_Success() (gas: 14948) +EVM2EVMOnRamp_setNops:test_AdminCanSetNops_Success() (gas: 67974) +EVM2EVMOnRamp_setNops:test_IncludesPayment_Success() (gas: 551687) +EVM2EVMOnRamp_setNops:test_LinkTokenCannotBeNop_Revert() (gas: 61776) +EVM2EVMOnRamp_setNops:test_NonOwnerOrAdmin_Revert() (gas: 16548) +EVM2EVMOnRamp_setNops:test_NotEnoughFundsForPayout_Revert() (gas: 96806) +EVM2EVMOnRamp_setNops:test_SetNopsRemovesOldNopsCompletely_Success() (gas: 64532) +EVM2EVMOnRamp_setNops:test_SetNops_Success() (gas: 185469) +EVM2EVMOnRamp_setNops:test_TooManyNops_Revert() (gas: 415502) +EVM2EVMOnRamp_setNops:test_ZeroAddressCannotBeNop_Revert() (gas: 58089) +EVM2EVMOnRamp_setTokenTransferFeeConfig:test__setTokenTransferFeeConfig_InvalidDestBytesOverhead_Revert() (gas: 17784) +EVM2EVMOnRamp_setTokenTransferFeeConfig:test__setTokenTransferFeeConfig_OnlyCallableByOwnerOrAdmin_Revert() (gas: 15545) +EVM2EVMOnRamp_setTokenTransferFeeConfig:test__setTokenTransferFeeConfig_Success() (gas: 117548) +EVM2EVMOnRamp_setTokenTransferFeeConfig:test__setTokenTransferFeeConfig_byAdmin_Success() (gas: 18795) +EVM2EVMOnRamp_withdrawNonLinkFees:test_LinkBalanceNotSettled_Revert() (gas: 92590) +EVM2EVMOnRamp_withdrawNonLinkFees:test_NonOwnerOrAdmin_Revert() (gas: 16405) +EVM2EVMOnRamp_withdrawNonLinkFees:test_SettlingBalance_Success() (gas: 326944) +EVM2EVMOnRamp_withdrawNonLinkFees:test_WithdrawNonLinkFees_Success() (gas: 58679) +EVM2EVMOnRamp_withdrawNonLinkFees:test_WithdrawToZeroAddress_Revert() (gas: 13676) +EtherSenderReceiverTest_ccipReceive:test_ccipReceive_fallbackToWethTransfer() (gas: 103814) +EtherSenderReceiverTest_ccipReceive:test_ccipReceive_happyPath() (gas: 54732) +EtherSenderReceiverTest_ccipReceive:test_ccipReceive_wrongToken() (gas: 21881) +EtherSenderReceiverTest_ccipReceive:test_ccipReceive_wrongTokenAmount() (gas: 20674) +EtherSenderReceiverTest_ccipSend:test_ccipSend_reverts_insufficientFee_feeToken() (gas: 116467) +EtherSenderReceiverTest_ccipSend:test_ccipSend_reverts_insufficientFee_native() (gas: 91360) +EtherSenderReceiverTest_ccipSend:test_ccipSend_reverts_insufficientFee_weth() (gas: 116371) +EtherSenderReceiverTest_ccipSend:test_ccipSend_success_feeToken() (gas: 167929) +EtherSenderReceiverTest_ccipSend:test_ccipSend_success_native() (gas: 98200) +EtherSenderReceiverTest_ccipSend:test_ccipSend_success_nativeExcess() (gas: 98574) +EtherSenderReceiverTest_ccipSend:test_ccipSend_success_weth() (gas: 117880) +EtherSenderReceiverTest_constructor:test_constructor() (gas: 19659) +EtherSenderReceiverTest_getFee:test_getFee() (gas: 41207) +EtherSenderReceiverTest_validateFeeToken:test_validateFeeToken_reverts_feeToken_tokenAmountNotEqualToMsgValue() (gas: 22872) +EtherSenderReceiverTest_validateFeeToken:test_validateFeeToken_valid_feeToken() (gas: 18390) +EtherSenderReceiverTest_validateFeeToken:test_validateFeeToken_valid_native() (gas: 18420) +EtherSenderReceiverTest_validatedMessage:test_validatedMessage_dataOverwrittenToMsgSender() (gas: 34950) +EtherSenderReceiverTest_validatedMessage:test_validatedMessage_emptyDataOverwrittenToMsgSender() (gas: 34697) +EtherSenderReceiverTest_validatedMessage:test_validatedMessage_invalidTokenAmounts() (gas: 23796) +EtherSenderReceiverTest_validatedMessage:test_validatedMessage_tokenOverwrittenToWeth() (gas: 34674) +EtherSenderReceiverTest_validatedMessage:test_validatedMessage_validMessage_extraArgs() (gas: 36305) +FactoryBurnMintERC20approve:testApproveSuccess() (gas: 60127) +FactoryBurnMintERC20approve:testInvalidAddressReverts() (gas: 11582) +FactoryBurnMintERC20burn:testBasicBurnSuccess() (gas: 185624) +FactoryBurnMintERC20burn:testBurnFromZeroAddressReverts() (gas: 49428) +FactoryBurnMintERC20burn:testExceedsBalanceReverts() (gas: 23548) +FactoryBurnMintERC20burn:testSenderNotBurnerReverts() (gas: 14676) +FactoryBurnMintERC20burnFrom:testBurnFromSuccess() (gas: 61181) +FactoryBurnMintERC20burnFrom:testExceedsBalanceReverts() (gas: 38721) +FactoryBurnMintERC20burnFrom:testInsufficientAllowanceReverts() (gas: 23766) +FactoryBurnMintERC20burnFrom:testSenderNotBurnerReverts() (gas: 14676) +FactoryBurnMintERC20burnFromAlias:testBurnFromSuccess() (gas: 61156) +FactoryBurnMintERC20burnFromAlias:testExceedsBalanceReverts() (gas: 38685) +FactoryBurnMintERC20burnFromAlias:testInsufficientAllowanceReverts() (gas: 23721) +FactoryBurnMintERC20burnFromAlias:testSenderNotBurnerReverts() (gas: 14631) +FactoryBurnMintERC20constructor:testConstructorSuccess() (gas: 2643724) +FactoryBurnMintERC20decreaseApproval:testDecreaseApprovalSuccess() (gas: 35121) +FactoryBurnMintERC20grantMintAndBurnRoles:testGrantMintAndBurnRolesSuccess() (gas: 125501) +FactoryBurnMintERC20grantRole:testGrantBurnAccessSuccess() (gas: 56572) +FactoryBurnMintERC20grantRole:testGrantManySuccess() (gas: 991780) +FactoryBurnMintERC20grantRole:testGrantMintAccessSuccess() (gas: 97550) +FactoryBurnMintERC20increaseApproval:testIncreaseApprovalSuccess() (gas: 48899) +FactoryBurnMintERC20mint:testBasicMintSuccess() (gas: 153672) +FactoryBurnMintERC20mint:testMaxSupplyExceededReverts() (gas: 54629) +FactoryBurnMintERC20mint:testSenderNotMinterReverts() (gas: 12662) +FactoryBurnMintERC20supportsInterface:testConstructorSuccess() (gas: 13451) +FactoryBurnMintERC20transfer:testInvalidAddressReverts() (gas: 11580) +FactoryBurnMintERC20transfer:testTransferSuccess() (gas: 45387) +FeeQuoter_applyDestChainConfigUpdates:test_InvalidChainFamilySelector_Revert() (gas: 21287) +FeeQuoter_applyDestChainConfigUpdates:test_InvalidDestChainConfigDestChainSelectorEqZero_Revert() (gas: 21260) +FeeQuoter_applyDestChainConfigUpdates:test_applyDestChainConfigUpdatesDefaultTxGasLimitEqZero_Revert() (gas: 21273) +FeeQuoter_applyDestChainConfigUpdates:test_applyDestChainConfigUpdatesDefaultTxGasLimitGtMaxPerMessageGasLimit_Revert() (gas: 49746) +FeeQuoter_applyDestChainConfigUpdates:test_applyDestChainConfigUpdatesZeroIntput_Success() (gas: 13305) +FeeQuoter_applyDestChainConfigUpdates:test_applyDestChainConfigUpdates_Success() (gas: 168513) +FeeQuoter_applyFeeTokensUpdates:test_ApplyFeeTokensUpdates_Success() (gas: 92061) +FeeQuoter_applyFeeTokensUpdates:test_OnlyCallableByOwner_Revert() (gas: 14447) +FeeQuoter_applyPremiumMultiplierWeiPerEthUpdates:test_OnlyCallableByOwnerOrAdmin_Revert() (gas: 12564) +FeeQuoter_applyPremiumMultiplierWeiPerEthUpdates:test_applyPremiumMultiplierWeiPerEthUpdatesMultipleTokens_Success() (gas: 61121) +FeeQuoter_applyPremiumMultiplierWeiPerEthUpdates:test_applyPremiumMultiplierWeiPerEthUpdatesSingleToken_Success() (gas: 48797) +FeeQuoter_applyPremiumMultiplierWeiPerEthUpdates:test_applyPremiumMultiplierWeiPerEthUpdatesZeroInput() (gas: 13248) +FeeQuoter_applyTokenTransferFeeConfigUpdates:test_ApplyTokenTransferFeeConfig_Success() (gas: 118031) +FeeQuoter_applyTokenTransferFeeConfigUpdates:test_ApplyTokenTransferFeeZeroInput() (gas: 14427) +FeeQuoter_applyTokenTransferFeeConfigUpdates:test_InvalidDestBytesOverhead_Revert() (gas: 21388) +FeeQuoter_applyTokenTransferFeeConfigUpdates:test_OnlyCallableByOwnerOrAdmin_Revert() (gas: 13659) +FeeQuoter_constructor:test_InvalidLinkTokenEqZeroAddress_Revert() (gas: 127807) +FeeQuoter_constructor:test_InvalidMaxFeeJuelsPerMsg_Revert() (gas: 132149) +FeeQuoter_constructor:test_InvalidStalenessThreshold_Revert() (gas: 132196) +FeeQuoter_constructor:test_Setup_Success() (gas: 7908400) +FeeQuoter_convertTokenAmount:test_ConvertTokenAmount_Success() (gas: 74951) +FeeQuoter_convertTokenAmount:test_LinkTokenNotSupported_Revert() (gas: 34055) +FeeQuoter_getDataAvailabilityCost:test_EmptyMessageCalculatesDataAvailabilityCost_Success() (gas: 124958) +FeeQuoter_getDataAvailabilityCost:test_SimpleMessageCalculatesDataAvailabilityCostUnsupportedDestChainSelector_Success() (gas: 20691) +FeeQuoter_getDataAvailabilityCost:test_SimpleMessageCalculatesDataAvailabilityCost_Success() (gas: 33048) +FeeQuoter_getTokenAndGasPrices:test_GetFeeTokenAndGasPrices_Success() (gas: 73952) +FeeQuoter_getTokenAndGasPrices:test_StaleGasPrice_Revert() (gas: 19223) +FeeQuoter_getTokenAndGasPrices:test_UnsupportedChain_Revert() (gas: 17728) +FeeQuoter_getTokenAndGasPrices:test_ZeroGasPrice_Success() (gas: 47642) +FeeQuoter_getTokenPrice:test_GetTokenPriceFromFeed_Success() (gas: 74567) +FeeQuoter_getTokenPrices:test_GetTokenPrices_Success() (gas: 87892) +FeeQuoter_getTokenTransferCost:test_CustomTokenBpsFee_Success() (gas: 51274) +FeeQuoter_getTokenTransferCost:test_FeeTokenBpsFee_Success() (gas: 46576) +FeeQuoter_getTokenTransferCost:test_LargeTokenTransferChargesMaxFeeAndGas_Success() (gas: 39182) +FeeQuoter_getTokenTransferCost:test_MixedTokenTransferFee_Success() (gas: 161432) +FeeQuoter_getTokenTransferCost:test_NoTokenTransferChargesZeroFee_Success() (gas: 25553) +FeeQuoter_getTokenTransferCost:test_SmallTokenTransferChargesMinFeeAndGas_Success() (gas: 38832) +FeeQuoter_getTokenTransferCost:test_ZeroAmountTokenTransferChargesMinFeeAndGas_Success() (gas: 38788) +FeeQuoter_getTokenTransferCost:test_ZeroFeeConfigChargesMinFee_Success() (gas: 53538) +FeeQuoter_getTokenTransferCost:test_getTokenTransferCost_selfServeUsesDefaults_Success() (gas: 40215) +FeeQuoter_getValidatedFee:test_DestinationChainNotEnabled_Revert() (gas: 23180) +FeeQuoter_getValidatedFee:test_EmptyMessage_Success() (gas: 126780) +FeeQuoter_getValidatedFee:test_EnforceOutOfOrder_Revert() (gas: 65331) +FeeQuoter_getValidatedFee:test_HighGasMessage_Success() (gas: 298759) +FeeQuoter_getValidatedFee:test_InvalidEVMAddress_Revert() (gas: 27952) +FeeQuoter_getValidatedFee:test_MessageGasLimitTooHigh_Revert() (gas: 37814) +FeeQuoter_getValidatedFee:test_MessageTooLarge_Revert() (gas: 113039) +FeeQuoter_getValidatedFee:test_MessageWithDataAndTokenTransfer_Success() (gas: 244565) +FeeQuoter_getValidatedFee:test_NotAFeeToken_Revert() (gas: 26700) +FeeQuoter_getValidatedFee:test_SingleTokenMessage_Success() (gas: 189634) +FeeQuoter_getValidatedFee:test_TooManyTokens_Revert() (gas: 29755) +FeeQuoter_getValidatedFee:test_ZeroDataAvailabilityMultiplier_Success() (gas: 82721) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedErc20Above18Decimals_Success() (gas: 3425326) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedErc20Below18Decimals_Success() (gas: 3425261) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFeedAt0Decimals_Success() (gas: 3405403) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFeedAt18Decimals_Success() (gas: 3425009) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFlippedDecimals_Success() (gas: 3425222) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedMaxInt224Value_Success() (gas: 3425016) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedOverStalenessPeriod_Success() (gas: 71128) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeed_Success() (gas: 70962) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPrice_Success() (gas: 63583) +FeeQuoter_getValidatedTokenPrice:test_OverflowFeedPrice_Revert() (gas: 3424704) +FeeQuoter_getValidatedTokenPrice:test_StaleFeeToken_Success() (gas: 66998) +FeeQuoter_getValidatedTokenPrice:test_TokenNotSupportedFeed_Revert() (gas: 122906) +FeeQuoter_getValidatedTokenPrice:test_TokenNotSupported_Revert() (gas: 15635) +FeeQuoter_getValidatedTokenPrice:test_UnderflowFeedPrice_Revert() (gas: 3422488) +FeeQuoter_onReport:test_OnReport_StaleUpdate_Revert() (gas: 55021) +FeeQuoter_onReport:test_onReport_InvalidForwarder_Reverts() (gas: 27666) +FeeQuoter_onReport:test_onReport_Success() (gas: 98820) +FeeQuoter_onReport:test_onReport_UnsupportedToken_Reverts() (gas: 31209) +FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsDefault_Success() (gas: 23993) +FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsEnforceOutOfOrder_Revert() (gas: 28138) +FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsGasLimitTooHigh_Revert() (gas: 25276) +FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsInvalidExtraArgsTag_Revert() (gas: 24171) +FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsV1_Success() (gas: 25547) +FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsV2_Success() (gas: 26085) +FeeQuoter_processMessageArgs:test_processMessageArgs_InvalidEVMAddressDestToken_Revert() (gas: 53875) +FeeQuoter_processMessageArgs:test_processMessageArgs_InvalidExtraArgs_Revert() (gas: 22252) +FeeQuoter_processMessageArgs:test_processMessageArgs_MalformedEVMExtraArgs_Revert() (gas: 22714) +FeeQuoter_processMessageArgs:test_processMessageArgs_MessageFeeTooHigh_Revert() (gas: 20791) +FeeQuoter_processMessageArgs:test_processMessageArgs_SourceTokenDataTooLarge_Revert() (gas: 159879) +FeeQuoter_processMessageArgs:test_processMessageArgs_TokenAmountArraysMismatching_Revert() (gas: 49920) +FeeQuoter_processMessageArgs:test_processMessageArgs_WitEVMExtraArgsV2_Success() (gas: 37697) +FeeQuoter_processMessageArgs:test_processMessageArgs_WithConvertedTokenAmount_Success() (gas: 36217) +FeeQuoter_processMessageArgs:test_processMessageArgs_WithCorrectPoolReturnData_Success() (gas: 96367) +FeeQuoter_processMessageArgs:test_processMessageArgs_WithEVMExtraArgsV1_Success() (gas: 36520) +FeeQuoter_processMessageArgs:test_processMessageArgs_WithEmptyEVMExtraArgs_Success() (gas: 33576) +FeeQuoter_processMessageArgs:test_processMessageArgs_WithLinkTokenAmount_Success() (gas: 22717) +FeeQuoter_updatePrices:test_OnlyCallableByUpdater_Revert() (gas: 13531) +FeeQuoter_updatePrices:test_OnlyGasPrice_Success() (gas: 27566) +FeeQuoter_updatePrices:test_OnlyTokenPrice_Success() (gas: 32627) +FeeQuoter_updatePrices:test_UpdatableByAuthorizedCaller_Success() (gas: 83557) +FeeQuoter_updatePrices:test_UpdateMultiplePrices_Success() (gas: 165439) +FeeQuoter_updateTokenPriceFeeds:test_FeedNotUpdated() (gas: 57411) +FeeQuoter_updateTokenPriceFeeds:test_FeedUnset_Success() (gas: 75829) +FeeQuoter_updateTokenPriceFeeds:test_FeedUpdatedByNonOwner_Revert() (gas: 22380) +FeeQuoter_updateTokenPriceFeeds:test_MultipleFeedUpdate_Success() (gas: 101508) +FeeQuoter_updateTokenPriceFeeds:test_SingleFeedUpdate_Success() (gas: 57373) +FeeQuoter_updateTokenPriceFeeds:test_ZeroFeeds_Success() (gas: 13342) +FeeQuoter_validateDestFamilyAddress:test_InvalidEVMAddressEncodePacked_Revert() (gas: 12222) +FeeQuoter_validateDestFamilyAddress:test_InvalidEVMAddressPrecompiles_Revert() (gas: 5634878) +FeeQuoter_validateDestFamilyAddress:test_InvalidEVMAddress_Revert() (gas: 12371) +FeeQuoter_validateDestFamilyAddress:test_ValidEVMAddress_Success() (gas: 7769) +FeeQuoter_validateDestFamilyAddress:test_ValidNonEVMAddress_Success() (gas: 7345) +HybridUSDCTokenPoolMigrationTests:test_LockOrBurn_LockReleaseMechanism_then_switchToPrimary_Success() (gas: 234768) +HybridUSDCTokenPoolMigrationTests:test_LockOrBurn_PrimaryMechanism_Success() (gas: 150751) +HybridUSDCTokenPoolMigrationTests:test_LockOrBurn_WhileMigrationPause_Revert() (gas: 113661) +HybridUSDCTokenPoolMigrationTests:test_LockOrBurn_onLockReleaseMechanism_Success() (gas: 154754) +HybridUSDCTokenPoolMigrationTests:test_MintOrRelease_OnLockReleaseMechanism_Success() (gas: 233895) +HybridUSDCTokenPoolMigrationTests:test_MintOrRelease_OnLockReleaseMechanism_then_switchToPrimary_Success() (gas: 509579) +HybridUSDCTokenPoolMigrationTests:test_MintOrRelease_incomingMessageWithPrimaryMechanism() (gas: 327065) +HybridUSDCTokenPoolMigrationTests:test_ReleaseOrMint_WhileMigrationPause_Revert() (gas: 122081) +HybridUSDCTokenPoolMigrationTests:test_burnLockedUSDC_invalidPermissions_Revert() (gas: 41448) +HybridUSDCTokenPoolMigrationTests:test_cancelExistingCCTPMigrationProposal() (gas: 35499) +HybridUSDCTokenPoolMigrationTests:test_cannotCancelANonExistentMigrationProposal() (gas: 12889) +HybridUSDCTokenPoolMigrationTests:test_cannotModifyLiquidityWithoutPermissions_Revert() (gas: 15409) +HybridUSDCTokenPoolMigrationTests:test_cannotTransferLiquidityDuringPendingMigration_Revert() (gas: 167516) +HybridUSDCTokenPoolMigrationTests:test_lockOrBurn_then_BurnInCCTPMigration_Success() (gas: 283817) +HybridUSDCTokenPoolMigrationTests:test_transferLiquidity_Success() (gas: 176428) +HybridUSDCTokenPoolMigrationTests:test_unstickManualTxAfterMigration_destChain_Success() (gas: 176729) +HybridUSDCTokenPoolMigrationTests:test_unstickManualTxAfterMigration_homeChain_Success() (gas: 538840) +HybridUSDCTokenPoolTests:test_LockOrBurn_LockReleaseMechanism_then_switchToPrimary_Success() (gas: 234786) +HybridUSDCTokenPoolTests:test_LockOrBurn_PrimaryMechanism_Success() (gas: 150729) +HybridUSDCTokenPoolTests:test_LockOrBurn_WhileMigrationPause_Revert() (gas: 113683) +HybridUSDCTokenPoolTests:test_LockOrBurn_onLockReleaseMechanism_Success() (gas: 154776) +HybridUSDCTokenPoolTests:test_MintOrRelease_OnLockReleaseMechanism_Success() (gas: 233917) +HybridUSDCTokenPoolTests:test_MintOrRelease_OnLockReleaseMechanism_then_switchToPrimary_Success() (gas: 509534) +HybridUSDCTokenPoolTests:test_MintOrRelease_incomingMessageWithPrimaryMechanism() (gas: 327020) +HybridUSDCTokenPoolTests:test_ReleaseOrMint_WhileMigrationPause_Revert() (gas: 122147) +HybridUSDCTokenPoolTests:test_cannotTransferLiquidityDuringPendingMigration_Revert() (gas: 167494) +HybridUSDCTokenPoolTests:test_transferLiquidity_Success() (gas: 176445) +LockReleaseTokenPoolAndProxy_setRebalancer:test_SetRebalancer_Revert() (gas: 11968) +LockReleaseTokenPoolAndProxy_setRebalancer:test_SetRebalancer_Success() (gas: 19761) +LockReleaseTokenPoolPoolAndProxy_canAcceptLiquidity:test_CanAcceptLiquidity_Success() (gas: 5147538) +LockReleaseTokenPoolPoolAndProxy_provideLiquidity:test_LiquidityNotAccepted_Revert() (gas: 5143388) +LockReleaseTokenPoolPoolAndProxy_provideLiquidity:test_Unauthorized_Revert() (gas: 12683) +LockReleaseTokenPoolPoolAndProxy_supportsInterface:test_SupportsInterface_Success() (gas: 11613) +LockReleaseTokenPoolPoolAndProxy_withdrawalLiquidity:test_InsufficientLiquidity_Revert() (gas: 64820) +LockReleaseTokenPoolPoolAndProxy_withdrawalLiquidity:test_Unauthorized_Revert() (gas: 12647) +LockReleaseTokenPool_canAcceptLiquidity:test_CanAcceptLiquidity_Success() (gas: 4775338) +LockReleaseTokenPool_lockOrBurn:test_LockOrBurnWithAllowList_Revert() (gas: 33986) +LockReleaseTokenPool_lockOrBurn:test_LockOrBurnWithAllowList_Success() (gas: 91128) +LockReleaseTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 64965) +LockReleaseTokenPool_provideLiquidity:test_LiquidityNotAccepted_Revert() (gas: 4771254) +LockReleaseTokenPool_provideLiquidity:test_Unauthorized_Revert() (gas: 12661) +LockReleaseTokenPool_releaseOrMint:test_ChainNotAllowed_Revert() (gas: 81914) +LockReleaseTokenPool_releaseOrMint:test_PoolMintNotHealthy_Revert() (gas: 63333) +LockReleaseTokenPool_releaseOrMint:test_ReleaseOrMint_Success() (gas: 274666) +LockReleaseTokenPool_setRebalancer:test_SetRebalancer_Revert() (gas: 11990) +LockReleaseTokenPool_setRebalancer:test_SetRebalancer_Success() (gas: 19783) +LockReleaseTokenPool_supportsInterface:test_SupportsInterface_Success() (gas: 11613) +LockReleaseTokenPool_transferLiquidity:test_transferLiquidity_Success() (gas: 88490) +LockReleaseTokenPool_transferLiquidity:test_transferLiquidity_transferTooMuch_Revert() (gas: 59808) +LockReleaseTokenPool_withdrawalLiquidity:test_InsufficientLiquidity_Revert() (gas: 64803) +LockReleaseTokenPool_withdrawalLiquidity:test_Unauthorized_Revert() (gas: 12647) +LockRelease_setRateLimitAdmin:test_SetRateLimitAdmin_Revert() (gas: 12033) +LockRelease_setRateLimitAdmin:test_SetRateLimitAdmin_Success() (gas: 36728) +MerkleMultiProofTest:test_CVE_2023_34459() (gas: 6372) +MerkleMultiProofTest:test_EmptyLeaf_Revert() (gas: 4019) +MerkleMultiProofTest:test_MerkleRoot256() (gas: 668330) +MerkleMultiProofTest:test_MerkleRootSingleLeaf_Success() (gas: 4074) +MerkleMultiProofTest:test_SpecSync_gas() (gas: 49338) +MockRouterTest:test_ccipSendWithInsufficientNativeTokens_Revert() (gas: 37132) +MockRouterTest:test_ccipSendWithInvalidMsgValue_Revert() (gas: 64034) +MockRouterTest:test_ccipSendWithLinkFeeTokenAndValidMsgValue_Success() (gas: 135267) +MockRouterTest:test_ccipSendWithLinkFeeTokenbutInsufficientAllowance_Revert() (gas: 68119) +MockRouterTest:test_ccipSendWithSufficientNativeFeeTokens_Success() (gas: 48403) +MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_MultipleConfigsBothLanes_Success() (gas: 150584) +MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_MultipleConfigs_Success() (gas: 357431) +MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_OnlyCallableByOwner_Revert() (gas: 20693) +MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_SingleConfigOutbound_Success() (gas: 85456) +MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_SingleConfig_Success() (gas: 85382) +MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_UpdateExistingConfigWithNoDifference_Success() (gas: 49626) +MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_UpdateExistingConfig_Success() (gas: 68052) +MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_ZeroChainSelector_Revert() (gas: 19536) +MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_ZeroConfigs_Success() (gas: 13331) +MultiAggregateRateLimiter_constructor:test_ConstructorNoAuthorizedCallers_Success() (gas: 3286151) +MultiAggregateRateLimiter_constructor:test_Constructor_Success() (gas: 3403578) +MultiAggregateRateLimiter_getTokenBucket:test_GetTokenBucket_Success() (gas: 38652) +MultiAggregateRateLimiter_getTokenBucket:test_Refill_Success() (gas: 63823) +MultiAggregateRateLimiter_getTokenBucket:test_TimeUnderflow_Revert() (gas: 18548) +MultiAggregateRateLimiter_getTokenValue:test_GetTokenValue_Success() (gas: 20837) +MultiAggregateRateLimiter_getTokenValue:test_NoTokenPrice_Reverts() (gas: 25361) +MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageFromUnauthorizedCaller_Revert() (gas: 17951) +MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithDifferentTokensOnDifferentChains_Success() (gas: 242409) +MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithDisabledRateLimitToken_Success() (gas: 68454) +MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithNoTokens_Success() (gas: 21034) +MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithRateLimitDisabled_Success() (gas: 53968) +MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithRateLimitExceeded_Revert() (gas: 56502) +MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithRateLimitReset_Success() (gas: 108389) +MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithTokensOnDifferentChains_Success() (gas: 344604) +MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithTokens_Success() (gas: 60097) +MultiAggregateRateLimiter_onOutboundMessage:test_RateLimitValueDifferentLanes_Success() (gas: 1073657377) +MultiAggregateRateLimiter_onOutboundMessage:test_ValidateMessageWithNoTokens_Success() (gas: 21497) +MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageFromUnauthorizedCaller_Revert() (gas: 18167) +MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithDifferentTokensOnDifferentChains_Success() (gas: 240199) +MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithDisabledRateLimitToken_Success() (gas: 69225) +MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithRateLimitDisabled_Success() (gas: 54803) +MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithRateLimitExceeded_Revert() (gas: 57316) +MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithRateLimitReset_Success() (gas: 105576) +MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithTokensOnDifferentChains_Success() (gas: 342731) +MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithTokens_Success() (gas: 60912) +MultiAggregateRateLimiter_setFeeQuoter:test_OnlyOwner_Revert() (gas: 12286) +MultiAggregateRateLimiter_setFeeQuoter:test_Owner_Success() (gas: 20439) +MultiAggregateRateLimiter_setFeeQuoter:test_ZeroAddress_Revert() (gas: 11124) +MultiAggregateRateLimiter_updateRateLimitTokens:test_NonOwner_Revert() (gas: 26352) +MultiAggregateRateLimiter_updateRateLimitTokens:test_UpdateRateLimitTokensMultipleChains_Success() (gas: 292916) +MultiAggregateRateLimiter_updateRateLimitTokens:test_UpdateRateLimitTokensSingleChain_Success() (gas: 265872) +MultiAggregateRateLimiter_updateRateLimitTokens:test_UpdateRateLimitTokens_AddsAndRemoves_Success() (gas: 214939) +MultiAggregateRateLimiter_updateRateLimitTokens:test_UpdateRateLimitTokens_RemoveNonExistentToken_Success() (gas: 32607) +MultiAggregateRateLimiter_updateRateLimitTokens:test_ZeroDestToken_Revert() (gas: 21085) +MultiAggregateRateLimiter_updateRateLimitTokens:test_ZeroSourceToken_Revert() (gas: 20891) +MultiOCR3Base_setOCR3Configs:test_FMustBePositive_Revert() (gas: 72005) +MultiOCR3Base_setOCR3Configs:test_FTooHigh_Revert() (gas: 49229) +MultiOCR3Base_setOCR3Configs:test_MoreTransmittersThanSigners_Revert() (gas: 115903) +MultiOCR3Base_setOCR3Configs:test_NoTransmitters_Revert() (gas: 23219) +MultiOCR3Base_setOCR3Configs:test_RepeatSignerAddress_Revert() (gas: 296831) +MultiOCR3Base_setOCR3Configs:test_RepeatTransmitterAddress_Revert() (gas: 437346) +MultiOCR3Base_setOCR3Configs:test_SetConfigIgnoreSigners_Success() (gas: 557001) +MultiOCR3Base_setOCR3Configs:test_SetConfigWithSignersMismatchingTransmitters_Success() (gas: 719687) +MultiOCR3Base_setOCR3Configs:test_SetConfigWithSigners_Success() (gas: 874847) +MultiOCR3Base_setOCR3Configs:test_SetConfigWithoutSigners_Success() (gas: 486312) +MultiOCR3Base_setOCR3Configs:test_SetConfigsZeroInput_Success() (gas: 13373) +MultiOCR3Base_setOCR3Configs:test_SetMultipleConfigs_Success() (gas: 2266810) +MultiOCR3Base_setOCR3Configs:test_SignerCannotBeZeroAddress_Revert() (gas: 152944) +MultiOCR3Base_setOCR3Configs:test_StaticConfigChange_Revert() (gas: 841242) +MultiOCR3Base_setOCR3Configs:test_TooManySigners_Revert() (gas: 312041) +MultiOCR3Base_setOCR3Configs:test_TooManyTransmitters_Revert() (gas: 261347) +MultiOCR3Base_setOCR3Configs:test_TransmitterCannotBeZeroAddress_Revert() (gas: 266581) +MultiOCR3Base_setOCR3Configs:test_UpdateConfigSigners_Success() (gas: 930576) +MultiOCR3Base_setOCR3Configs:test_UpdateConfigTransmittersWithoutSigners_Success() (gas: 516830) +MultiOCR3Base_transmit:test_ConfigDigestMismatch_Revert() (gas: 49771) +MultiOCR3Base_transmit:test_ForkedChain_Revert() (gas: 56488) +MultiOCR3Base_transmit:test_InsufficientSignatures_Revert() (gas: 87043) +MultiOCR3Base_transmit:test_NonUniqueSignature_Revert() (gas: 75511) +MultiOCR3Base_transmit:test_SignatureOutOfRegistration_Revert() (gas: 38453) +MultiOCR3Base_transmit:test_TooManySignatures_Revert() (gas: 92076) +MultiOCR3Base_transmit:test_TransmitSigners_gas_Success() (gas: 39865) +MultiOCR3Base_transmit:test_TransmitWithExtraCalldataArgs_Revert() (gas: 52756) +MultiOCR3Base_transmit:test_TransmitWithLessCalldataArgs_Revert() (gas: 30083) +MultiOCR3Base_transmit:test_TransmitWithoutSignatureVerification_gas_Success() (gas: 21035) +MultiOCR3Base_transmit:test_UnAuthorizedTransmitter_Revert() (gas: 29105) +MultiOCR3Base_transmit:test_UnauthorizedSigner_Revert() (gas: 69917) +MultiOCR3Base_transmit:test_UnconfiguredPlugin_Revert() (gas: 42537) +MultiOCR3Base_transmit:test_ZeroSignatures_Revert() (gas: 37478) +MultiOnRampTokenPoolReentrancy:test_OnRampTokenPoolReentrancy_Success() (gas: 304717) +MultiRampsE2E:test_E2E_3MessagesMMultiOffRampSuccess_gas() (gas: 1923206) +NonceManager_NonceIncrementation:test_getIncrementedOutboundNonce_Success() (gas: 40448) +NonceManager_NonceIncrementation:test_incrementInboundNonce_Skip() (gas: 27403) +NonceManager_NonceIncrementation:test_incrementInboundNonce_Success() (gas: 41879) +NonceManager_NonceIncrementation:test_incrementNoncesInboundAndOutbound_Success() (gas: 79874) +NonceManager_OffRampUpgrade:test_NoPrevOffRampForChain_Success() (gas: 316303) +NonceManager_OffRampUpgrade:test_UpgradedNonceNewSenderStartsAtZero_Success() (gas: 322476) +NonceManager_OffRampUpgrade:test_UpgradedNonceStartsAtV1Nonce_Success() (gas: 417220) +NonceManager_OffRampUpgrade:test_UpgradedOffRampNonceSkipsIfMsgInFlight_Success() (gas: 375446) +NonceManager_OffRampUpgrade:test_UpgradedSenderNoncesReadsPreviousRampTransitive_Success() (gas: 327638) +NonceManager_OffRampUpgrade:test_UpgradedSenderNoncesReadsPreviousRamp_Success() (gas: 313211) +NonceManager_OffRampUpgrade:test_Upgraded_Success() (gas: 183449) +NonceManager_OnRampUpgrade:test_UpgradeNonceNewSenderStartsAtZero_Success() (gas: 193661) +NonceManager_OnRampUpgrade:test_UpgradeNonceStartsAtV1Nonce_Success() (gas: 268468) +NonceManager_OnRampUpgrade:test_UpgradeSenderNoncesReadsPreviousRamp_Success() (gas: 153619) +NonceManager_OnRampUpgrade:test_Upgrade_Success() (gas: 125821) +NonceManager_applyPreviousRampsUpdates:test_MultipleRampsUpdates() (gas: 134448) +NonceManager_applyPreviousRampsUpdates:test_PreviousRampAlreadySetOffRamp_Revert() (gas: 47118) +NonceManager_applyPreviousRampsUpdates:test_PreviousRampAlreadySetOnRampAndOffRamp_Revert() (gas: 69128) +NonceManager_applyPreviousRampsUpdates:test_PreviousRampAlreadySetOnRamp_Revert() (gas: 46949) +NonceManager_applyPreviousRampsUpdates:test_SingleRampUpdate() (gas: 72431) +NonceManager_applyPreviousRampsUpdates:test_ZeroInput() (gas: 12892) +NonceManager_typeAndVersion:test_typeAndVersion() (gas: 10623) +OCR2BaseNoChecks_setOCR2Config:test_FMustBePositive_Revert() (gas: 15443) +OCR2BaseNoChecks_setOCR2Config:test_RepeatAddress_Revert() (gas: 48841) +OCR2BaseNoChecks_setOCR2Config:test_SetConfigSuccess_gas() (gas: 97138) +OCR2BaseNoChecks_setOCR2Config:test_TooManyTransmitter_Revert() (gas: 75615) +OCR2BaseNoChecks_setOCR2Config:test_TransmitterCannotBeZeroAddress_Revert() (gas: 32515) +OCR2BaseNoChecks_transmit:test_ConfigDigestMismatch_Revert() (gas: 20081) +OCR2BaseNoChecks_transmit:test_ForkedChain_Revert() (gas: 29888) +OCR2BaseNoChecks_transmit:test_TransmitSuccess_gas() (gas: 30530) +OCR2BaseNoChecks_transmit:test_UnAuthorizedTransmitter_Revert() (gas: 25249) +OCR2Base_setOCR2Config:test_FMustBePositive_Revert() (gas: 15449) +OCR2Base_setOCR2Config:test_FTooHigh_Revert() (gas: 15725) +OCR2Base_setOCR2Config:test_OracleOutOfRegister_Revert() (gas: 21647) +OCR2Base_setOCR2Config:test_RepeatAddress_Revert() (gas: 56234) +OCR2Base_setOCR2Config:test_SetConfigSuccess_gas() (gas: 169648) +OCR2Base_setOCR2Config:test_SingerCannotBeZeroAddress_Revert() (gas: 32751) +OCR2Base_setOCR2Config:test_TooManySigners_Revert() (gas: 34759) +OCR2Base_setOCR2Config:test_TransmitterCannotBeZeroAddress_Revert() (gas: 55992) +OCR2Base_transmit:test_ConfigDigestMismatch_Revert() (gas: 22520) +OCR2Base_transmit:test_ForkedChain_Revert() (gas: 42561) +OCR2Base_transmit:test_NonUniqueSignature_Revert() (gas: 62252) +OCR2Base_transmit:test_SignatureOutOfRegistration_Revert() (gas: 24538) +OCR2Base_transmit:test_Transmit2SignersSuccess_gas() (gas: 58490) +OCR2Base_transmit:test_UnAuthorizedTransmitter_Revert() (gas: 27448) +OCR2Base_transmit:test_UnauthorizedSigner_Revert() (gas: 45597) +OCR2Base_transmit:test_WrongNumberOfSignatures_Revert() (gas: 23593) +OffRamp_afterOC3ConfigSet:test_afterOCR3ConfigSet_SignatureVerificationDisabled_Revert() (gas: 9301256) +OffRamp_applySourceChainConfigUpdates:test_AddMultipleChains_Success() (gas: 652186) +OffRamp_applySourceChainConfigUpdates:test_AddNewChain_Success() (gas: 174768) +OffRamp_applySourceChainConfigUpdates:test_ApplyZeroUpdates_Success() (gas: 18224) +OffRamp_applySourceChainConfigUpdates:test_InvalidOnRampUpdate_Revert() (gas: 298010) +OffRamp_applySourceChainConfigUpdates:test_ReplaceExistingChainOnRamp_Success() (gas: 177903) +OffRamp_applySourceChainConfigUpdates:test_ReplaceExistingChain_Success() (gas: 195423) +OffRamp_applySourceChainConfigUpdates:test_RouterAddress_Revert() (gas: 15779) +OffRamp_applySourceChainConfigUpdates:test_ZeroOnRampAddress_Revert() (gas: 77864) +OffRamp_applySourceChainConfigUpdates:test_ZeroSourceChainSelector_Revert() (gas: 17916) +OffRamp_batchExecute:test_MultipleReportsDifferentChainsSkipCursedChain_Success() (gas: 224127) +OffRamp_batchExecute:test_MultipleReportsDifferentChains_Success() (gas: 426084) +OffRamp_batchExecute:test_MultipleReportsSameChain_Success() (gas: 369040) +OffRamp_batchExecute:test_MultipleReportsSkipDuplicate_Success() (gas: 208148) +OffRamp_batchExecute:test_OutOfBoundsGasLimitsAccess_Revert() (gas: 239377) +OffRamp_batchExecute:test_SingleReport_Success() (gas: 188697) +OffRamp_batchExecute:test_Unhealthy_Success() (gas: 717417) +OffRamp_batchExecute:test_ZeroReports_Revert() (gas: 12110) +OffRamp_ccipReceive:test_Reverts() (gas: 18775) +OffRamp_commit:test_CommitOnRampMismatch_Revert() (gas: 109720) +OffRamp_commit:test_FailedRMNVerification_Reverts() (gas: 77314) +OffRamp_commit:test_InvalidIntervalMinLargerThanMax_Revert() (gas: 83071) +OffRamp_commit:test_InvalidInterval_Revert() (gas: 77116) +OffRamp_commit:test_InvalidRootRevert() (gas: 75631) +OffRamp_commit:test_NoConfigWithOtherConfigPresent_Revert() (gas: 10104182) +OffRamp_commit:test_NoConfig_Revert() (gas: 9678313) +OffRamp_commit:test_OnlyGasPriceUpdates_Success() (gas: 130728) +OffRamp_commit:test_OnlyPriceUpdateStaleReport_Revert() (gas: 147353) +OffRamp_commit:test_OnlyTokenPriceUpdates_Success() (gas: 130749) +OffRamp_commit:test_PriceSequenceNumberCleared_Success() (gas: 424203) +OffRamp_commit:test_ReportAndPriceUpdate_Success() (gas: 190103) +OffRamp_commit:test_ReportOnlyRootSuccess_gas() (gas: 161941) +OffRamp_commit:test_RootAlreadyCommitted_Revert() (gas: 176263) +OffRamp_commit:test_SourceChainNotEnabled_Revert() (gas: 72480) +OffRamp_commit:test_StaleReportWithRoot_Success() (gas: 280609) +OffRamp_commit:test_UnauthorizedTransmitter_Revert() (gas: 144515) +OffRamp_commit:test_Unhealthy_Revert() (gas: 71728) +OffRamp_commit:test_ValidPriceUpdateThenStaleReportWithRoot_Success() (gas: 250314) +OffRamp_commit:test_ZeroEpochAndRound_Revert() (gas: 61202) +OffRamp_constructor:test_Constructor_Success() (gas: 9638677) +OffRamp_constructor:test_SourceChainSelector_Revert() (gas: 149544) +OffRamp_constructor:test_ZeroChainSelector_Revert() (gas: 113479) +OffRamp_constructor:test_ZeroNonceManager_Revert() (gas: 111281) +OffRamp_constructor:test_ZeroOnRampAddress_Revert() (gas: 175098) +OffRamp_constructor:test_ZeroRMNRemote_Revert() (gas: 111283) +OffRamp_constructor:test_ZeroTokenAdminRegistry_Revert() (gas: 111228) +OffRamp_execute:test_IncorrectArrayType_Revert() (gas: 19670) +OffRamp_execute:test_LargeBatch_Success() (gas: 4789695) +OffRamp_execute:test_MultipleReportsWithPartialValidationFailures_Success() (gas: 462410) +OffRamp_execute:test_MultipleReports_Success() (gas: 392458) +OffRamp_execute:test_NoConfigWithOtherConfigPresent_Revert() (gas: 10528542) +OffRamp_execute:test_NoConfig_Revert() (gas: 9735461) +OffRamp_execute:test_NonArray_Revert() (gas: 34048) +OffRamp_execute:test_SingleReport_Success() (gas: 209336) +OffRamp_execute:test_UnauthorizedTransmitter_Revert() (gas: 173222) +OffRamp_execute:test_WrongConfigWithSigners_Revert() (gas: 10536285) +OffRamp_execute:test_ZeroReports_Revert() (gas: 19285) +OffRamp_executeSingleMessage:test_MessageSender_Revert() (gas: 23999) +OffRamp_executeSingleMessage:test_NonContractWithTokens_Success() (gas: 277760) +OffRamp_executeSingleMessage:test_NonContract_Success() (gas: 26498) +OffRamp_executeSingleMessage:test_TokenHandlingError_Revert() (gas: 236604) +OffRamp_executeSingleMessage:test_ZeroGasDONExecution_Revert() (gas: 61012) +OffRamp_executeSingleMessage:test_executeSingleMessage_NoTokens_Success() (gas: 60154) +OffRamp_executeSingleMessage:test_executeSingleMessage_WithFailingValidationNoRouterCall_Revert() (gas: 267116) +OffRamp_executeSingleMessage:test_executeSingleMessage_WithFailingValidation_Revert() (gas: 98105) +OffRamp_executeSingleMessage:test_executeSingleMessage_WithTokens_Success() (gas: 320820) +OffRamp_executeSingleMessage:test_executeSingleMessage_WithVInterception_Success() (gas: 108693) +OffRamp_executeSingleReport:test_DisabledSourceChain_Revert() (gas: 36788) +OffRamp_executeSingleReport:test_EmptyReport_Revert() (gas: 24567) +OffRamp_executeSingleReport:test_InvalidSourcePoolAddress_Success() (gas: 595880) +OffRamp_executeSingleReport:test_ManualExecutionNotYetEnabled_Revert() (gas: 60490) +OffRamp_executeSingleReport:test_MismatchingDestChainSelector_Revert() (gas: 42477) +OffRamp_executeSingleReport:test_NonExistingSourceChain_Revert() (gas: 37234) +OffRamp_executeSingleReport:test_ReceiverError_Success() (gas: 221934) +OffRamp_executeSingleReport:test_RetryFailedMessageWithoutManualExecution_Revert() (gas: 238001) +OffRamp_executeSingleReport:test_RootNotCommitted_Revert() (gas: 52368) +OffRamp_executeSingleReport:test_RouterYULCall_Revert() (gas: 625062) +OffRamp_executeSingleReport:test_SingleMessageNoTokensOtherChain_Success() (gas: 298001) +OffRamp_executeSingleReport:test_SingleMessageNoTokensUnordered_Success() (gas: 252989) +OffRamp_executeSingleReport:test_SingleMessageNoTokens_Success() (gas: 272016) +OffRamp_executeSingleReport:test_SingleMessageToNonCCIPReceiver_Success() (gas: 307376) +OffRamp_executeSingleReport:test_SingleMessagesNoTokensSuccess_gas() (gas: 168302) +OffRamp_executeSingleReport:test_SkippedIncorrectNonceStillExecutes_Success() (gas: 502248) +OffRamp_executeSingleReport:test_SkippedIncorrectNonce_Success() (gas: 72021) +OffRamp_executeSingleReport:test_TokenDataMismatch_Revert() (gas: 86553) +OffRamp_executeSingleReport:test_TwoMessagesWithTokensAndGE_Success() (gas: 733747) +OffRamp_executeSingleReport:test_TwoMessagesWithTokensSuccess_gas() (gas: 666564) +OffRamp_executeSingleReport:test_UnexpectedTokenData_Revert() (gas: 42472) +OffRamp_executeSingleReport:test_UnhealthySingleChainCurse_Revert() (gas: 710808) +OffRamp_executeSingleReport:test_Unhealthy_Success() (gas: 710811) +OffRamp_executeSingleReport:test_WithCurseOnAnotherSourceChain_Success() (gas: 574200) +OffRamp_executeSingleReport:test__execute_SkippedAlreadyExecutedMessageUnordered_Success() (gas: 172842) +OffRamp_executeSingleReport:test__execute_SkippedAlreadyExecutedMessage_Success() (gas: 202303) +OffRamp_getExecutionState:test_FillExecutionState_Success() (gas: 5720172) +OffRamp_getExecutionState:test_GetDifferentChainExecutionState_Success() (gas: 148136) +OffRamp_getExecutionState:test_GetExecutionState_Success() (gas: 111630) +OffRamp_manuallyExecute:test_ManualExecGasLimitMismatchSingleReport_Revert() (gas: 127758) +OffRamp_manuallyExecute:test_manuallyExecute_DestinationGasAmountCountMismatch_Revert() (gas: 103837) +OffRamp_manuallyExecute:test_manuallyExecute_DoesNotRevertIfUntouched_Success() (gas: 208337) +OffRamp_manuallyExecute:test_manuallyExecute_FailedTx_Revert() (gas: 261274) +OffRamp_manuallyExecute:test_manuallyExecute_ForkedChain_Revert() (gas: 37621) +OffRamp_manuallyExecute:test_manuallyExecute_GasLimitMismatchMultipleReports_Revert() (gas: 267225) +OffRamp_manuallyExecute:test_manuallyExecute_InvalidReceiverExecutionGasLimit_Revert() (gas: 38149) +OffRamp_manuallyExecute:test_manuallyExecute_InvalidTokenGasOverride_Revert() (gas: 72989) +OffRamp_manuallyExecute:test_manuallyExecute_LowGasLimit_Success() (gas: 742493) +OffRamp_manuallyExecute:test_manuallyExecute_MultipleReportsWithSingleCursedLane_Revert() (gas: 408959) +OffRamp_manuallyExecute:test_manuallyExecute_ReentrancyFails_Success() (gas: 3573893) +OffRamp_manuallyExecute:test_manuallyExecute_SourceChainSelectorMismatch_Revert() (gas: 199675) +OffRamp_manuallyExecute:test_manuallyExecute_Success() (gas: 279996) +OffRamp_manuallyExecute:test_manuallyExecute_WithGasOverride_Success() (gas: 280692) +OffRamp_manuallyExecute:test_manuallyExecute_WithMultiReportGasOverride_Success() (gas: 1033938) +OffRamp_manuallyExecute:test_manuallyExecute_WithPartialMessages_Success() (gas: 461966) +OffRamp_releaseOrMintSingleToken:test__releaseOrMintSingleToken_NotACompatiblePool_Revert() (gas: 47670) +OffRamp_releaseOrMintSingleToken:test__releaseOrMintSingleToken_Success() (gas: 121919) +OffRamp_releaseOrMintSingleToken:test__releaseOrMintSingleToken_TokenHandlingError_transfer_Revert() (gas: 99377) +OffRamp_releaseOrMintSingleToken:test_releaseOrMintToken_InvalidDataLength_Revert() (gas: 44074) +OffRamp_releaseOrMintSingleToken:test_releaseOrMintToken_ReleaseOrMintBalanceMismatch_Revert() (gas: 109868) +OffRamp_releaseOrMintSingleToken:test_releaseOrMintToken_TokenHandlingError_BalanceOf_Revert() (gas: 46405) +OffRamp_releaseOrMintSingleToken:test_releaseOrMintToken_skip_ReleaseOrMintBalanceMismatch_if_pool_Revert() (gas: 101128) +OffRamp_releaseOrMintTokens:test_TokenHandlingError_Reverts() (gas: 187037) +OffRamp_releaseOrMintTokens:test__releaseOrMintTokens_PoolIsNotAPool_Reverts() (gas: 28901) +OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_InvalidDataLengthReturnData_Revert() (gas: 74851) +OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_PoolDoesNotSupportDest_Reverts() (gas: 94066) +OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_Success() (gas: 206891) +OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_WithGasOverride_Success() (gas: 209712) +OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_destDenominatedDecimals_Success() (gas: 217613) +OffRamp_setDynamicConfig:test_FeeQuoterZeroAddress_Revert() (gas: 12546) +OffRamp_setDynamicConfig:test_NonOwner_Revert() (gas: 15551) +OffRamp_setDynamicConfig:test_SetDynamicConfigWithInterceptor_Success() (gas: 50773) +OffRamp_setDynamicConfig:test_SetDynamicConfig_Success() (gas: 28739) +OffRamp_trialExecute:test_RateLimitError_Success() (gas: 259646) +OffRamp_trialExecute:test_TokenHandlingErrorIsCaught_Success() (gas: 269756) +OffRamp_trialExecute:test_TokenPoolIsNotAContract_Success() (gas: 386699) +OffRamp_trialExecute:test_trialExecute_Success() (gas: 329723) +OnRampTokenPoolReentrancy:test_OnRampTokenPoolReentrancy_Success() (gas: 508639) +OnRamp_applyAllowListUpdates:test_applyAllowListUpdates_InvalidAllowListRequestDisabledAllowListWithAdds() (gas: 21134) +OnRamp_applyAllowListUpdates:test_applyAllowListUpdates_Revert() (gas: 80371) +OnRamp_applyAllowListUpdates:test_applyAllowListUpdates_Success() (gas: 354856) +OnRamp_applyDestChainConfigUpdates:test_ApplyDestChainConfigUpdates_Success() (gas: 78476) +OnRamp_applyDestChainConfigUpdates:test_ApplyDestChainConfigUpdates_WithInvalidChainSelector_Revert() (gas: 15598) +OnRamp_constructor:test_Constructor_InvalidConfigChainSelectorEqZero_Revert() (gas: 102324) +OnRamp_constructor:test_Constructor_InvalidConfigNonceManagerEqAddressZero_Revert() (gas: 100230) +OnRamp_constructor:test_Constructor_InvalidConfigRMNProxyEqAddressZero_Revert() (gas: 105216) +OnRamp_constructor:test_Constructor_InvalidConfigTokenAdminRegistryEqAddressZero_Revert() (gas: 100261) +OnRamp_constructor:test_Constructor_Success() (gas: 4351170) +OnRamp_forwardFromRouter:test_ForwardFromRouterExtraArgsV2AllowOutOfOrderTrue_Success() (gas: 134178) +OnRamp_forwardFromRouter:test_ForwardFromRouterExtraArgsV2_Success() (gas: 166106) +OnRamp_forwardFromRouter:test_ForwardFromRouterSuccessCustomExtraArgs() (gas: 165015) +OnRamp_forwardFromRouter:test_ForwardFromRouterSuccessEmptyExtraArgs() (gas: 162157) +OnRamp_forwardFromRouter:test_ForwardFromRouterSuccessLegacyExtraArgs() (gas: 165256) +OnRamp_forwardFromRouter:test_ForwardFromRouter_Success() (gas: 164297) +OnRamp_forwardFromRouter:test_ForwardFromRouter_Success_ConfigurableSourceRouter() (gas: 162704) +OnRamp_forwardFromRouter:test_InvalidExtraArgsTag_Revert() (gas: 42724) +OnRamp_forwardFromRouter:test_MessageInterceptionError_Revert() (gas: 159155) +OnRamp_forwardFromRouter:test_MesssageFeeTooHigh_Revert() (gas: 41378) +OnRamp_forwardFromRouter:test_MultiCannotSendZeroTokens_Revert() (gas: 40275) +OnRamp_forwardFromRouter:test_OriginalSender_Revert() (gas: 20626) +OnRamp_forwardFromRouter:test_Paused_Revert() (gas: 44273) +OnRamp_forwardFromRouter:test_Permissions_Revert() (gas: 26244) +OnRamp_forwardFromRouter:test_ShouldIncrementNonceOnlyOnOrdered_Success() (gas: 248063) +OnRamp_forwardFromRouter:test_ShouldIncrementSeqNumAndNonce_Success() (gas: 275230) +OnRamp_forwardFromRouter:test_ShouldStoreLinkFees() (gas: 166769) +OnRamp_forwardFromRouter:test_ShouldStoreNonLinkFees() (gas: 185253) +OnRamp_forwardFromRouter:test_SourceTokenDataTooLarge_Revert() (gas: 5508691) +OnRamp_forwardFromRouter:test_UnAllowedOriginalSender_Revert() (gas: 26986) +OnRamp_forwardFromRouter:test_UnsupportedToken_Revert() (gas: 83046) +OnRamp_forwardFromRouter:test_forwardFromRouter_UnsupportedToken_Revert() (gas: 43372) +OnRamp_forwardFromRouter:test_forwardFromRouter_WithInterception_Success() (gas: 328987) +OnRamp_getFee:test_EmptyMessage_Success() (gas: 137801) +OnRamp_getFee:test_EnforceOutOfOrder_Revert() (gas: 78643) +OnRamp_getFee:test_GetFeeOfZeroForTokenMessage_Success() (gas: 112828) +OnRamp_getFee:test_NotAFeeTokenButPricedToken_Revert() (gas: 41569) +OnRamp_getFee:test_SingleTokenMessage_Success() (gas: 167530) +OnRamp_getFee:test_Unhealthy_Revert() (gas: 19992) +OnRamp_getSupportedTokens:test_GetSupportedTokens_Revert() (gas: 11166) +OnRamp_getTokenPool:test_GetTokenPool_Success() (gas: 42064) +OnRamp_setDynamicConfig:test_setDynamicConfig_InvalidConfigFeeAggregatorEqAddressZero_Revert() (gas: 13223) +OnRamp_setDynamicConfig:test_setDynamicConfig_InvalidConfigFeeQuoterEqAddressZero_Revert() (gas: 15545) +OnRamp_setDynamicConfig:test_setDynamicConfig_InvalidConfigInvalidConfig_Revert() (gas: 13277) +OnRamp_setDynamicConfig:test_setDynamicConfig_InvalidConfigOnlyOwner_Revert() (gas: 21138) +OnRamp_setDynamicConfig:test_setDynamicConfig_InvalidConfigReentrancyGuardEnteredEqTrue_Revert() (gas: 15612) +OnRamp_setDynamicConfig:test_setDynamicConfig_Success() (gas: 65013) +OnRamp_withdrawFeeTokens:test_WithdrawFeeTokens_Success() (gas: 104728) +PingPong_ccipReceive:test_CcipReceive_Success() (gas: 175023) +PingPong_plumbing:test_OutOfOrderExecution_Success() (gas: 21848) +PingPong_plumbing:test_Pausing_Success() (gas: 19077) +PingPong_startPingPong:test_StartPingPong_With_OOO_Success() (gas: 197173) +PingPong_startPingPong:test_StartPingPong_With_Sequenced_Ordered_Success() (gas: 215989) +RMNHome__validateStaticAndDynamicConfig:test_validateStaticAndDynamicConfig_DuplicateOffchainPublicKey_reverts() (gas: 27051) +RMNHome__validateStaticAndDynamicConfig:test_validateStaticAndDynamicConfig_DuplicatePeerId_reverts() (gas: 26895) +RMNHome__validateStaticAndDynamicConfig:test_validateStaticAndDynamicConfig_DuplicateSourceChain_reverts() (gas: 29030) +RMNHome__validateStaticAndDynamicConfig:test_validateStaticAndDynamicConfig_MinObserversTooHigh_reverts() (gas: 29826) +RMNHome__validateStaticAndDynamicConfig:test_validateStaticAndDynamicConfig_OutOfBoundsNodesLength_reverts() (gas: 370101) +RMNHome__validateStaticAndDynamicConfig:test_validateStaticAndDynamicConfig_OutOfBoundsObserverNodeIndex_reverts() (gas: 29288) +RMNHome_getConfigDigests:test_getConfigDigests_success() (gas: 1137234) +RMNHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_ConfigDigestMismatch_reverts() (gas: 27380) +RMNHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_NoOpStateTransitionNotAllowed_reverts() (gas: 11379) +RMNHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_OnlyOwner_reverts() (gas: 12167) +RMNHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_success() (gas: 1151630) +RMNHome_revokeCandidate:test_revokeCandidate_ConfigDigestMismatch_reverts() (gas: 20960) +RMNHome_revokeCandidate:test_revokeCandidate_OnlyOwner_reverts() (gas: 11983) +RMNHome_revokeCandidate:test_revokeCandidate_RevokingZeroDigestNotAllowed_reverts() (gas: 11190) +RMNHome_revokeCandidate:test_revokeCandidate_success() (gas: 34855) +RMNHome_setCandidate:test_setCandidate_ConfigDigestMismatch_reverts() (gas: 657738) +RMNHome_setCandidate:test_setCandidate_OnlyOwner_reverts() (gas: 19560) +RMNHome_setCandidate:test_setCandidate_success() (gas: 632748) +RMNHome_setDynamicConfig:test_setDynamicConfig_DigestNotFound_reverts() (gas: 35639) +RMNHome_setDynamicConfig:test_setDynamicConfig_MinObserversTooHigh_reverts() (gas: 21659) +RMNHome_setDynamicConfig:test_setDynamicConfig_OnlyOwner_reverts() (gas: 16974) +RMNHome_setDynamicConfig:test_setDynamicConfig_success() (gas: 128190) +RMNRemote_constructor:test_constructor_success() (gas: 8853) +RMNRemote_constructor:test_constructor_zeroChainSelector_reverts() (gas: 61072) +RMNRemote_curse:test_curse_AlreadyCursed_duplicateSubject_reverts() (gas: 156801) +RMNRemote_curse:test_curse_calledByNonOwner_reverts() (gas: 20544) +RMNRemote_curse:test_curse_success() (gas: 157167) +RMNRemote_global_and_legacy_curses:test_global_and_legacy_curses_success() (gas: 141492) +RMNRemote_setConfig:test_setConfig_addSigner_removeSigner_success() (gas: 1097399) +RMNRemote_setConfig:test_setConfig_duplicateOnChainPublicKey_reverts() (gas: 339136) +RMNRemote_setConfig:test_setConfig_invalidSignerOrder_reverts() (gas: 91696) +RMNRemote_setConfig:test_setConfig_minSignersIs0_success() (gas: 773860) +RMNRemote_setConfig:test_setConfig_minSignersTooHigh_reverts() (gas: 64566) +RMNRemote_uncurse:test_uncurse_NotCursed_duplicatedUncurseSubject_reverts() (gas: 53942) +RMNRemote_uncurse:test_uncurse_calledByNonOwner_reverts() (gas: 20525) +RMNRemote_uncurse:test_uncurse_success() (gas: 44264) +RMNRemote_verify_withConfigNotSet:test_verify_reverts() (gas: 14954) +RMNRemote_verify_withConfigSet:test_verify_InvalidSignature_reverts() (gas: 88745) +RMNRemote_verify_withConfigSet:test_verify_OutOfOrderSignatures_duplicateSignature_reverts() (gas: 86340) +RMNRemote_verify_withConfigSet:test_verify_OutOfOrderSignatures_not_sorted_reverts() (gas: 93570) +RMNRemote_verify_withConfigSet:test_verify_ThresholdNotMet_reverts() (gas: 177181) +RMNRemote_verify_withConfigSet:test_verify_UnexpectedSigner_reverts() (gas: 429818) +RMNRemote_verify_withConfigSet:test_verify_minSignersIsZero_success() (gas: 230707) +RMNRemote_verify_withConfigSet:test_verify_success() (gas: 77919) +RMN_constructor:test_Constructor_Success() (gas: 63037) +RMN_getRecordedCurseRelatedOps:test_OpsPostDeployment() (gas: 24609) +RMN_lazyVoteToCurseUpdate_Benchmark:test_VoteToCurseLazilyRetain3VotersUponConfigChange_gas() (gas: 159340) +RMN_ownerUnbless:test_Unbless_Success() (gas: 103665) +RMN_ownerUnvoteToCurse:test_CanBlessAndCurseAfterGlobalCurseIsLifted() (gas: 527240) +RMN_ownerUnvoteToCurse:test_IsIdempotent() (gas: 461028) +RMN_ownerUnvoteToCurse:test_NonOwner_Revert() (gas: 25696) +RMN_ownerUnvoteToCurse:test_OwnerUnvoteToCurseSuccess_gas() (gas: 402269) +RMN_ownerUnvoteToCurse:test_UnknownVoter_Revert() (gas: 37341) +RMN_ownerUnvoteToCurse_Benchmark:test_OwnerUnvoteToCurse_1Voter_LiftsCurse_gas() (gas: 310729) +RMN_permaBlessing:test_PermaBlessing() (gas: 234032) +RMN_setConfig:test_BlessVoterIsZeroAddress_Revert() (gas: 19944) +RMN_setConfig:test_EitherThresholdIsZero_Revert() (gas: 29093) +RMN_setConfig:test_NonOwner_Revert() (gas: 19180) +RMN_setConfig:test_RepeatedAddress_Revert() (gas: 24182) +RMN_setConfig:test_SetConfigSuccess_gas() (gas: 121383) +RMN_setConfig:test_TotalWeightsSmallerThanEachThreshold_Revert() (gas: 42230) +RMN_setConfig:test_VoteToBlessByEjectedVoter_Revert() (gas: 150092) +RMN_setConfig:test_VotersLengthIsZero_Revert() (gas: 13777) +RMN_setConfig:test_WeightIsZeroAddress_Revert() (gas: 20193) +RMN_setConfig_Benchmark_1:test_SetConfig_7Voters_gas() (gas: 699447) +RMN_setConfig_Benchmark_2:test_ResetConfig_7Voters_gas() (gas: 262912) +RMN_unvoteToCurse:test_InvalidCursesHash() (gas: 29467) +RMN_unvoteToCurse:test_OwnerSkips() (gas: 38039) +RMN_unvoteToCurse:test_OwnerSucceeds() (gas: 69773) +RMN_unvoteToCurse:test_UnauthorizedVoter() (gas: 59241) +RMN_unvoteToCurse:test_ValidCursesHash() (gas: 66142) +RMN_unvoteToCurse:test_VotersCantLiftCurseButOwnerCan() (gas: 729679) +RMN_voteToBless:test_Curse_Revert() (gas: 496801) +RMN_voteToBless:test_IsAlreadyBlessed_Revert() (gas: 147850) +RMN_voteToBless:test_RootSuccess() (gas: 745652) +RMN_voteToBless:test_SenderAlreadyVoted_Revert() (gas: 123496) +RMN_voteToBless:test_UnauthorizedVoter_Revert() (gas: 19508) +RMN_voteToBless_Benchmark:test_1RootSuccess_gas() (gas: 49435) +RMN_voteToBless_Benchmark:test_3RootSuccess_gas() (gas: 110271) +RMN_voteToBless_Benchmark:test_5RootSuccess_gas() (gas: 171045) +RMN_voteToBless_Blessed_Benchmark:test_1RootSuccessBecameBlessed_gas() (gas: 34790) +RMN_voteToBless_Blessed_Benchmark:test_1RootSuccess_gas() (gas: 32338) +RMN_voteToBless_Blessed_Benchmark:test_3RootSuccess_gas() (gas: 93196) +RMN_voteToBless_Blessed_Benchmark:test_5RootSuccess_gas() (gas: 153948) +RMN_voteToCurse:test_CurseOnlyWhenThresholdReached_Success() (gas: 1748779) +RMN_voteToCurse:test_EmptySubjects_Revert() (gas: 15996) +RMN_voteToCurse:test_EvenIfAlreadyCursed_Success() (gas: 564086) +RMN_voteToCurse:test_OwnerCanCurseAndUncurse() (gas: 471086) +RMN_voteToCurse:test_RepeatedSubject_Revert() (gas: 151480) +RMN_voteToCurse:test_ReusedCurseId_Revert() (gas: 155411) +RMN_voteToCurse:test_UnauthorizedVoter_Revert() (gas: 14537) +RMN_voteToCurse:test_VoteToCurse_NoCurse_Success() (gas: 203894) +RMN_voteToCurse:test_VoteToCurse_YesCurse_Success() (gas: 495649) +RMN_voteToCurse_2:test_VotesAreDroppedIfSubjectIsNotCursedDuringConfigChange() (gas: 417003) +RMN_voteToCurse_2:test_VotesAreRetainedIfSubjectIsCursedDuringConfigChange() (gas: 1339323) +RMN_voteToCurse_Benchmark_1:test_VoteToCurse_NewSubject_NewVoter_NoCurse_gas() (gas: 146898) +RMN_voteToCurse_Benchmark_1:test_VoteToCurse_NewSubject_NewVoter_YesCurse_gas() (gas: 171152) +RMN_voteToCurse_Benchmark_2:test_VoteToCurse_OldSubject_NewVoter_NoCurse_gas() (gas: 126446) +RMN_voteToCurse_Benchmark_2:test_VoteToCurse_OldSubject_OldVoter_NoCurse_gas() (gas: 102691) +RMN_voteToCurse_Benchmark_3:test_VoteToCurse_OldSubject_NewVoter_YesCurse_gas() (gas: 151187) +RateLimiter_constructor:test_Constructor_Success() (gas: 22964) +RateLimiter_consume:test_AggregateValueMaxCapacityExceeded_Revert() (gas: 19839) +RateLimiter_consume:test_AggregateValueRateLimitReached_Revert() (gas: 28311) +RateLimiter_consume:test_ConsumeAggregateValue_Success() (gas: 39405) +RateLimiter_consume:test_ConsumeTokens_Success() (gas: 21919) +RateLimiter_consume:test_ConsumeUnlimited_Success() (gas: 57402) +RateLimiter_consume:test_ConsumingMoreThanUint128_Revert() (gas: 19531) +RateLimiter_consume:test_RateLimitReachedOverConsecutiveBlocks_Revert() (gas: 33020) +RateLimiter_consume:test_Refill_Success() (gas: 48170) +RateLimiter_consume:test_TokenMaxCapacityExceeded_Revert() (gas: 22450) +RateLimiter_consume:test_TokenRateLimitReached_Revert() (gas: 31057) +RateLimiter_currentTokenBucketState:test_CurrentTokenBucketState_Success() (gas: 49681) +RateLimiter_currentTokenBucketState:test_Refill_Success() (gas: 63750) +RateLimiter_setTokenBucketConfig:test_SetRateLimiterConfig_Success() (gas: 48188) +RegistryModuleOwnerCustom_constructor:test_constructor_Revert() (gas: 36711) +RegistryModuleOwnerCustom_registerAdminViaGetCCIPAdmin:test_registerAdminViaGetCCIPAdmin_Revert() (gas: 22517) +RegistryModuleOwnerCustom_registerAdminViaGetCCIPAdmin:test_registerAdminViaGetCCIPAdmin_Success() (gas: 137341) +RegistryModuleOwnerCustom_registerAdminViaOwner:test_registerAdminViaOwner_Revert() (gas: 22359) +RegistryModuleOwnerCustom_registerAdminViaOwner:test_registerAdminViaOwner_Success() (gas: 137182) +Router_applyRampUpdates:test_OffRampMismatch_Revert() (gas: 93496) +Router_applyRampUpdates:test_OffRampUpdatesWithRouting() (gas: 12348645) +Router_applyRampUpdates:test_OnRampDisable() (gas: 65150) +Router_applyRampUpdates:test_OnlyOwner_Revert() (gas: 13275) +Router_ccipSend:test_CCIPSendLinkFeeNoTokenSuccess_gas() (gas: 133309) +Router_ccipSend:test_CCIPSendLinkFeeOneTokenSuccess_gas() (gas: 240131) +Router_ccipSend:test_CCIPSendNativeFeeNoTokenSuccess_gas() (gas: 147975) +Router_ccipSend:test_CCIPSendNativeFeeOneTokenSuccess_gas() (gas: 254777) +Router_ccipSend:test_FeeTokenAmountTooLow_Revert() (gas: 78020) +Router_ccipSend:test_InvalidMsgValue() (gas: 35871) +Router_ccipSend:test_NativeFeeTokenInsufficientValue() (gas: 80832) +Router_ccipSend:test_NativeFeeTokenOverpay_Success() (gas: 203317) +Router_ccipSend:test_NativeFeeTokenZeroValue() (gas: 65179) +Router_ccipSend:test_NativeFeeToken_Success() (gas: 201073) +Router_ccipSend:test_NonLinkFeeToken_Success() (gas: 266824) +Router_ccipSend:test_UnsupportedDestinationChain_Revert() (gas: 28660) +Router_ccipSend:test_WhenNotHealthy_Revert() (gas: 48532) +Router_ccipSend:test_WrappedNativeFeeToken_Success() (gas: 205616) +Router_ccipSend:test_ZeroFeeAndGasPrice_Success() (gas: 282163) +Router_constructor:test_Constructor_Success() (gas: 14515) +Router_getArmProxy:test_getArmProxy() (gas: 11328) +Router_getFee:test_GetFeeSupportedChain_Success() (gas: 55552) +Router_getFee:test_UnsupportedDestinationChain_Revert() (gas: 20945) +Router_getSupportedTokens:test_GetSupportedTokens_Revert() (gas: 11166) +Router_recoverTokens:test_RecoverTokensInvalidRecipient_Revert() (gas: 12807) +Router_recoverTokens:test_RecoverTokensNoFunds_Revert() (gas: 21382) +Router_recoverTokens:test_RecoverTokensNonOwner_Revert() (gas: 12776) +Router_recoverTokens:test_RecoverTokensValueReceiver_Revert() (gas: 603372) +Router_recoverTokens:test_RecoverTokens_Success() (gas: 59811) +Router_routeMessage:test_AutoExec_Success() (gas: 52571) +Router_routeMessage:test_ExecutionEvent_Success() (gas: 183071) +Router_routeMessage:test_ManualExec_Success() (gas: 41748) +Router_routeMessage:test_OnlyOffRamp_Revert() (gas: 28290) +Router_routeMessage:test_WhenNotHealthy_Revert() (gas: 47722) +Router_setWrappedNative:test_OnlyOwner_Revert() (gas: 11766) +SelfFundedPingPong_ccipReceive:test_FundingIfNotANop_Revert() (gas: 62294) +SelfFundedPingPong_ccipReceive:test_Funding_Success() (gas: 560135) +SelfFundedPingPong_setCountIncrBeforeFunding:test_setCountIncrBeforeFunding() (gas: 22195) +TokenAdminRegistry_acceptAdminRole:test_acceptAdminRole_OnlyPendingAdministrator_Revert() (gas: 58611) +TokenAdminRegistry_acceptAdminRole:test_acceptAdminRole_Success() (gas: 50532) +TokenAdminRegistry_addRegistryModule:test_addRegistryModule_OnlyOwner_Revert() (gas: 14159) +TokenAdminRegistry_addRegistryModule:test_addRegistryModule_Success() (gas: 70293) +TokenAdminRegistry_getAllConfiguredTokens:test_getAllConfiguredTokens_outOfBounds_Success() (gas: 12680) +TokenAdminRegistry_getPool:test_getPool_Success() (gas: 18649) +TokenAdminRegistry_getPools:test_getPools_Success() (gas: 48161) +TokenAdminRegistry_isAdministrator:test_isAdministrator_Success() (gas: 113861) +TokenAdminRegistry_proposeAdministrator:test_proposeAdministrator_AlreadyRegistered_Revert() (gas: 109470) +TokenAdminRegistry_proposeAdministrator:test_proposeAdministrator_OnlyRegistryModule_Revert() (gas: 17535) +TokenAdminRegistry_proposeAdministrator:test_proposeAdministrator_ZeroAddress_Revert() (gas: 16768) +TokenAdminRegistry_proposeAdministrator:test_proposeAdministrator_module_Success() (gas: 123148) +TokenAdminRegistry_proposeAdministrator:test_proposeAdministrator_owner_Success() (gas: 114227) +TokenAdminRegistry_proposeAdministrator:test_proposeAdministrator_reRegisterWhileUnclaimed_Success() (gas: 123889) +TokenAdminRegistry_removeRegistryModule:test_removeRegistryModule_OnlyOwner_Revert() (gas: 14115) +TokenAdminRegistry_removeRegistryModule:test_removeRegistryModule_Success() (gas: 58226) +TokenAdminRegistry_setPool:test_setPool_InvalidTokenPoolToken_Revert() (gas: 21992) +TokenAdminRegistry_setPool:test_setPool_OnlyAdministrator_Revert() (gas: 20133) +TokenAdminRegistry_setPool:test_setPool_Success() (gas: 41047) +TokenAdminRegistry_setPool:test_setPool_ZeroAddressRemovesPool_Success() (gas: 35795) +TokenAdminRegistry_transferAdminRole:test_transferAdminRole_OnlyAdministrator_Revert() (gas: 20198) +TokenAdminRegistry_transferAdminRole:test_transferAdminRole_Success() (gas: 54721) +TokenPoolAndProxy:test_lockOrBurn_burnMint_Success() (gas: 8984851) +TokenPoolAndProxy:test_lockOrBurn_burnWithFromMint_Success() (gas: 9018204) +TokenPoolAndProxy:test_lockOrBurn_lockRelease_Success() (gas: 9314221) +TokenPoolAndProxy:test_setPreviousPool_Success() (gas: 5168919) +TokenPoolAndProxyMigration:test_tokenPoolMigration_Success_1_2() (gas: 9975724) +TokenPoolAndProxyMigration:test_tokenPoolMigration_Success_1_4() (gas: 10174033) +TokenPoolFactoryTests:test_TokenPoolFactory_Constructor_Revert() (gas: 1517209) +TokenPoolFactoryTests:test_createTokenPoolLockRelease_ExistingToken_predict_Success() (gas: 20088575) +TokenPoolFactoryTests:test_createTokenPool_ExistingRemoteToken_AndPredictPool_Success() (gas: 20964977) +TokenPoolFactoryTests:test_createTokenPool_WithNoExistingRemoteContracts_predict_Success() (gas: 21423053) +TokenPoolFactoryTests:test_createTokenPool_WithNoExistingTokenOnRemoteChain_Success() (gas: 9998199) +TokenPoolFactoryTests:test_createTokenPool_WithRemoteTokenAndRemotePool_Success() (gas: 10079049) +TokenPoolWithAllowList_applyAllowListUpdates:test_AllowListNotEnabled_Revert() (gas: 3418174) +TokenPoolWithAllowList_applyAllowListUpdates:test_OnlyOwner_Revert() (gas: 13392) +TokenPoolWithAllowList_applyAllowListUpdates:test_SetAllowListSkipsZero_Success() (gas: 26742) +TokenPoolWithAllowList_applyAllowListUpdates:test_SetAllowList_Success() (gas: 189536) +TokenPoolWithAllowList_getAllowList:test_GetAllowList_Success() (gas: 25742) +TokenPoolWithAllowList_getAllowListEnabled:test_GetAllowListEnabled_Success() (gas: 8788) +TokenPoolWithAllowList_setRouter:test_SetRouter_Success() (gas: 28100) +TokenPool_applyChainUpdates:test_applyChainUpdates_DisabledNonZeroRateLimit_Revert() (gas: 282666) +TokenPool_applyChainUpdates:test_applyChainUpdates_InvalidRateLimitRate_Revert() (gas: 580050) +TokenPool_applyChainUpdates:test_applyChainUpdates_NonExistentChain_Revert() (gas: 22750) +TokenPool_applyChainUpdates:test_applyChainUpdates_OnlyCallableByOwner_Revert() (gas: 12333) +TokenPool_applyChainUpdates:test_applyChainUpdates_Success() (gas: 534354) +TokenPool_applyChainUpdates:test_applyChainUpdates_ZeroAddressNotAllowed_Revert() (gas: 165350) +TokenPool_constructor:test_ZeroAddressNotAllowed_Revert() (gas: 74247) +TokenPool_constructor:test_immutableFields_Success() (gas: 23251) +TokenPool_getRemotePool:test_getRemotePool_Success() (gas: 285082) +TokenPool_onlyOffRamp:test_CallerIsNotARampOnRouter_Revert() (gas: 287212) +TokenPool_onlyOffRamp:test_ChainNotAllowed_Revert() (gas: 305616) +TokenPool_onlyOffRamp:test_onlyOffRamp_Success() (gas: 361142) +TokenPool_onlyOnRamp:test_CallerIsNotARampOnRouter_Revert() (gas: 286591) +TokenPool_onlyOnRamp:test_ChainNotAllowed_Revert() (gas: 269389) +TokenPool_onlyOnRamp:test_onlyOnRamp_Success() (gas: 315814) +TokenPool_setChainRateLimiterConfig:test_NonExistentChain_Revert() (gas: 19578) +TokenPool_setChainRateLimiterConfig:test_OnlyOwnerOrRateLimitAdmin_Revert() (gas: 17926) +TokenPool_setRemotePool:test_setRemotePool_NonExistentChain_Reverts() (gas: 17612) +TokenPool_setRemotePool:test_setRemotePool_OnlyOwner_Reverts() (gas: 15337) +TokenPool_setRemotePool:test_setRemotePool_Success() (gas: 293732) +TokenProxy_ccipSend:test_CcipSendGasShouldBeZero_Revert() (gas: 20582) +TokenProxy_ccipSend:test_CcipSendInsufficientAllowance_Revert() (gas: 158368) +TokenProxy_ccipSend:test_CcipSendInvalidToken_Revert() (gas: 18599) +TokenProxy_ccipSend:test_CcipSendNative_Success() (gas: 288755) +TokenProxy_ccipSend:test_CcipSendNoDataAllowed_Revert() (gas: 19019) +TokenProxy_ccipSend:test_CcipSend_Success() (gas: 310931) +TokenProxy_constructor:test_Constructor() (gas: 15309) +TokenProxy_getFee:test_GetFeeGasShouldBeZero_Revert() (gas: 20176) +TokenProxy_getFee:test_GetFeeInvalidToken_Revert() (gas: 14693) +TokenProxy_getFee:test_GetFeeNoDataAllowed_Revert() (gas: 18513) +TokenProxy_getFee:test_GetFee_Success() (gas: 117905) +USDCTokenPool__validateMessage:test_ValidateInvalidMessage_Revert() (gas: 37856) +USDCTokenPool_lockOrBurn:test_CallerIsNotARampOnRouter_Revert() (gas: 40114) +USDCTokenPool_lockOrBurn:test_LockOrBurnWithAllowList_Revert() (gas: 34440) +USDCTokenPool_lockOrBurn:test_LockOrBurn_Success() (gas: 147394) +USDCTokenPool_lockOrBurn:test_UnknownDomain_Revert() (gas: 546719) +USDCTokenPool_releaseOrMint:test_ReleaseOrMintRealTx_Success() (gas: 326433) +USDCTokenPool_releaseOrMint:test_TokenMaxCapacityExceeded_Revert() (gas: 59047) +USDCTokenPool_releaseOrMint:test_UnlockingUSDCFailed_Revert() (gas: 112325) +USDCTokenPool_setDomains:test_InvalidDomain_Revert() (gas: 74539) +USDCTokenPool_setDomains:test_OnlyOwner_Revert() (gas: 12298) +USDCTokenPool_supportsInterface:test_SupportsInterface_Success() (gas: 11479) \ No newline at end of file diff --git a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol index ccf8f342b1..be30ecdfac 100644 --- a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol +++ b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol @@ -97,10 +97,7 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { dynamicSalt.computeAddress(keccak256(predictedPoolInitCode), address(s_tokenPoolFactory)); (address tokenAddress, address poolAddress) = s_tokenPoolFactory.deployTokenAndTokenPool( - new TokenPoolFactory.RemoteTokenPoolInfo[](0), - s_tokenInitCode, - s_poolInitCode, - FAKE_SALT + new TokenPoolFactory.RemoteTokenPoolInfo[](0), s_tokenInitCode, s_poolInitCode, FAKE_SALT ); assertNotEq(address(0), tokenAddress, "Token Address should not be 0"); @@ -196,10 +193,7 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { // On the new token pool factory, representing a destination chain, // deploy a new token and a new pool (address newTokenAddress, address newPoolAddress) = newTokenPoolFactory.deployTokenAndTokenPool( - new TokenPoolFactory.RemoteTokenPoolInfo[](0), - s_tokenInitCode, - s_poolInitCode, - FAKE_SALT + new TokenPoolFactory.RemoteTokenPoolInfo[](0), s_tokenInitCode, s_poolInitCode, FAKE_SALT ); assertEq( @@ -287,9 +281,8 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { // Since the remote chain information was provided, we should be able to get the information from the newly // deployed token pool using the available getter functions - (address tokenAddress, address poolAddress) = s_tokenPoolFactory.deployTokenAndTokenPool( - remoteTokenPools, s_tokenInitCode, s_poolInitCode, FAKE_SALT - ); + (address tokenAddress, address poolAddress) = + s_tokenPoolFactory.deployTokenAndTokenPool(remoteTokenPools, s_tokenInitCode, s_poolInitCode, FAKE_SALT); assertEq(address(TokenPool(poolAddress).getToken()), tokenAddress, "Token Address should have been set locally"); @@ -363,9 +356,8 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { RateLimiter.Config(false, 0, 0) // rateLimiterConfig ); - (address tokenAddress, address poolAddress) = s_tokenPoolFactory.deployTokenAndTokenPool( - remoteTokenPools, s_tokenInitCode, s_poolInitCode, FAKE_SALT - ); + (address tokenAddress, address poolAddress) = + s_tokenPoolFactory.deployTokenAndTokenPool(remoteTokenPools, s_tokenInitCode, s_poolInitCode, FAKE_SALT); assertNotEq(address(0), tokenAddress, "Token Address should not be 0"); assertNotEq(address(0), poolAddress, "Pool Address should not be 0"); @@ -410,7 +402,7 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { TokenPoolFactory.RemoteChainConfig memory remoteChainConfig = TokenPoolFactory.RemoteChainConfig(address(newTokenPoolFactory), address(s_destRouter), address(s_rmnProxy)); - FactoryBurnMintERC20 newLocalToken = + FactoryBurnMintERC20 newLocalToken = new FactoryBurnMintERC20("TestToken", "TEST", 18, type(uint256).max, PREMINT_AMOUNT, OWNER); FactoryBurnMintERC20 newRemoteToken = @@ -432,7 +424,7 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { s_tokenInitCode, // remoteTokenInitCode RateLimiter.Config(false, 0, 0) ); - + // Since the remote chain information was provided, we should be able to get the information from the newly // deployed token pool using the available getter functions address poolAddress = s_tokenPoolFactory.deployTokenPoolWithExistingToken( @@ -449,7 +441,11 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { OwnerIsCreator(poolAddress).acceptOwnership(); // Ensure that the remote Token was set to the one we predicted - assertEq(address(LockReleaseTokenPool(poolAddress).getToken()), address(newLocalToken), "Token Address should have been set"); + assertEq( + address(LockReleaseTokenPool(poolAddress).getToken()), + address(newLocalToken), + "Token Address should have been set" + ); LockReleaseTokenPool(poolAddress).setRebalancer(OWNER); assertEq(OWNER, LockReleaseTokenPool(poolAddress).getRebalancer(), "Rebalancer should be set"); @@ -480,6 +476,5 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { address(newRemoteToken), "New Remote Token should be set correctly" ); - } } diff --git a/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory/FactoryBurnMintERC20.sol b/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory/FactoryBurnMintERC20.sol index e22aa339c6..5b05ba5fd2 100644 --- a/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory/FactoryBurnMintERC20.sol +++ b/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory/FactoryBurnMintERC20.sol @@ -73,7 +73,8 @@ contract FactoryBurnMintERC20 is IBurnMintERC20, IGetCCIPAdmin, IERC165, ERC20Bu /// @inheritdoc IERC165 function supportsInterface(bytes4 interfaceId) public pure virtual override returns (bool) { return interfaceId == type(IERC20).interfaceId || interfaceId == type(IBurnMintERC20).interfaceId - || interfaceId == type(IERC165).interfaceId || interfaceId == type(IOwnable).interfaceId || interfaceId == type(IGetCCIPAdmin).interfaceId; + || interfaceId == type(IERC165).interfaceId || interfaceId == type(IOwnable).interfaceId + || interfaceId == type(IGetCCIPAdmin).interfaceId; } // ================================================================ From ea779296c6edfbcd16cf59d1edc5deabe633048a Mon Sep 17 00:00:00 2001 From: Josh Date: Thu, 10 Oct 2024 12:12:30 -0400 Subject: [PATCH 40/48] gas snapshotting --- contracts/gas-snapshots/ccip.gas-snapshot | 1949 +++++++++++---------- 1 file changed, 991 insertions(+), 958 deletions(-) diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot index 00787252ca..73f6d21e91 100644 --- a/contracts/gas-snapshots/ccip.gas-snapshot +++ b/contracts/gas-snapshots/ccip.gas-snapshot @@ -1,35 +1,35 @@ -ARMProxyStandaloneTest:test_ARMCallEmptyContractRevert() (gas: 19675) -ARMProxyStandaloneTest:test_Constructor() (gas: 310043) -ARMProxyStandaloneTest:test_SetARM() (gas: 16587) -ARMProxyStandaloneTest:test_SetARMzero() (gas: 11297) -ARMProxyTest:test_ARMCallRevertReasonForwarded() (gas: 47898) -ARMProxyTest:test_ARMIsBlessed_Success() (gas: 36363) -ARMProxyTest:test_ARMIsCursed_Success() (gas: 49851) -AggregateTokenLimiter_constructor:test_Constructor_Success() (gas: 27118) -AggregateTokenLimiter_getTokenBucket:test_GetTokenBucket_Success() (gas: 19871) -AggregateTokenLimiter_getTokenBucket:test_Refill_Success() (gas: 41586) -AggregateTokenLimiter_getTokenBucket:test_TimeUnderflow_Revert() (gas: 15452) -AggregateTokenLimiter_getTokenLimitAdmin:test_GetTokenLimitAdmin_Success() (gas: 10537) -AggregateTokenLimiter_getTokenValue:test_GetTokenValue_Success() (gas: 17531) -AggregateTokenLimiter_getTokenValue:test_NoTokenPrice_Reverts() (gas: 21414) -AggregateTokenLimiter_rateLimitValue:test_AggregateValueMaxCapacityExceeded_Revert() (gas: 16586) -AggregateTokenLimiter_rateLimitValue:test_RateLimitValueSuccess_gas() (gas: 18357) -AggregateTokenLimiter_setAdmin:test_OnlyOwnerOrAdmin_Revert() (gas: 13078) -AggregateTokenLimiter_setAdmin:test_Owner_Success() (gas: 19016) -AggregateTokenLimiter_setRateLimiterConfig:test_OnlyOnlyCallableByAdminOrOwner_Revert() (gas: 17546) -AggregateTokenLimiter_setRateLimiterConfig:test_Owner_Success() (gas: 30393) -AggregateTokenLimiter_setRateLimiterConfig:test_TokenLimitAdmin_Success() (gas: 32407) -BurnFromMintTokenPool_lockOrBurn:test_ChainNotAllowed_Revert() (gas: 28842) -BurnFromMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 55271) -BurnFromMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 244024) -BurnFromMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 24166) -BurnMintTokenPool_lockOrBurn:test_ChainNotAllowed_Revert() (gas: 27609) -BurnMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 55271) -BurnMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 241912) -BurnMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 17851) -BurnMintTokenPool_releaseOrMint:test_ChainNotAllowed_Revert() (gas: 28805) -BurnMintTokenPool_releaseOrMint:test_PoolMintNotHealthy_Revert() (gas: 56253) -BurnMintTokenPool_releaseOrMint:test_PoolMint_Success() (gas: 112391) +ARMProxyStandaloneTest:test_ARMCallEmptyContractRevert() (gas: 20673) +ARMProxyStandaloneTest:test_Constructor() (gas: 543485) +ARMProxyStandaloneTest:test_SetARM() (gas: 18216) +ARMProxyStandaloneTest:test_SetARMzero() (gas: 12144) +ARMProxyTest:test_ARMCallRevertReasonForwarded() (gas: 49764) +ARMProxyTest:test_ARMIsBlessed_Success() (gas: 39781) +ARMProxyTest:test_ARMIsCursed_Success() (gas: 51846) +AggregateTokenLimiter_constructor:test_Constructor_Success() (gas: 31944) +AggregateTokenLimiter_getTokenBucket:test_GetTokenBucket_Success() (gas: 23227) +AggregateTokenLimiter_getTokenBucket:test_Refill_Success() (gas: 55032) +AggregateTokenLimiter_getTokenBucket:test_TimeUnderflow_Revert() (gas: 17640) +AggregateTokenLimiter_getTokenLimitAdmin:test_GetTokenLimitAdmin_Success() (gas: 11188) +AggregateTokenLimiter_getTokenValue:test_GetTokenValue_Success() (gas: 21368) +AggregateTokenLimiter_getTokenValue:test_NoTokenPrice_Reverts() (gas: 25888) +AggregateTokenLimiter_rateLimitValue:test_AggregateValueMaxCapacityExceeded_Revert() (gas: 20854) +AggregateTokenLimiter_rateLimitValue:test_RateLimitValueSuccess_gas() (gas: 19835) +AggregateTokenLimiter_setAdmin:test_OnlyOwnerOrAdmin_Revert() (gas: 13880) +AggregateTokenLimiter_setAdmin:test_Owner_Success() (gas: 20448) +AggregateTokenLimiter_setRateLimiterConfig:test_OnlyOnlyCallableByAdminOrOwner_Revert() (gas: 19396) +AggregateTokenLimiter_setRateLimiterConfig:test_Owner_Success() (gas: 38776) +AggregateTokenLimiter_setRateLimiterConfig:test_TokenLimitAdmin_Success() (gas: 41521) +BurnFromMintTokenPool_lockOrBurn:test_ChainNotAllowed_Revert() (gas: 34256) +BurnFromMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 60604) +BurnFromMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 293700) +BurnFromMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 28203) +BurnMintTokenPool_lockOrBurn:test_ChainNotAllowed_Revert() (gas: 31296) +BurnMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 60604) +BurnMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 291204) +BurnMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 20610) +BurnMintTokenPool_releaseOrMint:test_ChainNotAllowed_Revert() (gas: 34256) +BurnMintTokenPool_releaseOrMint:test_PoolMintNotHealthy_Revert() (gas: 63377) +BurnMintTokenPool_releaseOrMint:test_PoolMint_Success() (gas: 122166) BurnWithFromMintTokenPool_lockOrBurn:test_ChainNotAllowed_Revert() (gas: 28842) BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 55271) BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 244050) @@ -37,533 +37,560 @@ BurnWithFromMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 24168) BurnWithFromMintTokenPool_releaseOrMint:test_Setup_Success() (gas: 24547) BurnWithFromMintTokenPool_releaseOrMint:test_releaseOrMint_NegativeMintAmount_reverts() (gas: 93840) BurnWithFromMintTokenPool_releaseOrMint:test_releaseOrMint_Success() (gas: 93423) -CCIPClientExample_sanity:test_ImmutableExamples_Success() (gas: 2052431) -CCIPHome__validateConfig:test__validateConfigLessTransmittersThanSigners_Success() (gas: 334693) -CCIPHome__validateConfig:test__validateConfigSmallerFChain_Success() (gas: 466117) -CCIPHome__validateConfig:test__validateConfig_ABIEncodedAddress_OfframpAddressCannotBeZero_Reverts() (gas: 289739) -CCIPHome__validateConfig:test__validateConfig_ABIEncodedAddress_RMNHomeAddressCannotBeZero_Reverts() (gas: 290034) -CCIPHome__validateConfig:test__validateConfig_ChainSelectorNotFound_Reverts() (gas: 292771) -CCIPHome__validateConfig:test__validateConfig_ChainSelectorNotSet_Reverts() (gas: 289373) -CCIPHome__validateConfig:test__validateConfig_FChainTooHigh_Reverts() (gas: 337311) -CCIPHome__validateConfig:test__validateConfig_FMustBePositive_Reverts() (gas: 291145) -CCIPHome__validateConfig:test__validateConfig_FTooHigh_Reverts() (gas: 290604) -CCIPHome__validateConfig:test__validateConfig_NodeNotInRegistry_Reverts() (gas: 344238) -CCIPHome__validateConfig:test__validateConfig_NotEnoughTransmittersEmptyAddresses_Reverts() (gas: 309179) -CCIPHome__validateConfig:test__validateConfig_NotEnoughTransmitters_Reverts() (gas: 1212133) -CCIPHome__validateConfig:test__validateConfig_OfframpAddressCannotBeZero_Reverts() (gas: 289400) -CCIPHome__validateConfig:test__validateConfig_RMNHomeAddressCannotBeZero_Reverts() (gas: 289661) -CCIPHome__validateConfig:test__validateConfig_Success() (gas: 300616) -CCIPHome__validateConfig:test__validateConfig_TooManySigners_Reverts() (gas: 773237) -CCIPHome__validateConfig:test__validateConfig_ZeroP2PId_Reverts() (gas: 293988) -CCIPHome__validateConfig:test__validateConfig_ZeroSignerKey_Reverts() (gas: 294035) -CCIPHome_applyChainConfigUpdates:test__applyChainConfigUpdates_FChainNotPositive_Reverts() (gas: 185242) -CCIPHome_applyChainConfigUpdates:test_applyChainConfigUpdates_addChainConfigs_Success() (gas: 347249) -CCIPHome_applyChainConfigUpdates:test_applyChainConfigUpdates_nodeNotInRegistry_Reverts() (gas: 20631) -CCIPHome_applyChainConfigUpdates:test_applyChainConfigUpdates_removeChainConfigs_Success() (gas: 270824) -CCIPHome_applyChainConfigUpdates:test_applyChainConfigUpdates_selectorNotFound_Reverts() (gas: 14952) -CCIPHome_applyChainConfigUpdates:test_getPaginatedCCIPHomes_Success() (gas: 370980) -CCIPHome_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_DONIdMismatch_reverts() (gas: 27137) -CCIPHome_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_InnerCallReverts_reverts() (gas: 11783) -CCIPHome_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_InvalidSelector_reverts() (gas: 11038) -CCIPHome_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_OnlyCapabilitiesRegistryCanCall_reverts() (gas: 26150) -CCIPHome_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_success() (gas: 1436726) -CCIPHome_constructor:test_constructor_CapabilitiesRegistryAddressZero_reverts() (gas: 63878) -CCIPHome_constructor:test_constructor_success() (gas: 3521034) -CCIPHome_constructor:test_getCapabilityConfiguration_success() (gas: 9173) -CCIPHome_constructor:test_supportsInterface_success() (gas: 9865) -CCIPHome_getAllConfigs:test_getAllConfigs_success() (gas: 2765282) -CCIPHome_getConfigDigests:test_getConfigDigests_success() (gas: 2539724) -CCIPHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_CanOnlySelfCall_reverts() (gas: 9110) -CCIPHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_ConfigDigestMismatch_reverts() (gas: 23052) -CCIPHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_NoOpStateTransitionNotAllowed_reverts() (gas: 8818) -CCIPHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_multiplePlugins_success() (gas: 5096112) -CCIPHome_revokeCandidate:test_revokeCandidate_CanOnlySelfCall_reverts() (gas: 9068) -CCIPHome_revokeCandidate:test_revokeCandidate_ConfigDigestMismatch_reverts() (gas: 19128) -CCIPHome_revokeCandidate:test_revokeCandidate_RevokingZeroDigestNotAllowed_reverts() (gas: 8773) -CCIPHome_revokeCandidate:test_revokeCandidate_success() (gas: 30676) -CCIPHome_setCandidate:test_setCandidate_CanOnlySelfCall_reverts() (gas: 19051) -CCIPHome_setCandidate:test_setCandidate_ConfigDigestMismatch_reverts() (gas: 1388198) -CCIPHome_setCandidate:test_setCandidate_success() (gas: 1357740) -CommitStore_constructor:test_Constructor_Success() (gas: 2855567) -CommitStore_isUnpausedAndRMNHealthy:test_RMN_Success() (gas: 73954) -CommitStore_report:test_InvalidIntervalMinLargerThanMax_Revert() (gas: 28739) -CommitStore_report:test_InvalidInterval_Revert() (gas: 28679) -CommitStore_report:test_InvalidRootRevert() (gas: 27912) -CommitStore_report:test_OnlyGasPriceUpdates_Success() (gas: 53448) -CommitStore_report:test_OnlyPriceUpdateStaleReport_Revert() (gas: 59286) -CommitStore_report:test_OnlyTokenPriceUpdates_Success() (gas: 53446) -CommitStore_report:test_Paused_Revert() (gas: 21319) -CommitStore_report:test_ReportAndPriceUpdate_Success() (gas: 84485) -CommitStore_report:test_ReportOnlyRootSuccess_gas() (gas: 56342) -CommitStore_report:test_RootAlreadyCommitted_Revert() (gas: 64077) -CommitStore_report:test_StaleReportWithRoot_Success() (gas: 117309) -CommitStore_report:test_Unhealthy_Revert() (gas: 44823) -CommitStore_report:test_ValidPriceUpdateThenStaleReportWithRoot_Success() (gas: 98929) -CommitStore_report:test_ZeroEpochAndRound_Revert() (gas: 27707) -CommitStore_resetUnblessedRoots:test_OnlyOwner_Revert() (gas: 11376) -CommitStore_resetUnblessedRoots:test_ResetUnblessedRoots_Success() (gas: 144186) -CommitStore_setDynamicConfig:test_InvalidCommitStoreConfig_Revert() (gas: 37314) -CommitStore_setDynamicConfig:test_OnlyOwner_Revert() (gas: 37483) -CommitStore_setDynamicConfig:test_PriceEpochCleared_Success() (gas: 129329) -CommitStore_setLatestPriceEpochAndRound:test_OnlyOwner_Revert() (gas: 11099) -CommitStore_setLatestPriceEpochAndRound:test_SetLatestPriceEpochAndRound_Success() (gas: 20690) -CommitStore_setMinSeqNr:test_OnlyOwner_Revert() (gas: 11098) -CommitStore_verify:test_Blessed_Success() (gas: 96581) -CommitStore_verify:test_NotBlessed_Success() (gas: 61473) -CommitStore_verify:test_Paused_Revert() (gas: 18568) -CommitStore_verify:test_TooManyLeaves_Revert() (gas: 36848) -DefensiveExampleTest:test_HappyPath_Success() (gas: 200200) -DefensiveExampleTest:test_Recovery() (gas: 424476) -E2E:test_E2E_3MessagesSuccess_gas() (gas: 1106985) -EVM2EVMOffRamp__releaseOrMintToken:test__releaseOrMintToken_NotACompatiblePool_Revert() (gas: 38322) -EVM2EVMOffRamp__releaseOrMintToken:test__releaseOrMintToken_Success() (gas: 104438) -EVM2EVMOffRamp__releaseOrMintToken:test__releaseOrMintToken_TokenHandlingError_transfer_Revert() (gas: 86026) -EVM2EVMOffRamp__releaseOrMintToken:test_releaseOrMintToken_InvalidDataLength_Revert() (gas: 37365) -EVM2EVMOffRamp__releaseOrMintToken:test_releaseOrMintToken_ReleaseOrMintBalanceMismatch_Revert() (gas: 95013) -EVM2EVMOffRamp__releaseOrMintToken:test_releaseOrMintToken_TokenHandlingError_BalanceOf_Revert() (gas: 40341) -EVM2EVMOffRamp__releaseOrMintToken:test_releaseOrMintToken_skip_ReleaseOrMintBalanceMismatch_if_pool_Revert() (gas: 87189) -EVM2EVMOffRamp__releaseOrMintTokens:test_OverValueWithARLOff_Success() (gas: 381594) -EVM2EVMOffRamp__releaseOrMintTokens:test_PriceNotFoundForToken_Reverts() (gas: 140568) -EVM2EVMOffRamp__releaseOrMintTokens:test_RateLimitErrors_Reverts() (gas: 798833) -EVM2EVMOffRamp__releaseOrMintTokens:test_TokenHandlingError_Reverts() (gas: 178400) -EVM2EVMOffRamp__releaseOrMintTokens:test__releaseOrMintTokens_NotACompatiblePool_Reverts() (gas: 29681) -EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_InvalidDataLengthReturnData_Revert() (gas: 67146) -EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_InvalidEVMAddress_Revert() (gas: 43605) -EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_Success() (gas: 208068) -EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_destDenominatedDecimals_Success() (gas: 219365) -EVM2EVMOffRamp__report:test_Report_Success() (gas: 127774) -EVM2EVMOffRamp__trialExecute:test_RateLimitError_Success() (gas: 237406) -EVM2EVMOffRamp__trialExecute:test_TokenHandlingErrorIsCaught_Success() (gas: 246039) -EVM2EVMOffRamp__trialExecute:test_TokenPoolIsNotAContract_Success() (gas: 329283) -EVM2EVMOffRamp__trialExecute:test_trialExecute_Success() (gas: 310166) -EVM2EVMOffRamp_ccipReceive:test_Reverts() (gas: 17048) -EVM2EVMOffRamp_constructor:test_CommitStoreAlreadyInUse_Revert() (gas: 153120) -EVM2EVMOffRamp_constructor:test_Constructor_Success() (gas: 5212732) -EVM2EVMOffRamp_constructor:test_ZeroOnRampAddress_Revert() (gas: 143845) -EVM2EVMOffRamp_execute:test_EmptyReport_Revert() (gas: 21507) -EVM2EVMOffRamp_execute:test_InvalidMessageId_Revert() (gas: 36936) -EVM2EVMOffRamp_execute:test_InvalidSourceChain_Revert() (gas: 52324) -EVM2EVMOffRamp_execute:test_InvalidSourcePoolAddress_Success() (gas: 473387) -EVM2EVMOffRamp_execute:test_ManualExecutionNotYetEnabled_Revert() (gas: 48346) -EVM2EVMOffRamp_execute:test_MessageTooLarge_Revert() (gas: 153019) -EVM2EVMOffRamp_execute:test_Paused_Revert() (gas: 103946) -EVM2EVMOffRamp_execute:test_ReceiverError_Success() (gas: 165358) -EVM2EVMOffRamp_execute:test_RetryFailedMessageWithoutManualExecution_Success() (gas: 180107) -EVM2EVMOffRamp_execute:test_RootNotCommitted_Revert() (gas: 43157) -EVM2EVMOffRamp_execute:test_SingleMessageNoTokensUnordered_Success() (gas: 160119) -EVM2EVMOffRamp_execute:test_SingleMessageNoTokens_Success() (gas: 175497) -EVM2EVMOffRamp_execute:test_SingleMessageToNonCCIPReceiver_Success() (gas: 237901) -EVM2EVMOffRamp_execute:test_SingleMessagesNoTokensSuccess_gas() (gas: 115048) -EVM2EVMOffRamp_execute:test_SkippedIncorrectNonceStillExecutes_Success() (gas: 406606) -EVM2EVMOffRamp_execute:test_SkippedIncorrectNonce_Success() (gas: 54774) -EVM2EVMOffRamp_execute:test_StrictUntouchedToSuccess_Success() (gas: 132556) -EVM2EVMOffRamp_execute:test_TokenDataMismatch_Revert() (gas: 52786) -EVM2EVMOffRamp_execute:test_TwoMessagesWithTokensAndGE_Success() (gas: 564471) -EVM2EVMOffRamp_execute:test_TwoMessagesWithTokensSuccess_gas() (gas: 494719) -EVM2EVMOffRamp_execute:test_UnexpectedTokenData_Revert() (gas: 35887) -EVM2EVMOffRamp_execute:test_Unhealthy_Revert() (gas: 546333) -EVM2EVMOffRamp_execute:test_UnsupportedNumberOfTokens_Revert() (gas: 65298) -EVM2EVMOffRamp_execute:test__execute_SkippedAlreadyExecutedMessageUnordered_Success() (gas: 124107) -EVM2EVMOffRamp_execute:test__execute_SkippedAlreadyExecutedMessage_Success() (gas: 144365) -EVM2EVMOffRamp_execute:test_execute_RouterYULCall_Success() (gas: 394187) -EVM2EVMOffRamp_executeSingleMessage:test_MessageSender_Revert() (gas: 18685) -EVM2EVMOffRamp_executeSingleMessage:test_NonContractWithTokens_Success() (gas: 275257) -EVM2EVMOffRamp_executeSingleMessage:test_NonContract_Success() (gas: 18815) -EVM2EVMOffRamp_executeSingleMessage:test_TokenHandlingError_Revert() (gas: 223182) -EVM2EVMOffRamp_executeSingleMessage:test_ZeroGasDONExecution_Revert() (gas: 48391) -EVM2EVMOffRamp_executeSingleMessage:test_executeSingleMessage_NoTokens_Success() (gas: 47823) -EVM2EVMOffRamp_executeSingleMessage:test_executeSingleMessage_WithTokens_Success() (gas: 311554) -EVM2EVMOffRamp_executeSingleMessage:test_executeSingleMessage_ZeroGasZeroData_Success() (gas: 70839) -EVM2EVMOffRamp_execute_upgrade:test_V2NonceNewSenderStartsAtZero_Success() (gas: 232136) -EVM2EVMOffRamp_execute_upgrade:test_V2NonceStartsAtV1Nonce_Success() (gas: 281170) -EVM2EVMOffRamp_execute_upgrade:test_V2OffRampNonceSkipsIfMsgInFlight_Success() (gas: 262488) -EVM2EVMOffRamp_execute_upgrade:test_V2SenderNoncesReadsPreviousRamp_Success() (gas: 230645) -EVM2EVMOffRamp_execute_upgrade:test_V2_Success() (gas: 132092) -EVM2EVMOffRamp_getAllRateLimitTokens:test_GetAllRateLimitTokens_Success() (gas: 38626) -EVM2EVMOffRamp_getExecutionState:test_FillExecutionState_Success() (gas: 3397486) -EVM2EVMOffRamp_getExecutionState:test_GetExecutionState_Success() (gas: 84833) -EVM2EVMOffRamp_manuallyExecute:test_ManualExecFailedTx_Revert() (gas: 188280) -EVM2EVMOffRamp_manuallyExecute:test_ManualExecForkedChain_Revert() (gas: 27574) -EVM2EVMOffRamp_manuallyExecute:test_ManualExecGasLimitMismatch_Revert() (gas: 46457) -EVM2EVMOffRamp_manuallyExecute:test_ManualExecInvalidGasLimit_Revert() (gas: 27948) -EVM2EVMOffRamp_manuallyExecute:test_ManualExecWithMultipleMessagesAndSourceTokens_Success() (gas: 531330) -EVM2EVMOffRamp_manuallyExecute:test_ManualExecWithSourceTokens_Success() (gas: 344463) -EVM2EVMOffRamp_manuallyExecute:test_ManualExec_Success() (gas: 189760) -EVM2EVMOffRamp_manuallyExecute:test_ReentrancyManualExecuteFails_Success() (gas: 2195128) -EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_DestinationGasAmountCountMismatch_Revert() (gas: 362054) -EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_DoesNotRevertIfUntouched_Success() (gas: 145457) -EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_InvalidTokenGasOverride_Revert() (gas: 365283) -EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_LowGasLimitManualExec_Success() (gas: 450711) -EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_WithGasOverride_Success() (gas: 192223) -EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_WithInvalidReceiverExecutionGasOverride_Revert() (gas: 155387) -EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_WithInvalidSourceTokenDataCount_Revert() (gas: 60494) -EVM2EVMOffRamp_metadataHash:test_MetadataHash_Success() (gas: 8895) -EVM2EVMOffRamp_setDynamicConfig:test_NonOwner_Revert() (gas: 40357) -EVM2EVMOffRamp_setDynamicConfig:test_RouterZeroAddress_Revert() (gas: 38419) -EVM2EVMOffRamp_setDynamicConfig:test_SetDynamicConfig_Success() (gas: 142469) -EVM2EVMOffRamp_updateRateLimitTokens:test_updateRateLimitTokens_AddsAndRemoves_Success() (gas: 162818) -EVM2EVMOffRamp_updateRateLimitTokens:test_updateRateLimitTokens_NonOwner_Revert() (gas: 16936) -EVM2EVMOffRamp_updateRateLimitTokens:test_updateRateLimitTokens_Success() (gas: 197985) -EVM2EVMOnRamp_constructor:test_Constructor_Success() (gas: 5056698) -EVM2EVMOnRamp_forwardFromRouter:test_CannotSendZeroTokens_Revert() (gas: 36063) -EVM2EVMOnRamp_forwardFromRouter:test_EnforceOutOfOrder_Revert() (gas: 99010) -EVM2EVMOnRamp_forwardFromRouter:test_ForwardFromRouterExtraArgsV2AllowOutOfOrderTrue_Success() (gas: 114925) -EVM2EVMOnRamp_forwardFromRouter:test_ForwardFromRouterExtraArgsV2_Success() (gas: 114967) -EVM2EVMOnRamp_forwardFromRouter:test_ForwardFromRouterSuccessCustomExtraArgs() (gas: 130991) -EVM2EVMOnRamp_forwardFromRouter:test_ForwardFromRouterSuccessLegacyExtraArgs() (gas: 139431) -EVM2EVMOnRamp_forwardFromRouter:test_ForwardFromRouter_Success() (gas: 130607) -EVM2EVMOnRamp_forwardFromRouter:test_InvalidAddressEncodePacked_Revert() (gas: 38647) -EVM2EVMOnRamp_forwardFromRouter:test_InvalidAddress_Revert() (gas: 38830) -EVM2EVMOnRamp_forwardFromRouter:test_InvalidChainSelector_Revert() (gas: 25726) -EVM2EVMOnRamp_forwardFromRouter:test_InvalidExtraArgsTag_Revert() (gas: 25545) -EVM2EVMOnRamp_forwardFromRouter:test_MaxCapacityExceeded_Revert() (gas: 84266) -EVM2EVMOnRamp_forwardFromRouter:test_MaxFeeBalanceReached_Revert() (gas: 36847) -EVM2EVMOnRamp_forwardFromRouter:test_MessageGasLimitTooHigh_Revert() (gas: 29327) -EVM2EVMOnRamp_forwardFromRouter:test_MessageTooLarge_Revert() (gas: 107850) -EVM2EVMOnRamp_forwardFromRouter:test_OriginalSender_Revert() (gas: 22823) -EVM2EVMOnRamp_forwardFromRouter:test_OverValueWithARLOff_Success() (gas: 226568) -EVM2EVMOnRamp_forwardFromRouter:test_Paused_Revert() (gas: 53432) -EVM2EVMOnRamp_forwardFromRouter:test_Permissions_Revert() (gas: 25757) -EVM2EVMOnRamp_forwardFromRouter:test_PriceNotFoundForToken_Revert() (gas: 57722) -EVM2EVMOnRamp_forwardFromRouter:test_ShouldIncrementNonceOnlyOnOrdered_Success() (gas: 182247) -EVM2EVMOnRamp_forwardFromRouter:test_ShouldIncrementSeqNumAndNonce_Success() (gas: 180718) -EVM2EVMOnRamp_forwardFromRouter:test_ShouldStoreNonLinkFees() (gas: 133236) -EVM2EVMOnRamp_forwardFromRouter:test_SourceTokenDataTooLarge_Revert() (gas: 3573653) -EVM2EVMOnRamp_forwardFromRouter:test_TooManyTokens_Revert() (gas: 30472) -EVM2EVMOnRamp_forwardFromRouter:test_Unhealthy_Revert() (gas: 43480) -EVM2EVMOnRamp_forwardFromRouter:test_UnsupportedToken_Revert() (gas: 110111) -EVM2EVMOnRamp_forwardFromRouter:test_ZeroAddressReceiver_Revert() (gas: 316020) -EVM2EVMOnRamp_forwardFromRouter:test_forwardFromRouter_ShouldStoreLinkFees_Success() (gas: 113033) -EVM2EVMOnRamp_forwardFromRouter:test_forwardFromRouter_UnsupportedToken_Revert() (gas: 72824) -EVM2EVMOnRamp_forwardFromRouter:test_forwardFromRouter_correctSourceTokenData_Success() (gas: 714726) -EVM2EVMOnRamp_forwardFromRouter_upgrade:test_V2NonceNewSenderStartsAtZero_Success() (gas: 148808) -EVM2EVMOnRamp_forwardFromRouter_upgrade:test_V2NonceStartsAtV1Nonce_Success() (gas: 192679) -EVM2EVMOnRamp_forwardFromRouter_upgrade:test_V2SenderNoncesReadsPreviousRamp_Success() (gas: 123243) -EVM2EVMOnRamp_forwardFromRouter_upgrade:test_V2_Success() (gas: 96028) -EVM2EVMOnRamp_getDataAvailabilityCost:test_EmptyMessageCalculatesDataAvailabilityCost_Success() (gas: 20598) -EVM2EVMOnRamp_getDataAvailabilityCost:test_SimpleMessageCalculatesDataAvailabilityCost_Success() (gas: 20966) -EVM2EVMOnRamp_getFee:test_EmptyMessage_Success() (gas: 74894) -EVM2EVMOnRamp_getFee:test_GetFeeOfZeroForTokenMessage_Success() (gas: 80393) -EVM2EVMOnRamp_getFee:test_HighGasMessage_Success() (gas: 230742) -EVM2EVMOnRamp_getFee:test_MessageGasLimitTooHigh_Revert() (gas: 16943) -EVM2EVMOnRamp_getFee:test_MessageTooLarge_Revert() (gas: 95505) -EVM2EVMOnRamp_getFee:test_MessageWithDataAndTokenTransfer_Success() (gas: 154010) -EVM2EVMOnRamp_getFee:test_NotAFeeToken_Revert() (gas: 24323) -EVM2EVMOnRamp_getFee:test_SingleTokenMessage_Success() (gas: 114740) -EVM2EVMOnRamp_getFee:test_TooManyTokens_Revert() (gas: 20142) -EVM2EVMOnRamp_getFee:test_ZeroDataAvailabilityMultiplier_Success() (gas: 63070) -EVM2EVMOnRamp_getSupportedTokens:test_GetSupportedTokens_Revert() (gas: 10532) -EVM2EVMOnRamp_getTokenPool:test_GetTokenPool_Success() (gas: 35297) -EVM2EVMOnRamp_getTokenTransferCost:test_CustomTokenBpsFee_Success() (gas: 43218) -EVM2EVMOnRamp_getTokenTransferCost:test_FeeTokenBpsFee_Success() (gas: 33280) -EVM2EVMOnRamp_getTokenTransferCost:test_LargeTokenTransferChargesMaxFeeAndGas_Success() (gas: 28551) -EVM2EVMOnRamp_getTokenTransferCost:test_MixedTokenTransferFee_Success() (gas: 122690) -EVM2EVMOnRamp_getTokenTransferCost:test_NoTokenTransferChargesZeroFee_Success() (gas: 15403) -EVM2EVMOnRamp_getTokenTransferCost:test_SmallTokenTransferChargesMinFeeAndGas_Success() (gas: 28359) -EVM2EVMOnRamp_getTokenTransferCost:test_UnsupportedToken_Revert() (gas: 21353) -EVM2EVMOnRamp_getTokenTransferCost:test_ZeroAmountTokenTransferChargesMinFeeAndGas_Success() (gas: 28382) -EVM2EVMOnRamp_getTokenTransferCost:test_ZeroFeeConfigChargesMinFee_Success() (gas: 38899) -EVM2EVMOnRamp_getTokenTransferCost:test__getTokenTransferCost_selfServeUsesDefaults_Success() (gas: 29674) -EVM2EVMOnRamp_linkAvailableForPayment:test_InsufficientLinkBalance_Success() (gas: 32756) -EVM2EVMOnRamp_linkAvailableForPayment:test_LinkAvailableForPayment_Success() (gas: 135247) -EVM2EVMOnRamp_payNops:test_AdminPayNops_Success() (gas: 143660) -EVM2EVMOnRamp_payNops:test_InsufficientBalance_Revert() (gas: 29196) -EVM2EVMOnRamp_payNops:test_NoFeesToPay_Revert() (gas: 127718) -EVM2EVMOnRamp_payNops:test_NoNopsToPay_Revert() (gas: 133580) -EVM2EVMOnRamp_payNops:test_NopPayNops_Success() (gas: 146947) -EVM2EVMOnRamp_payNops:test_OwnerPayNops_Success() (gas: 141522) -EVM2EVMOnRamp_payNops:test_PayNopsSuccessAfterSetNops() (gas: 298719) -EVM2EVMOnRamp_payNops:test_WrongPermissions_Revert() (gas: 15378) -EVM2EVMOnRamp_setDynamicConfig:test_SetConfigInvalidConfig_Revert() (gas: 42524) -EVM2EVMOnRamp_setDynamicConfig:test_SetConfigOnlyOwner_Revert() (gas: 21426) -EVM2EVMOnRamp_setDynamicConfig:test_SetDynamicConfig_Success() (gas: 54301) -EVM2EVMOnRamp_setFeeTokenConfig:test_OnlyCallableByOwnerOrAdmin_Revert() (gas: 13530) -EVM2EVMOnRamp_setFeeTokenConfig:test_SetFeeTokenConfigByAdmin_Success() (gas: 16497) -EVM2EVMOnRamp_setFeeTokenConfig:test_SetFeeTokenConfig_Success() (gas: 14036) -EVM2EVMOnRamp_setNops:test_AdminCanSetNops_Success() (gas: 61872) -EVM2EVMOnRamp_setNops:test_IncludesPayment_Success() (gas: 470835) -EVM2EVMOnRamp_setNops:test_LinkTokenCannotBeNop_Revert() (gas: 57370) -EVM2EVMOnRamp_setNops:test_NonOwnerOrAdmin_Revert() (gas: 14779) -EVM2EVMOnRamp_setNops:test_NotEnoughFundsForPayout_Revert() (gas: 85200) -EVM2EVMOnRamp_setNops:test_SetNopsRemovesOldNopsCompletely_Success() (gas: 60868) -EVM2EVMOnRamp_setNops:test_SetNops_Success() (gas: 174097) -EVM2EVMOnRamp_setNops:test_TooManyNops_Revert() (gas: 193503) -EVM2EVMOnRamp_setNops:test_ZeroAddressCannotBeNop_Revert() (gas: 53711) -EVM2EVMOnRamp_setTokenTransferFeeConfig:test__setTokenTransferFeeConfig_InvalidDestBytesOverhead_Revert() (gas: 14616) -EVM2EVMOnRamp_setTokenTransferFeeConfig:test__setTokenTransferFeeConfig_OnlyCallableByOwnerOrAdmin_Revert() (gas: 14427) -EVM2EVMOnRamp_setTokenTransferFeeConfig:test__setTokenTransferFeeConfig_Success() (gas: 85487) -EVM2EVMOnRamp_setTokenTransferFeeConfig:test__setTokenTransferFeeConfig_byAdmin_Success() (gas: 17468) -EVM2EVMOnRamp_withdrawNonLinkFees:test_LinkBalanceNotSettled_Revert() (gas: 83617) -EVM2EVMOnRamp_withdrawNonLinkFees:test_NonOwnerOrAdmin_Revert() (gas: 15353) -EVM2EVMOnRamp_withdrawNonLinkFees:test_SettlingBalance_Success() (gas: 272851) -EVM2EVMOnRamp_withdrawNonLinkFees:test_WithdrawNonLinkFees_Success() (gas: 53566) -EVM2EVMOnRamp_withdrawNonLinkFees:test_WithdrawToZeroAddress_Revert() (gas: 12875) -EtherSenderReceiverTest_ccipReceive:test_ccipReceive_fallbackToWethTransfer() (gas: 96907) -EtherSenderReceiverTest_ccipReceive:test_ccipReceive_happyPath() (gas: 49775) -EtherSenderReceiverTest_ccipReceive:test_ccipReceive_wrongToken() (gas: 17435) -EtherSenderReceiverTest_ccipReceive:test_ccipReceive_wrongTokenAmount() (gas: 15728) -EtherSenderReceiverTest_ccipSend:test_ccipSend_reverts_insufficientFee_feeToken() (gas: 99909) -EtherSenderReceiverTest_ccipSend:test_ccipSend_reverts_insufficientFee_native() (gas: 76138) -EtherSenderReceiverTest_ccipSend:test_ccipSend_reverts_insufficientFee_weth() (gas: 99931) -EtherSenderReceiverTest_ccipSend:test_ccipSend_success_feeToken() (gas: 145010) -EtherSenderReceiverTest_ccipSend:test_ccipSend_success_native() (gas: 80373) -EtherSenderReceiverTest_ccipSend:test_ccipSend_success_nativeExcess() (gas: 80560) -EtherSenderReceiverTest_ccipSend:test_ccipSend_success_weth() (gas: 96064) -EtherSenderReceiverTest_constructor:test_constructor() (gas: 17553) -EtherSenderReceiverTest_getFee:test_getFee() (gas: 27346) -EtherSenderReceiverTest_validateFeeToken:test_validateFeeToken_reverts_feeToken_tokenAmountNotEqualToMsgValue() (gas: 20375) -EtherSenderReceiverTest_validateFeeToken:test_validateFeeToken_valid_feeToken() (gas: 16724) -EtherSenderReceiverTest_validateFeeToken:test_validateFeeToken_valid_native() (gas: 16657) -EtherSenderReceiverTest_validatedMessage:test_validatedMessage_dataOverwrittenToMsgSender() (gas: 25457) -EtherSenderReceiverTest_validatedMessage:test_validatedMessage_emptyDataOverwrittenToMsgSender() (gas: 25307) -EtherSenderReceiverTest_validatedMessage:test_validatedMessage_invalidTokenAmounts() (gas: 17925) -EtherSenderReceiverTest_validatedMessage:test_validatedMessage_tokenOverwrittenToWeth() (gas: 25329) -EtherSenderReceiverTest_validatedMessage:test_validatedMessage_validMessage_extraArgs() (gas: 26370) -FeeQuoter_applyDestChainConfigUpdates:test_InvalidChainFamilySelector_Revert() (gas: 16686) -FeeQuoter_applyDestChainConfigUpdates:test_InvalidDestChainConfigDestChainSelectorEqZero_Revert() (gas: 16588) -FeeQuoter_applyDestChainConfigUpdates:test_applyDestChainConfigUpdatesDefaultTxGasLimitEqZero_Revert() (gas: 16630) -FeeQuoter_applyDestChainConfigUpdates:test_applyDestChainConfigUpdatesDefaultTxGasLimitGtMaxPerMessageGasLimit_Revert() (gas: 40326) -FeeQuoter_applyDestChainConfigUpdates:test_applyDestChainConfigUpdatesZeroIntput_Success() (gas: 12483) -FeeQuoter_applyDestChainConfigUpdates:test_applyDestChainConfigUpdates_Success() (gas: 137553) -FeeQuoter_applyFeeTokensUpdates:test_ApplyFeeTokensUpdates_Success() (gas: 80348) -FeeQuoter_applyFeeTokensUpdates:test_OnlyCallableByOwner_Revert() (gas: 12687) -FeeQuoter_applyPremiumMultiplierWeiPerEthUpdates:test_OnlyCallableByOwnerOrAdmin_Revert() (gas: 11547) -FeeQuoter_applyPremiumMultiplierWeiPerEthUpdates:test_applyPremiumMultiplierWeiPerEthUpdatesMultipleTokens_Success() (gas: 54684) -FeeQuoter_applyPremiumMultiplierWeiPerEthUpdates:test_applyPremiumMultiplierWeiPerEthUpdatesSingleToken_Success() (gas: 45130) -FeeQuoter_applyPremiumMultiplierWeiPerEthUpdates:test_applyPremiumMultiplierWeiPerEthUpdatesZeroInput() (gas: 12332) -FeeQuoter_applyTokenTransferFeeConfigUpdates:test_ApplyTokenTransferFeeConfig_Success() (gas: 87721) -FeeQuoter_applyTokenTransferFeeConfigUpdates:test_ApplyTokenTransferFeeZeroInput() (gas: 13233) -FeeQuoter_applyTokenTransferFeeConfigUpdates:test_InvalidDestBytesOverhead_Revert() (gas: 17278) -FeeQuoter_applyTokenTransferFeeConfigUpdates:test_OnlyCallableByOwnerOrAdmin_Revert() (gas: 12330) -FeeQuoter_constructor:test_InvalidLinkTokenEqZeroAddress_Revert() (gas: 106501) -FeeQuoter_constructor:test_InvalidMaxFeeJuelsPerMsg_Revert() (gas: 110851) -FeeQuoter_constructor:test_InvalidStalenessThreshold_Revert() (gas: 110904) -FeeQuoter_constructor:test_Setup_Success() (gas: 4972944) -FeeQuoter_convertTokenAmount:test_ConvertTokenAmount_Success() (gas: 68383) -FeeQuoter_convertTokenAmount:test_LinkTokenNotSupported_Revert() (gas: 29076) -FeeQuoter_getDataAvailabilityCost:test_EmptyMessageCalculatesDataAvailabilityCost_Success() (gas: 94781) -FeeQuoter_getDataAvailabilityCost:test_SimpleMessageCalculatesDataAvailabilityCostUnsupportedDestChainSelector_Success() (gas: 14670) -FeeQuoter_getDataAvailabilityCost:test_SimpleMessageCalculatesDataAvailabilityCost_Success() (gas: 20550) -FeeQuoter_getTokenAndGasPrices:test_GetFeeTokenAndGasPrices_Success() (gas: 68298) -FeeQuoter_getTokenAndGasPrices:test_StaleGasPrice_Revert() (gas: 16892) -FeeQuoter_getTokenAndGasPrices:test_UnsupportedChain_Revert() (gas: 16188) -FeeQuoter_getTokenAndGasPrices:test_ZeroGasPrice_Success() (gas: 43667) -FeeQuoter_getTokenPrice:test_GetTokenPriceFromFeed_Success() (gas: 66273) -FeeQuoter_getTokenPrices:test_GetTokenPrices_Success() (gas: 78322) -FeeQuoter_getTokenTransferCost:test_CustomTokenBpsFee_Success() (gas: 39244) -FeeQuoter_getTokenTransferCost:test_FeeTokenBpsFee_Success() (gas: 34880) -FeeQuoter_getTokenTransferCost:test_LargeTokenTransferChargesMaxFeeAndGas_Success() (gas: 27954) -FeeQuoter_getTokenTransferCost:test_MixedTokenTransferFee_Success() (gas: 97513) -FeeQuoter_getTokenTransferCost:test_NoTokenTransferChargesZeroFee_Success() (gas: 20468) -FeeQuoter_getTokenTransferCost:test_SmallTokenTransferChargesMinFeeAndGas_Success() (gas: 27829) -FeeQuoter_getTokenTransferCost:test_ZeroAmountTokenTransferChargesMinFeeAndGas_Success() (gas: 27785) -FeeQuoter_getTokenTransferCost:test_ZeroFeeConfigChargesMinFee_Success() (gas: 40376) -FeeQuoter_getTokenTransferCost:test_getTokenTransferCost_selfServeUsesDefaults_Success() (gas: 29503) -FeeQuoter_getValidatedFee:test_DestinationChainNotEnabled_Revert() (gas: 18315) -FeeQuoter_getValidatedFee:test_EmptyMessage_Success() (gas: 82344) -FeeQuoter_getValidatedFee:test_EnforceOutOfOrder_Revert() (gas: 52638) -FeeQuoter_getValidatedFee:test_HighGasMessage_Success() (gas: 238762) -FeeQuoter_getValidatedFee:test_InvalidEVMAddress_Revert() (gas: 22555) -FeeQuoter_getValidatedFee:test_MessageGasLimitTooHigh_Revert() (gas: 29847) -FeeQuoter_getValidatedFee:test_MessageTooLarge_Revert() (gas: 100292) -FeeQuoter_getValidatedFee:test_MessageWithDataAndTokenTransfer_Success() (gas: 141892) -FeeQuoter_getValidatedFee:test_NotAFeeToken_Revert() (gas: 21172) -FeeQuoter_getValidatedFee:test_SingleTokenMessage_Success() (gas: 113309) -FeeQuoter_getValidatedFee:test_TooManyTokens_Revert() (gas: 22691) -FeeQuoter_getValidatedFee:test_ZeroDataAvailabilityMultiplier_Success() (gas: 62714) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedErc20Above18Decimals_Success() (gas: 1973907) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedErc20Below18Decimals_Success() (gas: 1973865) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFeedAt0Decimals_Success() (gas: 1953984) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFeedAt18Decimals_Success() (gas: 1973639) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFlippedDecimals_Success() (gas: 1973843) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedMaxInt224Value_Success() (gas: 1973655) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedOverStalenessPeriod_Success() (gas: 64610) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeed_Success() (gas: 64490) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPrice_Success() (gas: 58894) -FeeQuoter_getValidatedTokenPrice:test_OverflowFeedPrice_Revert() (gas: 1973352) -FeeQuoter_getValidatedTokenPrice:test_StaleFeeToken_Success() (gas: 61764) -FeeQuoter_getValidatedTokenPrice:test_TokenNotSupportedFeed_Revert() (gas: 116495) -FeeQuoter_getValidatedTokenPrice:test_TokenNotSupported_Revert() (gas: 14037) -FeeQuoter_getValidatedTokenPrice:test_UnderflowFeedPrice_Revert() (gas: 1972029) -FeeQuoter_onReport:test_OnReport_StaleUpdate_Revert() (gas: 43631) -FeeQuoter_onReport:test_onReport_InvalidForwarder_Reverts() (gas: 23492) -FeeQuoter_onReport:test_onReport_Success() (gas: 80094) -FeeQuoter_onReport:test_onReport_UnsupportedToken_Reverts() (gas: 26860) -FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsDefault_Success() (gas: 17284) -FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsEnforceOutOfOrder_Revert() (gas: 21428) -FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsGasLimitTooHigh_Revert() (gas: 18516) -FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsInvalidExtraArgsTag_Revert() (gas: 18034) -FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsV1_Success() (gas: 18390) -FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsV2_Success() (gas: 18512) -FeeQuoter_processMessageArgs:test_processMessageArgs_InvalidEVMAddressDestToken_Revert() (gas: 44703) -FeeQuoter_processMessageArgs:test_processMessageArgs_InvalidExtraArgs_Revert() (gas: 19914) -FeeQuoter_processMessageArgs:test_processMessageArgs_MalformedEVMExtraArgs_Revert() (gas: 20333) -FeeQuoter_processMessageArgs:test_processMessageArgs_MessageFeeTooHigh_Revert() (gas: 17904) -FeeQuoter_processMessageArgs:test_processMessageArgs_SourceTokenDataTooLarge_Revert() (gas: 122709) -FeeQuoter_processMessageArgs:test_processMessageArgs_TokenAmountArraysMismatching_Revert() (gas: 42032) -FeeQuoter_processMessageArgs:test_processMessageArgs_WitEVMExtraArgsV2_Success() (gas: 28518) -FeeQuoter_processMessageArgs:test_processMessageArgs_WithConvertedTokenAmount_Success() (gas: 29949) -FeeQuoter_processMessageArgs:test_processMessageArgs_WithCorrectPoolReturnData_Success() (gas: 76145) -FeeQuoter_processMessageArgs:test_processMessageArgs_WithEVMExtraArgsV1_Success() (gas: 28116) -FeeQuoter_processMessageArgs:test_processMessageArgs_WithEmptyEVMExtraArgs_Success() (gas: 25987) -FeeQuoter_processMessageArgs:test_processMessageArgs_WithLinkTokenAmount_Success() (gas: 19523) -FeeQuoter_updatePrices:test_OnlyCallableByUpdater_Revert() (gas: 12176) -FeeQuoter_updatePrices:test_OnlyGasPrice_Success() (gas: 23730) -FeeQuoter_updatePrices:test_OnlyTokenPrice_Success() (gas: 28505) -FeeQuoter_updatePrices:test_UpdatableByAuthorizedCaller_Success() (gas: 74598) -FeeQuoter_updatePrices:test_UpdateMultiplePrices_Success() (gas: 145320) -FeeQuoter_updateTokenPriceFeeds:test_FeedNotUpdated() (gas: 50875) -FeeQuoter_updateTokenPriceFeeds:test_FeedUnset_Success() (gas: 63847) -FeeQuoter_updateTokenPriceFeeds:test_FeedUpdatedByNonOwner_Revert() (gas: 20142) -FeeQuoter_updateTokenPriceFeeds:test_MultipleFeedUpdate_Success() (gas: 89470) -FeeQuoter_updateTokenPriceFeeds:test_SingleFeedUpdate_Success() (gas: 51121) -FeeQuoter_updateTokenPriceFeeds:test_ZeroFeeds_Success() (gas: 12437) -FeeQuoter_validateDestFamilyAddress:test_InvalidEVMAddressEncodePacked_Revert() (gas: 10655) -FeeQuoter_validateDestFamilyAddress:test_InvalidEVMAddressPrecompiles_Revert() (gas: 4001603) -FeeQuoter_validateDestFamilyAddress:test_InvalidEVMAddress_Revert() (gas: 10839) -FeeQuoter_validateDestFamilyAddress:test_ValidEVMAddress_Success() (gas: 6731) -FeeQuoter_validateDestFamilyAddress:test_ValidNonEVMAddress_Success() (gas: 6511) -HybridUSDCTokenPoolMigrationTests:test_LockOrBurn_LockReleaseMechanism_then_switchToPrimary_Success() (gas: 209248) -HybridUSDCTokenPoolMigrationTests:test_LockOrBurn_PrimaryMechanism_Success() (gas: 135879) -HybridUSDCTokenPoolMigrationTests:test_LockOrBurn_WhileMigrationPause_Revert() (gas: 107090) -HybridUSDCTokenPoolMigrationTests:test_LockOrBurn_onLockReleaseMechanism_Success() (gas: 144586) -HybridUSDCTokenPoolMigrationTests:test_MintOrRelease_OnLockReleaseMechanism_Success() (gas: 214817) -HybridUSDCTokenPoolMigrationTests:test_MintOrRelease_OnLockReleaseMechanism_then_switchToPrimary_Success() (gas: 423641) -HybridUSDCTokenPoolMigrationTests:test_MintOrRelease_incomingMessageWithPrimaryMechanism() (gas: 268928) -HybridUSDCTokenPoolMigrationTests:test_ReleaseOrMint_WhileMigrationPause_Revert() (gas: 111484) -HybridUSDCTokenPoolMigrationTests:test_burnLockedUSDC_invalidPermissions_Revert() (gas: 39362) -HybridUSDCTokenPoolMigrationTests:test_cancelExistingCCTPMigrationProposal() (gas: 33189) -HybridUSDCTokenPoolMigrationTests:test_cannotCancelANonExistentMigrationProposal() (gas: 12669) -HybridUSDCTokenPoolMigrationTests:test_cannotModifyLiquidityWithoutPermissions_Revert() (gas: 13329) -HybridUSDCTokenPoolMigrationTests:test_cannotTransferLiquidityDuringPendingMigration_Revert() (gas: 160900) -HybridUSDCTokenPoolMigrationTests:test_lockOrBurn_then_BurnInCCTPMigration_Success() (gas: 255982) -HybridUSDCTokenPoolMigrationTests:test_transferLiquidity_Success() (gas: 165921) -HybridUSDCTokenPoolMigrationTests:test_unstickManualTxAfterMigration_destChain_Success() (gas: 154242) -HybridUSDCTokenPoolMigrationTests:test_unstickManualTxAfterMigration_homeChain_Success() (gas: 463740) -HybridUSDCTokenPoolTests:test_LockOrBurn_LockReleaseMechanism_then_switchToPrimary_Success() (gas: 209230) -HybridUSDCTokenPoolTests:test_LockOrBurn_PrimaryMechanism_Success() (gas: 135880) -HybridUSDCTokenPoolTests:test_LockOrBurn_WhileMigrationPause_Revert() (gas: 107135) -HybridUSDCTokenPoolTests:test_LockOrBurn_onLockReleaseMechanism_Success() (gas: 144607) -HybridUSDCTokenPoolTests:test_MintOrRelease_OnLockReleaseMechanism_Success() (gas: 214795) -HybridUSDCTokenPoolTests:test_MintOrRelease_OnLockReleaseMechanism_then_switchToPrimary_Success() (gas: 423619) -HybridUSDCTokenPoolTests:test_MintOrRelease_incomingMessageWithPrimaryMechanism() (gas: 268910) -HybridUSDCTokenPoolTests:test_ReleaseOrMint_WhileMigrationPause_Revert() (gas: 111528) -HybridUSDCTokenPoolTests:test_cannotTransferLiquidityDuringPendingMigration_Revert() (gas: 160845) -HybridUSDCTokenPoolTests:test_transferLiquidity_Success() (gas: 165904) -LockReleaseTokenPoolAndProxy_setRebalancer:test_SetRebalancer_Revert() (gas: 10989) -LockReleaseTokenPoolAndProxy_setRebalancer:test_SetRebalancer_Success() (gas: 18028) -LockReleaseTokenPoolPoolAndProxy_canAcceptLiquidity:test_CanAcceptLiquidity_Success() (gas: 3051552) -LockReleaseTokenPoolPoolAndProxy_provideLiquidity:test_LiquidityNotAccepted_Revert() (gas: 3047988) -LockReleaseTokenPoolPoolAndProxy_provideLiquidity:test_Unauthorized_Revert() (gas: 11489) -LockReleaseTokenPoolPoolAndProxy_supportsInterface:test_SupportsInterface_Success() (gas: 10196) -LockReleaseTokenPoolPoolAndProxy_withdrawalLiquidity:test_InsufficientLiquidity_Revert() (gas: 60187) -LockReleaseTokenPoolPoolAndProxy_withdrawalLiquidity:test_Unauthorized_Revert() (gas: 11464) -LockReleaseTokenPool_canAcceptLiquidity:test_CanAcceptLiquidity_Success() (gas: 2836138) -LockReleaseTokenPool_lockOrBurn:test_LockOrBurnWithAllowList_Revert() (gas: 30062) -LockReleaseTokenPool_lockOrBurn:test_LockOrBurnWithAllowList_Success() (gas: 79943) -LockReleaseTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 59620) -LockReleaseTokenPool_provideLiquidity:test_LiquidityNotAccepted_Revert() (gas: 2832618) -LockReleaseTokenPool_provideLiquidity:test_Unauthorized_Revert() (gas: 11489) -LockReleaseTokenPool_releaseOrMint:test_ChainNotAllowed_Revert() (gas: 72743) -LockReleaseTokenPool_releaseOrMint:test_PoolMintNotHealthy_Revert() (gas: 56352) -LockReleaseTokenPool_releaseOrMint:test_ReleaseOrMint_Success() (gas: 225548) -LockReleaseTokenPool_setRebalancer:test_SetRebalancer_Revert() (gas: 11011) -LockReleaseTokenPool_setRebalancer:test_SetRebalancer_Success() (gas: 18094) -LockReleaseTokenPool_supportsInterface:test_SupportsInterface_Success() (gas: 10196) -LockReleaseTokenPool_transferLiquidity:test_transferLiquidity_Success() (gas: 83231) -LockReleaseTokenPool_transferLiquidity:test_transferLiquidity_transferTooMuch_Revert() (gas: 55953) -LockReleaseTokenPool_withdrawalLiquidity:test_InsufficientLiquidity_Revert() (gas: 60187) -LockReleaseTokenPool_withdrawalLiquidity:test_Unauthorized_Revert() (gas: 11464) -LockRelease_setRateLimitAdmin:test_SetRateLimitAdmin_Revert() (gas: 11054) -LockRelease_setRateLimitAdmin:test_SetRateLimitAdmin_Success() (gas: 35060) -MerkleMultiProofTest:test_CVE_2023_34459() (gas: 5478) -MerkleMultiProofTest:test_EmptyLeaf_Revert() (gas: 3585) -MerkleMultiProofTest:test_MerkleRoot256() (gas: 394891) -MerkleMultiProofTest:test_MerkleRootSingleLeaf_Success() (gas: 3661) -MerkleMultiProofTest:test_SpecSync_gas() (gas: 34129) -MockRouterTest:test_ccipSendWithInsufficientNativeTokens_Revert() (gas: 34037) -MockRouterTest:test_ccipSendWithInvalidMsgValue_Revert() (gas: 60842) -MockRouterTest:test_ccipSendWithLinkFeeTokenAndValidMsgValue_Success() (gas: 126576) -MockRouterTest:test_ccipSendWithLinkFeeTokenbutInsufficientAllowance_Revert() (gas: 63455) -MockRouterTest:test_ccipSendWithSufficientNativeFeeTokens_Success() (gas: 44012) -MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_MultipleConfigsBothLanes_Success() (gas: 133528) -MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_MultipleConfigs_Success() (gas: 315630) -MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_OnlyCallableByOwner_Revert() (gas: 17864) -MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_SingleConfigOutbound_Success() (gas: 76453) -MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_SingleConfig_Success() (gas: 76369) -MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_UpdateExistingConfigWithNoDifference_Success() (gas: 38736) -MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_UpdateExistingConfig_Success() (gas: 53869) -MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_ZeroChainSelector_Revert() (gas: 17109) -MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_ZeroConfigs_Success() (gas: 12436) -MultiAggregateRateLimiter_constructor:test_ConstructorNoAuthorizedCallers_Success() (gas: 1958738) -MultiAggregateRateLimiter_constructor:test_Constructor_Success() (gas: 2075046) -MultiAggregateRateLimiter_getTokenBucket:test_GetTokenBucket_Success() (gas: 30794) -MultiAggregateRateLimiter_getTokenBucket:test_Refill_Success() (gas: 48099) -MultiAggregateRateLimiter_getTokenBucket:test_TimeUnderflow_Revert() (gas: 15929) -MultiAggregateRateLimiter_getTokenValue:test_GetTokenValue_Success() (gas: 17525) -MultiAggregateRateLimiter_getTokenValue:test_NoTokenPrice_Reverts() (gas: 21408) -MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageFromUnauthorizedCaller_Revert() (gas: 14617) -MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithDifferentTokensOnDifferentChains_Success() (gas: 210107) -MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithDisabledRateLimitToken_Success() (gas: 58416) -MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithNoTokens_Success() (gas: 17743) -MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithRateLimitDisabled_Success() (gas: 45162) -MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithRateLimitExceeded_Revert() (gas: 46370) -MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithRateLimitReset_Success() (gas: 76561) -MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithTokensOnDifferentChains_Success() (gas: 308233) -MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithTokens_Success() (gas: 50558) -MultiAggregateRateLimiter_onOutboundMessage:test_RateLimitValueDifferentLanes_Success() (gas: 1073669578) -MultiAggregateRateLimiter_onOutboundMessage:test_ValidateMessageWithNoTokens_Success() (gas: 19302) -MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageFromUnauthorizedCaller_Revert() (gas: 15913) -MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithDifferentTokensOnDifferentChains_Success() (gas: 209885) -MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithDisabledRateLimitToken_Success() (gas: 60182) -MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithRateLimitDisabled_Success() (gas: 46935) -MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithRateLimitExceeded_Revert() (gas: 48179) -MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithRateLimitReset_Success() (gas: 77728) -MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithTokensOnDifferentChains_Success() (gas: 308237) -MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithTokens_Success() (gas: 52346) -MultiAggregateRateLimiter_setFeeQuoter:test_OnlyOwner_Revert() (gas: 11337) -MultiAggregateRateLimiter_setFeeQuoter:test_Owner_Success() (gas: 19090) -MultiAggregateRateLimiter_setFeeQuoter:test_ZeroAddress_Revert() (gas: 10609) -MultiAggregateRateLimiter_updateRateLimitTokens:test_NonOwner_Revert() (gas: 18878) -MultiAggregateRateLimiter_updateRateLimitTokens:test_UpdateRateLimitTokensMultipleChains_Success() (gas: 280256) -MultiAggregateRateLimiter_updateRateLimitTokens:test_UpdateRateLimitTokensSingleChain_Success() (gas: 254729) -MultiAggregateRateLimiter_updateRateLimitTokens:test_UpdateRateLimitTokens_AddsAndRemoves_Success() (gas: 204595) -MultiAggregateRateLimiter_updateRateLimitTokens:test_UpdateRateLimitTokens_RemoveNonExistentToken_Success() (gas: 28826) -MultiAggregateRateLimiter_updateRateLimitTokens:test_ZeroDestToken_Revert() (gas: 18324) -MultiAggregateRateLimiter_updateRateLimitTokens:test_ZeroSourceToken_Revert() (gas: 18253) -MultiOCR3Base_setOCR3Configs:test_FMustBePositive_Revert() (gas: 59397) -MultiOCR3Base_setOCR3Configs:test_FTooHigh_Revert() (gas: 44190) -MultiOCR3Base_setOCR3Configs:test_MoreTransmittersThanSigners_Revert() (gas: 104822) -MultiOCR3Base_setOCR3Configs:test_NoTransmitters_Revert() (gas: 18886) -MultiOCR3Base_setOCR3Configs:test_RepeatSignerAddress_Revert() (gas: 283736) -MultiOCR3Base_setOCR3Configs:test_RepeatTransmitterAddress_Revert() (gas: 422361) -MultiOCR3Base_setOCR3Configs:test_SetConfigIgnoreSigners_Success() (gas: 511918) -MultiOCR3Base_setOCR3Configs:test_SetConfigWithSignersMismatchingTransmitters_Success() (gas: 680323) -MultiOCR3Base_setOCR3Configs:test_SetConfigWithSigners_Success() (gas: 828900) -MultiOCR3Base_setOCR3Configs:test_SetConfigWithoutSigners_Success() (gas: 457292) -MultiOCR3Base_setOCR3Configs:test_SetConfigsZeroInput_Success() (gas: 12481) -MultiOCR3Base_setOCR3Configs:test_SetMultipleConfigs_Success() (gas: 2141722) -MultiOCR3Base_setOCR3Configs:test_SignerCannotBeZeroAddress_Revert() (gas: 141835) -MultiOCR3Base_setOCR3Configs:test_StaticConfigChange_Revert() (gas: 807623) -MultiOCR3Base_setOCR3Configs:test_TooManySigners_Revert() (gas: 158867) -MultiOCR3Base_setOCR3Configs:test_TooManyTransmitters_Revert() (gas: 112335) -MultiOCR3Base_setOCR3Configs:test_TransmitterCannotBeZeroAddress_Revert() (gas: 254201) -MultiOCR3Base_setOCR3Configs:test_UpdateConfigSigners_Success() (gas: 861206) -MultiOCR3Base_setOCR3Configs:test_UpdateConfigTransmittersWithoutSigners_Success() (gas: 475852) -MultiOCR3Base_transmit:test_ConfigDigestMismatch_Revert() (gas: 42956) -MultiOCR3Base_transmit:test_ForkedChain_Revert() (gas: 48639) -MultiOCR3Base_transmit:test_InsufficientSignatures_Revert() (gas: 77138) -MultiOCR3Base_transmit:test_NonUniqueSignature_Revert() (gas: 65912) -MultiOCR3Base_transmit:test_SignatureOutOfRegistration_Revert() (gas: 33495) -MultiOCR3Base_transmit:test_TooManySignatures_Revert() (gas: 79795) -MultiOCR3Base_transmit:test_TransmitSigners_gas_Success() (gas: 33664) -MultiOCR3Base_transmit:test_TransmitWithExtraCalldataArgs_Revert() (gas: 47200) -MultiOCR3Base_transmit:test_TransmitWithLessCalldataArgs_Revert() (gas: 25768) -MultiOCR3Base_transmit:test_TransmitWithoutSignatureVerification_gas_Success() (gas: 18745) -MultiOCR3Base_transmit:test_UnAuthorizedTransmitter_Revert() (gas: 24234) -MultiOCR3Base_transmit:test_UnauthorizedSigner_Revert() (gas: 61275) -MultiOCR3Base_transmit:test_UnconfiguredPlugin_Revert() (gas: 39933) -MultiOCR3Base_transmit:test_ZeroSignatures_Revert() (gas: 33049) +CCIPClientExample_sanity:test_ImmutableExamples_Success() (gas: 3189509) +CCIPHome__validateConfig:test__validateConfigLessTransmittersThanSigners_Success() (gas: 380435) +CCIPHome__validateConfig:test__validateConfigSmallerFChain_Success() (gas: 563820) +CCIPHome__validateConfig:test__validateConfig_ABIEncodedAddress_OfframpAddressCannotBeZero_Reverts() (gas: 322845) +CCIPHome__validateConfig:test__validateConfig_ABIEncodedAddress_RMNHomeAddressCannotBeZero_Reverts() (gas: 323318) +CCIPHome__validateConfig:test__validateConfig_ChainSelectorNotFound_Reverts() (gas: 326388) +CCIPHome__validateConfig:test__validateConfig_ChainSelectorNotSet_Reverts() (gas: 322093) +CCIPHome__validateConfig:test__validateConfig_FChainTooHigh_Reverts() (gas: 394935) +CCIPHome__validateConfig:test__validateConfig_FMustBePositive_Reverts() (gas: 325101) +CCIPHome__validateConfig:test__validateConfig_FTooHigh_Reverts() (gas: 324000) +CCIPHome__validateConfig:test__validateConfig_NodeNotInRegistry_Reverts() (gas: 404874) +CCIPHome__validateConfig:test__validateConfig_NotEnoughTransmittersEmptyAddresses_Reverts() (gas: 353950) +CCIPHome__validateConfig:test__validateConfig_NotEnoughTransmitters_Reverts() (gas: 1444130) +CCIPHome__validateConfig:test__validateConfig_OfframpAddressCannotBeZero_Reverts() (gas: 322144) +CCIPHome__validateConfig:test__validateConfig_RMNHomeAddressCannotBeZero_Reverts() (gas: 322594) +CCIPHome__validateConfig:test__validateConfig_Success() (gas: 338936) +CCIPHome__validateConfig:test__validateConfig_TooManySigners_Reverts() (gas: 1176311) +CCIPHome__validateConfig:test__validateConfig_ZeroP2PId_Reverts() (gas: 328508) +CCIPHome__validateConfig:test__validateConfig_ZeroSignerKey_Reverts() (gas: 328620) +CCIPHome_applyChainConfigUpdates:test__applyChainConfigUpdates_FChainNotPositive_Reverts() (gas: 194886) +CCIPHome_applyChainConfigUpdates:test_applyChainConfigUpdates_addChainConfigs_Success() (gas: 367588) +CCIPHome_applyChainConfigUpdates:test_applyChainConfigUpdates_nodeNotInRegistry_Reverts() (gas: 27219) +CCIPHome_applyChainConfigUpdates:test_applyChainConfigUpdates_removeChainConfigs_Success() (gas: 283157) +CCIPHome_applyChainConfigUpdates:test_applyChainConfigUpdates_selectorNotFound_Reverts() (gas: 16607) +CCIPHome_applyChainConfigUpdates:test_getPaginatedCCIPHomes_Success() (gas: 407992) +CCIPHome_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_DONIdMismatch_reverts() (gas: 35872) +CCIPHome_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_InnerCallReverts_reverts() (gas: 13995) +CCIPHome_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_InvalidSelector_reverts() (gas: 12740) +CCIPHome_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_OnlyCapabilitiesRegistryCanCall_reverts() (gas: 33934) +CCIPHome_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_success() (gas: 1519499) +CCIPHome_constructor:test_constructor_CapabilitiesRegistryAddressZero_reverts() (gas: 67189) +CCIPHome_constructor:test_constructor_success() (gas: 5365115) +CCIPHome_constructor:test_getCapabilityConfiguration_success() (gas: 10244) +CCIPHome_constructor:test_supportsInterface_success() (gas: 11297) +CCIPHome_getAllConfigs:test_getAllConfigs_success() (gas: 2901092) +CCIPHome_getConfigDigests:test_getConfigDigests_success() (gas: 2615935) +CCIPHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_CanOnlySelfCall_reverts() (gas: 10152) +CCIPHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_ConfigDigestMismatch_reverts() (gas: 27337) +CCIPHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_NoOpStateTransitionNotAllowed_reverts() (gas: 9902) +CCIPHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_multiplePlugins_success() (gas: 5284426) +CCIPHome_revokeCandidate:test_revokeCandidate_CanOnlySelfCall_reverts() (gas: 10119) +CCIPHome_revokeCandidate:test_revokeCandidate_ConfigDigestMismatch_reverts() (gas: 21547) +CCIPHome_revokeCandidate:test_revokeCandidate_RevokingZeroDigestNotAllowed_reverts() (gas: 9666) +CCIPHome_revokeCandidate:test_revokeCandidate_success() (gas: 39075) +CCIPHome_setCandidate:test_setCandidate_CanOnlySelfCall_reverts() (gas: 26729) +CCIPHome_setCandidate:test_setCandidate_ConfigDigestMismatch_reverts() (gas: 1472425) +CCIPHome_setCandidate:test_setCandidate_success() (gas: 1419718) +CommitStore_constructor:test_Constructor_Success() (gas: 4361942) +CommitStore_isUnpausedAndRMNHealthy:test_RMN_Success() (gas: 83130) +CommitStore_report:test_InvalidIntervalMinLargerThanMax_Revert() (gas: 32885) +CommitStore_report:test_InvalidInterval_Revert() (gas: 32781) +CommitStore_report:test_InvalidRootRevert() (gas: 31537) +CommitStore_report:test_OnlyGasPriceUpdates_Success() (gas: 61004) +CommitStore_report:test_OnlyPriceUpdateStaleReport_Revert() (gas: 70437) +CommitStore_report:test_OnlyTokenPriceUpdates_Success() (gas: 61025) +CommitStore_report:test_Paused_Revert() (gas: 22402) +CommitStore_report:test_ReportAndPriceUpdate_Success() (gas: 94701) +CommitStore_report:test_ReportOnlyRootSuccess_gas() (gas: 60020) +CommitStore_report:test_RootAlreadyCommitted_Revert() (gas: 72243) +CommitStore_report:test_StaleReportWithRoot_Success() (gas: 136763) +CommitStore_report:test_Unhealthy_Revert() (gas: 46665) +CommitStore_report:test_ValidPriceUpdateThenStaleReportWithRoot_Success() (gas: 116937) +CommitStore_report:test_ZeroEpochAndRound_Revert() (gas: 32226) +CommitStore_resetUnblessedRoots:test_OnlyOwner_Revert() (gas: 12082) +CommitStore_resetUnblessedRoots:test_ResetUnblessedRoots_Success() (gas: 172098) +CommitStore_setDynamicConfig:test_InvalidCommitStoreConfig_Revert() (gas: 44708) +CommitStore_setDynamicConfig:test_OnlyOwner_Revert() (gas: 44671) +CommitStore_setDynamicConfig:test_PriceEpochCleared_Success() (gas: 150735) +CommitStore_setLatestPriceEpochAndRound:test_OnlyOwner_Revert() (gas: 11970) +CommitStore_setLatestPriceEpochAndRound:test_SetLatestPriceEpochAndRound_Success() (gas: 22566) +CommitStore_setMinSeqNr:test_OnlyOwner_Revert() (gas: 11969) +CommitStore_verify:test_Blessed_Success() (gas: 108814) +CommitStore_verify:test_NotBlessed_Success() (gas: 69299) +CommitStore_verify:test_Paused_Revert() (gas: 19843) +CommitStore_verify:test_TooManyLeaves_Revert() (gas: 85894) +DefensiveExampleTest:test_HappyPath_Success() (gas: 247055) +DefensiveExampleTest:test_Recovery() (gas: 483144) +E2E:test_E2E_3MessagesSuccess_gas() (gas: 1459037) +EVM2EVMOffRamp__releaseOrMintToken:test__releaseOrMintToken_NotACompatiblePool_Revert() (gas: 48827) +EVM2EVMOffRamp__releaseOrMintToken:test__releaseOrMintToken_Success() (gas: 122487) +EVM2EVMOffRamp__releaseOrMintToken:test__releaseOrMintToken_TokenHandlingError_transfer_Revert() (gas: 100439) +EVM2EVMOffRamp__releaseOrMintToken:test_releaseOrMintToken_InvalidDataLength_Revert() (gas: 45166) +EVM2EVMOffRamp__releaseOrMintToken:test_releaseOrMintToken_ReleaseOrMintBalanceMismatch_Revert() (gas: 110906) +EVM2EVMOffRamp__releaseOrMintToken:test_releaseOrMintToken_TokenHandlingError_BalanceOf_Revert() (gas: 47409) +EVM2EVMOffRamp__releaseOrMintToken:test_releaseOrMintToken_skip_ReleaseOrMintBalanceMismatch_if_pool_Revert() (gas: 102213) +EVM2EVMOffRamp__releaseOrMintTokens:test_OverValueWithARLOff_Success() (gas: 452793) +EVM2EVMOffRamp__releaseOrMintTokens:test_PriceNotFoundForToken_Reverts() (gas: 163533) +EVM2EVMOffRamp__releaseOrMintTokens:test_RateLimitErrors_Reverts() (gas: 947445) +EVM2EVMOffRamp__releaseOrMintTokens:test_TokenHandlingError_Reverts() (gas: 207677) +EVM2EVMOffRamp__releaseOrMintTokens:test__releaseOrMintTokens_NotACompatiblePool_Reverts() (gas: 37420) +EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_InvalidDataLengthReturnData_Revert() (gas: 81689) +EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_InvalidEVMAddress_Revert() (gas: 52840) +EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_Success() (gas: 248387) +EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_destDenominatedDecimals_Success() (gas: 256427) +EVM2EVMOffRamp__report:test_Report_Success() (gas: 150186) +EVM2EVMOffRamp__trialExecute:test_RateLimitError_Success() (gas: 280928) +EVM2EVMOffRamp__trialExecute:test_TokenHandlingErrorIsCaught_Success() (gas: 291045) +EVM2EVMOffRamp__trialExecute:test_TokenPoolIsNotAContract_Success() (gas: 425921) +EVM2EVMOffRamp__trialExecute:test_trialExecute_Success() (gas: 368465) +EVM2EVMOffRamp_ccipReceive:test_Reverts() (gas: 20655) +EVM2EVMOffRamp_constructor:test_CommitStoreAlreadyInUse_Revert() (gas: 162623) +EVM2EVMOffRamp_constructor:test_Constructor_Success() (gas: 7939916) +EVM2EVMOffRamp_constructor:test_ZeroOnRampAddress_Revert() (gas: 152500) +EVM2EVMOffRamp_execute:test_EmptyReport_Revert() (gas: 24199) +EVM2EVMOffRamp_execute:test_InvalidMessageId_Revert() (gas: 47203) +EVM2EVMOffRamp_execute:test_InvalidSourceChain_Revert() (gas: 67004) +EVM2EVMOffRamp_execute:test_InvalidSourcePoolAddress_Success() (gas: 578501) +EVM2EVMOffRamp_execute:test_ManualExecutionNotYetEnabled_Revert() (gas: 61423) +EVM2EVMOffRamp_execute:test_MessageTooLarge_Revert() (gas: 175550) +EVM2EVMOffRamp_execute:test_Paused_Revert() (gas: 139288) +EVM2EVMOffRamp_execute:test_ReceiverError_Success() (gas: 192927) +EVM2EVMOffRamp_execute:test_RetryFailedMessageWithoutManualExecution_Success() (gas: 215419) +EVM2EVMOffRamp_execute:test_RootNotCommitted_Revert() (gas: 55720) +EVM2EVMOffRamp_execute:test_SingleMessageNoTokensUnordered_Success() (gas: 208494) +EVM2EVMOffRamp_execute:test_SingleMessageNoTokens_Success() (gas: 220462) +EVM2EVMOffRamp_execute:test_SingleMessageToNonCCIPReceiver_Success() (gas: 290662) +EVM2EVMOffRamp_execute:test_SingleMessagesNoTokensSuccess_gas() (gas: 134108) +EVM2EVMOffRamp_execute:test_SkippedIncorrectNonceStillExecutes_Success() (gas: 490970) +EVM2EVMOffRamp_execute:test_SkippedIncorrectNonce_Success() (gas: 68824) +EVM2EVMOffRamp_execute:test_StrictUntouchedToSuccess_Success() (gas: 158417) +EVM2EVMOffRamp_execute:test_TokenDataMismatch_Revert() (gas: 65640) +EVM2EVMOffRamp_execute:test_TwoMessagesWithTokensAndGE_Success() (gas: 699587) +EVM2EVMOffRamp_execute:test_TwoMessagesWithTokensSuccess_gas() (gas: 607548) +EVM2EVMOffRamp_execute:test_UnexpectedTokenData_Revert() (gas: 45035) +EVM2EVMOffRamp_execute:test_Unhealthy_Revert() (gas: 699898) +EVM2EVMOffRamp_execute:test_UnsupportedNumberOfTokens_Revert() (gas: 91821) +EVM2EVMOffRamp_execute:test__execute_SkippedAlreadyExecutedMessageUnordered_Success() (gas: 157284) +EVM2EVMOffRamp_execute:test__execute_SkippedAlreadyExecutedMessage_Success() (gas: 175420) +EVM2EVMOffRamp_execute:test_execute_RouterYULCall_Success() (gas: 601571) +EVM2EVMOffRamp_executeSingleMessage:test_MessageSender_Revert() (gas: 23052) +EVM2EVMOffRamp_executeSingleMessage:test_NonContractWithTokens_Success() (gas: 315290) +EVM2EVMOffRamp_executeSingleMessage:test_NonContract_Success() (gas: 23338) +EVM2EVMOffRamp_executeSingleMessage:test_TokenHandlingError_Revert() (gas: 258353) +EVM2EVMOffRamp_executeSingleMessage:test_ZeroGasDONExecution_Revert() (gas: 59576) +EVM2EVMOffRamp_executeSingleMessage:test_executeSingleMessage_NoTokens_Success() (gas: 58690) +EVM2EVMOffRamp_executeSingleMessage:test_executeSingleMessage_WithTokens_Success() (gas: 368147) +EVM2EVMOffRamp_executeSingleMessage:test_executeSingleMessage_ZeroGasZeroData_Success() (gas: 93587) +EVM2EVMOffRamp_execute_upgrade:test_V2NonceNewSenderStartsAtZero_Success() (gas: 279051) +EVM2EVMOffRamp_execute_upgrade:test_V2NonceStartsAtV1Nonce_Success() (gas: 351951) +EVM2EVMOffRamp_execute_upgrade:test_V2OffRampNonceSkipsIfMsgInFlight_Success() (gas: 326170) +EVM2EVMOffRamp_execute_upgrade:test_V2SenderNoncesReadsPreviousRamp_Success() (gas: 303514) +EVM2EVMOffRamp_execute_upgrade:test_V2_Success() (gas: 154916) +EVM2EVMOffRamp_getAllRateLimitTokens:test_GetAllRateLimitTokens_Success() (gas: 42076) +EVM2EVMOffRamp_getExecutionState:test_FillExecutionState_Success() (gas: 5016070) +EVM2EVMOffRamp_getExecutionState:test_GetExecutionState_Success() (gas: 104111) +EVM2EVMOffRamp_manuallyExecute:test_ManualExecFailedTx_Revert() (gas: 234610) +EVM2EVMOffRamp_manuallyExecute:test_ManualExecForkedChain_Revert() (gas: 37344) +EVM2EVMOffRamp_manuallyExecute:test_ManualExecGasLimitMismatch_Revert() (gas: 67784) +EVM2EVMOffRamp_manuallyExecute:test_ManualExecInvalidGasLimit_Revert() (gas: 37732) +EVM2EVMOffRamp_manuallyExecute:test_ManualExecWithMultipleMessagesAndSourceTokens_Success() (gas: 673237) +EVM2EVMOffRamp_manuallyExecute:test_ManualExecWithSourceTokens_Success() (gas: 416742) +EVM2EVMOffRamp_manuallyExecute:test_ManualExec_Success() (gas: 235356) +EVM2EVMOffRamp_manuallyExecute:test_ReentrancyManualExecuteFails_Success() (gas: 3548576) +EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_DestinationGasAmountCountMismatch_Revert() (gas: 442167) +EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_DoesNotRevertIfUntouched_Success() (gas: 173700) +EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_InvalidTokenGasOverride_Revert() (gas: 447336) +EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_LowGasLimitManualExec_Success() (gas: 681724) +EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_WithGasOverride_Success() (gas: 239038) +EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_WithInvalidReceiverExecutionGasOverride_Revert() (gas: 188679) +EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_WithInvalidSourceTokenDataCount_Revert() (gas: 80150) +EVM2EVMOffRamp_metadataHash:test_MetadataHash_Success() (gas: 10174) +EVM2EVMOffRamp_setDynamicConfig:test_NonOwner_Revert() (gas: 47737) +EVM2EVMOffRamp_setDynamicConfig:test_RouterZeroAddress_Revert() (gas: 46206) +EVM2EVMOffRamp_setDynamicConfig:test_SetDynamicConfig_Success() (gas: 182870) +EVM2EVMOffRamp_updateRateLimitTokens:test_updateRateLimitTokens_AddsAndRemoves_Success() (gas: 171983) +EVM2EVMOffRamp_updateRateLimitTokens:test_updateRateLimitTokens_NonOwner_Revert() (gas: 25219) +EVM2EVMOffRamp_updateRateLimitTokens:test_updateRateLimitTokens_Success() (gas: 205572) +EVM2EVMOnRamp_constructor:test_Constructor_Success() (gas: 7995985) +EVM2EVMOnRamp_forwardFromRouter:test_CannotSendZeroTokens_Revert() (gas: 40118) +EVM2EVMOnRamp_forwardFromRouter:test_EnforceOutOfOrder_Revert() (gas: 112063) +EVM2EVMOnRamp_forwardFromRouter:test_ForwardFromRouterExtraArgsV2AllowOutOfOrderTrue_Success() (gas: 136127) +EVM2EVMOnRamp_forwardFromRouter:test_ForwardFromRouterExtraArgsV2_Success() (gas: 136125) +EVM2EVMOnRamp_forwardFromRouter:test_ForwardFromRouterSuccessCustomExtraArgs() (gas: 147732) +EVM2EVMOnRamp_forwardFromRouter:test_ForwardFromRouterSuccessLegacyExtraArgs() (gas: 160359) +EVM2EVMOnRamp_forwardFromRouter:test_ForwardFromRouter_Success() (gas: 146970) +EVM2EVMOnRamp_forwardFromRouter:test_InvalidAddressEncodePacked_Revert() (gas: 43162) +EVM2EVMOnRamp_forwardFromRouter:test_InvalidAddress_Revert() (gas: 43265) +EVM2EVMOnRamp_forwardFromRouter:test_InvalidChainSelector_Revert() (gas: 28899) +EVM2EVMOnRamp_forwardFromRouter:test_InvalidExtraArgsTag_Revert() (gas: 28541) +EVM2EVMOnRamp_forwardFromRouter:test_MaxCapacityExceeded_Revert() (gas: 93166) +EVM2EVMOnRamp_forwardFromRouter:test_MaxFeeBalanceReached_Revert() (gas: 40651) +EVM2EVMOnRamp_forwardFromRouter:test_MessageGasLimitTooHigh_Revert() (gas: 33116) +EVM2EVMOnRamp_forwardFromRouter:test_MessageTooLarge_Revert() (gas: 119271) +EVM2EVMOnRamp_forwardFromRouter:test_OriginalSender_Revert() (gas: 25711) +EVM2EVMOnRamp_forwardFromRouter:test_OverValueWithARLOff_Success() (gas: 263611) +EVM2EVMOnRamp_forwardFromRouter:test_Paused_Revert() (gas: 60811) +EVM2EVMOnRamp_forwardFromRouter:test_Permissions_Revert() (gas: 28656) +EVM2EVMOnRamp_forwardFromRouter:test_PriceNotFoundForToken_Revert() (gas: 66594) +EVM2EVMOnRamp_forwardFromRouter:test_ShouldIncrementNonceOnlyOnOrdered_Success() (gas: 246017) +EVM2EVMOnRamp_forwardFromRouter:test_ShouldIncrementSeqNumAndNonce_Success() (gas: 231059) +EVM2EVMOnRamp_forwardFromRouter:test_ShouldStoreNonLinkFees() (gas: 148693) +EVM2EVMOnRamp_forwardFromRouter:test_SourceTokenDataTooLarge_Revert() (gas: 5451750) +EVM2EVMOnRamp_forwardFromRouter:test_TooManyTokens_Revert() (gas: 36372) +EVM2EVMOnRamp_forwardFromRouter:test_Unhealthy_Revert() (gas: 46651) +EVM2EVMOnRamp_forwardFromRouter:test_UnsupportedToken_Revert() (gas: 119388) +EVM2EVMOnRamp_forwardFromRouter:test_ZeroAddressReceiver_Revert() (gas: 357179) +EVM2EVMOnRamp_forwardFromRouter:test_forwardFromRouter_ShouldStoreLinkFees_Success() (gas: 122802) +EVM2EVMOnRamp_forwardFromRouter:test_forwardFromRouter_UnsupportedToken_Revert() (gas: 79581) +EVM2EVMOnRamp_forwardFromRouter:test_forwardFromRouter_correctSourceTokenData_Success() (gas: 931861) +EVM2EVMOnRamp_forwardFromRouter_upgrade:test_V2NonceNewSenderStartsAtZero_Success() (gas: 170805) +EVM2EVMOnRamp_forwardFromRouter_upgrade:test_V2NonceStartsAtV1Nonce_Success() (gas: 233734) +EVM2EVMOnRamp_forwardFromRouter_upgrade:test_V2SenderNoncesReadsPreviousRamp_Success() (gas: 149106) +EVM2EVMOnRamp_forwardFromRouter_upgrade:test_V2_Success() (gas: 111551) +EVM2EVMOnRamp_getDataAvailabilityCost:test_EmptyMessageCalculatesDataAvailabilityCost_Success() (gas: 28790) +EVM2EVMOnRamp_getDataAvailabilityCost:test_SimpleMessageCalculatesDataAvailabilityCost_Success() (gas: 29664) +EVM2EVMOnRamp_getFee:test_EmptyMessage_Success() (gas: 103386) +EVM2EVMOnRamp_getFee:test_GetFeeOfZeroForTokenMessage_Success() (gas: 102775) +EVM2EVMOnRamp_getFee:test_HighGasMessage_Success() (gas: 274795) +EVM2EVMOnRamp_getFee:test_MessageGasLimitTooHigh_Revert() (gas: 19531) +EVM2EVMOnRamp_getFee:test_MessageTooLarge_Revert() (gas: 105736) +EVM2EVMOnRamp_getFee:test_MessageWithDataAndTokenTransfer_Success() (gas: 246841) +EVM2EVMOnRamp_getFee:test_NotAFeeToken_Revert() (gas: 28335) +EVM2EVMOnRamp_getFee:test_SingleTokenMessage_Success() (gas: 174801) +EVM2EVMOnRamp_getFee:test_TooManyTokens_Revert() (gas: 24852) +EVM2EVMOnRamp_getFee:test_ZeroDataAvailabilityMultiplier_Success() (gas: 81035) +EVM2EVMOnRamp_getSupportedTokens:test_GetSupportedTokens_Revert() (gas: 11166) +EVM2EVMOnRamp_getTokenPool:test_GetTokenPool_Success() (gas: 41957) +EVM2EVMOnRamp_getTokenTransferCost:test_CustomTokenBpsFee_Success() (gas: 54001) +EVM2EVMOnRamp_getTokenTransferCost:test_FeeTokenBpsFee_Success() (gas: 43066) +EVM2EVMOnRamp_getTokenTransferCost:test_LargeTokenTransferChargesMaxFeeAndGas_Success() (gas: 37875) +EVM2EVMOnRamp_getTokenTransferCost:test_MixedTokenTransferFee_Success() (gas: 190349) +EVM2EVMOnRamp_getTokenTransferCost:test_NoTokenTransferChargesZeroFee_Success() (gas: 17641) +EVM2EVMOnRamp_getTokenTransferCost:test_SmallTokenTransferChargesMinFeeAndGas_Success() (gas: 37525) +EVM2EVMOnRamp_getTokenTransferCost:test_UnsupportedToken_Revert() (gas: 24786) +EVM2EVMOnRamp_getTokenTransferCost:test_ZeroAmountTokenTransferChargesMinFeeAndGas_Success() (gas: 37548) +EVM2EVMOnRamp_getTokenTransferCost:test_ZeroFeeConfigChargesMinFee_Success() (gas: 49698) +EVM2EVMOnRamp_getTokenTransferCost:test__getTokenTransferCost_selfServeUsesDefaults_Success() (gas: 38218) +EVM2EVMOnRamp_linkAvailableForPayment:test_InsufficientLinkBalance_Success() (gas: 36639) +EVM2EVMOnRamp_linkAvailableForPayment:test_LinkAvailableForPayment_Success() (gas: 145939) +EVM2EVMOnRamp_payNops:test_AdminPayNops_Success() (gas: 157645) +EVM2EVMOnRamp_payNops:test_InsufficientBalance_Revert() (gas: 32428) +EVM2EVMOnRamp_payNops:test_NoFeesToPay_Revert() (gas: 135001) +EVM2EVMOnRamp_payNops:test_NoNopsToPay_Revert() (gas: 141695) +EVM2EVMOnRamp_payNops:test_NopPayNops_Success() (gas: 161181) +EVM2EVMOnRamp_payNops:test_OwnerPayNops_Success() (gas: 155453) +EVM2EVMOnRamp_payNops:test_PayNopsSuccessAfterSetNops() (gas: 328800) +EVM2EVMOnRamp_payNops:test_WrongPermissions_Revert() (gas: 15878) +EVM2EVMOnRamp_setDynamicConfig:test_SetConfigInvalidConfig_Revert() (gas: 49643) +EVM2EVMOnRamp_setDynamicConfig:test_SetConfigOnlyOwner_Revert() (gas: 28163) +EVM2EVMOnRamp_setDynamicConfig:test_SetDynamicConfig_Success() (gas: 68220) +EVM2EVMOnRamp_setFeeTokenConfig:test_OnlyCallableByOwnerOrAdmin_Revert() (gas: 14432) +EVM2EVMOnRamp_setFeeTokenConfig:test_SetFeeTokenConfigByAdmin_Success() (gas: 17635) +EVM2EVMOnRamp_setFeeTokenConfig:test_SetFeeTokenConfig_Success() (gas: 14948) +EVM2EVMOnRamp_setNops:test_AdminCanSetNops_Success() (gas: 67974) +EVM2EVMOnRamp_setNops:test_IncludesPayment_Success() (gas: 551687) +EVM2EVMOnRamp_setNops:test_LinkTokenCannotBeNop_Revert() (gas: 61776) +EVM2EVMOnRamp_setNops:test_NonOwnerOrAdmin_Revert() (gas: 16548) +EVM2EVMOnRamp_setNops:test_NotEnoughFundsForPayout_Revert() (gas: 96806) +EVM2EVMOnRamp_setNops:test_SetNopsRemovesOldNopsCompletely_Success() (gas: 64532) +EVM2EVMOnRamp_setNops:test_SetNops_Success() (gas: 185469) +EVM2EVMOnRamp_setNops:test_TooManyNops_Revert() (gas: 415502) +EVM2EVMOnRamp_setNops:test_ZeroAddressCannotBeNop_Revert() (gas: 58089) +EVM2EVMOnRamp_setTokenTransferFeeConfig:test__setTokenTransferFeeConfig_InvalidDestBytesOverhead_Revert() (gas: 17784) +EVM2EVMOnRamp_setTokenTransferFeeConfig:test__setTokenTransferFeeConfig_OnlyCallableByOwnerOrAdmin_Revert() (gas: 15545) +EVM2EVMOnRamp_setTokenTransferFeeConfig:test__setTokenTransferFeeConfig_Success() (gas: 117548) +EVM2EVMOnRamp_setTokenTransferFeeConfig:test__setTokenTransferFeeConfig_byAdmin_Success() (gas: 18795) +EVM2EVMOnRamp_withdrawNonLinkFees:test_LinkBalanceNotSettled_Revert() (gas: 92590) +EVM2EVMOnRamp_withdrawNonLinkFees:test_NonOwnerOrAdmin_Revert() (gas: 16405) +EVM2EVMOnRamp_withdrawNonLinkFees:test_SettlingBalance_Success() (gas: 326944) +EVM2EVMOnRamp_withdrawNonLinkFees:test_WithdrawNonLinkFees_Success() (gas: 58679) +EVM2EVMOnRamp_withdrawNonLinkFees:test_WithdrawToZeroAddress_Revert() (gas: 13676) +EtherSenderReceiverTest_ccipReceive:test_ccipReceive_fallbackToWethTransfer() (gas: 103814) +EtherSenderReceiverTest_ccipReceive:test_ccipReceive_happyPath() (gas: 54732) +EtherSenderReceiverTest_ccipReceive:test_ccipReceive_wrongToken() (gas: 21881) +EtherSenderReceiverTest_ccipReceive:test_ccipReceive_wrongTokenAmount() (gas: 20674) +EtherSenderReceiverTest_ccipSend:test_ccipSend_reverts_insufficientFee_feeToken() (gas: 116467) +EtherSenderReceiverTest_ccipSend:test_ccipSend_reverts_insufficientFee_native() (gas: 91360) +EtherSenderReceiverTest_ccipSend:test_ccipSend_reverts_insufficientFee_weth() (gas: 116371) +EtherSenderReceiverTest_ccipSend:test_ccipSend_success_feeToken() (gas: 167929) +EtherSenderReceiverTest_ccipSend:test_ccipSend_success_native() (gas: 98200) +EtherSenderReceiverTest_ccipSend:test_ccipSend_success_nativeExcess() (gas: 98574) +EtherSenderReceiverTest_ccipSend:test_ccipSend_success_weth() (gas: 117880) +EtherSenderReceiverTest_constructor:test_constructor() (gas: 19659) +EtherSenderReceiverTest_getFee:test_getFee() (gas: 41207) +EtherSenderReceiverTest_validateFeeToken:test_validateFeeToken_reverts_feeToken_tokenAmountNotEqualToMsgValue() (gas: 22872) +EtherSenderReceiverTest_validateFeeToken:test_validateFeeToken_valid_feeToken() (gas: 18390) +EtherSenderReceiverTest_validateFeeToken:test_validateFeeToken_valid_native() (gas: 18420) +EtherSenderReceiverTest_validatedMessage:test_validatedMessage_dataOverwrittenToMsgSender() (gas: 34950) +EtherSenderReceiverTest_validatedMessage:test_validatedMessage_emptyDataOverwrittenToMsgSender() (gas: 34697) +EtherSenderReceiverTest_validatedMessage:test_validatedMessage_invalidTokenAmounts() (gas: 23796) +EtherSenderReceiverTest_validatedMessage:test_validatedMessage_tokenOverwrittenToWeth() (gas: 34674) +EtherSenderReceiverTest_validatedMessage:test_validatedMessage_validMessage_extraArgs() (gas: 36305) +FactoryBurnMintERC20approve:testApproveSuccess() (gas: 55767) +FactoryBurnMintERC20approve:testInvalidAddressReverts() (gas: 10709) +FactoryBurnMintERC20burn:testBasicBurnSuccess() (gas: 172380) +FactoryBurnMintERC20burn:testBurnFromZeroAddressReverts() (gas: 47384) +FactoryBurnMintERC20burn:testExceedsBalanceReverts() (gas: 21962) +FactoryBurnMintERC20burn:testSenderNotBurnerReverts() (gas: 13491) +FactoryBurnMintERC20burnFrom:testBurnFromSuccess() (gas: 58212) +FactoryBurnMintERC20burnFrom:testExceedsBalanceReverts() (gas: 36130) +FactoryBurnMintERC20burnFrom:testInsufficientAllowanceReverts() (gas: 22054) +FactoryBurnMintERC20burnFrom:testSenderNotBurnerReverts() (gas: 13491) +FactoryBurnMintERC20burnFromAlias:testBurnFromSuccess() (gas: 58187) +FactoryBurnMintERC20burnFromAlias:testExceedsBalanceReverts() (gas: 36094) +FactoryBurnMintERC20burnFromAlias:testInsufficientAllowanceReverts() (gas: 22009) +FactoryBurnMintERC20burnFromAlias:testSenderNotBurnerReverts() (gas: 13446) +FactoryBurnMintERC20constructor:testConstructorSuccess() (gas: 1500873) +FactoryBurnMintERC20decreaseApproval:testDecreaseApprovalSuccess() (gas: 31323) +FactoryBurnMintERC20grantMintAndBurnRoles:testGrantMintAndBurnRolesSuccess() (gas: 121439) +FactoryBurnMintERC20grantRole:testGrantBurnAccessSuccess() (gas: 53612) +FactoryBurnMintERC20grantRole:testGrantManySuccess() (gas: 963184) +FactoryBurnMintERC20grantRole:testGrantMintAccessSuccess() (gas: 94434) +FactoryBurnMintERC20increaseApproval:testIncreaseApprovalSuccess() (gas: 44368) +FactoryBurnMintERC20mint:testBasicMintSuccess() (gas: 149987) +FactoryBurnMintERC20mint:testMaxSupplyExceededReverts() (gas: 50703) +FactoryBurnMintERC20mint:testSenderNotMinterReverts() (gas: 11328) +FactoryBurnMintERC20supportsInterface:testConstructorSuccess() (gas: 11396) +FactoryBurnMintERC20transfer:testInvalidAddressReverts() (gas: 10707) +FactoryBurnMintERC20transfer:testTransferSuccess() (gas: 42427) +FeeQuoter_applyDestChainConfigUpdates:test_InvalidChainFamilySelector_Revert() (gas: 21287) +FeeQuoter_applyDestChainConfigUpdates:test_InvalidDestChainConfigDestChainSelectorEqZero_Revert() (gas: 21260) +FeeQuoter_applyDestChainConfigUpdates:test_applyDestChainConfigUpdatesDefaultTxGasLimitEqZero_Revert() (gas: 21273) +FeeQuoter_applyDestChainConfigUpdates:test_applyDestChainConfigUpdatesDefaultTxGasLimitGtMaxPerMessageGasLimit_Revert() (gas: 49746) +FeeQuoter_applyDestChainConfigUpdates:test_applyDestChainConfigUpdatesZeroIntput_Success() (gas: 13305) +FeeQuoter_applyDestChainConfigUpdates:test_applyDestChainConfigUpdates_Success() (gas: 168513) +FeeQuoter_applyFeeTokensUpdates:test_ApplyFeeTokensUpdates_Success() (gas: 92061) +FeeQuoter_applyFeeTokensUpdates:test_OnlyCallableByOwner_Revert() (gas: 14447) +FeeQuoter_applyPremiumMultiplierWeiPerEthUpdates:test_OnlyCallableByOwnerOrAdmin_Revert() (gas: 12564) +FeeQuoter_applyPremiumMultiplierWeiPerEthUpdates:test_applyPremiumMultiplierWeiPerEthUpdatesMultipleTokens_Success() (gas: 61121) +FeeQuoter_applyPremiumMultiplierWeiPerEthUpdates:test_applyPremiumMultiplierWeiPerEthUpdatesSingleToken_Success() (gas: 48797) +FeeQuoter_applyPremiumMultiplierWeiPerEthUpdates:test_applyPremiumMultiplierWeiPerEthUpdatesZeroInput() (gas: 13248) +FeeQuoter_applyTokenTransferFeeConfigUpdates:test_ApplyTokenTransferFeeConfig_Success() (gas: 118031) +FeeQuoter_applyTokenTransferFeeConfigUpdates:test_ApplyTokenTransferFeeZeroInput() (gas: 14427) +FeeQuoter_applyTokenTransferFeeConfigUpdates:test_InvalidDestBytesOverhead_Revert() (gas: 21388) +FeeQuoter_applyTokenTransferFeeConfigUpdates:test_OnlyCallableByOwnerOrAdmin_Revert() (gas: 13659) +FeeQuoter_constructor:test_InvalidLinkTokenEqZeroAddress_Revert() (gas: 127807) +FeeQuoter_constructor:test_InvalidMaxFeeJuelsPerMsg_Revert() (gas: 132149) +FeeQuoter_constructor:test_InvalidStalenessThreshold_Revert() (gas: 132196) +FeeQuoter_constructor:test_Setup_Success() (gas: 7908400) +FeeQuoter_convertTokenAmount:test_ConvertTokenAmount_Success() (gas: 74951) +FeeQuoter_convertTokenAmount:test_LinkTokenNotSupported_Revert() (gas: 34055) +FeeQuoter_getDataAvailabilityCost:test_EmptyMessageCalculatesDataAvailabilityCost_Success() (gas: 124958) +FeeQuoter_getDataAvailabilityCost:test_SimpleMessageCalculatesDataAvailabilityCostUnsupportedDestChainSelector_Success() (gas: 20691) +FeeQuoter_getDataAvailabilityCost:test_SimpleMessageCalculatesDataAvailabilityCost_Success() (gas: 33048) +FeeQuoter_getTokenAndGasPrices:test_GetFeeTokenAndGasPrices_Success() (gas: 73952) +FeeQuoter_getTokenAndGasPrices:test_StaleGasPrice_Revert() (gas: 19223) +FeeQuoter_getTokenAndGasPrices:test_UnsupportedChain_Revert() (gas: 17728) +FeeQuoter_getTokenAndGasPrices:test_ZeroGasPrice_Success() (gas: 47642) +FeeQuoter_getTokenPrice:test_GetTokenPriceFromFeed_Success() (gas: 74567) +FeeQuoter_getTokenPrices:test_GetTokenPrices_Success() (gas: 87892) +FeeQuoter_getTokenTransferCost:test_CustomTokenBpsFee_Success() (gas: 51274) +FeeQuoter_getTokenTransferCost:test_FeeTokenBpsFee_Success() (gas: 46576) +FeeQuoter_getTokenTransferCost:test_LargeTokenTransferChargesMaxFeeAndGas_Success() (gas: 39182) +FeeQuoter_getTokenTransferCost:test_MixedTokenTransferFee_Success() (gas: 161432) +FeeQuoter_getTokenTransferCost:test_NoTokenTransferChargesZeroFee_Success() (gas: 25553) +FeeQuoter_getTokenTransferCost:test_SmallTokenTransferChargesMinFeeAndGas_Success() (gas: 38832) +FeeQuoter_getTokenTransferCost:test_ZeroAmountTokenTransferChargesMinFeeAndGas_Success() (gas: 38788) +FeeQuoter_getTokenTransferCost:test_ZeroFeeConfigChargesMinFee_Success() (gas: 53538) +FeeQuoter_getTokenTransferCost:test_getTokenTransferCost_selfServeUsesDefaults_Success() (gas: 40215) +FeeQuoter_getValidatedFee:test_DestinationChainNotEnabled_Revert() (gas: 23180) +FeeQuoter_getValidatedFee:test_EmptyMessage_Success() (gas: 126780) +FeeQuoter_getValidatedFee:test_EnforceOutOfOrder_Revert() (gas: 65331) +FeeQuoter_getValidatedFee:test_HighGasMessage_Success() (gas: 298759) +FeeQuoter_getValidatedFee:test_InvalidEVMAddress_Revert() (gas: 27952) +FeeQuoter_getValidatedFee:test_MessageGasLimitTooHigh_Revert() (gas: 37814) +FeeQuoter_getValidatedFee:test_MessageTooLarge_Revert() (gas: 113039) +FeeQuoter_getValidatedFee:test_MessageWithDataAndTokenTransfer_Success() (gas: 244565) +FeeQuoter_getValidatedFee:test_NotAFeeToken_Revert() (gas: 26700) +FeeQuoter_getValidatedFee:test_SingleTokenMessage_Success() (gas: 189634) +FeeQuoter_getValidatedFee:test_TooManyTokens_Revert() (gas: 29755) +FeeQuoter_getValidatedFee:test_ZeroDataAvailabilityMultiplier_Success() (gas: 82721) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedErc20Above18Decimals_Success() (gas: 3425326) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedErc20Below18Decimals_Success() (gas: 3425261) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFeedAt0Decimals_Success() (gas: 3405403) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFeedAt18Decimals_Success() (gas: 3425009) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFlippedDecimals_Success() (gas: 3425222) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedMaxInt224Value_Success() (gas: 3425016) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedOverStalenessPeriod_Success() (gas: 71128) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeed_Success() (gas: 70962) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPrice_Success() (gas: 63583) +FeeQuoter_getValidatedTokenPrice:test_OverflowFeedPrice_Revert() (gas: 3424704) +FeeQuoter_getValidatedTokenPrice:test_StaleFeeToken_Success() (gas: 66998) +FeeQuoter_getValidatedTokenPrice:test_TokenNotSupportedFeed_Revert() (gas: 122906) +FeeQuoter_getValidatedTokenPrice:test_TokenNotSupported_Revert() (gas: 15635) +FeeQuoter_getValidatedTokenPrice:test_UnderflowFeedPrice_Revert() (gas: 3422488) +FeeQuoter_onReport:test_OnReport_StaleUpdate_Revert() (gas: 55021) +FeeQuoter_onReport:test_onReport_InvalidForwarder_Reverts() (gas: 27666) +FeeQuoter_onReport:test_onReport_Success() (gas: 98820) +FeeQuoter_onReport:test_onReport_UnsupportedToken_Reverts() (gas: 31209) +FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsDefault_Success() (gas: 23993) +FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsEnforceOutOfOrder_Revert() (gas: 28138) +FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsGasLimitTooHigh_Revert() (gas: 25276) +FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsInvalidExtraArgsTag_Revert() (gas: 24171) +FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsV1_Success() (gas: 25547) +FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsV2_Success() (gas: 26085) +FeeQuoter_processMessageArgs:test_processMessageArgs_InvalidEVMAddressDestToken_Revert() (gas: 53875) +FeeQuoter_processMessageArgs:test_processMessageArgs_InvalidExtraArgs_Revert() (gas: 22252) +FeeQuoter_processMessageArgs:test_processMessageArgs_MalformedEVMExtraArgs_Revert() (gas: 22714) +FeeQuoter_processMessageArgs:test_processMessageArgs_MessageFeeTooHigh_Revert() (gas: 20791) +FeeQuoter_processMessageArgs:test_processMessageArgs_SourceTokenDataTooLarge_Revert() (gas: 159879) +FeeQuoter_processMessageArgs:test_processMessageArgs_TokenAmountArraysMismatching_Revert() (gas: 49920) +FeeQuoter_processMessageArgs:test_processMessageArgs_WitEVMExtraArgsV2_Success() (gas: 37697) +FeeQuoter_processMessageArgs:test_processMessageArgs_WithConvertedTokenAmount_Success() (gas: 36217) +FeeQuoter_processMessageArgs:test_processMessageArgs_WithCorrectPoolReturnData_Success() (gas: 96367) +FeeQuoter_processMessageArgs:test_processMessageArgs_WithEVMExtraArgsV1_Success() (gas: 36520) +FeeQuoter_processMessageArgs:test_processMessageArgs_WithEmptyEVMExtraArgs_Success() (gas: 33576) +FeeQuoter_processMessageArgs:test_processMessageArgs_WithLinkTokenAmount_Success() (gas: 22717) +FeeQuoter_updatePrices:test_OnlyCallableByUpdater_Revert() (gas: 13531) +FeeQuoter_updatePrices:test_OnlyGasPrice_Success() (gas: 27566) +FeeQuoter_updatePrices:test_OnlyTokenPrice_Success() (gas: 32627) +FeeQuoter_updatePrices:test_UpdatableByAuthorizedCaller_Success() (gas: 83557) +FeeQuoter_updatePrices:test_UpdateMultiplePrices_Success() (gas: 165439) +FeeQuoter_updateTokenPriceFeeds:test_FeedNotUpdated() (gas: 57411) +FeeQuoter_updateTokenPriceFeeds:test_FeedUnset_Success() (gas: 75829) +FeeQuoter_updateTokenPriceFeeds:test_FeedUpdatedByNonOwner_Revert() (gas: 22380) +FeeQuoter_updateTokenPriceFeeds:test_MultipleFeedUpdate_Success() (gas: 101508) +FeeQuoter_updateTokenPriceFeeds:test_SingleFeedUpdate_Success() (gas: 57373) +FeeQuoter_updateTokenPriceFeeds:test_ZeroFeeds_Success() (gas: 13342) +FeeQuoter_validateDestFamilyAddress:test_InvalidEVMAddressEncodePacked_Revert() (gas: 12222) +FeeQuoter_validateDestFamilyAddress:test_InvalidEVMAddressPrecompiles_Revert() (gas: 5634878) +FeeQuoter_validateDestFamilyAddress:test_InvalidEVMAddress_Revert() (gas: 12371) +FeeQuoter_validateDestFamilyAddress:test_ValidEVMAddress_Success() (gas: 7769) +FeeQuoter_validateDestFamilyAddress:test_ValidNonEVMAddress_Success() (gas: 7345) +HybridUSDCTokenPoolMigrationTests:test_LockOrBurn_LockReleaseMechanism_then_switchToPrimary_Success() (gas: 234768) +HybridUSDCTokenPoolMigrationTests:test_LockOrBurn_PrimaryMechanism_Success() (gas: 150751) +HybridUSDCTokenPoolMigrationTests:test_LockOrBurn_WhileMigrationPause_Revert() (gas: 113661) +HybridUSDCTokenPoolMigrationTests:test_LockOrBurn_onLockReleaseMechanism_Success() (gas: 154754) +HybridUSDCTokenPoolMigrationTests:test_MintOrRelease_OnLockReleaseMechanism_Success() (gas: 233895) +HybridUSDCTokenPoolMigrationTests:test_MintOrRelease_OnLockReleaseMechanism_then_switchToPrimary_Success() (gas: 509579) +HybridUSDCTokenPoolMigrationTests:test_MintOrRelease_incomingMessageWithPrimaryMechanism() (gas: 327065) +HybridUSDCTokenPoolMigrationTests:test_ReleaseOrMint_WhileMigrationPause_Revert() (gas: 122081) +HybridUSDCTokenPoolMigrationTests:test_burnLockedUSDC_invalidPermissions_Revert() (gas: 41448) +HybridUSDCTokenPoolMigrationTests:test_cancelExistingCCTPMigrationProposal() (gas: 35499) +HybridUSDCTokenPoolMigrationTests:test_cannotCancelANonExistentMigrationProposal() (gas: 12889) +HybridUSDCTokenPoolMigrationTests:test_cannotModifyLiquidityWithoutPermissions_Revert() (gas: 15409) +HybridUSDCTokenPoolMigrationTests:test_cannotTransferLiquidityDuringPendingMigration_Revert() (gas: 167516) +HybridUSDCTokenPoolMigrationTests:test_lockOrBurn_then_BurnInCCTPMigration_Success() (gas: 283817) +HybridUSDCTokenPoolMigrationTests:test_transferLiquidity_Success() (gas: 176428) +HybridUSDCTokenPoolMigrationTests:test_unstickManualTxAfterMigration_destChain_Success() (gas: 176729) +HybridUSDCTokenPoolMigrationTests:test_unstickManualTxAfterMigration_homeChain_Success() (gas: 538840) +HybridUSDCTokenPoolTests:test_LockOrBurn_LockReleaseMechanism_then_switchToPrimary_Success() (gas: 234786) +HybridUSDCTokenPoolTests:test_LockOrBurn_PrimaryMechanism_Success() (gas: 150729) +HybridUSDCTokenPoolTests:test_LockOrBurn_WhileMigrationPause_Revert() (gas: 113683) +HybridUSDCTokenPoolTests:test_LockOrBurn_onLockReleaseMechanism_Success() (gas: 154776) +HybridUSDCTokenPoolTests:test_MintOrRelease_OnLockReleaseMechanism_Success() (gas: 233917) +HybridUSDCTokenPoolTests:test_MintOrRelease_OnLockReleaseMechanism_then_switchToPrimary_Success() (gas: 509534) +HybridUSDCTokenPoolTests:test_MintOrRelease_incomingMessageWithPrimaryMechanism() (gas: 327020) +HybridUSDCTokenPoolTests:test_ReleaseOrMint_WhileMigrationPause_Revert() (gas: 122147) +HybridUSDCTokenPoolTests:test_cannotTransferLiquidityDuringPendingMigration_Revert() (gas: 167494) +HybridUSDCTokenPoolTests:test_transferLiquidity_Success() (gas: 176445) +LockReleaseTokenPoolAndProxy_setRebalancer:test_SetRebalancer_Revert() (gas: 11968) +LockReleaseTokenPoolAndProxy_setRebalancer:test_SetRebalancer_Success() (gas: 19761) +LockReleaseTokenPoolPoolAndProxy_canAcceptLiquidity:test_CanAcceptLiquidity_Success() (gas: 5147538) +LockReleaseTokenPoolPoolAndProxy_provideLiquidity:test_LiquidityNotAccepted_Revert() (gas: 5143388) +LockReleaseTokenPoolPoolAndProxy_provideLiquidity:test_Unauthorized_Revert() (gas: 12683) +LockReleaseTokenPoolPoolAndProxy_supportsInterface:test_SupportsInterface_Success() (gas: 11613) +LockReleaseTokenPoolPoolAndProxy_withdrawalLiquidity:test_InsufficientLiquidity_Revert() (gas: 64820) +LockReleaseTokenPoolPoolAndProxy_withdrawalLiquidity:test_Unauthorized_Revert() (gas: 12647) +LockReleaseTokenPool_canAcceptLiquidity:test_CanAcceptLiquidity_Success() (gas: 4775338) +LockReleaseTokenPool_lockOrBurn:test_LockOrBurnWithAllowList_Revert() (gas: 33986) +LockReleaseTokenPool_lockOrBurn:test_LockOrBurnWithAllowList_Success() (gas: 91128) +LockReleaseTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 64965) +LockReleaseTokenPool_provideLiquidity:test_LiquidityNotAccepted_Revert() (gas: 4771254) +LockReleaseTokenPool_provideLiquidity:test_Unauthorized_Revert() (gas: 12661) +LockReleaseTokenPool_releaseOrMint:test_ChainNotAllowed_Revert() (gas: 81914) +LockReleaseTokenPool_releaseOrMint:test_PoolMintNotHealthy_Revert() (gas: 63333) +LockReleaseTokenPool_releaseOrMint:test_ReleaseOrMint_Success() (gas: 274666) +LockReleaseTokenPool_setRebalancer:test_SetRebalancer_Revert() (gas: 11990) +LockReleaseTokenPool_setRebalancer:test_SetRebalancer_Success() (gas: 19783) +LockReleaseTokenPool_supportsInterface:test_SupportsInterface_Success() (gas: 11613) +LockReleaseTokenPool_transferLiquidity:test_transferLiquidity_Success() (gas: 88490) +LockReleaseTokenPool_transferLiquidity:test_transferLiquidity_transferTooMuch_Revert() (gas: 59808) +LockReleaseTokenPool_withdrawalLiquidity:test_InsufficientLiquidity_Revert() (gas: 64803) +LockReleaseTokenPool_withdrawalLiquidity:test_Unauthorized_Revert() (gas: 12647) +LockRelease_setRateLimitAdmin:test_SetRateLimitAdmin_Revert() (gas: 12033) +LockRelease_setRateLimitAdmin:test_SetRateLimitAdmin_Success() (gas: 36728) +MerkleMultiProofTest:test_CVE_2023_34459() (gas: 6372) +MerkleMultiProofTest:test_EmptyLeaf_Revert() (gas: 4019) +MerkleMultiProofTest:test_MerkleRoot256() (gas: 668330) +MerkleMultiProofTest:test_MerkleRootSingleLeaf_Success() (gas: 4074) +MerkleMultiProofTest:test_SpecSync_gas() (gas: 49338) +MockRouterTest:test_ccipSendWithInsufficientNativeTokens_Revert() (gas: 37132) +MockRouterTest:test_ccipSendWithInvalidMsgValue_Revert() (gas: 64034) +MockRouterTest:test_ccipSendWithLinkFeeTokenAndValidMsgValue_Success() (gas: 135267) +MockRouterTest:test_ccipSendWithLinkFeeTokenbutInsufficientAllowance_Revert() (gas: 68119) +MockRouterTest:test_ccipSendWithSufficientNativeFeeTokens_Success() (gas: 48403) +MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_MultipleConfigsBothLanes_Success() (gas: 150584) +MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_MultipleConfigs_Success() (gas: 357431) +MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_OnlyCallableByOwner_Revert() (gas: 20693) +MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_SingleConfigOutbound_Success() (gas: 85456) +MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_SingleConfig_Success() (gas: 85382) +MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_UpdateExistingConfigWithNoDifference_Success() (gas: 49626) +MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_UpdateExistingConfig_Success() (gas: 68052) +MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_ZeroChainSelector_Revert() (gas: 19536) +MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_ZeroConfigs_Success() (gas: 13331) +MultiAggregateRateLimiter_constructor:test_ConstructorNoAuthorizedCallers_Success() (gas: 3286151) +MultiAggregateRateLimiter_constructor:test_Constructor_Success() (gas: 3403578) +MultiAggregateRateLimiter_getTokenBucket:test_GetTokenBucket_Success() (gas: 38652) +MultiAggregateRateLimiter_getTokenBucket:test_Refill_Success() (gas: 63823) +MultiAggregateRateLimiter_getTokenBucket:test_TimeUnderflow_Revert() (gas: 18548) +MultiAggregateRateLimiter_getTokenValue:test_GetTokenValue_Success() (gas: 20837) +MultiAggregateRateLimiter_getTokenValue:test_NoTokenPrice_Reverts() (gas: 25361) +MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageFromUnauthorizedCaller_Revert() (gas: 17951) +MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithDifferentTokensOnDifferentChains_Success() (gas: 242409) +MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithDisabledRateLimitToken_Success() (gas: 68454) +MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithNoTokens_Success() (gas: 21034) +MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithRateLimitDisabled_Success() (gas: 53968) +MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithRateLimitExceeded_Revert() (gas: 56502) +MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithRateLimitReset_Success() (gas: 108389) +MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithTokensOnDifferentChains_Success() (gas: 344604) +MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithTokens_Success() (gas: 60097) +MultiAggregateRateLimiter_onOutboundMessage:test_RateLimitValueDifferentLanes_Success() (gas: 1073657377) +MultiAggregateRateLimiter_onOutboundMessage:test_ValidateMessageWithNoTokens_Success() (gas: 21497) +MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageFromUnauthorizedCaller_Revert() (gas: 18167) +MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithDifferentTokensOnDifferentChains_Success() (gas: 240199) +MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithDisabledRateLimitToken_Success() (gas: 69225) +MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithRateLimitDisabled_Success() (gas: 54803) +MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithRateLimitExceeded_Revert() (gas: 57316) +MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithRateLimitReset_Success() (gas: 105576) +MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithTokensOnDifferentChains_Success() (gas: 342731) +MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithTokens_Success() (gas: 60912) +MultiAggregateRateLimiter_setFeeQuoter:test_OnlyOwner_Revert() (gas: 12286) +MultiAggregateRateLimiter_setFeeQuoter:test_Owner_Success() (gas: 20439) +MultiAggregateRateLimiter_setFeeQuoter:test_ZeroAddress_Revert() (gas: 11124) +MultiAggregateRateLimiter_updateRateLimitTokens:test_NonOwner_Revert() (gas: 26352) +MultiAggregateRateLimiter_updateRateLimitTokens:test_UpdateRateLimitTokensMultipleChains_Success() (gas: 292916) +MultiAggregateRateLimiter_updateRateLimitTokens:test_UpdateRateLimitTokensSingleChain_Success() (gas: 265872) +MultiAggregateRateLimiter_updateRateLimitTokens:test_UpdateRateLimitTokens_AddsAndRemoves_Success() (gas: 214939) +MultiAggregateRateLimiter_updateRateLimitTokens:test_UpdateRateLimitTokens_RemoveNonExistentToken_Success() (gas: 32607) +MultiAggregateRateLimiter_updateRateLimitTokens:test_ZeroDestToken_Revert() (gas: 21085) +MultiAggregateRateLimiter_updateRateLimitTokens:test_ZeroSourceToken_Revert() (gas: 20891) +MultiOCR3Base_setOCR3Configs:test_FMustBePositive_Revert() (gas: 72005) +MultiOCR3Base_setOCR3Configs:test_FTooHigh_Revert() (gas: 49229) +MultiOCR3Base_setOCR3Configs:test_MoreTransmittersThanSigners_Revert() (gas: 115903) +MultiOCR3Base_setOCR3Configs:test_NoTransmitters_Revert() (gas: 23219) +MultiOCR3Base_setOCR3Configs:test_RepeatSignerAddress_Revert() (gas: 296831) +MultiOCR3Base_setOCR3Configs:test_RepeatTransmitterAddress_Revert() (gas: 437346) +MultiOCR3Base_setOCR3Configs:test_SetConfigIgnoreSigners_Success() (gas: 557001) +MultiOCR3Base_setOCR3Configs:test_SetConfigWithSignersMismatchingTransmitters_Success() (gas: 719687) +MultiOCR3Base_setOCR3Configs:test_SetConfigWithSigners_Success() (gas: 874847) +MultiOCR3Base_setOCR3Configs:test_SetConfigWithoutSigners_Success() (gas: 486312) +MultiOCR3Base_setOCR3Configs:test_SetConfigsZeroInput_Success() (gas: 13373) +MultiOCR3Base_setOCR3Configs:test_SetMultipleConfigs_Success() (gas: 2266810) +MultiOCR3Base_setOCR3Configs:test_SignerCannotBeZeroAddress_Revert() (gas: 152944) +MultiOCR3Base_setOCR3Configs:test_StaticConfigChange_Revert() (gas: 841242) +MultiOCR3Base_setOCR3Configs:test_TooManySigners_Revert() (gas: 312041) +MultiOCR3Base_setOCR3Configs:test_TooManyTransmitters_Revert() (gas: 261347) +MultiOCR3Base_setOCR3Configs:test_TransmitterCannotBeZeroAddress_Revert() (gas: 266581) +MultiOCR3Base_setOCR3Configs:test_UpdateConfigSigners_Success() (gas: 930576) +MultiOCR3Base_setOCR3Configs:test_UpdateConfigTransmittersWithoutSigners_Success() (gas: 516830) +MultiOCR3Base_transmit:test_ConfigDigestMismatch_Revert() (gas: 49771) +MultiOCR3Base_transmit:test_ForkedChain_Revert() (gas: 56488) +MultiOCR3Base_transmit:test_InsufficientSignatures_Revert() (gas: 87043) +MultiOCR3Base_transmit:test_NonUniqueSignature_Revert() (gas: 75511) +MultiOCR3Base_transmit:test_SignatureOutOfRegistration_Revert() (gas: 38453) +MultiOCR3Base_transmit:test_TooManySignatures_Revert() (gas: 92076) +MultiOCR3Base_transmit:test_TransmitSigners_gas_Success() (gas: 39865) +MultiOCR3Base_transmit:test_TransmitWithExtraCalldataArgs_Revert() (gas: 52756) +MultiOCR3Base_transmit:test_TransmitWithLessCalldataArgs_Revert() (gas: 30083) +MultiOCR3Base_transmit:test_TransmitWithoutSignatureVerification_gas_Success() (gas: 21035) +MultiOCR3Base_transmit:test_UnAuthorizedTransmitter_Revert() (gas: 29105) +MultiOCR3Base_transmit:test_UnauthorizedSigner_Revert() (gas: 69917) +MultiOCR3Base_transmit:test_UnconfiguredPlugin_Revert() (gas: 42537) +MultiOCR3Base_transmit:test_ZeroSignatures_Revert() (gas: 37478) MultiOnRampTokenPoolReentrancy:test_OnRampTokenPoolReentrancy_Success() (gas: 233635) MultiRampsE2E:test_E2E_3MessagesMMultiOffRampSuccess_gas() (gas: 1501725) NonceManager_NonceIncrementation:test_getIncrementedOutboundNonce_Success() (gas: 37934) @@ -588,166 +615,166 @@ NonceManager_applyPreviousRampsUpdates:test_PreviousRampAlreadySetOnRamp_Revert( NonceManager_applyPreviousRampsUpdates:test_SingleRampUpdate() (gas: 66666) NonceManager_applyPreviousRampsUpdates:test_ZeroInput() (gas: 12070) NonceManager_typeAndVersion:test_typeAndVersion() (gas: 9705) -OCR2BaseNoChecks_setOCR2Config:test_FMustBePositive_Revert() (gas: 12210) -OCR2BaseNoChecks_setOCR2Config:test_RepeatAddress_Revert() (gas: 42431) -OCR2BaseNoChecks_setOCR2Config:test_SetConfigSuccess_gas() (gas: 84597) -OCR2BaseNoChecks_setOCR2Config:test_TooManyTransmitter_Revert() (gas: 38177) -OCR2BaseNoChecks_setOCR2Config:test_TransmitterCannotBeZeroAddress_Revert() (gas: 24308) -OCR2BaseNoChecks_transmit:test_ConfigDigestMismatch_Revert() (gas: 17499) -OCR2BaseNoChecks_transmit:test_ForkedChain_Revert() (gas: 26798) -OCR2BaseNoChecks_transmit:test_TransmitSuccess_gas() (gas: 27499) -OCR2BaseNoChecks_transmit:test_UnAuthorizedTransmitter_Revert() (gas: 21335) -OCR2Base_setOCR2Config:test_FMustBePositive_Revert() (gas: 12216) -OCR2Base_setOCR2Config:test_FTooHigh_Revert() (gas: 12372) -OCR2Base_setOCR2Config:test_OracleOutOfRegister_Revert() (gas: 14919) -OCR2Base_setOCR2Config:test_RepeatAddress_Revert() (gas: 45469) -OCR2Base_setOCR2Config:test_SetConfigSuccess_gas() (gas: 155220) -OCR2Base_setOCR2Config:test_SingerCannotBeZeroAddress_Revert() (gas: 24425) -OCR2Base_setOCR2Config:test_TooManySigners_Revert() (gas: 20535) -OCR2Base_setOCR2Config:test_TransmitterCannotBeZeroAddress_Revert() (gas: 47316) -OCR2Base_transmit:test_ConfigDigestMismatch_Revert() (gas: 19668) -OCR2Base_transmit:test_ForkedChain_Revert() (gas: 37749) -OCR2Base_transmit:test_NonUniqueSignature_Revert() (gas: 55360) -OCR2Base_transmit:test_SignatureOutOfRegistration_Revert() (gas: 20989) -OCR2Base_transmit:test_Transmit2SignersSuccess_gas() (gas: 51689) -OCR2Base_transmit:test_UnAuthorizedTransmitter_Revert() (gas: 23511) -OCR2Base_transmit:test_UnauthorizedSigner_Revert() (gas: 39707) -OCR2Base_transmit:test_WrongNumberOfSignatures_Revert() (gas: 20584) -OffRamp_afterOC3ConfigSet:test_afterOCR3ConfigSet_SignatureVerificationDisabled_Revert() (gas: 5913989) -OffRamp_applySourceChainConfigUpdates:test_AddMultipleChains_Success() (gas: 626106) -OffRamp_applySourceChainConfigUpdates:test_AddNewChain_Success() (gas: 166490) -OffRamp_applySourceChainConfigUpdates:test_ApplyZeroUpdates_Success() (gas: 16763) -OffRamp_applySourceChainConfigUpdates:test_InvalidOnRampUpdate_Revert() (gas: 272148) -OffRamp_applySourceChainConfigUpdates:test_ReplaceExistingChainOnRamp_Success() (gas: 168572) -OffRamp_applySourceChainConfigUpdates:test_ReplaceExistingChain_Success() (gas: 181027) -OffRamp_applySourceChainConfigUpdates:test_RouterAddress_Revert() (gas: 13463) -OffRamp_applySourceChainConfigUpdates:test_ZeroOnRampAddress_Revert() (gas: 72746) -OffRamp_applySourceChainConfigUpdates:test_ZeroSourceChainSelector_Revert() (gas: 15519) -OffRamp_batchExecute:test_MultipleReportsDifferentChainsSkipCursedChain_Success() (gas: 177991) -OffRamp_batchExecute:test_MultipleReportsDifferentChains_Success() (gas: 335638) -OffRamp_batchExecute:test_MultipleReportsSameChain_Success() (gas: 278904) -OffRamp_batchExecute:test_MultipleReportsSkipDuplicate_Success() (gas: 169320) -OffRamp_batchExecute:test_OutOfBoundsGasLimitsAccess_Revert() (gas: 189033) -OffRamp_batchExecute:test_SingleReport_Success() (gas: 157144) -OffRamp_batchExecute:test_Unhealthy_Success() (gas: 554256) -OffRamp_batchExecute:test_ZeroReports_Revert() (gas: 10622) -OffRamp_ccipReceive:test_Reverts() (gas: 15407) -OffRamp_commit:test_CommitOnRampMismatch_Revert() (gas: 92905) -OffRamp_commit:test_FailedRMNVerification_Reverts() (gas: 64099) -OffRamp_commit:test_InvalidIntervalMinLargerThanMax_Revert() (gas: 68173) -OffRamp_commit:test_InvalidInterval_Revert() (gas: 64291) -OffRamp_commit:test_InvalidRootRevert() (gas: 63356) -OffRamp_commit:test_NoConfigWithOtherConfigPresent_Revert() (gas: 6674717) -OffRamp_commit:test_NoConfig_Revert() (gas: 6258389) -OffRamp_commit:test_OnlyGasPriceUpdates_Success() (gas: 113042) -OffRamp_commit:test_OnlyPriceUpdateStaleReport_Revert() (gas: 121403) -OffRamp_commit:test_OnlyTokenPriceUpdates_Success() (gas: 113063) -OffRamp_commit:test_PriceSequenceNumberCleared_Success() (gas: 355198) -OffRamp_commit:test_ReportAndPriceUpdate_Success() (gas: 164400) -OffRamp_commit:test_ReportOnlyRootSuccess_gas() (gas: 139413) -OffRamp_commit:test_RootAlreadyCommitted_Revert() (gas: 146555) -OffRamp_commit:test_SourceChainNotEnabled_Revert() (gas: 59858) -OffRamp_commit:test_StaleReportWithRoot_Success() (gas: 232042) -OffRamp_commit:test_UnauthorizedTransmitter_Revert() (gas: 125409) -OffRamp_commit:test_Unhealthy_Revert() (gas: 58633) -OffRamp_commit:test_ValidPriceUpdateThenStaleReportWithRoot_Success() (gas: 206713) -OffRamp_commit:test_ZeroEpochAndRound_Revert() (gas: 51722) -OffRamp_constructor:test_Constructor_Success() (gas: 6219782) -OffRamp_constructor:test_SourceChainSelector_Revert() (gas: 135943) -OffRamp_constructor:test_ZeroChainSelector_Revert() (gas: 103375) -OffRamp_constructor:test_ZeroNonceManager_Revert() (gas: 101269) -OffRamp_constructor:test_ZeroOnRampAddress_Revert() (gas: 161468) -OffRamp_constructor:test_ZeroRMNRemote_Revert() (gas: 101189) -OffRamp_constructor:test_ZeroTokenAdminRegistry_Revert() (gas: 101227) -OffRamp_execute:test_IncorrectArrayType_Revert() (gas: 17639) -OffRamp_execute:test_LargeBatch_Success() (gas: 3426335) -OffRamp_execute:test_MultipleReportsWithPartialValidationFailures_Success() (gas: 372990) -OffRamp_execute:test_MultipleReports_Success() (gas: 300979) -OffRamp_execute:test_NoConfigWithOtherConfigPresent_Revert() (gas: 7083612) -OffRamp_execute:test_NoConfig_Revert() (gas: 6308087) -OffRamp_execute:test_NonArray_Revert() (gas: 27562) -OffRamp_execute:test_SingleReport_Success() (gas: 176354) -OffRamp_execute:test_UnauthorizedTransmitter_Revert() (gas: 148372) -OffRamp_execute:test_WrongConfigWithSigners_Revert() (gas: 7086361) -OffRamp_execute:test_ZeroReports_Revert() (gas: 17361) -OffRamp_executeSingleMessage:test_MessageSender_Revert() (gas: 18533) -OffRamp_executeSingleMessage:test_NonContractWithTokens_Success() (gas: 244079) -OffRamp_executeSingleMessage:test_NonContract_Success() (gas: 20781) -OffRamp_executeSingleMessage:test_TokenHandlingError_Revert() (gas: 205116) -OffRamp_executeSingleMessage:test_ZeroGasDONExecution_Revert() (gas: 49306) -OffRamp_executeSingleMessage:test_executeSingleMessage_NoTokens_Success() (gas: 48750) -OffRamp_executeSingleMessage:test_executeSingleMessage_WithFailingValidationNoRouterCall_Revert() (gas: 218028) -OffRamp_executeSingleMessage:test_executeSingleMessage_WithFailingValidation_Revert() (gas: 85296) -OffRamp_executeSingleMessage:test_executeSingleMessage_WithTokens_Success() (gas: 274196) -OffRamp_executeSingleMessage:test_executeSingleMessage_WithVInterception_Success() (gas: 91724) -OffRamp_executeSingleReport:test_DisabledSourceChain_Revert() (gas: 28282) -OffRamp_executeSingleReport:test_EmptyReport_Revert() (gas: 22084) -OffRamp_executeSingleReport:test_InvalidSourcePoolAddress_Success() (gas: 481794) -OffRamp_executeSingleReport:test_ManualExecutionNotYetEnabled_Revert() (gas: 48394) -OffRamp_executeSingleReport:test_MismatchingDestChainSelector_Revert() (gas: 33981) -OffRamp_executeSingleReport:test_NonExistingSourceChain_Revert() (gas: 28458) -OffRamp_executeSingleReport:test_ReceiverError_Success() (gas: 188096) -OffRamp_executeSingleReport:test_RetryFailedMessageWithoutManualExecution_Revert() (gas: 198552) -OffRamp_executeSingleReport:test_RootNotCommitted_Revert() (gas: 40763) -OffRamp_executeSingleReport:test_RouterYULCall_Revert() (gas: 413245) -OffRamp_executeSingleReport:test_SingleMessageNoTokensOtherChain_Success() (gas: 249800) -OffRamp_executeSingleReport:test_SingleMessageNoTokensUnordered_Success() (gas: 193614) -OffRamp_executeSingleReport:test_SingleMessageNoTokens_Success() (gas: 213648) -OffRamp_executeSingleReport:test_SingleMessageToNonCCIPReceiver_Success() (gas: 249550) -OffRamp_executeSingleReport:test_SingleMessagesNoTokensSuccess_gas() (gas: 142163) -OffRamp_executeSingleReport:test_SkippedIncorrectNonceStillExecutes_Success() (gas: 409313) -OffRamp_executeSingleReport:test_SkippedIncorrectNonce_Success() (gas: 58315) -OffRamp_executeSingleReport:test_TokenDataMismatch_Revert() (gas: 73890) -OffRamp_executeSingleReport:test_TwoMessagesWithTokensAndGE_Success() (gas: 583427) -OffRamp_executeSingleReport:test_TwoMessagesWithTokensSuccess_gas() (gas: 532141) -OffRamp_executeSingleReport:test_UnexpectedTokenData_Revert() (gas: 33739) -OffRamp_executeSingleReport:test_UnhealthySingleChainCurse_Revert() (gas: 549786) -OffRamp_executeSingleReport:test_Unhealthy_Success() (gas: 549800) -OffRamp_executeSingleReport:test_WithCurseOnAnotherSourceChain_Success() (gas: 460521) -OffRamp_executeSingleReport:test__execute_SkippedAlreadyExecutedMessageUnordered_Success() (gas: 135944) -OffRamp_executeSingleReport:test__execute_SkippedAlreadyExecutedMessage_Success() (gas: 165649) -OffRamp_getExecutionState:test_FillExecutionState_Success() (gas: 3885554) -OffRamp_getExecutionState:test_GetDifferentChainExecutionState_Success() (gas: 120606) -OffRamp_getExecutionState:test_GetExecutionState_Success() (gas: 89288) -OffRamp_manuallyExecute:test_ManualExecGasLimitMismatchSingleReport_Revert() (gas: 81016) -OffRamp_manuallyExecute:test_manuallyExecute_DestinationGasAmountCountMismatch_Revert() (gas: 74027) -OffRamp_manuallyExecute:test_manuallyExecute_DoesNotRevertIfUntouched_Success() (gas: 173167) -OffRamp_manuallyExecute:test_manuallyExecute_FailedTx_Revert() (gas: 214124) -OffRamp_manuallyExecute:test_manuallyExecute_ForkedChain_Revert() (gas: 27085) -OffRamp_manuallyExecute:test_manuallyExecute_GasLimitMismatchMultipleReports_Revert() (gas: 164696) -OffRamp_manuallyExecute:test_manuallyExecute_InvalidReceiverExecutionGasLimit_Revert() (gas: 27622) -OffRamp_manuallyExecute:test_manuallyExecute_InvalidTokenGasOverride_Revert() (gas: 55193) -OffRamp_manuallyExecute:test_manuallyExecute_LowGasLimit_Success() (gas: 498549) -OffRamp_manuallyExecute:test_manuallyExecute_MultipleReportsWithSingleCursedLane_Revert() (gas: 316061) -OffRamp_manuallyExecute:test_manuallyExecute_ReentrancyFails_Success() (gas: 2245222) -OffRamp_manuallyExecute:test_manuallyExecute_SourceChainSelectorMismatch_Revert() (gas: 165525) -OffRamp_manuallyExecute:test_manuallyExecute_Success() (gas: 227169) -OffRamp_manuallyExecute:test_manuallyExecute_WithGasOverride_Success() (gas: 227709) -OffRamp_manuallyExecute:test_manuallyExecute_WithMultiReportGasOverride_Success() (gas: 781365) -OffRamp_manuallyExecute:test_manuallyExecute_WithPartialMessages_Success() (gas: 347346) -OffRamp_releaseOrMintSingleToken:test__releaseOrMintSingleToken_NotACompatiblePool_Revert() (gas: 37656) -OffRamp_releaseOrMintSingleToken:test__releaseOrMintSingleToken_Success() (gas: 104404) -OffRamp_releaseOrMintSingleToken:test__releaseOrMintSingleToken_TokenHandlingError_transfer_Revert() (gas: 85342) -OffRamp_releaseOrMintSingleToken:test_releaseOrMintToken_InvalidDataLength_Revert() (gas: 36752) -OffRamp_releaseOrMintSingleToken:test_releaseOrMintToken_ReleaseOrMintBalanceMismatch_Revert() (gas: 94382) -OffRamp_releaseOrMintSingleToken:test_releaseOrMintToken_TokenHandlingError_BalanceOf_Revert() (gas: 39741) -OffRamp_releaseOrMintSingleToken:test_releaseOrMintToken_skip_ReleaseOrMintBalanceMismatch_if_pool_Revert() (gas: 86516) -OffRamp_releaseOrMintTokens:test_TokenHandlingError_Reverts() (gas: 162381) -OffRamp_releaseOrMintTokens:test__releaseOrMintTokens_PoolIsNotAPool_Reverts() (gas: 23903) -OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_InvalidDataLengthReturnData_Revert() (gas: 62751) -OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_PoolDoesNotSupportDest_Reverts() (gas: 79790) -OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_Success() (gas: 174468) -OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_WithGasOverride_Success() (gas: 176380) -OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_destDenominatedDecimals_Success() (gas: 187679) -OffRamp_setDynamicConfig:test_FeeQuoterZeroAddress_Revert() (gas: 11291) -OffRamp_setDynamicConfig:test_NonOwner_Revert() (gas: 13906) -OffRamp_setDynamicConfig:test_SetDynamicConfigWithInterceptor_Success() (gas: 46378) -OffRamp_setDynamicConfig:test_SetDynamicConfig_Success() (gas: 24420) -OffRamp_trialExecute:test_RateLimitError_Success() (gas: 219377) -OffRamp_trialExecute:test_TokenHandlingErrorIsCaught_Success() (gas: 227999) -OffRamp_trialExecute:test_TokenPoolIsNotAContract_Success() (gas: 295396) -OffRamp_trialExecute:test_trialExecute_Success() (gas: 277896) -OnRampTokenPoolReentrancy:test_OnRampTokenPoolReentrancy_Success() (gas: 390842) +OCR2BaseNoChecks_setOCR2Config:test_FMustBePositive_Revert() (gas: 15443) +OCR2BaseNoChecks_setOCR2Config:test_RepeatAddress_Revert() (gas: 48841) +OCR2BaseNoChecks_setOCR2Config:test_SetConfigSuccess_gas() (gas: 97138) +OCR2BaseNoChecks_setOCR2Config:test_TooManyTransmitter_Revert() (gas: 75615) +OCR2BaseNoChecks_setOCR2Config:test_TransmitterCannotBeZeroAddress_Revert() (gas: 32515) +OCR2BaseNoChecks_transmit:test_ConfigDigestMismatch_Revert() (gas: 20081) +OCR2BaseNoChecks_transmit:test_ForkedChain_Revert() (gas: 29888) +OCR2BaseNoChecks_transmit:test_TransmitSuccess_gas() (gas: 30530) +OCR2BaseNoChecks_transmit:test_UnAuthorizedTransmitter_Revert() (gas: 25249) +OCR2Base_setOCR2Config:test_FMustBePositive_Revert() (gas: 15449) +OCR2Base_setOCR2Config:test_FTooHigh_Revert() (gas: 15725) +OCR2Base_setOCR2Config:test_OracleOutOfRegister_Revert() (gas: 21647) +OCR2Base_setOCR2Config:test_RepeatAddress_Revert() (gas: 56234) +OCR2Base_setOCR2Config:test_SetConfigSuccess_gas() (gas: 169648) +OCR2Base_setOCR2Config:test_SingerCannotBeZeroAddress_Revert() (gas: 32751) +OCR2Base_setOCR2Config:test_TooManySigners_Revert() (gas: 34759) +OCR2Base_setOCR2Config:test_TransmitterCannotBeZeroAddress_Revert() (gas: 55992) +OCR2Base_transmit:test_ConfigDigestMismatch_Revert() (gas: 22520) +OCR2Base_transmit:test_ForkedChain_Revert() (gas: 42561) +OCR2Base_transmit:test_NonUniqueSignature_Revert() (gas: 62252) +OCR2Base_transmit:test_SignatureOutOfRegistration_Revert() (gas: 24538) +OCR2Base_transmit:test_Transmit2SignersSuccess_gas() (gas: 58490) +OCR2Base_transmit:test_UnAuthorizedTransmitter_Revert() (gas: 27448) +OCR2Base_transmit:test_UnauthorizedSigner_Revert() (gas: 45597) +OCR2Base_transmit:test_WrongNumberOfSignatures_Revert() (gas: 23593) +OffRamp_afterOC3ConfigSet:test_afterOCR3ConfigSet_SignatureVerificationDisabled_Revert() (gas: 9301256) +OffRamp_applySourceChainConfigUpdates:test_AddMultipleChains_Success() (gas: 652186) +OffRamp_applySourceChainConfigUpdates:test_AddNewChain_Success() (gas: 174768) +OffRamp_applySourceChainConfigUpdates:test_ApplyZeroUpdates_Success() (gas: 18224) +OffRamp_applySourceChainConfigUpdates:test_InvalidOnRampUpdate_Revert() (gas: 298010) +OffRamp_applySourceChainConfigUpdates:test_ReplaceExistingChainOnRamp_Success() (gas: 177903) +OffRamp_applySourceChainConfigUpdates:test_ReplaceExistingChain_Success() (gas: 195423) +OffRamp_applySourceChainConfigUpdates:test_RouterAddress_Revert() (gas: 15779) +OffRamp_applySourceChainConfigUpdates:test_ZeroOnRampAddress_Revert() (gas: 77864) +OffRamp_applySourceChainConfigUpdates:test_ZeroSourceChainSelector_Revert() (gas: 17916) +OffRamp_batchExecute:test_MultipleReportsDifferentChainsSkipCursedChain_Success() (gas: 224127) +OffRamp_batchExecute:test_MultipleReportsDifferentChains_Success() (gas: 426084) +OffRamp_batchExecute:test_MultipleReportsSameChain_Success() (gas: 369040) +OffRamp_batchExecute:test_MultipleReportsSkipDuplicate_Success() (gas: 208148) +OffRamp_batchExecute:test_OutOfBoundsGasLimitsAccess_Revert() (gas: 239377) +OffRamp_batchExecute:test_SingleReport_Success() (gas: 188697) +OffRamp_batchExecute:test_Unhealthy_Success() (gas: 717417) +OffRamp_batchExecute:test_ZeroReports_Revert() (gas: 12110) +OffRamp_ccipReceive:test_Reverts() (gas: 18775) +OffRamp_commit:test_CommitOnRampMismatch_Revert() (gas: 109720) +OffRamp_commit:test_FailedRMNVerification_Reverts() (gas: 77314) +OffRamp_commit:test_InvalidIntervalMinLargerThanMax_Revert() (gas: 83071) +OffRamp_commit:test_InvalidInterval_Revert() (gas: 77116) +OffRamp_commit:test_InvalidRootRevert() (gas: 75631) +OffRamp_commit:test_NoConfigWithOtherConfigPresent_Revert() (gas: 10104182) +OffRamp_commit:test_NoConfig_Revert() (gas: 9678313) +OffRamp_commit:test_OnlyGasPriceUpdates_Success() (gas: 130728) +OffRamp_commit:test_OnlyPriceUpdateStaleReport_Revert() (gas: 147353) +OffRamp_commit:test_OnlyTokenPriceUpdates_Success() (gas: 130749) +OffRamp_commit:test_PriceSequenceNumberCleared_Success() (gas: 424203) +OffRamp_commit:test_ReportAndPriceUpdate_Success() (gas: 190103) +OffRamp_commit:test_ReportOnlyRootSuccess_gas() (gas: 161941) +OffRamp_commit:test_RootAlreadyCommitted_Revert() (gas: 176263) +OffRamp_commit:test_SourceChainNotEnabled_Revert() (gas: 72480) +OffRamp_commit:test_StaleReportWithRoot_Success() (gas: 280609) +OffRamp_commit:test_UnauthorizedTransmitter_Revert() (gas: 144515) +OffRamp_commit:test_Unhealthy_Revert() (gas: 71728) +OffRamp_commit:test_ValidPriceUpdateThenStaleReportWithRoot_Success() (gas: 250314) +OffRamp_commit:test_ZeroEpochAndRound_Revert() (gas: 61202) +OffRamp_constructor:test_Constructor_Success() (gas: 9638677) +OffRamp_constructor:test_SourceChainSelector_Revert() (gas: 149544) +OffRamp_constructor:test_ZeroChainSelector_Revert() (gas: 113479) +OffRamp_constructor:test_ZeroNonceManager_Revert() (gas: 111281) +OffRamp_constructor:test_ZeroOnRampAddress_Revert() (gas: 175098) +OffRamp_constructor:test_ZeroRMNRemote_Revert() (gas: 111283) +OffRamp_constructor:test_ZeroTokenAdminRegistry_Revert() (gas: 111228) +OffRamp_execute:test_IncorrectArrayType_Revert() (gas: 19670) +OffRamp_execute:test_LargeBatch_Success() (gas: 4789695) +OffRamp_execute:test_MultipleReportsWithPartialValidationFailures_Success() (gas: 462410) +OffRamp_execute:test_MultipleReports_Success() (gas: 392458) +OffRamp_execute:test_NoConfigWithOtherConfigPresent_Revert() (gas: 10528542) +OffRamp_execute:test_NoConfig_Revert() (gas: 9735461) +OffRamp_execute:test_NonArray_Revert() (gas: 34048) +OffRamp_execute:test_SingleReport_Success() (gas: 209336) +OffRamp_execute:test_UnauthorizedTransmitter_Revert() (gas: 173222) +OffRamp_execute:test_WrongConfigWithSigners_Revert() (gas: 10536285) +OffRamp_execute:test_ZeroReports_Revert() (gas: 19285) +OffRamp_executeSingleMessage:test_MessageSender_Revert() (gas: 23999) +OffRamp_executeSingleMessage:test_NonContractWithTokens_Success() (gas: 277760) +OffRamp_executeSingleMessage:test_NonContract_Success() (gas: 26498) +OffRamp_executeSingleMessage:test_TokenHandlingError_Revert() (gas: 236604) +OffRamp_executeSingleMessage:test_ZeroGasDONExecution_Revert() (gas: 61012) +OffRamp_executeSingleMessage:test_executeSingleMessage_NoTokens_Success() (gas: 60154) +OffRamp_executeSingleMessage:test_executeSingleMessage_WithFailingValidationNoRouterCall_Revert() (gas: 267116) +OffRamp_executeSingleMessage:test_executeSingleMessage_WithFailingValidation_Revert() (gas: 98105) +OffRamp_executeSingleMessage:test_executeSingleMessage_WithTokens_Success() (gas: 320820) +OffRamp_executeSingleMessage:test_executeSingleMessage_WithVInterception_Success() (gas: 108693) +OffRamp_executeSingleReport:test_DisabledSourceChain_Revert() (gas: 36788) +OffRamp_executeSingleReport:test_EmptyReport_Revert() (gas: 24567) +OffRamp_executeSingleReport:test_InvalidSourcePoolAddress_Success() (gas: 595880) +OffRamp_executeSingleReport:test_ManualExecutionNotYetEnabled_Revert() (gas: 60490) +OffRamp_executeSingleReport:test_MismatchingDestChainSelector_Revert() (gas: 42477) +OffRamp_executeSingleReport:test_NonExistingSourceChain_Revert() (gas: 37234) +OffRamp_executeSingleReport:test_ReceiverError_Success() (gas: 221934) +OffRamp_executeSingleReport:test_RetryFailedMessageWithoutManualExecution_Revert() (gas: 238001) +OffRamp_executeSingleReport:test_RootNotCommitted_Revert() (gas: 52368) +OffRamp_executeSingleReport:test_RouterYULCall_Revert() (gas: 625062) +OffRamp_executeSingleReport:test_SingleMessageNoTokensOtherChain_Success() (gas: 298001) +OffRamp_executeSingleReport:test_SingleMessageNoTokensUnordered_Success() (gas: 252989) +OffRamp_executeSingleReport:test_SingleMessageNoTokens_Success() (gas: 272016) +OffRamp_executeSingleReport:test_SingleMessageToNonCCIPReceiver_Success() (gas: 307376) +OffRamp_executeSingleReport:test_SingleMessagesNoTokensSuccess_gas() (gas: 168302) +OffRamp_executeSingleReport:test_SkippedIncorrectNonceStillExecutes_Success() (gas: 502248) +OffRamp_executeSingleReport:test_SkippedIncorrectNonce_Success() (gas: 72021) +OffRamp_executeSingleReport:test_TokenDataMismatch_Revert() (gas: 86553) +OffRamp_executeSingleReport:test_TwoMessagesWithTokensAndGE_Success() (gas: 733747) +OffRamp_executeSingleReport:test_TwoMessagesWithTokensSuccess_gas() (gas: 666564) +OffRamp_executeSingleReport:test_UnexpectedTokenData_Revert() (gas: 42472) +OffRamp_executeSingleReport:test_UnhealthySingleChainCurse_Revert() (gas: 710808) +OffRamp_executeSingleReport:test_Unhealthy_Success() (gas: 710811) +OffRamp_executeSingleReport:test_WithCurseOnAnotherSourceChain_Success() (gas: 574200) +OffRamp_executeSingleReport:test__execute_SkippedAlreadyExecutedMessageUnordered_Success() (gas: 172842) +OffRamp_executeSingleReport:test__execute_SkippedAlreadyExecutedMessage_Success() (gas: 202303) +OffRamp_getExecutionState:test_FillExecutionState_Success() (gas: 5720172) +OffRamp_getExecutionState:test_GetDifferentChainExecutionState_Success() (gas: 148136) +OffRamp_getExecutionState:test_GetExecutionState_Success() (gas: 111630) +OffRamp_manuallyExecute:test_ManualExecGasLimitMismatchSingleReport_Revert() (gas: 127758) +OffRamp_manuallyExecute:test_manuallyExecute_DestinationGasAmountCountMismatch_Revert() (gas: 103837) +OffRamp_manuallyExecute:test_manuallyExecute_DoesNotRevertIfUntouched_Success() (gas: 208337) +OffRamp_manuallyExecute:test_manuallyExecute_FailedTx_Revert() (gas: 261274) +OffRamp_manuallyExecute:test_manuallyExecute_ForkedChain_Revert() (gas: 37621) +OffRamp_manuallyExecute:test_manuallyExecute_GasLimitMismatchMultipleReports_Revert() (gas: 267225) +OffRamp_manuallyExecute:test_manuallyExecute_InvalidReceiverExecutionGasLimit_Revert() (gas: 38149) +OffRamp_manuallyExecute:test_manuallyExecute_InvalidTokenGasOverride_Revert() (gas: 72989) +OffRamp_manuallyExecute:test_manuallyExecute_LowGasLimit_Success() (gas: 742493) +OffRamp_manuallyExecute:test_manuallyExecute_MultipleReportsWithSingleCursedLane_Revert() (gas: 408959) +OffRamp_manuallyExecute:test_manuallyExecute_ReentrancyFails_Success() (gas: 3573893) +OffRamp_manuallyExecute:test_manuallyExecute_SourceChainSelectorMismatch_Revert() (gas: 199675) +OffRamp_manuallyExecute:test_manuallyExecute_Success() (gas: 279996) +OffRamp_manuallyExecute:test_manuallyExecute_WithGasOverride_Success() (gas: 280692) +OffRamp_manuallyExecute:test_manuallyExecute_WithMultiReportGasOverride_Success() (gas: 1033938) +OffRamp_manuallyExecute:test_manuallyExecute_WithPartialMessages_Success() (gas: 461966) +OffRamp_releaseOrMintSingleToken:test__releaseOrMintSingleToken_NotACompatiblePool_Revert() (gas: 47670) +OffRamp_releaseOrMintSingleToken:test__releaseOrMintSingleToken_Success() (gas: 121919) +OffRamp_releaseOrMintSingleToken:test__releaseOrMintSingleToken_TokenHandlingError_transfer_Revert() (gas: 99377) +OffRamp_releaseOrMintSingleToken:test_releaseOrMintToken_InvalidDataLength_Revert() (gas: 44074) +OffRamp_releaseOrMintSingleToken:test_releaseOrMintToken_ReleaseOrMintBalanceMismatch_Revert() (gas: 109868) +OffRamp_releaseOrMintSingleToken:test_releaseOrMintToken_TokenHandlingError_BalanceOf_Revert() (gas: 46405) +OffRamp_releaseOrMintSingleToken:test_releaseOrMintToken_skip_ReleaseOrMintBalanceMismatch_if_pool_Revert() (gas: 101128) +OffRamp_releaseOrMintTokens:test_TokenHandlingError_Reverts() (gas: 187037) +OffRamp_releaseOrMintTokens:test__releaseOrMintTokens_PoolIsNotAPool_Reverts() (gas: 28901) +OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_InvalidDataLengthReturnData_Revert() (gas: 74851) +OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_PoolDoesNotSupportDest_Reverts() (gas: 94066) +OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_Success() (gas: 206891) +OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_WithGasOverride_Success() (gas: 209712) +OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_destDenominatedDecimals_Success() (gas: 217613) +OffRamp_setDynamicConfig:test_FeeQuoterZeroAddress_Revert() (gas: 12546) +OffRamp_setDynamicConfig:test_NonOwner_Revert() (gas: 15551) +OffRamp_setDynamicConfig:test_SetDynamicConfigWithInterceptor_Success() (gas: 50773) +OffRamp_setDynamicConfig:test_SetDynamicConfig_Success() (gas: 28739) +OffRamp_trialExecute:test_RateLimitError_Success() (gas: 259646) +OffRamp_trialExecute:test_TokenHandlingErrorIsCaught_Success() (gas: 269756) +OffRamp_trialExecute:test_TokenPoolIsNotAContract_Success() (gas: 386699) +OffRamp_trialExecute:test_trialExecute_Success() (gas: 329723) +OnRampTokenPoolReentrancy:test_OnRampTokenPoolReentrancy_Success() (gas: 508639) OnRamp_applyAllowListUpdates:test_applyAllowListUpdates_InvalidAllowListRequestDisabledAllowListWithAdds() (gas: 18018) OnRamp_applyAllowListUpdates:test_applyAllowListUpdates_Revert() (gas: 67797) OnRamp_applyAllowListUpdates:test_applyAllowListUpdates_Success() (gas: 325198) @@ -797,242 +824,248 @@ OnRamp_setDynamicConfig:test_setDynamicConfig_InvalidConfigOnlyOwner_Revert() (g OnRamp_setDynamicConfig:test_setDynamicConfig_InvalidConfigReentrancyGuardEnteredEqTrue_Revert() (gas: 13265) OnRamp_setDynamicConfig:test_setDynamicConfig_Success() (gas: 56347) OnRamp_withdrawFeeTokens:test_WithdrawFeeTokens_Success() (gas: 97302) -PingPong_ccipReceive:test_CcipReceive_Success() (gas: 151349) -PingPong_plumbing:test_OutOfOrderExecution_Success() (gas: 20310) -PingPong_plumbing:test_Pausing_Success() (gas: 17810) -PingPong_startPingPong:test_StartPingPong_With_OOO_Success() (gas: 162091) -PingPong_startPingPong:test_StartPingPong_With_Sequenced_Ordered_Success() (gas: 181509) -RMNHome__validateStaticAndDynamicConfig:test_validateStaticAndDynamicConfig_DuplicateOffchainPublicKey_reverts() (gas: 18822) -RMNHome__validateStaticAndDynamicConfig:test_validateStaticAndDynamicConfig_DuplicatePeerId_reverts() (gas: 18682) -RMNHome__validateStaticAndDynamicConfig:test_validateStaticAndDynamicConfig_DuplicateSourceChain_reverts() (gas: 20371) -RMNHome__validateStaticAndDynamicConfig:test_validateStaticAndDynamicConfig_MinObserversTooHigh_reverts() (gas: 20810) -RMNHome__validateStaticAndDynamicConfig:test_validateStaticAndDynamicConfig_OutOfBoundsNodesLength_reverts() (gas: 137268) -RMNHome__validateStaticAndDynamicConfig:test_validateStaticAndDynamicConfig_OutOfBoundsObserverNodeIndex_reverts() (gas: 20472) -RMNHome_getConfigDigests:test_getConfigDigests_success() (gas: 1077745) -RMNHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_ConfigDigestMismatch_reverts() (gas: 23857) -RMNHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_NoOpStateTransitionNotAllowed_reverts() (gas: 10575) -RMNHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_OnlyOwner_reverts() (gas: 10936) -RMNHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_success() (gas: 1083071) -RMNHome_revokeCandidate:test_revokeCandidate_ConfigDigestMismatch_reverts() (gas: 19063) -RMNHome_revokeCandidate:test_revokeCandidate_OnlyOwner_reverts() (gas: 10963) -RMNHome_revokeCandidate:test_revokeCandidate_RevokingZeroDigestNotAllowed_reverts() (gas: 10606) -RMNHome_revokeCandidate:test_revokeCandidate_success() (gas: 28147) -RMNHome_setCandidate:test_setCandidate_ConfigDigestMismatch_reverts() (gas: 594679) -RMNHome_setCandidate:test_setCandidate_OnlyOwner_reverts() (gas: 15177) -RMNHome_setCandidate:test_setCandidate_success() (gas: 588379) -RMNHome_setDynamicConfig:test_setDynamicConfig_DigestNotFound_reverts() (gas: 30159) -RMNHome_setDynamicConfig:test_setDynamicConfig_MinObserversTooHigh_reverts() (gas: 18848) -RMNHome_setDynamicConfig:test_setDynamicConfig_OnlyOwner_reverts() (gas: 14115) -RMNHome_setDynamicConfig:test_setDynamicConfig_success() (gas: 103911) -RMNRemote_constructor:test_constructor_success() (gas: 8334) -RMNRemote_constructor:test_constructor_zeroChainSelector_reverts() (gas: 59165) -RMNRemote_curse:test_curse_AlreadyCursed_duplicateSubject_reverts() (gas: 154457) -RMNRemote_curse:test_curse_calledByNonOwner_reverts() (gas: 18780) -RMNRemote_curse:test_curse_success() (gas: 149365) -RMNRemote_global_and_legacy_curses:test_global_and_legacy_curses_success() (gas: 133464) -RMNRemote_setConfig:test_setConfig_addSigner_removeSigner_success() (gas: 976479) -RMNRemote_setConfig:test_setConfig_duplicateOnChainPublicKey_reverts() (gas: 323272) -RMNRemote_setConfig:test_setConfig_invalidSignerOrder_reverts() (gas: 80138) -RMNRemote_setConfig:test_setConfig_minSignersIs0_success() (gas: 700548) -RMNRemote_setConfig:test_setConfig_minSignersTooHigh_reverts() (gas: 54024) -RMNRemote_uncurse:test_uncurse_NotCursed_duplicatedUncurseSubject_reverts() (gas: 51912) -RMNRemote_uncurse:test_uncurse_calledByNonOwner_reverts() (gas: 18748) -RMNRemote_uncurse:test_uncurse_success() (gas: 40151) -RMNRemote_verify_withConfigNotSet:test_verify_reverts() (gas: 13650) -RMNRemote_verify_withConfigSet:test_verify_InvalidSignature_reverts() (gas: 78519) -RMNRemote_verify_withConfigSet:test_verify_OutOfOrderSignatures_duplicateSignature_reverts() (gas: 76336) -RMNRemote_verify_withConfigSet:test_verify_OutOfOrderSignatures_not_sorted_reverts() (gas: 83399) -RMNRemote_verify_withConfigSet:test_verify_ThresholdNotMet_reverts() (gas: 153002) -RMNRemote_verify_withConfigSet:test_verify_UnexpectedSigner_reverts() (gas: 387667) -RMNRemote_verify_withConfigSet:test_verify_minSignersIsZero_success() (gas: 184524) -RMNRemote_verify_withConfigSet:test_verify_success() (gas: 68207) -RMN_constructor:test_Constructor_Success() (gas: 48994) -RMN_getRecordedCurseRelatedOps:test_OpsPostDeployment() (gas: 19732) -RMN_lazyVoteToCurseUpdate_Benchmark:test_VoteToCurseLazilyRetain3VotersUponConfigChange_gas() (gas: 152296) -RMN_ownerUnbless:test_Unbless_Success() (gas: 74936) -RMN_ownerUnvoteToCurse:test_CanBlessAndCurseAfterGlobalCurseIsLifted() (gas: 471829) -RMN_ownerUnvoteToCurse:test_IsIdempotent() (gas: 398492) -RMN_ownerUnvoteToCurse:test_NonOwner_Revert() (gas: 18723) -RMN_ownerUnvoteToCurse:test_OwnerUnvoteToCurseSuccess_gas() (gas: 358084) -RMN_ownerUnvoteToCurse:test_UnknownVoter_Revert() (gas: 33190) -RMN_ownerUnvoteToCurse_Benchmark:test_OwnerUnvoteToCurse_1Voter_LiftsCurse_gas() (gas: 262408) -RMN_permaBlessing:test_PermaBlessing() (gas: 202777) -RMN_setConfig:test_BlessVoterIsZeroAddress_Revert() (gas: 15500) -RMN_setConfig:test_EitherThresholdIsZero_Revert() (gas: 21107) -RMN_setConfig:test_NonOwner_Revert() (gas: 14725) -RMN_setConfig:test_RepeatedAddress_Revert() (gas: 18219) -RMN_setConfig:test_SetConfigSuccess_gas() (gas: 104154) -RMN_setConfig:test_TotalWeightsSmallerThanEachThreshold_Revert() (gas: 30185) -RMN_setConfig:test_VoteToBlessByEjectedVoter_Revert() (gas: 130461) -RMN_setConfig:test_VotersLengthIsZero_Revert() (gas: 12149) -RMN_setConfig:test_WeightIsZeroAddress_Revert() (gas: 15740) -RMN_setConfig_Benchmark_1:test_SetConfig_7Voters_gas() (gas: 659600) -RMN_setConfig_Benchmark_2:test_ResetConfig_7Voters_gas() (gas: 212652) -RMN_unvoteToCurse:test_InvalidCursesHash() (gas: 26430) -RMN_unvoteToCurse:test_OwnerSkips() (gas: 33831) -RMN_unvoteToCurse:test_OwnerSucceeds() (gas: 64005) -RMN_unvoteToCurse:test_UnauthorizedVoter() (gas: 47715) -RMN_unvoteToCurse:test_ValidCursesHash() (gas: 61145) -RMN_unvoteToCurse:test_VotersCantLiftCurseButOwnerCan() (gas: 629190) -RMN_voteToBless:test_Curse_Revert() (gas: 473408) -RMN_voteToBless:test_IsAlreadyBlessed_Revert() (gas: 115435) -RMN_voteToBless:test_RootSuccess() (gas: 558661) -RMN_voteToBless:test_SenderAlreadyVoted_Revert() (gas: 97234) -RMN_voteToBless:test_UnauthorizedVoter_Revert() (gas: 17126) -RMN_voteToBless_Benchmark:test_1RootSuccess_gas() (gas: 44718) -RMN_voteToBless_Benchmark:test_3RootSuccess_gas() (gas: 98694) -RMN_voteToBless_Benchmark:test_5RootSuccess_gas() (gas: 152608) -RMN_voteToBless_Blessed_Benchmark:test_1RootSuccessBecameBlessed_gas() (gas: 29682) -RMN_voteToBless_Blessed_Benchmark:test_1RootSuccess_gas() (gas: 27628) -RMN_voteToBless_Blessed_Benchmark:test_3RootSuccess_gas() (gas: 81626) -RMN_voteToBless_Blessed_Benchmark:test_5RootSuccess_gas() (gas: 135518) -RMN_voteToCurse:test_CurseOnlyWhenThresholdReached_Success() (gas: 1651170) -RMN_voteToCurse:test_EmptySubjects_Revert() (gas: 14061) -RMN_voteToCurse:test_EvenIfAlreadyCursed_Success() (gas: 535124) -RMN_voteToCurse:test_OwnerCanCurseAndUncurse() (gas: 400060) -RMN_voteToCurse:test_RepeatedSubject_Revert() (gas: 144405) -RMN_voteToCurse:test_ReusedCurseId_Revert() (gas: 146972) -RMN_voteToCurse:test_UnauthorizedVoter_Revert() (gas: 12666) -RMN_voteToCurse:test_VoteToCurse_NoCurse_Success() (gas: 187556) -RMN_voteToCurse:test_VoteToCurse_YesCurse_Success() (gas: 473079) -RMN_voteToCurse_2:test_VotesAreDroppedIfSubjectIsNotCursedDuringConfigChange() (gas: 371083) -RMN_voteToCurse_2:test_VotesAreRetainedIfSubjectIsCursedDuringConfigChange() (gas: 1154362) -RMN_voteToCurse_Benchmark_1:test_VoteToCurse_NewSubject_NewVoter_NoCurse_gas() (gas: 141118) -RMN_voteToCurse_Benchmark_1:test_VoteToCurse_NewSubject_NewVoter_YesCurse_gas() (gas: 165258) -RMN_voteToCurse_Benchmark_2:test_VoteToCurse_OldSubject_NewVoter_NoCurse_gas() (gas: 121437) -RMN_voteToCurse_Benchmark_2:test_VoteToCurse_OldSubject_OldVoter_NoCurse_gas() (gas: 98373) -RMN_voteToCurse_Benchmark_3:test_VoteToCurse_OldSubject_NewVoter_YesCurse_gas() (gas: 145784) -RateLimiter_constructor:test_Constructor_Success() (gas: 19734) -RateLimiter_consume:test_AggregateValueMaxCapacityExceeded_Revert() (gas: 16042) -RateLimiter_consume:test_AggregateValueRateLimitReached_Revert() (gas: 22390) -RateLimiter_consume:test_ConsumeAggregateValue_Success() (gas: 31518) -RateLimiter_consume:test_ConsumeTokens_Success() (gas: 20381) -RateLimiter_consume:test_ConsumeUnlimited_Success() (gas: 40687) -RateLimiter_consume:test_ConsumingMoreThanUint128_Revert() (gas: 15822) -RateLimiter_consume:test_RateLimitReachedOverConsecutiveBlocks_Revert() (gas: 25798) -RateLimiter_consume:test_Refill_Success() (gas: 37444) -RateLimiter_consume:test_TokenMaxCapacityExceeded_Revert() (gas: 18388) -RateLimiter_consume:test_TokenRateLimitReached_Revert() (gas: 24886) -RateLimiter_currentTokenBucketState:test_CurrentTokenBucketState_Success() (gas: 38944) -RateLimiter_currentTokenBucketState:test_Refill_Success() (gas: 46849) -RateLimiter_setTokenBucketConfig:test_SetRateLimiterConfig_Success() (gas: 38506) -RegistryModuleOwnerCustom_constructor:test_constructor_Revert() (gas: 36033) -RegistryModuleOwnerCustom_registerAdminViaGetCCIPAdmin:test_registerAdminViaGetCCIPAdmin_Revert() (gas: 19739) -RegistryModuleOwnerCustom_registerAdminViaGetCCIPAdmin:test_registerAdminViaGetCCIPAdmin_Success() (gas: 130086) -RegistryModuleOwnerCustom_registerAdminViaOwner:test_registerAdminViaOwner_Revert() (gas: 19559) -RegistryModuleOwnerCustom_registerAdminViaOwner:test_registerAdminViaOwner_Success() (gas: 129905) -Router_applyRampUpdates:test_OffRampMismatch_Revert() (gas: 89366) -Router_applyRampUpdates:test_OffRampUpdatesWithRouting() (gas: 10662612) -Router_applyRampUpdates:test_OnRampDisable() (gas: 56007) -Router_applyRampUpdates:test_OnlyOwner_Revert() (gas: 12356) -Router_ccipSend:test_CCIPSendLinkFeeNoTokenSuccess_gas() (gas: 114599) -Router_ccipSend:test_CCIPSendLinkFeeOneTokenSuccess_gas() (gas: 202430) -Router_ccipSend:test_CCIPSendNativeFeeNoTokenSuccess_gas() (gas: 126968) -Router_ccipSend:test_CCIPSendNativeFeeOneTokenSuccess_gas() (gas: 214801) -Router_ccipSend:test_FeeTokenAmountTooLow_Revert() (gas: 64520) -Router_ccipSend:test_InvalidMsgValue() (gas: 32155) -Router_ccipSend:test_NativeFeeTokenInsufficientValue() (gas: 67177) -Router_ccipSend:test_NativeFeeTokenOverpay_Success() (gas: 170385) -Router_ccipSend:test_NativeFeeTokenZeroValue() (gas: 54279) -Router_ccipSend:test_NativeFeeToken_Success() (gas: 168901) -Router_ccipSend:test_NonLinkFeeToken_Success() (gas: 239227) -Router_ccipSend:test_UnsupportedDestinationChain_Revert() (gas: 24854) -Router_ccipSend:test_WhenNotHealthy_Revert() (gas: 44811) -Router_ccipSend:test_WrappedNativeFeeToken_Success() (gas: 171189) -Router_ccipSend:test_ZeroFeeAndGasPrice_Success() (gas: 241701) -Router_constructor:test_Constructor_Success() (gas: 13128) -Router_getArmProxy:test_getArmProxy() (gas: 10573) -Router_getFee:test_GetFeeSupportedChain_Success() (gas: 44673) -Router_getFee:test_UnsupportedDestinationChain_Revert() (gas: 17192) -Router_getSupportedTokens:test_GetSupportedTokens_Revert() (gas: 10532) -Router_recoverTokens:test_RecoverTokensInvalidRecipient_Revert() (gas: 11334) -Router_recoverTokens:test_RecoverTokensNoFunds_Revert() (gas: 20267) -Router_recoverTokens:test_RecoverTokensNonOwner_Revert() (gas: 11171) -Router_recoverTokens:test_RecoverTokensValueReceiver_Revert() (gas: 358049) -Router_recoverTokens:test_RecoverTokens_Success() (gas: 52480) -Router_routeMessage:test_AutoExec_Success() (gas: 42816) -Router_routeMessage:test_ExecutionEvent_Success() (gas: 158520) -Router_routeMessage:test_ManualExec_Success() (gas: 35546) -Router_routeMessage:test_OnlyOffRamp_Revert() (gas: 25224) -Router_routeMessage:test_WhenNotHealthy_Revert() (gas: 44799) -Router_setWrappedNative:test_OnlyOwner_Revert() (gas: 10998) -SelfFundedPingPong_ccipReceive:test_FundingIfNotANop_Revert() (gas: 55660) -SelfFundedPingPong_ccipReceive:test_Funding_Success() (gas: 421258) -SelfFundedPingPong_setCountIncrBeforeFunding:test_setCountIncrBeforeFunding() (gas: 20181) -TokenAdminRegistry_acceptAdminRole:test_acceptAdminRole_OnlyPendingAdministrator_Revert() (gas: 51163) -TokenAdminRegistry_acceptAdminRole:test_acceptAdminRole_Success() (gas: 44004) -TokenAdminRegistry_addRegistryModule:test_addRegistryModule_OnlyOwner_Revert() (gas: 12653) -TokenAdminRegistry_addRegistryModule:test_addRegistryModule_Success() (gas: 67056) -TokenAdminRegistry_getAllConfiguredTokens:test_getAllConfiguredTokens_outOfBounds_Success() (gas: 11362) -TokenAdminRegistry_getPool:test_getPool_Success() (gas: 17602) -TokenAdminRegistry_getPools:test_getPools_Success() (gas: 39962) -TokenAdminRegistry_isAdministrator:test_isAdministrator_Success() (gas: 106006) -TokenAdminRegistry_proposeAdministrator:test_proposeAdministrator_AlreadyRegistered_Revert() (gas: 104346) -TokenAdminRegistry_proposeAdministrator:test_proposeAdministrator_OnlyRegistryModule_Revert() (gas: 15610) -TokenAdminRegistry_proposeAdministrator:test_proposeAdministrator_ZeroAddress_Revert() (gas: 15155) -TokenAdminRegistry_proposeAdministrator:test_proposeAdministrator_module_Success() (gas: 112962) -TokenAdminRegistry_proposeAdministrator:test_proposeAdministrator_owner_Success() (gas: 107965) -TokenAdminRegistry_proposeAdministrator:test_proposeAdministrator_reRegisterWhileUnclaimed_Success() (gas: 116067) -TokenAdminRegistry_removeRegistryModule:test_removeRegistryModule_OnlyOwner_Revert() (gas: 12609) -TokenAdminRegistry_removeRegistryModule:test_removeRegistryModule_Success() (gas: 54524) -TokenAdminRegistry_setPool:test_setPool_InvalidTokenPoolToken_Revert() (gas: 19316) -TokenAdminRegistry_setPool:test_setPool_OnlyAdministrator_Revert() (gas: 18137) -TokenAdminRegistry_setPool:test_setPool_Success() (gas: 36135) -TokenAdminRegistry_setPool:test_setPool_ZeroAddressRemovesPool_Success() (gas: 30842) -TokenAdminRegistry_transferAdminRole:test_transferAdminRole_OnlyAdministrator_Revert() (gas: 18103) -TokenAdminRegistry_transferAdminRole:test_transferAdminRole_Success() (gas: 49438) -TokenPoolAndProxy:test_lockOrBurn_burnMint_Success() (gas: 5586499) -TokenPoolAndProxy:test_lockOrBurn_burnWithFromMint_Success() (gas: 5618769) -TokenPoolAndProxy:test_lockOrBurn_lockRelease_Success() (gas: 5793246) -TokenPoolAndProxy:test_setPreviousPool_Success() (gas: 3070731) -TokenPoolAndProxyMigration:test_tokenPoolMigration_Success_1_2() (gas: 6434801) -TokenPoolAndProxyMigration:test_tokenPoolMigration_Success_1_4() (gas: 6634934) -TokenPoolWithAllowList_applyAllowListUpdates:test_AllowListNotEnabled_Revert() (gas: 1979943) -TokenPoolWithAllowList_applyAllowListUpdates:test_OnlyOwner_Revert() (gas: 12113) -TokenPoolWithAllowList_applyAllowListUpdates:test_SetAllowListSkipsZero_Success() (gas: 23476) -TokenPoolWithAllowList_applyAllowListUpdates:test_SetAllowList_Success() (gas: 177848) -TokenPoolWithAllowList_getAllowList:test_GetAllowList_Success() (gas: 23764) -TokenPoolWithAllowList_getAllowListEnabled:test_GetAllowListEnabled_Success() (gas: 8375) -TokenPoolWithAllowList_setRouter:test_SetRouter_Success() (gas: 24867) -TokenPool_applyChainUpdates:test_applyChainUpdates_DisabledNonZeroRateLimit_Revert() (gas: 271569) -TokenPool_applyChainUpdates:test_applyChainUpdates_InvalidRateLimitRate_Revert() (gas: 542359) -TokenPool_applyChainUpdates:test_applyChainUpdates_NonExistentChain_Revert() (gas: 18449) -TokenPool_applyChainUpdates:test_applyChainUpdates_OnlyCallableByOwner_Revert() (gas: 11469) -TokenPool_applyChainUpdates:test_applyChainUpdates_Success() (gas: 479160) -TokenPool_applyChainUpdates:test_applyChainUpdates_ZeroAddressNotAllowed_Revert() (gas: 157422) -TokenPool_constructor:test_ZeroAddressNotAllowed_Revert() (gas: 70484) -TokenPool_constructor:test_immutableFields_Success() (gas: 20586) -TokenPool_getRemotePool:test_getRemotePool_Success() (gas: 274181) -TokenPool_onlyOffRamp:test_CallerIsNotARampOnRouter_Revert() (gas: 277296) -TokenPool_onlyOffRamp:test_ChainNotAllowed_Revert() (gas: 290028) -TokenPool_onlyOffRamp:test_onlyOffRamp_Success() (gas: 350050) -TokenPool_onlyOnRamp:test_CallerIsNotARampOnRouter_Revert() (gas: 277036) -TokenPool_onlyOnRamp:test_ChainNotAllowed_Revert() (gas: 254065) -TokenPool_onlyOnRamp:test_onlyOnRamp_Success() (gas: 305106) -TokenPool_setChainRateLimiterConfig:test_NonExistentChain_Revert() (gas: 17187) -TokenPool_setChainRateLimiterConfig:test_OnlyOwnerOrRateLimitAdmin_Revert() (gas: 15227) -TokenPool_setRemotePool:test_setRemotePool_NonExistentChain_Reverts() (gas: 15671) -TokenPool_setRemotePool:test_setRemotePool_OnlyOwner_Reverts() (gas: 13219) -TokenPool_setRemotePool:test_setRemotePool_Success() (gas: 282125) -TokenProxy_ccipSend:test_CcipSendGasShouldBeZero_Revert() (gas: 17226) -TokenProxy_ccipSend:test_CcipSendInsufficientAllowance_Revert() (gas: 134605) -TokenProxy_ccipSend:test_CcipSendInvalidToken_Revert() (gas: 16000) -TokenProxy_ccipSend:test_CcipSendNative_Success() (gas: 244013) -TokenProxy_ccipSend:test_CcipSendNoDataAllowed_Revert() (gas: 16384) -TokenProxy_ccipSend:test_CcipSend_Success() (gas: 262651) -TokenProxy_constructor:test_Constructor() (gas: 13836) -TokenProxy_getFee:test_GetFeeGasShouldBeZero_Revert() (gas: 16899) -TokenProxy_getFee:test_GetFeeInvalidToken_Revert() (gas: 12706) -TokenProxy_getFee:test_GetFeeNoDataAllowed_Revert() (gas: 15885) -TokenProxy_getFee:test_GetFee_Success() (gas: 85240) -USDCTokenPool__validateMessage:test_ValidateInvalidMessage_Revert() (gas: 25704) -USDCTokenPool_lockOrBurn:test_CallerIsNotARampOnRouter_Revert() (gas: 35481) -USDCTokenPool_lockOrBurn:test_LockOrBurnWithAllowList_Revert() (gas: 30235) -USDCTokenPool_lockOrBurn:test_LockOrBurn_Success() (gas: 133508) -USDCTokenPool_lockOrBurn:test_UnknownDomain_Revert() (gas: 478182) -USDCTokenPool_releaseOrMint:test_ReleaseOrMintRealTx_Success() (gas: 268672) -USDCTokenPool_releaseOrMint:test_TokenMaxCapacityExceeded_Revert() (gas: 50952) -USDCTokenPool_releaseOrMint:test_UnlockingUSDCFailed_Revert() (gas: 98987) -USDCTokenPool_setDomains:test_InvalidDomain_Revert() (gas: 66393) -USDCTokenPool_setDomains:test_OnlyOwner_Revert() (gas: 11363) -USDCTokenPool_supportsInterface:test_SupportsInterface_Success() (gas: 10041) +PingPong_ccipReceive:test_CcipReceive_Success() (gas: 175023) +PingPong_plumbing:test_OutOfOrderExecution_Success() (gas: 21848) +PingPong_plumbing:test_Pausing_Success() (gas: 19077) +PingPong_startPingPong:test_StartPingPong_With_OOO_Success() (gas: 197173) +PingPong_startPingPong:test_StartPingPong_With_Sequenced_Ordered_Success() (gas: 215989) +RMNHome__validateStaticAndDynamicConfig:test_validateStaticAndDynamicConfig_DuplicateOffchainPublicKey_reverts() (gas: 27051) +RMNHome__validateStaticAndDynamicConfig:test_validateStaticAndDynamicConfig_DuplicatePeerId_reverts() (gas: 26895) +RMNHome__validateStaticAndDynamicConfig:test_validateStaticAndDynamicConfig_DuplicateSourceChain_reverts() (gas: 29030) +RMNHome__validateStaticAndDynamicConfig:test_validateStaticAndDynamicConfig_MinObserversTooHigh_reverts() (gas: 29826) +RMNHome__validateStaticAndDynamicConfig:test_validateStaticAndDynamicConfig_OutOfBoundsNodesLength_reverts() (gas: 370101) +RMNHome__validateStaticAndDynamicConfig:test_validateStaticAndDynamicConfig_OutOfBoundsObserverNodeIndex_reverts() (gas: 29288) +RMNHome_getConfigDigests:test_getConfigDigests_success() (gas: 1137234) +RMNHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_ConfigDigestMismatch_reverts() (gas: 27380) +RMNHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_NoOpStateTransitionNotAllowed_reverts() (gas: 11379) +RMNHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_OnlyOwner_reverts() (gas: 12167) +RMNHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_success() (gas: 1151630) +RMNHome_revokeCandidate:test_revokeCandidate_ConfigDigestMismatch_reverts() (gas: 20960) +RMNHome_revokeCandidate:test_revokeCandidate_OnlyOwner_reverts() (gas: 11983) +RMNHome_revokeCandidate:test_revokeCandidate_RevokingZeroDigestNotAllowed_reverts() (gas: 11190) +RMNHome_revokeCandidate:test_revokeCandidate_success() (gas: 34855) +RMNHome_setCandidate:test_setCandidate_ConfigDigestMismatch_reverts() (gas: 657738) +RMNHome_setCandidate:test_setCandidate_OnlyOwner_reverts() (gas: 19560) +RMNHome_setCandidate:test_setCandidate_success() (gas: 632748) +RMNHome_setDynamicConfig:test_setDynamicConfig_DigestNotFound_reverts() (gas: 35639) +RMNHome_setDynamicConfig:test_setDynamicConfig_MinObserversTooHigh_reverts() (gas: 21659) +RMNHome_setDynamicConfig:test_setDynamicConfig_OnlyOwner_reverts() (gas: 16974) +RMNHome_setDynamicConfig:test_setDynamicConfig_success() (gas: 128190) +RMNRemote_constructor:test_constructor_success() (gas: 8853) +RMNRemote_constructor:test_constructor_zeroChainSelector_reverts() (gas: 61072) +RMNRemote_curse:test_curse_AlreadyCursed_duplicateSubject_reverts() (gas: 156801) +RMNRemote_curse:test_curse_calledByNonOwner_reverts() (gas: 20544) +RMNRemote_curse:test_curse_success() (gas: 157167) +RMNRemote_global_and_legacy_curses:test_global_and_legacy_curses_success() (gas: 141492) +RMNRemote_setConfig:test_setConfig_addSigner_removeSigner_success() (gas: 1097399) +RMNRemote_setConfig:test_setConfig_duplicateOnChainPublicKey_reverts() (gas: 339136) +RMNRemote_setConfig:test_setConfig_invalidSignerOrder_reverts() (gas: 91696) +RMNRemote_setConfig:test_setConfig_minSignersIs0_success() (gas: 773860) +RMNRemote_setConfig:test_setConfig_minSignersTooHigh_reverts() (gas: 64566) +RMNRemote_uncurse:test_uncurse_NotCursed_duplicatedUncurseSubject_reverts() (gas: 53942) +RMNRemote_uncurse:test_uncurse_calledByNonOwner_reverts() (gas: 20525) +RMNRemote_uncurse:test_uncurse_success() (gas: 44264) +RMNRemote_verify_withConfigNotSet:test_verify_reverts() (gas: 14954) +RMNRemote_verify_withConfigSet:test_verify_InvalidSignature_reverts() (gas: 88745) +RMNRemote_verify_withConfigSet:test_verify_OutOfOrderSignatures_duplicateSignature_reverts() (gas: 86340) +RMNRemote_verify_withConfigSet:test_verify_OutOfOrderSignatures_not_sorted_reverts() (gas: 93570) +RMNRemote_verify_withConfigSet:test_verify_ThresholdNotMet_reverts() (gas: 177181) +RMNRemote_verify_withConfigSet:test_verify_UnexpectedSigner_reverts() (gas: 429818) +RMNRemote_verify_withConfigSet:test_verify_minSignersIsZero_success() (gas: 230707) +RMNRemote_verify_withConfigSet:test_verify_success() (gas: 77919) +RMN_constructor:test_Constructor_Success() (gas: 63037) +RMN_getRecordedCurseRelatedOps:test_OpsPostDeployment() (gas: 24609) +RMN_lazyVoteToCurseUpdate_Benchmark:test_VoteToCurseLazilyRetain3VotersUponConfigChange_gas() (gas: 159340) +RMN_ownerUnbless:test_Unbless_Success() (gas: 103665) +RMN_ownerUnvoteToCurse:test_CanBlessAndCurseAfterGlobalCurseIsLifted() (gas: 527240) +RMN_ownerUnvoteToCurse:test_IsIdempotent() (gas: 461028) +RMN_ownerUnvoteToCurse:test_NonOwner_Revert() (gas: 25696) +RMN_ownerUnvoteToCurse:test_OwnerUnvoteToCurseSuccess_gas() (gas: 402269) +RMN_ownerUnvoteToCurse:test_UnknownVoter_Revert() (gas: 37341) +RMN_ownerUnvoteToCurse_Benchmark:test_OwnerUnvoteToCurse_1Voter_LiftsCurse_gas() (gas: 310729) +RMN_permaBlessing:test_PermaBlessing() (gas: 234032) +RMN_setConfig:test_BlessVoterIsZeroAddress_Revert() (gas: 19944) +RMN_setConfig:test_EitherThresholdIsZero_Revert() (gas: 29093) +RMN_setConfig:test_NonOwner_Revert() (gas: 19180) +RMN_setConfig:test_RepeatedAddress_Revert() (gas: 24182) +RMN_setConfig:test_SetConfigSuccess_gas() (gas: 121383) +RMN_setConfig:test_TotalWeightsSmallerThanEachThreshold_Revert() (gas: 42230) +RMN_setConfig:test_VoteToBlessByEjectedVoter_Revert() (gas: 150092) +RMN_setConfig:test_VotersLengthIsZero_Revert() (gas: 13777) +RMN_setConfig:test_WeightIsZeroAddress_Revert() (gas: 20193) +RMN_setConfig_Benchmark_1:test_SetConfig_7Voters_gas() (gas: 699447) +RMN_setConfig_Benchmark_2:test_ResetConfig_7Voters_gas() (gas: 262912) +RMN_unvoteToCurse:test_InvalidCursesHash() (gas: 29467) +RMN_unvoteToCurse:test_OwnerSkips() (gas: 38039) +RMN_unvoteToCurse:test_OwnerSucceeds() (gas: 69773) +RMN_unvoteToCurse:test_UnauthorizedVoter() (gas: 59241) +RMN_unvoteToCurse:test_ValidCursesHash() (gas: 66142) +RMN_unvoteToCurse:test_VotersCantLiftCurseButOwnerCan() (gas: 729679) +RMN_voteToBless:test_Curse_Revert() (gas: 496801) +RMN_voteToBless:test_IsAlreadyBlessed_Revert() (gas: 147850) +RMN_voteToBless:test_RootSuccess() (gas: 745652) +RMN_voteToBless:test_SenderAlreadyVoted_Revert() (gas: 123496) +RMN_voteToBless:test_UnauthorizedVoter_Revert() (gas: 19508) +RMN_voteToBless_Benchmark:test_1RootSuccess_gas() (gas: 49435) +RMN_voteToBless_Benchmark:test_3RootSuccess_gas() (gas: 110271) +RMN_voteToBless_Benchmark:test_5RootSuccess_gas() (gas: 171045) +RMN_voteToBless_Blessed_Benchmark:test_1RootSuccessBecameBlessed_gas() (gas: 34790) +RMN_voteToBless_Blessed_Benchmark:test_1RootSuccess_gas() (gas: 32338) +RMN_voteToBless_Blessed_Benchmark:test_3RootSuccess_gas() (gas: 93196) +RMN_voteToBless_Blessed_Benchmark:test_5RootSuccess_gas() (gas: 153948) +RMN_voteToCurse:test_CurseOnlyWhenThresholdReached_Success() (gas: 1748779) +RMN_voteToCurse:test_EmptySubjects_Revert() (gas: 15996) +RMN_voteToCurse:test_EvenIfAlreadyCursed_Success() (gas: 564086) +RMN_voteToCurse:test_OwnerCanCurseAndUncurse() (gas: 471086) +RMN_voteToCurse:test_RepeatedSubject_Revert() (gas: 151480) +RMN_voteToCurse:test_ReusedCurseId_Revert() (gas: 155411) +RMN_voteToCurse:test_UnauthorizedVoter_Revert() (gas: 14537) +RMN_voteToCurse:test_VoteToCurse_NoCurse_Success() (gas: 203894) +RMN_voteToCurse:test_VoteToCurse_YesCurse_Success() (gas: 495649) +RMN_voteToCurse_2:test_VotesAreDroppedIfSubjectIsNotCursedDuringConfigChange() (gas: 417003) +RMN_voteToCurse_2:test_VotesAreRetainedIfSubjectIsCursedDuringConfigChange() (gas: 1339323) +RMN_voteToCurse_Benchmark_1:test_VoteToCurse_NewSubject_NewVoter_NoCurse_gas() (gas: 146898) +RMN_voteToCurse_Benchmark_1:test_VoteToCurse_NewSubject_NewVoter_YesCurse_gas() (gas: 171152) +RMN_voteToCurse_Benchmark_2:test_VoteToCurse_OldSubject_NewVoter_NoCurse_gas() (gas: 126446) +RMN_voteToCurse_Benchmark_2:test_VoteToCurse_OldSubject_OldVoter_NoCurse_gas() (gas: 102691) +RMN_voteToCurse_Benchmark_3:test_VoteToCurse_OldSubject_NewVoter_YesCurse_gas() (gas: 151187) +RateLimiter_constructor:test_Constructor_Success() (gas: 22964) +RateLimiter_consume:test_AggregateValueMaxCapacityExceeded_Revert() (gas: 19839) +RateLimiter_consume:test_AggregateValueRateLimitReached_Revert() (gas: 28311) +RateLimiter_consume:test_ConsumeAggregateValue_Success() (gas: 39405) +RateLimiter_consume:test_ConsumeTokens_Success() (gas: 21919) +RateLimiter_consume:test_ConsumeUnlimited_Success() (gas: 57402) +RateLimiter_consume:test_ConsumingMoreThanUint128_Revert() (gas: 19531) +RateLimiter_consume:test_RateLimitReachedOverConsecutiveBlocks_Revert() (gas: 33020) +RateLimiter_consume:test_Refill_Success() (gas: 48170) +RateLimiter_consume:test_TokenMaxCapacityExceeded_Revert() (gas: 22450) +RateLimiter_consume:test_TokenRateLimitReached_Revert() (gas: 31057) +RateLimiter_currentTokenBucketState:test_CurrentTokenBucketState_Success() (gas: 49681) +RateLimiter_currentTokenBucketState:test_Refill_Success() (gas: 63750) +RateLimiter_setTokenBucketConfig:test_SetRateLimiterConfig_Success() (gas: 48188) +RegistryModuleOwnerCustom_constructor:test_constructor_Revert() (gas: 36711) +RegistryModuleOwnerCustom_registerAdminViaGetCCIPAdmin:test_registerAdminViaGetCCIPAdmin_Revert() (gas: 22517) +RegistryModuleOwnerCustom_registerAdminViaGetCCIPAdmin:test_registerAdminViaGetCCIPAdmin_Success() (gas: 137341) +RegistryModuleOwnerCustom_registerAdminViaOwner:test_registerAdminViaOwner_Revert() (gas: 22359) +RegistryModuleOwnerCustom_registerAdminViaOwner:test_registerAdminViaOwner_Success() (gas: 137182) +Router_applyRampUpdates:test_OffRampMismatch_Revert() (gas: 93496) +Router_applyRampUpdates:test_OffRampUpdatesWithRouting() (gas: 12348645) +Router_applyRampUpdates:test_OnRampDisable() (gas: 65150) +Router_applyRampUpdates:test_OnlyOwner_Revert() (gas: 13275) +Router_ccipSend:test_CCIPSendLinkFeeNoTokenSuccess_gas() (gas: 133309) +Router_ccipSend:test_CCIPSendLinkFeeOneTokenSuccess_gas() (gas: 240131) +Router_ccipSend:test_CCIPSendNativeFeeNoTokenSuccess_gas() (gas: 147975) +Router_ccipSend:test_CCIPSendNativeFeeOneTokenSuccess_gas() (gas: 254777) +Router_ccipSend:test_FeeTokenAmountTooLow_Revert() (gas: 78020) +Router_ccipSend:test_InvalidMsgValue() (gas: 35871) +Router_ccipSend:test_NativeFeeTokenInsufficientValue() (gas: 80832) +Router_ccipSend:test_NativeFeeTokenOverpay_Success() (gas: 203317) +Router_ccipSend:test_NativeFeeTokenZeroValue() (gas: 65179) +Router_ccipSend:test_NativeFeeToken_Success() (gas: 201073) +Router_ccipSend:test_NonLinkFeeToken_Success() (gas: 266824) +Router_ccipSend:test_UnsupportedDestinationChain_Revert() (gas: 28660) +Router_ccipSend:test_WhenNotHealthy_Revert() (gas: 48532) +Router_ccipSend:test_WrappedNativeFeeToken_Success() (gas: 205616) +Router_ccipSend:test_ZeroFeeAndGasPrice_Success() (gas: 282163) +Router_constructor:test_Constructor_Success() (gas: 14515) +Router_getArmProxy:test_getArmProxy() (gas: 11328) +Router_getFee:test_GetFeeSupportedChain_Success() (gas: 55552) +Router_getFee:test_UnsupportedDestinationChain_Revert() (gas: 20945) +Router_getSupportedTokens:test_GetSupportedTokens_Revert() (gas: 11166) +Router_recoverTokens:test_RecoverTokensInvalidRecipient_Revert() (gas: 12807) +Router_recoverTokens:test_RecoverTokensNoFunds_Revert() (gas: 21382) +Router_recoverTokens:test_RecoverTokensNonOwner_Revert() (gas: 12776) +Router_recoverTokens:test_RecoverTokensValueReceiver_Revert() (gas: 603372) +Router_recoverTokens:test_RecoverTokens_Success() (gas: 59811) +Router_routeMessage:test_AutoExec_Success() (gas: 52571) +Router_routeMessage:test_ExecutionEvent_Success() (gas: 183071) +Router_routeMessage:test_ManualExec_Success() (gas: 41748) +Router_routeMessage:test_OnlyOffRamp_Revert() (gas: 28290) +Router_routeMessage:test_WhenNotHealthy_Revert() (gas: 47722) +Router_setWrappedNative:test_OnlyOwner_Revert() (gas: 11766) +SelfFundedPingPong_ccipReceive:test_FundingIfNotANop_Revert() (gas: 62294) +SelfFundedPingPong_ccipReceive:test_Funding_Success() (gas: 560135) +SelfFundedPingPong_setCountIncrBeforeFunding:test_setCountIncrBeforeFunding() (gas: 22195) +TokenAdminRegistry_acceptAdminRole:test_acceptAdminRole_OnlyPendingAdministrator_Revert() (gas: 58611) +TokenAdminRegistry_acceptAdminRole:test_acceptAdminRole_Success() (gas: 50532) +TokenAdminRegistry_addRegistryModule:test_addRegistryModule_OnlyOwner_Revert() (gas: 14159) +TokenAdminRegistry_addRegistryModule:test_addRegistryModule_Success() (gas: 70293) +TokenAdminRegistry_getAllConfiguredTokens:test_getAllConfiguredTokens_outOfBounds_Success() (gas: 12680) +TokenAdminRegistry_getPool:test_getPool_Success() (gas: 18649) +TokenAdminRegistry_getPools:test_getPools_Success() (gas: 48161) +TokenAdminRegistry_isAdministrator:test_isAdministrator_Success() (gas: 113861) +TokenAdminRegistry_proposeAdministrator:test_proposeAdministrator_AlreadyRegistered_Revert() (gas: 109470) +TokenAdminRegistry_proposeAdministrator:test_proposeAdministrator_OnlyRegistryModule_Revert() (gas: 17535) +TokenAdminRegistry_proposeAdministrator:test_proposeAdministrator_ZeroAddress_Revert() (gas: 16768) +TokenAdminRegistry_proposeAdministrator:test_proposeAdministrator_module_Success() (gas: 123148) +TokenAdminRegistry_proposeAdministrator:test_proposeAdministrator_owner_Success() (gas: 114227) +TokenAdminRegistry_proposeAdministrator:test_proposeAdministrator_reRegisterWhileUnclaimed_Success() (gas: 123889) +TokenAdminRegistry_removeRegistryModule:test_removeRegistryModule_OnlyOwner_Revert() (gas: 14115) +TokenAdminRegistry_removeRegistryModule:test_removeRegistryModule_Success() (gas: 58226) +TokenAdminRegistry_setPool:test_setPool_InvalidTokenPoolToken_Revert() (gas: 21992) +TokenAdminRegistry_setPool:test_setPool_OnlyAdministrator_Revert() (gas: 20133) +TokenAdminRegistry_setPool:test_setPool_Success() (gas: 41047) +TokenAdminRegistry_setPool:test_setPool_ZeroAddressRemovesPool_Success() (gas: 35795) +TokenAdminRegistry_transferAdminRole:test_transferAdminRole_OnlyAdministrator_Revert() (gas: 20198) +TokenAdminRegistry_transferAdminRole:test_transferAdminRole_Success() (gas: 54721) +TokenPoolAndProxy:test_lockOrBurn_burnMint_Success() (gas: 8984851) +TokenPoolAndProxy:test_lockOrBurn_burnWithFromMint_Success() (gas: 9018204) +TokenPoolAndProxy:test_lockOrBurn_lockRelease_Success() (gas: 9314221) +TokenPoolAndProxy:test_setPreviousPool_Success() (gas: 5168919) +TokenPoolAndProxyMigration:test_tokenPoolMigration_Success_1_2() (gas: 9975724) +TokenPoolAndProxyMigration:test_tokenPoolMigration_Success_1_4() (gas: 10174033) +TokenPoolFactoryTests:test_TokenPoolFactory_Constructor_Revert() (gas: 1048467) +TokenPoolFactoryTests:test_createTokenPoolLockRelease_ExistingToken_predict_Success() (gas: 11782140) +TokenPoolFactoryTests:test_createTokenPool_ExistingRemoteToken_AndPredictPool_Success() (gas: 12423735) +TokenPoolFactoryTests:test_createTokenPool_WithNoExistingRemoteContracts_predict_Success() (gas: 12765036) +TokenPoolFactoryTests:test_createTokenPool_WithNoExistingTokenOnRemoteChain_Success() (gas: 5841282) +TokenPoolFactoryTests:test_createTokenPool_WithRemoteTokenAndRemotePool_Success() (gas: 5981454) +TokenPoolWithAllowList_applyAllowListUpdates:test_AllowListNotEnabled_Revert() (gas: 3418174) +TokenPoolWithAllowList_applyAllowListUpdates:test_OnlyOwner_Revert() (gas: 13392) +TokenPoolWithAllowList_applyAllowListUpdates:test_SetAllowListSkipsZero_Success() (gas: 26742) +TokenPoolWithAllowList_applyAllowListUpdates:test_SetAllowList_Success() (gas: 189536) +TokenPoolWithAllowList_getAllowList:test_GetAllowList_Success() (gas: 25742) +TokenPoolWithAllowList_getAllowListEnabled:test_GetAllowListEnabled_Success() (gas: 8788) +TokenPoolWithAllowList_setRouter:test_SetRouter_Success() (gas: 28100) +TokenPool_applyChainUpdates:test_applyChainUpdates_DisabledNonZeroRateLimit_Revert() (gas: 282666) +TokenPool_applyChainUpdates:test_applyChainUpdates_InvalidRateLimitRate_Revert() (gas: 580050) +TokenPool_applyChainUpdates:test_applyChainUpdates_NonExistentChain_Revert() (gas: 22750) +TokenPool_applyChainUpdates:test_applyChainUpdates_OnlyCallableByOwner_Revert() (gas: 12333) +TokenPool_applyChainUpdates:test_applyChainUpdates_Success() (gas: 534354) +TokenPool_applyChainUpdates:test_applyChainUpdates_ZeroAddressNotAllowed_Revert() (gas: 165350) +TokenPool_constructor:test_ZeroAddressNotAllowed_Revert() (gas: 74247) +TokenPool_constructor:test_immutableFields_Success() (gas: 23251) +TokenPool_getRemotePool:test_getRemotePool_Success() (gas: 285082) +TokenPool_onlyOffRamp:test_CallerIsNotARampOnRouter_Revert() (gas: 287212) +TokenPool_onlyOffRamp:test_ChainNotAllowed_Revert() (gas: 305616) +TokenPool_onlyOffRamp:test_onlyOffRamp_Success() (gas: 361142) +TokenPool_onlyOnRamp:test_CallerIsNotARampOnRouter_Revert() (gas: 286591) +TokenPool_onlyOnRamp:test_ChainNotAllowed_Revert() (gas: 269389) +TokenPool_onlyOnRamp:test_onlyOnRamp_Success() (gas: 315814) +TokenPool_setChainRateLimiterConfig:test_NonExistentChain_Revert() (gas: 19578) +TokenPool_setChainRateLimiterConfig:test_OnlyOwnerOrRateLimitAdmin_Revert() (gas: 17926) +TokenPool_setRemotePool:test_setRemotePool_NonExistentChain_Reverts() (gas: 17612) +TokenPool_setRemotePool:test_setRemotePool_OnlyOwner_Reverts() (gas: 15337) +TokenPool_setRemotePool:test_setRemotePool_Success() (gas: 293732) +TokenProxy_ccipSend:test_CcipSendGasShouldBeZero_Revert() (gas: 20582) +TokenProxy_ccipSend:test_CcipSendInsufficientAllowance_Revert() (gas: 158368) +TokenProxy_ccipSend:test_CcipSendInvalidToken_Revert() (gas: 18599) +TokenProxy_ccipSend:test_CcipSendNative_Success() (gas: 288755) +TokenProxy_ccipSend:test_CcipSendNoDataAllowed_Revert() (gas: 19019) +TokenProxy_ccipSend:test_CcipSend_Success() (gas: 310931) +TokenProxy_constructor:test_Constructor() (gas: 15309) +TokenProxy_getFee:test_GetFeeGasShouldBeZero_Revert() (gas: 20176) +TokenProxy_getFee:test_GetFeeInvalidToken_Revert() (gas: 14693) +TokenProxy_getFee:test_GetFeeNoDataAllowed_Revert() (gas: 18513) +TokenProxy_getFee:test_GetFee_Success() (gas: 117905) +USDCTokenPool__validateMessage:test_ValidateInvalidMessage_Revert() (gas: 37856) +USDCTokenPool_lockOrBurn:test_CallerIsNotARampOnRouter_Revert() (gas: 40114) +USDCTokenPool_lockOrBurn:test_LockOrBurnWithAllowList_Revert() (gas: 34440) +USDCTokenPool_lockOrBurn:test_LockOrBurn_Success() (gas: 147394) +USDCTokenPool_lockOrBurn:test_UnknownDomain_Revert() (gas: 546719) +USDCTokenPool_releaseOrMint:test_ReleaseOrMintRealTx_Success() (gas: 326433) +USDCTokenPool_releaseOrMint:test_TokenMaxCapacityExceeded_Revert() (gas: 59047) +USDCTokenPool_releaseOrMint:test_UnlockingUSDCFailed_Revert() (gas: 112325) +USDCTokenPool_setDomains:test_InvalidDomain_Revert() (gas: 74539) +USDCTokenPool_setDomains:test_OnlyOwner_Revert() (gas: 12298) +USDCTokenPool_supportsInterface:test_SupportsInterface_Success() (gas: 11479) \ No newline at end of file From 7dc40dfe0b1ea2ec8234a0c66cd956af5290c607 Mon Sep 17 00:00:00 2001 From: Josh Date: Thu, 10 Oct 2024 12:14:22 -0400 Subject: [PATCH 41/48] remove console log and silence compiler warning --- contracts/gas-snapshots/ccip.gas-snapshot | 2 +- .../v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot index 73f6d21e91..63530ce332 100644 --- a/contracts/gas-snapshots/ccip.gas-snapshot +++ b/contracts/gas-snapshots/ccip.gas-snapshot @@ -1015,7 +1015,7 @@ TokenPoolAndProxy:test_setPreviousPool_Success() (gas: 5168919) TokenPoolAndProxyMigration:test_tokenPoolMigration_Success_1_2() (gas: 9975724) TokenPoolAndProxyMigration:test_tokenPoolMigration_Success_1_4() (gas: 10174033) TokenPoolFactoryTests:test_TokenPoolFactory_Constructor_Revert() (gas: 1048467) -TokenPoolFactoryTests:test_createTokenPoolLockRelease_ExistingToken_predict_Success() (gas: 11782140) +TokenPoolFactoryTests:test_createTokenPoolLockRelease_ExistingToken_predict_Success() (gas: 11781716) TokenPoolFactoryTests:test_createTokenPool_ExistingRemoteToken_AndPredictPool_Success() (gas: 12423735) TokenPoolFactoryTests:test_createTokenPool_WithNoExistingRemoteContracts_predict_Success() (gas: 12765036) TokenPoolFactoryTests:test_createTokenPool_WithNoExistingTokenOnRemoteChain_Success() (gas: 5841282) diff --git a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol index be30ecdfac..aa6a6bba0a 100644 --- a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol +++ b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol @@ -20,8 +20,6 @@ import {TokenAdminRegistrySetup} from "./TokenAdminRegistry.t.sol"; import {Create2} from "../../../vendor/openzeppelin-solidity/v5.0.2/contracts/utils/Create2.sol"; -import {console2 as console} from "forge-std/console2.sol"; - contract TokenPoolFactorySetup is TokenAdminRegistrySetup { using Create2 for bytes32; @@ -387,7 +385,6 @@ contract TokenPoolFactoryTests is TokenPoolFactorySetup { function test_createTokenPoolLockRelease_ExistingToken_predict_Success() public { vm.startPrank(OWNER); - bytes32 dynamicSalt = keccak256(abi.encodePacked(FAKE_SALT, OWNER)); // We have to create a new factory, registry module, and token admin registry to simulate the other chain TokenAdminRegistry newTokenAdminRegistry = new TokenAdminRegistry(); From b1c8c67a8c57af829cc7ae6966e956fe2000b873 Mon Sep 17 00:00:00 2001 From: Josh Date: Thu, 10 Oct 2024 13:34:20 -0400 Subject: [PATCH 42/48] another attempt at snapshot fixing --- contracts/gas-snapshots/ccip.gas-snapshot | 1916 ++++++++++----------- 1 file changed, 958 insertions(+), 958 deletions(-) diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot index 63530ce332..3925bb8171 100644 --- a/contracts/gas-snapshots/ccip.gas-snapshot +++ b/contracts/gas-snapshots/ccip.gas-snapshot @@ -1,35 +1,35 @@ -ARMProxyStandaloneTest:test_ARMCallEmptyContractRevert() (gas: 20673) -ARMProxyStandaloneTest:test_Constructor() (gas: 543485) -ARMProxyStandaloneTest:test_SetARM() (gas: 18216) -ARMProxyStandaloneTest:test_SetARMzero() (gas: 12144) -ARMProxyTest:test_ARMCallRevertReasonForwarded() (gas: 49764) -ARMProxyTest:test_ARMIsBlessed_Success() (gas: 39781) -ARMProxyTest:test_ARMIsCursed_Success() (gas: 51846) -AggregateTokenLimiter_constructor:test_Constructor_Success() (gas: 31944) -AggregateTokenLimiter_getTokenBucket:test_GetTokenBucket_Success() (gas: 23227) -AggregateTokenLimiter_getTokenBucket:test_Refill_Success() (gas: 55032) -AggregateTokenLimiter_getTokenBucket:test_TimeUnderflow_Revert() (gas: 17640) -AggregateTokenLimiter_getTokenLimitAdmin:test_GetTokenLimitAdmin_Success() (gas: 11188) -AggregateTokenLimiter_getTokenValue:test_GetTokenValue_Success() (gas: 21368) -AggregateTokenLimiter_getTokenValue:test_NoTokenPrice_Reverts() (gas: 25888) -AggregateTokenLimiter_rateLimitValue:test_AggregateValueMaxCapacityExceeded_Revert() (gas: 20854) -AggregateTokenLimiter_rateLimitValue:test_RateLimitValueSuccess_gas() (gas: 19835) -AggregateTokenLimiter_setAdmin:test_OnlyOwnerOrAdmin_Revert() (gas: 13880) -AggregateTokenLimiter_setAdmin:test_Owner_Success() (gas: 20448) -AggregateTokenLimiter_setRateLimiterConfig:test_OnlyOnlyCallableByAdminOrOwner_Revert() (gas: 19396) -AggregateTokenLimiter_setRateLimiterConfig:test_Owner_Success() (gas: 38776) -AggregateTokenLimiter_setRateLimiterConfig:test_TokenLimitAdmin_Success() (gas: 41521) -BurnFromMintTokenPool_lockOrBurn:test_ChainNotAllowed_Revert() (gas: 34256) -BurnFromMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 60604) -BurnFromMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 293700) -BurnFromMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 28203) -BurnMintTokenPool_lockOrBurn:test_ChainNotAllowed_Revert() (gas: 31296) -BurnMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 60604) -BurnMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 291204) -BurnMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 20610) -BurnMintTokenPool_releaseOrMint:test_ChainNotAllowed_Revert() (gas: 34256) -BurnMintTokenPool_releaseOrMint:test_PoolMintNotHealthy_Revert() (gas: 63377) -BurnMintTokenPool_releaseOrMint:test_PoolMint_Success() (gas: 122166) +ARMProxyStandaloneTest:test_ARMCallEmptyContractRevert() (gas: 19675) +ARMProxyStandaloneTest:test_Constructor() (gas: 310043) +ARMProxyStandaloneTest:test_SetARM() (gas: 16587) +ARMProxyStandaloneTest:test_SetARMzero() (gas: 11297) +ARMProxyTest:test_ARMCallRevertReasonForwarded() (gas: 47898) +ARMProxyTest:test_ARMIsBlessed_Success() (gas: 36363) +ARMProxyTest:test_ARMIsCursed_Success() (gas: 49851) +AggregateTokenLimiter_constructor:test_Constructor_Success() (gas: 27118) +AggregateTokenLimiter_getTokenBucket:test_GetTokenBucket_Success() (gas: 19871) +AggregateTokenLimiter_getTokenBucket:test_Refill_Success() (gas: 41586) +AggregateTokenLimiter_getTokenBucket:test_TimeUnderflow_Revert() (gas: 15452) +AggregateTokenLimiter_getTokenLimitAdmin:test_GetTokenLimitAdmin_Success() (gas: 10537) +AggregateTokenLimiter_getTokenValue:test_GetTokenValue_Success() (gas: 17531) +AggregateTokenLimiter_getTokenValue:test_NoTokenPrice_Reverts() (gas: 21414) +AggregateTokenLimiter_rateLimitValue:test_AggregateValueMaxCapacityExceeded_Revert() (gas: 16586) +AggregateTokenLimiter_rateLimitValue:test_RateLimitValueSuccess_gas() (gas: 18357) +AggregateTokenLimiter_setAdmin:test_OnlyOwnerOrAdmin_Revert() (gas: 13078) +AggregateTokenLimiter_setAdmin:test_Owner_Success() (gas: 19016) +AggregateTokenLimiter_setRateLimiterConfig:test_OnlyOnlyCallableByAdminOrOwner_Revert() (gas: 17546) +AggregateTokenLimiter_setRateLimiterConfig:test_Owner_Success() (gas: 30393) +AggregateTokenLimiter_setRateLimiterConfig:test_TokenLimitAdmin_Success() (gas: 32407) +BurnFromMintTokenPool_lockOrBurn:test_ChainNotAllowed_Revert() (gas: 28842) +BurnFromMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 55271) +BurnFromMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 244024) +BurnFromMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 24166) +BurnMintTokenPool_lockOrBurn:test_ChainNotAllowed_Revert() (gas: 27609) +BurnMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 55271) +BurnMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 241912) +BurnMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 17851) +BurnMintTokenPool_releaseOrMint:test_ChainNotAllowed_Revert() (gas: 28805) +BurnMintTokenPool_releaseOrMint:test_PoolMintNotHealthy_Revert() (gas: 56253) +BurnMintTokenPool_releaseOrMint:test_PoolMint_Success() (gas: 112391) BurnWithFromMintTokenPool_lockOrBurn:test_ChainNotAllowed_Revert() (gas: 28842) BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 55271) BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 244050) @@ -37,288 +37,288 @@ BurnWithFromMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 24168) BurnWithFromMintTokenPool_releaseOrMint:test_Setup_Success() (gas: 24547) BurnWithFromMintTokenPool_releaseOrMint:test_releaseOrMint_NegativeMintAmount_reverts() (gas: 93840) BurnWithFromMintTokenPool_releaseOrMint:test_releaseOrMint_Success() (gas: 93423) -CCIPClientExample_sanity:test_ImmutableExamples_Success() (gas: 3189509) -CCIPHome__validateConfig:test__validateConfigLessTransmittersThanSigners_Success() (gas: 380435) -CCIPHome__validateConfig:test__validateConfigSmallerFChain_Success() (gas: 563820) -CCIPHome__validateConfig:test__validateConfig_ABIEncodedAddress_OfframpAddressCannotBeZero_Reverts() (gas: 322845) -CCIPHome__validateConfig:test__validateConfig_ABIEncodedAddress_RMNHomeAddressCannotBeZero_Reverts() (gas: 323318) -CCIPHome__validateConfig:test__validateConfig_ChainSelectorNotFound_Reverts() (gas: 326388) -CCIPHome__validateConfig:test__validateConfig_ChainSelectorNotSet_Reverts() (gas: 322093) -CCIPHome__validateConfig:test__validateConfig_FChainTooHigh_Reverts() (gas: 394935) -CCIPHome__validateConfig:test__validateConfig_FMustBePositive_Reverts() (gas: 325101) -CCIPHome__validateConfig:test__validateConfig_FTooHigh_Reverts() (gas: 324000) -CCIPHome__validateConfig:test__validateConfig_NodeNotInRegistry_Reverts() (gas: 404874) -CCIPHome__validateConfig:test__validateConfig_NotEnoughTransmittersEmptyAddresses_Reverts() (gas: 353950) -CCIPHome__validateConfig:test__validateConfig_NotEnoughTransmitters_Reverts() (gas: 1444130) -CCIPHome__validateConfig:test__validateConfig_OfframpAddressCannotBeZero_Reverts() (gas: 322144) -CCIPHome__validateConfig:test__validateConfig_RMNHomeAddressCannotBeZero_Reverts() (gas: 322594) -CCIPHome__validateConfig:test__validateConfig_Success() (gas: 338936) -CCIPHome__validateConfig:test__validateConfig_TooManySigners_Reverts() (gas: 1176311) -CCIPHome__validateConfig:test__validateConfig_ZeroP2PId_Reverts() (gas: 328508) -CCIPHome__validateConfig:test__validateConfig_ZeroSignerKey_Reverts() (gas: 328620) -CCIPHome_applyChainConfigUpdates:test__applyChainConfigUpdates_FChainNotPositive_Reverts() (gas: 194886) -CCIPHome_applyChainConfigUpdates:test_applyChainConfigUpdates_addChainConfigs_Success() (gas: 367588) -CCIPHome_applyChainConfigUpdates:test_applyChainConfigUpdates_nodeNotInRegistry_Reverts() (gas: 27219) -CCIPHome_applyChainConfigUpdates:test_applyChainConfigUpdates_removeChainConfigs_Success() (gas: 283157) -CCIPHome_applyChainConfigUpdates:test_applyChainConfigUpdates_selectorNotFound_Reverts() (gas: 16607) -CCIPHome_applyChainConfigUpdates:test_getPaginatedCCIPHomes_Success() (gas: 407992) -CCIPHome_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_DONIdMismatch_reverts() (gas: 35872) -CCIPHome_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_InnerCallReverts_reverts() (gas: 13995) -CCIPHome_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_InvalidSelector_reverts() (gas: 12740) -CCIPHome_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_OnlyCapabilitiesRegistryCanCall_reverts() (gas: 33934) -CCIPHome_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_success() (gas: 1519499) -CCIPHome_constructor:test_constructor_CapabilitiesRegistryAddressZero_reverts() (gas: 67189) -CCIPHome_constructor:test_constructor_success() (gas: 5365115) -CCIPHome_constructor:test_getCapabilityConfiguration_success() (gas: 10244) -CCIPHome_constructor:test_supportsInterface_success() (gas: 11297) -CCIPHome_getAllConfigs:test_getAllConfigs_success() (gas: 2901092) -CCIPHome_getConfigDigests:test_getConfigDigests_success() (gas: 2615935) -CCIPHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_CanOnlySelfCall_reverts() (gas: 10152) -CCIPHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_ConfigDigestMismatch_reverts() (gas: 27337) -CCIPHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_NoOpStateTransitionNotAllowed_reverts() (gas: 9902) -CCIPHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_multiplePlugins_success() (gas: 5284426) -CCIPHome_revokeCandidate:test_revokeCandidate_CanOnlySelfCall_reverts() (gas: 10119) -CCIPHome_revokeCandidate:test_revokeCandidate_ConfigDigestMismatch_reverts() (gas: 21547) -CCIPHome_revokeCandidate:test_revokeCandidate_RevokingZeroDigestNotAllowed_reverts() (gas: 9666) -CCIPHome_revokeCandidate:test_revokeCandidate_success() (gas: 39075) -CCIPHome_setCandidate:test_setCandidate_CanOnlySelfCall_reverts() (gas: 26729) -CCIPHome_setCandidate:test_setCandidate_ConfigDigestMismatch_reverts() (gas: 1472425) -CCIPHome_setCandidate:test_setCandidate_success() (gas: 1419718) -CommitStore_constructor:test_Constructor_Success() (gas: 4361942) -CommitStore_isUnpausedAndRMNHealthy:test_RMN_Success() (gas: 83130) -CommitStore_report:test_InvalidIntervalMinLargerThanMax_Revert() (gas: 32885) -CommitStore_report:test_InvalidInterval_Revert() (gas: 32781) -CommitStore_report:test_InvalidRootRevert() (gas: 31537) -CommitStore_report:test_OnlyGasPriceUpdates_Success() (gas: 61004) -CommitStore_report:test_OnlyPriceUpdateStaleReport_Revert() (gas: 70437) -CommitStore_report:test_OnlyTokenPriceUpdates_Success() (gas: 61025) -CommitStore_report:test_Paused_Revert() (gas: 22402) -CommitStore_report:test_ReportAndPriceUpdate_Success() (gas: 94701) -CommitStore_report:test_ReportOnlyRootSuccess_gas() (gas: 60020) -CommitStore_report:test_RootAlreadyCommitted_Revert() (gas: 72243) -CommitStore_report:test_StaleReportWithRoot_Success() (gas: 136763) -CommitStore_report:test_Unhealthy_Revert() (gas: 46665) -CommitStore_report:test_ValidPriceUpdateThenStaleReportWithRoot_Success() (gas: 116937) -CommitStore_report:test_ZeroEpochAndRound_Revert() (gas: 32226) -CommitStore_resetUnblessedRoots:test_OnlyOwner_Revert() (gas: 12082) -CommitStore_resetUnblessedRoots:test_ResetUnblessedRoots_Success() (gas: 172098) -CommitStore_setDynamicConfig:test_InvalidCommitStoreConfig_Revert() (gas: 44708) -CommitStore_setDynamicConfig:test_OnlyOwner_Revert() (gas: 44671) -CommitStore_setDynamicConfig:test_PriceEpochCleared_Success() (gas: 150735) -CommitStore_setLatestPriceEpochAndRound:test_OnlyOwner_Revert() (gas: 11970) -CommitStore_setLatestPriceEpochAndRound:test_SetLatestPriceEpochAndRound_Success() (gas: 22566) -CommitStore_setMinSeqNr:test_OnlyOwner_Revert() (gas: 11969) -CommitStore_verify:test_Blessed_Success() (gas: 108814) -CommitStore_verify:test_NotBlessed_Success() (gas: 69299) -CommitStore_verify:test_Paused_Revert() (gas: 19843) -CommitStore_verify:test_TooManyLeaves_Revert() (gas: 85894) -DefensiveExampleTest:test_HappyPath_Success() (gas: 247055) -DefensiveExampleTest:test_Recovery() (gas: 483144) -E2E:test_E2E_3MessagesSuccess_gas() (gas: 1459037) -EVM2EVMOffRamp__releaseOrMintToken:test__releaseOrMintToken_NotACompatiblePool_Revert() (gas: 48827) -EVM2EVMOffRamp__releaseOrMintToken:test__releaseOrMintToken_Success() (gas: 122487) -EVM2EVMOffRamp__releaseOrMintToken:test__releaseOrMintToken_TokenHandlingError_transfer_Revert() (gas: 100439) -EVM2EVMOffRamp__releaseOrMintToken:test_releaseOrMintToken_InvalidDataLength_Revert() (gas: 45166) -EVM2EVMOffRamp__releaseOrMintToken:test_releaseOrMintToken_ReleaseOrMintBalanceMismatch_Revert() (gas: 110906) -EVM2EVMOffRamp__releaseOrMintToken:test_releaseOrMintToken_TokenHandlingError_BalanceOf_Revert() (gas: 47409) -EVM2EVMOffRamp__releaseOrMintToken:test_releaseOrMintToken_skip_ReleaseOrMintBalanceMismatch_if_pool_Revert() (gas: 102213) -EVM2EVMOffRamp__releaseOrMintTokens:test_OverValueWithARLOff_Success() (gas: 452793) -EVM2EVMOffRamp__releaseOrMintTokens:test_PriceNotFoundForToken_Reverts() (gas: 163533) -EVM2EVMOffRamp__releaseOrMintTokens:test_RateLimitErrors_Reverts() (gas: 947445) -EVM2EVMOffRamp__releaseOrMintTokens:test_TokenHandlingError_Reverts() (gas: 207677) -EVM2EVMOffRamp__releaseOrMintTokens:test__releaseOrMintTokens_NotACompatiblePool_Reverts() (gas: 37420) -EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_InvalidDataLengthReturnData_Revert() (gas: 81689) -EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_InvalidEVMAddress_Revert() (gas: 52840) -EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_Success() (gas: 248387) -EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_destDenominatedDecimals_Success() (gas: 256427) -EVM2EVMOffRamp__report:test_Report_Success() (gas: 150186) -EVM2EVMOffRamp__trialExecute:test_RateLimitError_Success() (gas: 280928) -EVM2EVMOffRamp__trialExecute:test_TokenHandlingErrorIsCaught_Success() (gas: 291045) -EVM2EVMOffRamp__trialExecute:test_TokenPoolIsNotAContract_Success() (gas: 425921) -EVM2EVMOffRamp__trialExecute:test_trialExecute_Success() (gas: 368465) -EVM2EVMOffRamp_ccipReceive:test_Reverts() (gas: 20655) -EVM2EVMOffRamp_constructor:test_CommitStoreAlreadyInUse_Revert() (gas: 162623) -EVM2EVMOffRamp_constructor:test_Constructor_Success() (gas: 7939916) -EVM2EVMOffRamp_constructor:test_ZeroOnRampAddress_Revert() (gas: 152500) -EVM2EVMOffRamp_execute:test_EmptyReport_Revert() (gas: 24199) -EVM2EVMOffRamp_execute:test_InvalidMessageId_Revert() (gas: 47203) -EVM2EVMOffRamp_execute:test_InvalidSourceChain_Revert() (gas: 67004) -EVM2EVMOffRamp_execute:test_InvalidSourcePoolAddress_Success() (gas: 578501) -EVM2EVMOffRamp_execute:test_ManualExecutionNotYetEnabled_Revert() (gas: 61423) -EVM2EVMOffRamp_execute:test_MessageTooLarge_Revert() (gas: 175550) -EVM2EVMOffRamp_execute:test_Paused_Revert() (gas: 139288) -EVM2EVMOffRamp_execute:test_ReceiverError_Success() (gas: 192927) -EVM2EVMOffRamp_execute:test_RetryFailedMessageWithoutManualExecution_Success() (gas: 215419) -EVM2EVMOffRamp_execute:test_RootNotCommitted_Revert() (gas: 55720) -EVM2EVMOffRamp_execute:test_SingleMessageNoTokensUnordered_Success() (gas: 208494) -EVM2EVMOffRamp_execute:test_SingleMessageNoTokens_Success() (gas: 220462) -EVM2EVMOffRamp_execute:test_SingleMessageToNonCCIPReceiver_Success() (gas: 290662) -EVM2EVMOffRamp_execute:test_SingleMessagesNoTokensSuccess_gas() (gas: 134108) -EVM2EVMOffRamp_execute:test_SkippedIncorrectNonceStillExecutes_Success() (gas: 490970) -EVM2EVMOffRamp_execute:test_SkippedIncorrectNonce_Success() (gas: 68824) -EVM2EVMOffRamp_execute:test_StrictUntouchedToSuccess_Success() (gas: 158417) -EVM2EVMOffRamp_execute:test_TokenDataMismatch_Revert() (gas: 65640) -EVM2EVMOffRamp_execute:test_TwoMessagesWithTokensAndGE_Success() (gas: 699587) -EVM2EVMOffRamp_execute:test_TwoMessagesWithTokensSuccess_gas() (gas: 607548) -EVM2EVMOffRamp_execute:test_UnexpectedTokenData_Revert() (gas: 45035) -EVM2EVMOffRamp_execute:test_Unhealthy_Revert() (gas: 699898) -EVM2EVMOffRamp_execute:test_UnsupportedNumberOfTokens_Revert() (gas: 91821) -EVM2EVMOffRamp_execute:test__execute_SkippedAlreadyExecutedMessageUnordered_Success() (gas: 157284) -EVM2EVMOffRamp_execute:test__execute_SkippedAlreadyExecutedMessage_Success() (gas: 175420) -EVM2EVMOffRamp_execute:test_execute_RouterYULCall_Success() (gas: 601571) -EVM2EVMOffRamp_executeSingleMessage:test_MessageSender_Revert() (gas: 23052) -EVM2EVMOffRamp_executeSingleMessage:test_NonContractWithTokens_Success() (gas: 315290) -EVM2EVMOffRamp_executeSingleMessage:test_NonContract_Success() (gas: 23338) -EVM2EVMOffRamp_executeSingleMessage:test_TokenHandlingError_Revert() (gas: 258353) -EVM2EVMOffRamp_executeSingleMessage:test_ZeroGasDONExecution_Revert() (gas: 59576) -EVM2EVMOffRamp_executeSingleMessage:test_executeSingleMessage_NoTokens_Success() (gas: 58690) -EVM2EVMOffRamp_executeSingleMessage:test_executeSingleMessage_WithTokens_Success() (gas: 368147) -EVM2EVMOffRamp_executeSingleMessage:test_executeSingleMessage_ZeroGasZeroData_Success() (gas: 93587) -EVM2EVMOffRamp_execute_upgrade:test_V2NonceNewSenderStartsAtZero_Success() (gas: 279051) -EVM2EVMOffRamp_execute_upgrade:test_V2NonceStartsAtV1Nonce_Success() (gas: 351951) -EVM2EVMOffRamp_execute_upgrade:test_V2OffRampNonceSkipsIfMsgInFlight_Success() (gas: 326170) -EVM2EVMOffRamp_execute_upgrade:test_V2SenderNoncesReadsPreviousRamp_Success() (gas: 303514) -EVM2EVMOffRamp_execute_upgrade:test_V2_Success() (gas: 154916) -EVM2EVMOffRamp_getAllRateLimitTokens:test_GetAllRateLimitTokens_Success() (gas: 42076) -EVM2EVMOffRamp_getExecutionState:test_FillExecutionState_Success() (gas: 5016070) -EVM2EVMOffRamp_getExecutionState:test_GetExecutionState_Success() (gas: 104111) -EVM2EVMOffRamp_manuallyExecute:test_ManualExecFailedTx_Revert() (gas: 234610) -EVM2EVMOffRamp_manuallyExecute:test_ManualExecForkedChain_Revert() (gas: 37344) -EVM2EVMOffRamp_manuallyExecute:test_ManualExecGasLimitMismatch_Revert() (gas: 67784) -EVM2EVMOffRamp_manuallyExecute:test_ManualExecInvalidGasLimit_Revert() (gas: 37732) -EVM2EVMOffRamp_manuallyExecute:test_ManualExecWithMultipleMessagesAndSourceTokens_Success() (gas: 673237) -EVM2EVMOffRamp_manuallyExecute:test_ManualExecWithSourceTokens_Success() (gas: 416742) -EVM2EVMOffRamp_manuallyExecute:test_ManualExec_Success() (gas: 235356) -EVM2EVMOffRamp_manuallyExecute:test_ReentrancyManualExecuteFails_Success() (gas: 3548576) -EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_DestinationGasAmountCountMismatch_Revert() (gas: 442167) -EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_DoesNotRevertIfUntouched_Success() (gas: 173700) -EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_InvalidTokenGasOverride_Revert() (gas: 447336) -EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_LowGasLimitManualExec_Success() (gas: 681724) -EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_WithGasOverride_Success() (gas: 239038) -EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_WithInvalidReceiverExecutionGasOverride_Revert() (gas: 188679) -EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_WithInvalidSourceTokenDataCount_Revert() (gas: 80150) -EVM2EVMOffRamp_metadataHash:test_MetadataHash_Success() (gas: 10174) -EVM2EVMOffRamp_setDynamicConfig:test_NonOwner_Revert() (gas: 47737) -EVM2EVMOffRamp_setDynamicConfig:test_RouterZeroAddress_Revert() (gas: 46206) -EVM2EVMOffRamp_setDynamicConfig:test_SetDynamicConfig_Success() (gas: 182870) -EVM2EVMOffRamp_updateRateLimitTokens:test_updateRateLimitTokens_AddsAndRemoves_Success() (gas: 171983) -EVM2EVMOffRamp_updateRateLimitTokens:test_updateRateLimitTokens_NonOwner_Revert() (gas: 25219) -EVM2EVMOffRamp_updateRateLimitTokens:test_updateRateLimitTokens_Success() (gas: 205572) -EVM2EVMOnRamp_constructor:test_Constructor_Success() (gas: 7995985) -EVM2EVMOnRamp_forwardFromRouter:test_CannotSendZeroTokens_Revert() (gas: 40118) -EVM2EVMOnRamp_forwardFromRouter:test_EnforceOutOfOrder_Revert() (gas: 112063) -EVM2EVMOnRamp_forwardFromRouter:test_ForwardFromRouterExtraArgsV2AllowOutOfOrderTrue_Success() (gas: 136127) -EVM2EVMOnRamp_forwardFromRouter:test_ForwardFromRouterExtraArgsV2_Success() (gas: 136125) -EVM2EVMOnRamp_forwardFromRouter:test_ForwardFromRouterSuccessCustomExtraArgs() (gas: 147732) -EVM2EVMOnRamp_forwardFromRouter:test_ForwardFromRouterSuccessLegacyExtraArgs() (gas: 160359) -EVM2EVMOnRamp_forwardFromRouter:test_ForwardFromRouter_Success() (gas: 146970) -EVM2EVMOnRamp_forwardFromRouter:test_InvalidAddressEncodePacked_Revert() (gas: 43162) -EVM2EVMOnRamp_forwardFromRouter:test_InvalidAddress_Revert() (gas: 43265) -EVM2EVMOnRamp_forwardFromRouter:test_InvalidChainSelector_Revert() (gas: 28899) -EVM2EVMOnRamp_forwardFromRouter:test_InvalidExtraArgsTag_Revert() (gas: 28541) -EVM2EVMOnRamp_forwardFromRouter:test_MaxCapacityExceeded_Revert() (gas: 93166) -EVM2EVMOnRamp_forwardFromRouter:test_MaxFeeBalanceReached_Revert() (gas: 40651) -EVM2EVMOnRamp_forwardFromRouter:test_MessageGasLimitTooHigh_Revert() (gas: 33116) -EVM2EVMOnRamp_forwardFromRouter:test_MessageTooLarge_Revert() (gas: 119271) -EVM2EVMOnRamp_forwardFromRouter:test_OriginalSender_Revert() (gas: 25711) -EVM2EVMOnRamp_forwardFromRouter:test_OverValueWithARLOff_Success() (gas: 263611) -EVM2EVMOnRamp_forwardFromRouter:test_Paused_Revert() (gas: 60811) -EVM2EVMOnRamp_forwardFromRouter:test_Permissions_Revert() (gas: 28656) -EVM2EVMOnRamp_forwardFromRouter:test_PriceNotFoundForToken_Revert() (gas: 66594) -EVM2EVMOnRamp_forwardFromRouter:test_ShouldIncrementNonceOnlyOnOrdered_Success() (gas: 246017) -EVM2EVMOnRamp_forwardFromRouter:test_ShouldIncrementSeqNumAndNonce_Success() (gas: 231059) -EVM2EVMOnRamp_forwardFromRouter:test_ShouldStoreNonLinkFees() (gas: 148693) -EVM2EVMOnRamp_forwardFromRouter:test_SourceTokenDataTooLarge_Revert() (gas: 5451750) -EVM2EVMOnRamp_forwardFromRouter:test_TooManyTokens_Revert() (gas: 36372) -EVM2EVMOnRamp_forwardFromRouter:test_Unhealthy_Revert() (gas: 46651) -EVM2EVMOnRamp_forwardFromRouter:test_UnsupportedToken_Revert() (gas: 119388) -EVM2EVMOnRamp_forwardFromRouter:test_ZeroAddressReceiver_Revert() (gas: 357179) -EVM2EVMOnRamp_forwardFromRouter:test_forwardFromRouter_ShouldStoreLinkFees_Success() (gas: 122802) -EVM2EVMOnRamp_forwardFromRouter:test_forwardFromRouter_UnsupportedToken_Revert() (gas: 79581) -EVM2EVMOnRamp_forwardFromRouter:test_forwardFromRouter_correctSourceTokenData_Success() (gas: 931861) -EVM2EVMOnRamp_forwardFromRouter_upgrade:test_V2NonceNewSenderStartsAtZero_Success() (gas: 170805) -EVM2EVMOnRamp_forwardFromRouter_upgrade:test_V2NonceStartsAtV1Nonce_Success() (gas: 233734) -EVM2EVMOnRamp_forwardFromRouter_upgrade:test_V2SenderNoncesReadsPreviousRamp_Success() (gas: 149106) -EVM2EVMOnRamp_forwardFromRouter_upgrade:test_V2_Success() (gas: 111551) -EVM2EVMOnRamp_getDataAvailabilityCost:test_EmptyMessageCalculatesDataAvailabilityCost_Success() (gas: 28790) -EVM2EVMOnRamp_getDataAvailabilityCost:test_SimpleMessageCalculatesDataAvailabilityCost_Success() (gas: 29664) -EVM2EVMOnRamp_getFee:test_EmptyMessage_Success() (gas: 103386) -EVM2EVMOnRamp_getFee:test_GetFeeOfZeroForTokenMessage_Success() (gas: 102775) -EVM2EVMOnRamp_getFee:test_HighGasMessage_Success() (gas: 274795) -EVM2EVMOnRamp_getFee:test_MessageGasLimitTooHigh_Revert() (gas: 19531) -EVM2EVMOnRamp_getFee:test_MessageTooLarge_Revert() (gas: 105736) -EVM2EVMOnRamp_getFee:test_MessageWithDataAndTokenTransfer_Success() (gas: 246841) -EVM2EVMOnRamp_getFee:test_NotAFeeToken_Revert() (gas: 28335) -EVM2EVMOnRamp_getFee:test_SingleTokenMessage_Success() (gas: 174801) -EVM2EVMOnRamp_getFee:test_TooManyTokens_Revert() (gas: 24852) -EVM2EVMOnRamp_getFee:test_ZeroDataAvailabilityMultiplier_Success() (gas: 81035) -EVM2EVMOnRamp_getSupportedTokens:test_GetSupportedTokens_Revert() (gas: 11166) -EVM2EVMOnRamp_getTokenPool:test_GetTokenPool_Success() (gas: 41957) -EVM2EVMOnRamp_getTokenTransferCost:test_CustomTokenBpsFee_Success() (gas: 54001) -EVM2EVMOnRamp_getTokenTransferCost:test_FeeTokenBpsFee_Success() (gas: 43066) -EVM2EVMOnRamp_getTokenTransferCost:test_LargeTokenTransferChargesMaxFeeAndGas_Success() (gas: 37875) -EVM2EVMOnRamp_getTokenTransferCost:test_MixedTokenTransferFee_Success() (gas: 190349) -EVM2EVMOnRamp_getTokenTransferCost:test_NoTokenTransferChargesZeroFee_Success() (gas: 17641) -EVM2EVMOnRamp_getTokenTransferCost:test_SmallTokenTransferChargesMinFeeAndGas_Success() (gas: 37525) -EVM2EVMOnRamp_getTokenTransferCost:test_UnsupportedToken_Revert() (gas: 24786) -EVM2EVMOnRamp_getTokenTransferCost:test_ZeroAmountTokenTransferChargesMinFeeAndGas_Success() (gas: 37548) -EVM2EVMOnRamp_getTokenTransferCost:test_ZeroFeeConfigChargesMinFee_Success() (gas: 49698) -EVM2EVMOnRamp_getTokenTransferCost:test__getTokenTransferCost_selfServeUsesDefaults_Success() (gas: 38218) -EVM2EVMOnRamp_linkAvailableForPayment:test_InsufficientLinkBalance_Success() (gas: 36639) -EVM2EVMOnRamp_linkAvailableForPayment:test_LinkAvailableForPayment_Success() (gas: 145939) -EVM2EVMOnRamp_payNops:test_AdminPayNops_Success() (gas: 157645) -EVM2EVMOnRamp_payNops:test_InsufficientBalance_Revert() (gas: 32428) -EVM2EVMOnRamp_payNops:test_NoFeesToPay_Revert() (gas: 135001) -EVM2EVMOnRamp_payNops:test_NoNopsToPay_Revert() (gas: 141695) -EVM2EVMOnRamp_payNops:test_NopPayNops_Success() (gas: 161181) -EVM2EVMOnRamp_payNops:test_OwnerPayNops_Success() (gas: 155453) -EVM2EVMOnRamp_payNops:test_PayNopsSuccessAfterSetNops() (gas: 328800) -EVM2EVMOnRamp_payNops:test_WrongPermissions_Revert() (gas: 15878) -EVM2EVMOnRamp_setDynamicConfig:test_SetConfigInvalidConfig_Revert() (gas: 49643) -EVM2EVMOnRamp_setDynamicConfig:test_SetConfigOnlyOwner_Revert() (gas: 28163) -EVM2EVMOnRamp_setDynamicConfig:test_SetDynamicConfig_Success() (gas: 68220) -EVM2EVMOnRamp_setFeeTokenConfig:test_OnlyCallableByOwnerOrAdmin_Revert() (gas: 14432) -EVM2EVMOnRamp_setFeeTokenConfig:test_SetFeeTokenConfigByAdmin_Success() (gas: 17635) -EVM2EVMOnRamp_setFeeTokenConfig:test_SetFeeTokenConfig_Success() (gas: 14948) -EVM2EVMOnRamp_setNops:test_AdminCanSetNops_Success() (gas: 67974) -EVM2EVMOnRamp_setNops:test_IncludesPayment_Success() (gas: 551687) -EVM2EVMOnRamp_setNops:test_LinkTokenCannotBeNop_Revert() (gas: 61776) -EVM2EVMOnRamp_setNops:test_NonOwnerOrAdmin_Revert() (gas: 16548) -EVM2EVMOnRamp_setNops:test_NotEnoughFundsForPayout_Revert() (gas: 96806) -EVM2EVMOnRamp_setNops:test_SetNopsRemovesOldNopsCompletely_Success() (gas: 64532) -EVM2EVMOnRamp_setNops:test_SetNops_Success() (gas: 185469) -EVM2EVMOnRamp_setNops:test_TooManyNops_Revert() (gas: 415502) -EVM2EVMOnRamp_setNops:test_ZeroAddressCannotBeNop_Revert() (gas: 58089) -EVM2EVMOnRamp_setTokenTransferFeeConfig:test__setTokenTransferFeeConfig_InvalidDestBytesOverhead_Revert() (gas: 17784) -EVM2EVMOnRamp_setTokenTransferFeeConfig:test__setTokenTransferFeeConfig_OnlyCallableByOwnerOrAdmin_Revert() (gas: 15545) -EVM2EVMOnRamp_setTokenTransferFeeConfig:test__setTokenTransferFeeConfig_Success() (gas: 117548) -EVM2EVMOnRamp_setTokenTransferFeeConfig:test__setTokenTransferFeeConfig_byAdmin_Success() (gas: 18795) -EVM2EVMOnRamp_withdrawNonLinkFees:test_LinkBalanceNotSettled_Revert() (gas: 92590) -EVM2EVMOnRamp_withdrawNonLinkFees:test_NonOwnerOrAdmin_Revert() (gas: 16405) -EVM2EVMOnRamp_withdrawNonLinkFees:test_SettlingBalance_Success() (gas: 326944) -EVM2EVMOnRamp_withdrawNonLinkFees:test_WithdrawNonLinkFees_Success() (gas: 58679) -EVM2EVMOnRamp_withdrawNonLinkFees:test_WithdrawToZeroAddress_Revert() (gas: 13676) -EtherSenderReceiverTest_ccipReceive:test_ccipReceive_fallbackToWethTransfer() (gas: 103814) -EtherSenderReceiverTest_ccipReceive:test_ccipReceive_happyPath() (gas: 54732) -EtherSenderReceiverTest_ccipReceive:test_ccipReceive_wrongToken() (gas: 21881) -EtherSenderReceiverTest_ccipReceive:test_ccipReceive_wrongTokenAmount() (gas: 20674) -EtherSenderReceiverTest_ccipSend:test_ccipSend_reverts_insufficientFee_feeToken() (gas: 116467) -EtherSenderReceiverTest_ccipSend:test_ccipSend_reverts_insufficientFee_native() (gas: 91360) -EtherSenderReceiverTest_ccipSend:test_ccipSend_reverts_insufficientFee_weth() (gas: 116371) -EtherSenderReceiverTest_ccipSend:test_ccipSend_success_feeToken() (gas: 167929) -EtherSenderReceiverTest_ccipSend:test_ccipSend_success_native() (gas: 98200) -EtherSenderReceiverTest_ccipSend:test_ccipSend_success_nativeExcess() (gas: 98574) -EtherSenderReceiverTest_ccipSend:test_ccipSend_success_weth() (gas: 117880) -EtherSenderReceiverTest_constructor:test_constructor() (gas: 19659) -EtherSenderReceiverTest_getFee:test_getFee() (gas: 41207) -EtherSenderReceiverTest_validateFeeToken:test_validateFeeToken_reverts_feeToken_tokenAmountNotEqualToMsgValue() (gas: 22872) -EtherSenderReceiverTest_validateFeeToken:test_validateFeeToken_valid_feeToken() (gas: 18390) -EtherSenderReceiverTest_validateFeeToken:test_validateFeeToken_valid_native() (gas: 18420) -EtherSenderReceiverTest_validatedMessage:test_validatedMessage_dataOverwrittenToMsgSender() (gas: 34950) -EtherSenderReceiverTest_validatedMessage:test_validatedMessage_emptyDataOverwrittenToMsgSender() (gas: 34697) -EtherSenderReceiverTest_validatedMessage:test_validatedMessage_invalidTokenAmounts() (gas: 23796) -EtherSenderReceiverTest_validatedMessage:test_validatedMessage_tokenOverwrittenToWeth() (gas: 34674) -EtherSenderReceiverTest_validatedMessage:test_validatedMessage_validMessage_extraArgs() (gas: 36305) +CCIPClientExample_sanity:test_ImmutableExamples_Success() (gas: 2052431) +CCIPHome__validateConfig:test__validateConfigLessTransmittersThanSigners_Success() (gas: 334693) +CCIPHome__validateConfig:test__validateConfigSmallerFChain_Success() (gas: 466117) +CCIPHome__validateConfig:test__validateConfig_ABIEncodedAddress_OfframpAddressCannotBeZero_Reverts() (gas: 289739) +CCIPHome__validateConfig:test__validateConfig_ABIEncodedAddress_RMNHomeAddressCannotBeZero_Reverts() (gas: 290034) +CCIPHome__validateConfig:test__validateConfig_ChainSelectorNotFound_Reverts() (gas: 292771) +CCIPHome__validateConfig:test__validateConfig_ChainSelectorNotSet_Reverts() (gas: 289373) +CCIPHome__validateConfig:test__validateConfig_FChainTooHigh_Reverts() (gas: 337311) +CCIPHome__validateConfig:test__validateConfig_FMustBePositive_Reverts() (gas: 291145) +CCIPHome__validateConfig:test__validateConfig_FTooHigh_Reverts() (gas: 290604) +CCIPHome__validateConfig:test__validateConfig_NodeNotInRegistry_Reverts() (gas: 344238) +CCIPHome__validateConfig:test__validateConfig_NotEnoughTransmittersEmptyAddresses_Reverts() (gas: 309179) +CCIPHome__validateConfig:test__validateConfig_NotEnoughTransmitters_Reverts() (gas: 1212133) +CCIPHome__validateConfig:test__validateConfig_OfframpAddressCannotBeZero_Reverts() (gas: 289400) +CCIPHome__validateConfig:test__validateConfig_RMNHomeAddressCannotBeZero_Reverts() (gas: 289661) +CCIPHome__validateConfig:test__validateConfig_Success() (gas: 300616) +CCIPHome__validateConfig:test__validateConfig_TooManySigners_Reverts() (gas: 773237) +CCIPHome__validateConfig:test__validateConfig_ZeroP2PId_Reverts() (gas: 293988) +CCIPHome__validateConfig:test__validateConfig_ZeroSignerKey_Reverts() (gas: 294035) +CCIPHome_applyChainConfigUpdates:test__applyChainConfigUpdates_FChainNotPositive_Reverts() (gas: 185242) +CCIPHome_applyChainConfigUpdates:test_applyChainConfigUpdates_addChainConfigs_Success() (gas: 347249) +CCIPHome_applyChainConfigUpdates:test_applyChainConfigUpdates_nodeNotInRegistry_Reverts() (gas: 20631) +CCIPHome_applyChainConfigUpdates:test_applyChainConfigUpdates_removeChainConfigs_Success() (gas: 270824) +CCIPHome_applyChainConfigUpdates:test_applyChainConfigUpdates_selectorNotFound_Reverts() (gas: 14952) +CCIPHome_applyChainConfigUpdates:test_getPaginatedCCIPHomes_Success() (gas: 370980) +CCIPHome_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_DONIdMismatch_reverts() (gas: 27137) +CCIPHome_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_InnerCallReverts_reverts() (gas: 11783) +CCIPHome_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_InvalidSelector_reverts() (gas: 11038) +CCIPHome_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_OnlyCapabilitiesRegistryCanCall_reverts() (gas: 26150) +CCIPHome_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_success() (gas: 1436726) +CCIPHome_constructor:test_constructor_CapabilitiesRegistryAddressZero_reverts() (gas: 63878) +CCIPHome_constructor:test_constructor_success() (gas: 3521034) +CCIPHome_constructor:test_getCapabilityConfiguration_success() (gas: 9173) +CCIPHome_constructor:test_supportsInterface_success() (gas: 9865) +CCIPHome_getAllConfigs:test_getAllConfigs_success() (gas: 2765282) +CCIPHome_getConfigDigests:test_getConfigDigests_success() (gas: 2539724) +CCIPHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_CanOnlySelfCall_reverts() (gas: 9110) +CCIPHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_ConfigDigestMismatch_reverts() (gas: 23052) +CCIPHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_NoOpStateTransitionNotAllowed_reverts() (gas: 8818) +CCIPHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_multiplePlugins_success() (gas: 5096112) +CCIPHome_revokeCandidate:test_revokeCandidate_CanOnlySelfCall_reverts() (gas: 9068) +CCIPHome_revokeCandidate:test_revokeCandidate_ConfigDigestMismatch_reverts() (gas: 19128) +CCIPHome_revokeCandidate:test_revokeCandidate_RevokingZeroDigestNotAllowed_reverts() (gas: 8773) +CCIPHome_revokeCandidate:test_revokeCandidate_success() (gas: 30676) +CCIPHome_setCandidate:test_setCandidate_CanOnlySelfCall_reverts() (gas: 19051) +CCIPHome_setCandidate:test_setCandidate_ConfigDigestMismatch_reverts() (gas: 1388198) +CCIPHome_setCandidate:test_setCandidate_success() (gas: 1357740) +CommitStore_constructor:test_Constructor_Success() (gas: 2855567) +CommitStore_isUnpausedAndRMNHealthy:test_RMN_Success() (gas: 73954) +CommitStore_report:test_InvalidIntervalMinLargerThanMax_Revert() (gas: 28739) +CommitStore_report:test_InvalidInterval_Revert() (gas: 28679) +CommitStore_report:test_InvalidRootRevert() (gas: 27912) +CommitStore_report:test_OnlyGasPriceUpdates_Success() (gas: 53448) +CommitStore_report:test_OnlyPriceUpdateStaleReport_Revert() (gas: 59286) +CommitStore_report:test_OnlyTokenPriceUpdates_Success() (gas: 53446) +CommitStore_report:test_Paused_Revert() (gas: 21319) +CommitStore_report:test_ReportAndPriceUpdate_Success() (gas: 84485) +CommitStore_report:test_ReportOnlyRootSuccess_gas() (gas: 56342) +CommitStore_report:test_RootAlreadyCommitted_Revert() (gas: 64077) +CommitStore_report:test_StaleReportWithRoot_Success() (gas: 117309) +CommitStore_report:test_Unhealthy_Revert() (gas: 44823) +CommitStore_report:test_ValidPriceUpdateThenStaleReportWithRoot_Success() (gas: 98929) +CommitStore_report:test_ZeroEpochAndRound_Revert() (gas: 27707) +CommitStore_resetUnblessedRoots:test_OnlyOwner_Revert() (gas: 11376) +CommitStore_resetUnblessedRoots:test_ResetUnblessedRoots_Success() (gas: 144186) +CommitStore_setDynamicConfig:test_InvalidCommitStoreConfig_Revert() (gas: 37314) +CommitStore_setDynamicConfig:test_OnlyOwner_Revert() (gas: 37483) +CommitStore_setDynamicConfig:test_PriceEpochCleared_Success() (gas: 129329) +CommitStore_setLatestPriceEpochAndRound:test_OnlyOwner_Revert() (gas: 11099) +CommitStore_setLatestPriceEpochAndRound:test_SetLatestPriceEpochAndRound_Success() (gas: 20690) +CommitStore_setMinSeqNr:test_OnlyOwner_Revert() (gas: 11098) +CommitStore_verify:test_Blessed_Success() (gas: 96581) +CommitStore_verify:test_NotBlessed_Success() (gas: 61473) +CommitStore_verify:test_Paused_Revert() (gas: 18568) +CommitStore_verify:test_TooManyLeaves_Revert() (gas: 36848) +DefensiveExampleTest:test_HappyPath_Success() (gas: 200200) +DefensiveExampleTest:test_Recovery() (gas: 424476) +E2E:test_E2E_3MessagesSuccess_gas() (gas: 1106985) +EVM2EVMOffRamp__releaseOrMintToken:test__releaseOrMintToken_NotACompatiblePool_Revert() (gas: 38322) +EVM2EVMOffRamp__releaseOrMintToken:test__releaseOrMintToken_Success() (gas: 104438) +EVM2EVMOffRamp__releaseOrMintToken:test__releaseOrMintToken_TokenHandlingError_transfer_Revert() (gas: 86026) +EVM2EVMOffRamp__releaseOrMintToken:test_releaseOrMintToken_InvalidDataLength_Revert() (gas: 37365) +EVM2EVMOffRamp__releaseOrMintToken:test_releaseOrMintToken_ReleaseOrMintBalanceMismatch_Revert() (gas: 95013) +EVM2EVMOffRamp__releaseOrMintToken:test_releaseOrMintToken_TokenHandlingError_BalanceOf_Revert() (gas: 40341) +EVM2EVMOffRamp__releaseOrMintToken:test_releaseOrMintToken_skip_ReleaseOrMintBalanceMismatch_if_pool_Revert() (gas: 87189) +EVM2EVMOffRamp__releaseOrMintTokens:test_OverValueWithARLOff_Success() (gas: 381594) +EVM2EVMOffRamp__releaseOrMintTokens:test_PriceNotFoundForToken_Reverts() (gas: 140568) +EVM2EVMOffRamp__releaseOrMintTokens:test_RateLimitErrors_Reverts() (gas: 798833) +EVM2EVMOffRamp__releaseOrMintTokens:test_TokenHandlingError_Reverts() (gas: 178400) +EVM2EVMOffRamp__releaseOrMintTokens:test__releaseOrMintTokens_NotACompatiblePool_Reverts() (gas: 29681) +EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_InvalidDataLengthReturnData_Revert() (gas: 67146) +EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_InvalidEVMAddress_Revert() (gas: 43605) +EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_Success() (gas: 208068) +EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_destDenominatedDecimals_Success() (gas: 219365) +EVM2EVMOffRamp__report:test_Report_Success() (gas: 127774) +EVM2EVMOffRamp__trialExecute:test_RateLimitError_Success() (gas: 237406) +EVM2EVMOffRamp__trialExecute:test_TokenHandlingErrorIsCaught_Success() (gas: 246039) +EVM2EVMOffRamp__trialExecute:test_TokenPoolIsNotAContract_Success() (gas: 329283) +EVM2EVMOffRamp__trialExecute:test_trialExecute_Success() (gas: 310166) +EVM2EVMOffRamp_ccipReceive:test_Reverts() (gas: 17048) +EVM2EVMOffRamp_constructor:test_CommitStoreAlreadyInUse_Revert() (gas: 153120) +EVM2EVMOffRamp_constructor:test_Constructor_Success() (gas: 5212732) +EVM2EVMOffRamp_constructor:test_ZeroOnRampAddress_Revert() (gas: 143845) +EVM2EVMOffRamp_execute:test_EmptyReport_Revert() (gas: 21507) +EVM2EVMOffRamp_execute:test_InvalidMessageId_Revert() (gas: 36936) +EVM2EVMOffRamp_execute:test_InvalidSourceChain_Revert() (gas: 52324) +EVM2EVMOffRamp_execute:test_InvalidSourcePoolAddress_Success() (gas: 473387) +EVM2EVMOffRamp_execute:test_ManualExecutionNotYetEnabled_Revert() (gas: 48346) +EVM2EVMOffRamp_execute:test_MessageTooLarge_Revert() (gas: 153019) +EVM2EVMOffRamp_execute:test_Paused_Revert() (gas: 103946) +EVM2EVMOffRamp_execute:test_ReceiverError_Success() (gas: 165358) +EVM2EVMOffRamp_execute:test_RetryFailedMessageWithoutManualExecution_Success() (gas: 180107) +EVM2EVMOffRamp_execute:test_RootNotCommitted_Revert() (gas: 43157) +EVM2EVMOffRamp_execute:test_SingleMessageNoTokensUnordered_Success() (gas: 160119) +EVM2EVMOffRamp_execute:test_SingleMessageNoTokens_Success() (gas: 175497) +EVM2EVMOffRamp_execute:test_SingleMessageToNonCCIPReceiver_Success() (gas: 237901) +EVM2EVMOffRamp_execute:test_SingleMessagesNoTokensSuccess_gas() (gas: 115048) +EVM2EVMOffRamp_execute:test_SkippedIncorrectNonceStillExecutes_Success() (gas: 406606) +EVM2EVMOffRamp_execute:test_SkippedIncorrectNonce_Success() (gas: 54774) +EVM2EVMOffRamp_execute:test_StrictUntouchedToSuccess_Success() (gas: 132556) +EVM2EVMOffRamp_execute:test_TokenDataMismatch_Revert() (gas: 52786) +EVM2EVMOffRamp_execute:test_TwoMessagesWithTokensAndGE_Success() (gas: 564471) +EVM2EVMOffRamp_execute:test_TwoMessagesWithTokensSuccess_gas() (gas: 494719) +EVM2EVMOffRamp_execute:test_UnexpectedTokenData_Revert() (gas: 35887) +EVM2EVMOffRamp_execute:test_Unhealthy_Revert() (gas: 546333) +EVM2EVMOffRamp_execute:test_UnsupportedNumberOfTokens_Revert() (gas: 65298) +EVM2EVMOffRamp_execute:test__execute_SkippedAlreadyExecutedMessageUnordered_Success() (gas: 124107) +EVM2EVMOffRamp_execute:test__execute_SkippedAlreadyExecutedMessage_Success() (gas: 144365) +EVM2EVMOffRamp_execute:test_execute_RouterYULCall_Success() (gas: 394187) +EVM2EVMOffRamp_executeSingleMessage:test_MessageSender_Revert() (gas: 18685) +EVM2EVMOffRamp_executeSingleMessage:test_NonContractWithTokens_Success() (gas: 275257) +EVM2EVMOffRamp_executeSingleMessage:test_NonContract_Success() (gas: 18815) +EVM2EVMOffRamp_executeSingleMessage:test_TokenHandlingError_Revert() (gas: 223182) +EVM2EVMOffRamp_executeSingleMessage:test_ZeroGasDONExecution_Revert() (gas: 48391) +EVM2EVMOffRamp_executeSingleMessage:test_executeSingleMessage_NoTokens_Success() (gas: 47823) +EVM2EVMOffRamp_executeSingleMessage:test_executeSingleMessage_WithTokens_Success() (gas: 311554) +EVM2EVMOffRamp_executeSingleMessage:test_executeSingleMessage_ZeroGasZeroData_Success() (gas: 70839) +EVM2EVMOffRamp_execute_upgrade:test_V2NonceNewSenderStartsAtZero_Success() (gas: 232136) +EVM2EVMOffRamp_execute_upgrade:test_V2NonceStartsAtV1Nonce_Success() (gas: 281170) +EVM2EVMOffRamp_execute_upgrade:test_V2OffRampNonceSkipsIfMsgInFlight_Success() (gas: 262488) +EVM2EVMOffRamp_execute_upgrade:test_V2SenderNoncesReadsPreviousRamp_Success() (gas: 230645) +EVM2EVMOffRamp_execute_upgrade:test_V2_Success() (gas: 132092) +EVM2EVMOffRamp_getAllRateLimitTokens:test_GetAllRateLimitTokens_Success() (gas: 38626) +EVM2EVMOffRamp_getExecutionState:test_FillExecutionState_Success() (gas: 3397486) +EVM2EVMOffRamp_getExecutionState:test_GetExecutionState_Success() (gas: 84833) +EVM2EVMOffRamp_manuallyExecute:test_ManualExecFailedTx_Revert() (gas: 188280) +EVM2EVMOffRamp_manuallyExecute:test_ManualExecForkedChain_Revert() (gas: 27574) +EVM2EVMOffRamp_manuallyExecute:test_ManualExecGasLimitMismatch_Revert() (gas: 46457) +EVM2EVMOffRamp_manuallyExecute:test_ManualExecInvalidGasLimit_Revert() (gas: 27948) +EVM2EVMOffRamp_manuallyExecute:test_ManualExecWithMultipleMessagesAndSourceTokens_Success() (gas: 531330) +EVM2EVMOffRamp_manuallyExecute:test_ManualExecWithSourceTokens_Success() (gas: 344463) +EVM2EVMOffRamp_manuallyExecute:test_ManualExec_Success() (gas: 189760) +EVM2EVMOffRamp_manuallyExecute:test_ReentrancyManualExecuteFails_Success() (gas: 2195128) +EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_DestinationGasAmountCountMismatch_Revert() (gas: 362054) +EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_DoesNotRevertIfUntouched_Success() (gas: 145457) +EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_InvalidTokenGasOverride_Revert() (gas: 365283) +EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_LowGasLimitManualExec_Success() (gas: 450711) +EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_WithGasOverride_Success() (gas: 192223) +EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_WithInvalidReceiverExecutionGasOverride_Revert() (gas: 155387) +EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_WithInvalidSourceTokenDataCount_Revert() (gas: 60494) +EVM2EVMOffRamp_metadataHash:test_MetadataHash_Success() (gas: 8895) +EVM2EVMOffRamp_setDynamicConfig:test_NonOwner_Revert() (gas: 40357) +EVM2EVMOffRamp_setDynamicConfig:test_RouterZeroAddress_Revert() (gas: 38419) +EVM2EVMOffRamp_setDynamicConfig:test_SetDynamicConfig_Success() (gas: 142469) +EVM2EVMOffRamp_updateRateLimitTokens:test_updateRateLimitTokens_AddsAndRemoves_Success() (gas: 162818) +EVM2EVMOffRamp_updateRateLimitTokens:test_updateRateLimitTokens_NonOwner_Revert() (gas: 16936) +EVM2EVMOffRamp_updateRateLimitTokens:test_updateRateLimitTokens_Success() (gas: 197985) +EVM2EVMOnRamp_constructor:test_Constructor_Success() (gas: 5056698) +EVM2EVMOnRamp_forwardFromRouter:test_CannotSendZeroTokens_Revert() (gas: 36063) +EVM2EVMOnRamp_forwardFromRouter:test_EnforceOutOfOrder_Revert() (gas: 99010) +EVM2EVMOnRamp_forwardFromRouter:test_ForwardFromRouterExtraArgsV2AllowOutOfOrderTrue_Success() (gas: 114925) +EVM2EVMOnRamp_forwardFromRouter:test_ForwardFromRouterExtraArgsV2_Success() (gas: 114967) +EVM2EVMOnRamp_forwardFromRouter:test_ForwardFromRouterSuccessCustomExtraArgs() (gas: 130991) +EVM2EVMOnRamp_forwardFromRouter:test_ForwardFromRouterSuccessLegacyExtraArgs() (gas: 139431) +EVM2EVMOnRamp_forwardFromRouter:test_ForwardFromRouter_Success() (gas: 130607) +EVM2EVMOnRamp_forwardFromRouter:test_InvalidAddressEncodePacked_Revert() (gas: 38647) +EVM2EVMOnRamp_forwardFromRouter:test_InvalidAddress_Revert() (gas: 38830) +EVM2EVMOnRamp_forwardFromRouter:test_InvalidChainSelector_Revert() (gas: 25726) +EVM2EVMOnRamp_forwardFromRouter:test_InvalidExtraArgsTag_Revert() (gas: 25545) +EVM2EVMOnRamp_forwardFromRouter:test_MaxCapacityExceeded_Revert() (gas: 84266) +EVM2EVMOnRamp_forwardFromRouter:test_MaxFeeBalanceReached_Revert() (gas: 36847) +EVM2EVMOnRamp_forwardFromRouter:test_MessageGasLimitTooHigh_Revert() (gas: 29327) +EVM2EVMOnRamp_forwardFromRouter:test_MessageTooLarge_Revert() (gas: 107850) +EVM2EVMOnRamp_forwardFromRouter:test_OriginalSender_Revert() (gas: 22823) +EVM2EVMOnRamp_forwardFromRouter:test_OverValueWithARLOff_Success() (gas: 226568) +EVM2EVMOnRamp_forwardFromRouter:test_Paused_Revert() (gas: 53432) +EVM2EVMOnRamp_forwardFromRouter:test_Permissions_Revert() (gas: 25757) +EVM2EVMOnRamp_forwardFromRouter:test_PriceNotFoundForToken_Revert() (gas: 57722) +EVM2EVMOnRamp_forwardFromRouter:test_ShouldIncrementNonceOnlyOnOrdered_Success() (gas: 182247) +EVM2EVMOnRamp_forwardFromRouter:test_ShouldIncrementSeqNumAndNonce_Success() (gas: 180718) +EVM2EVMOnRamp_forwardFromRouter:test_ShouldStoreNonLinkFees() (gas: 133236) +EVM2EVMOnRamp_forwardFromRouter:test_SourceTokenDataTooLarge_Revert() (gas: 3573653) +EVM2EVMOnRamp_forwardFromRouter:test_TooManyTokens_Revert() (gas: 30472) +EVM2EVMOnRamp_forwardFromRouter:test_Unhealthy_Revert() (gas: 43480) +EVM2EVMOnRamp_forwardFromRouter:test_UnsupportedToken_Revert() (gas: 110111) +EVM2EVMOnRamp_forwardFromRouter:test_ZeroAddressReceiver_Revert() (gas: 316020) +EVM2EVMOnRamp_forwardFromRouter:test_forwardFromRouter_ShouldStoreLinkFees_Success() (gas: 113033) +EVM2EVMOnRamp_forwardFromRouter:test_forwardFromRouter_UnsupportedToken_Revert() (gas: 72824) +EVM2EVMOnRamp_forwardFromRouter:test_forwardFromRouter_correctSourceTokenData_Success() (gas: 714726) +EVM2EVMOnRamp_forwardFromRouter_upgrade:test_V2NonceNewSenderStartsAtZero_Success() (gas: 148808) +EVM2EVMOnRamp_forwardFromRouter_upgrade:test_V2NonceStartsAtV1Nonce_Success() (gas: 192679) +EVM2EVMOnRamp_forwardFromRouter_upgrade:test_V2SenderNoncesReadsPreviousRamp_Success() (gas: 123243) +EVM2EVMOnRamp_forwardFromRouter_upgrade:test_V2_Success() (gas: 96028) +EVM2EVMOnRamp_getDataAvailabilityCost:test_EmptyMessageCalculatesDataAvailabilityCost_Success() (gas: 20598) +EVM2EVMOnRamp_getDataAvailabilityCost:test_SimpleMessageCalculatesDataAvailabilityCost_Success() (gas: 20966) +EVM2EVMOnRamp_getFee:test_EmptyMessage_Success() (gas: 74894) +EVM2EVMOnRamp_getFee:test_GetFeeOfZeroForTokenMessage_Success() (gas: 80393) +EVM2EVMOnRamp_getFee:test_HighGasMessage_Success() (gas: 230742) +EVM2EVMOnRamp_getFee:test_MessageGasLimitTooHigh_Revert() (gas: 16943) +EVM2EVMOnRamp_getFee:test_MessageTooLarge_Revert() (gas: 95505) +EVM2EVMOnRamp_getFee:test_MessageWithDataAndTokenTransfer_Success() (gas: 154010) +EVM2EVMOnRamp_getFee:test_NotAFeeToken_Revert() (gas: 24323) +EVM2EVMOnRamp_getFee:test_SingleTokenMessage_Success() (gas: 114740) +EVM2EVMOnRamp_getFee:test_TooManyTokens_Revert() (gas: 20142) +EVM2EVMOnRamp_getFee:test_ZeroDataAvailabilityMultiplier_Success() (gas: 63070) +EVM2EVMOnRamp_getSupportedTokens:test_GetSupportedTokens_Revert() (gas: 10532) +EVM2EVMOnRamp_getTokenPool:test_GetTokenPool_Success() (gas: 35297) +EVM2EVMOnRamp_getTokenTransferCost:test_CustomTokenBpsFee_Success() (gas: 43218) +EVM2EVMOnRamp_getTokenTransferCost:test_FeeTokenBpsFee_Success() (gas: 33280) +EVM2EVMOnRamp_getTokenTransferCost:test_LargeTokenTransferChargesMaxFeeAndGas_Success() (gas: 28551) +EVM2EVMOnRamp_getTokenTransferCost:test_MixedTokenTransferFee_Success() (gas: 122690) +EVM2EVMOnRamp_getTokenTransferCost:test_NoTokenTransferChargesZeroFee_Success() (gas: 15403) +EVM2EVMOnRamp_getTokenTransferCost:test_SmallTokenTransferChargesMinFeeAndGas_Success() (gas: 28359) +EVM2EVMOnRamp_getTokenTransferCost:test_UnsupportedToken_Revert() (gas: 21353) +EVM2EVMOnRamp_getTokenTransferCost:test_ZeroAmountTokenTransferChargesMinFeeAndGas_Success() (gas: 28382) +EVM2EVMOnRamp_getTokenTransferCost:test_ZeroFeeConfigChargesMinFee_Success() (gas: 38899) +EVM2EVMOnRamp_getTokenTransferCost:test__getTokenTransferCost_selfServeUsesDefaults_Success() (gas: 29674) +EVM2EVMOnRamp_linkAvailableForPayment:test_InsufficientLinkBalance_Success() (gas: 32756) +EVM2EVMOnRamp_linkAvailableForPayment:test_LinkAvailableForPayment_Success() (gas: 135247) +EVM2EVMOnRamp_payNops:test_AdminPayNops_Success() (gas: 143660) +EVM2EVMOnRamp_payNops:test_InsufficientBalance_Revert() (gas: 29196) +EVM2EVMOnRamp_payNops:test_NoFeesToPay_Revert() (gas: 127718) +EVM2EVMOnRamp_payNops:test_NoNopsToPay_Revert() (gas: 133580) +EVM2EVMOnRamp_payNops:test_NopPayNops_Success() (gas: 146947) +EVM2EVMOnRamp_payNops:test_OwnerPayNops_Success() (gas: 141522) +EVM2EVMOnRamp_payNops:test_PayNopsSuccessAfterSetNops() (gas: 298719) +EVM2EVMOnRamp_payNops:test_WrongPermissions_Revert() (gas: 15378) +EVM2EVMOnRamp_setDynamicConfig:test_SetConfigInvalidConfig_Revert() (gas: 42524) +EVM2EVMOnRamp_setDynamicConfig:test_SetConfigOnlyOwner_Revert() (gas: 21426) +EVM2EVMOnRamp_setDynamicConfig:test_SetDynamicConfig_Success() (gas: 54301) +EVM2EVMOnRamp_setFeeTokenConfig:test_OnlyCallableByOwnerOrAdmin_Revert() (gas: 13530) +EVM2EVMOnRamp_setFeeTokenConfig:test_SetFeeTokenConfigByAdmin_Success() (gas: 16497) +EVM2EVMOnRamp_setFeeTokenConfig:test_SetFeeTokenConfig_Success() (gas: 14036) +EVM2EVMOnRamp_setNops:test_AdminCanSetNops_Success() (gas: 61872) +EVM2EVMOnRamp_setNops:test_IncludesPayment_Success() (gas: 470835) +EVM2EVMOnRamp_setNops:test_LinkTokenCannotBeNop_Revert() (gas: 57370) +EVM2EVMOnRamp_setNops:test_NonOwnerOrAdmin_Revert() (gas: 14779) +EVM2EVMOnRamp_setNops:test_NotEnoughFundsForPayout_Revert() (gas: 85200) +EVM2EVMOnRamp_setNops:test_SetNopsRemovesOldNopsCompletely_Success() (gas: 60868) +EVM2EVMOnRamp_setNops:test_SetNops_Success() (gas: 174097) +EVM2EVMOnRamp_setNops:test_TooManyNops_Revert() (gas: 193503) +EVM2EVMOnRamp_setNops:test_ZeroAddressCannotBeNop_Revert() (gas: 53711) +EVM2EVMOnRamp_setTokenTransferFeeConfig:test__setTokenTransferFeeConfig_InvalidDestBytesOverhead_Revert() (gas: 14616) +EVM2EVMOnRamp_setTokenTransferFeeConfig:test__setTokenTransferFeeConfig_OnlyCallableByOwnerOrAdmin_Revert() (gas: 14427) +EVM2EVMOnRamp_setTokenTransferFeeConfig:test__setTokenTransferFeeConfig_Success() (gas: 85487) +EVM2EVMOnRamp_setTokenTransferFeeConfig:test__setTokenTransferFeeConfig_byAdmin_Success() (gas: 17468) +EVM2EVMOnRamp_withdrawNonLinkFees:test_LinkBalanceNotSettled_Revert() (gas: 83617) +EVM2EVMOnRamp_withdrawNonLinkFees:test_NonOwnerOrAdmin_Revert() (gas: 15353) +EVM2EVMOnRamp_withdrawNonLinkFees:test_SettlingBalance_Success() (gas: 272851) +EVM2EVMOnRamp_withdrawNonLinkFees:test_WithdrawNonLinkFees_Success() (gas: 53566) +EVM2EVMOnRamp_withdrawNonLinkFees:test_WithdrawToZeroAddress_Revert() (gas: 12875) +EtherSenderReceiverTest_ccipReceive:test_ccipReceive_fallbackToWethTransfer() (gas: 96907) +EtherSenderReceiverTest_ccipReceive:test_ccipReceive_happyPath() (gas: 49775) +EtherSenderReceiverTest_ccipReceive:test_ccipReceive_wrongToken() (gas: 17435) +EtherSenderReceiverTest_ccipReceive:test_ccipReceive_wrongTokenAmount() (gas: 15728) +EtherSenderReceiverTest_ccipSend:test_ccipSend_reverts_insufficientFee_feeToken() (gas: 99909) +EtherSenderReceiverTest_ccipSend:test_ccipSend_reverts_insufficientFee_native() (gas: 76138) +EtherSenderReceiverTest_ccipSend:test_ccipSend_reverts_insufficientFee_weth() (gas: 99931) +EtherSenderReceiverTest_ccipSend:test_ccipSend_success_feeToken() (gas: 145010) +EtherSenderReceiverTest_ccipSend:test_ccipSend_success_native() (gas: 80373) +EtherSenderReceiverTest_ccipSend:test_ccipSend_success_nativeExcess() (gas: 80560) +EtherSenderReceiverTest_ccipSend:test_ccipSend_success_weth() (gas: 96064) +EtherSenderReceiverTest_constructor:test_constructor() (gas: 17553) +EtherSenderReceiverTest_getFee:test_getFee() (gas: 27346) +EtherSenderReceiverTest_validateFeeToken:test_validateFeeToken_reverts_feeToken_tokenAmountNotEqualToMsgValue() (gas: 20375) +EtherSenderReceiverTest_validateFeeToken:test_validateFeeToken_valid_feeToken() (gas: 16724) +EtherSenderReceiverTest_validateFeeToken:test_validateFeeToken_valid_native() (gas: 16657) +EtherSenderReceiverTest_validatedMessage:test_validatedMessage_dataOverwrittenToMsgSender() (gas: 25457) +EtherSenderReceiverTest_validatedMessage:test_validatedMessage_emptyDataOverwrittenToMsgSender() (gas: 25307) +EtherSenderReceiverTest_validatedMessage:test_validatedMessage_invalidTokenAmounts() (gas: 17925) +EtherSenderReceiverTest_validatedMessage:test_validatedMessage_tokenOverwrittenToWeth() (gas: 25329) +EtherSenderReceiverTest_validatedMessage:test_validatedMessage_validMessage_extraArgs() (gas: 26370) FactoryBurnMintERC20approve:testApproveSuccess() (gas: 55767) FactoryBurnMintERC20approve:testInvalidAddressReverts() (gas: 10709) FactoryBurnMintERC20burn:testBasicBurnSuccess() (gas: 172380) @@ -346,251 +346,251 @@ FactoryBurnMintERC20mint:testSenderNotMinterReverts() (gas: 11328) FactoryBurnMintERC20supportsInterface:testConstructorSuccess() (gas: 11396) FactoryBurnMintERC20transfer:testInvalidAddressReverts() (gas: 10707) FactoryBurnMintERC20transfer:testTransferSuccess() (gas: 42427) -FeeQuoter_applyDestChainConfigUpdates:test_InvalidChainFamilySelector_Revert() (gas: 21287) -FeeQuoter_applyDestChainConfigUpdates:test_InvalidDestChainConfigDestChainSelectorEqZero_Revert() (gas: 21260) -FeeQuoter_applyDestChainConfigUpdates:test_applyDestChainConfigUpdatesDefaultTxGasLimitEqZero_Revert() (gas: 21273) -FeeQuoter_applyDestChainConfigUpdates:test_applyDestChainConfigUpdatesDefaultTxGasLimitGtMaxPerMessageGasLimit_Revert() (gas: 49746) -FeeQuoter_applyDestChainConfigUpdates:test_applyDestChainConfigUpdatesZeroIntput_Success() (gas: 13305) -FeeQuoter_applyDestChainConfigUpdates:test_applyDestChainConfigUpdates_Success() (gas: 168513) -FeeQuoter_applyFeeTokensUpdates:test_ApplyFeeTokensUpdates_Success() (gas: 92061) -FeeQuoter_applyFeeTokensUpdates:test_OnlyCallableByOwner_Revert() (gas: 14447) -FeeQuoter_applyPremiumMultiplierWeiPerEthUpdates:test_OnlyCallableByOwnerOrAdmin_Revert() (gas: 12564) -FeeQuoter_applyPremiumMultiplierWeiPerEthUpdates:test_applyPremiumMultiplierWeiPerEthUpdatesMultipleTokens_Success() (gas: 61121) -FeeQuoter_applyPremiumMultiplierWeiPerEthUpdates:test_applyPremiumMultiplierWeiPerEthUpdatesSingleToken_Success() (gas: 48797) -FeeQuoter_applyPremiumMultiplierWeiPerEthUpdates:test_applyPremiumMultiplierWeiPerEthUpdatesZeroInput() (gas: 13248) -FeeQuoter_applyTokenTransferFeeConfigUpdates:test_ApplyTokenTransferFeeConfig_Success() (gas: 118031) -FeeQuoter_applyTokenTransferFeeConfigUpdates:test_ApplyTokenTransferFeeZeroInput() (gas: 14427) -FeeQuoter_applyTokenTransferFeeConfigUpdates:test_InvalidDestBytesOverhead_Revert() (gas: 21388) -FeeQuoter_applyTokenTransferFeeConfigUpdates:test_OnlyCallableByOwnerOrAdmin_Revert() (gas: 13659) -FeeQuoter_constructor:test_InvalidLinkTokenEqZeroAddress_Revert() (gas: 127807) -FeeQuoter_constructor:test_InvalidMaxFeeJuelsPerMsg_Revert() (gas: 132149) -FeeQuoter_constructor:test_InvalidStalenessThreshold_Revert() (gas: 132196) -FeeQuoter_constructor:test_Setup_Success() (gas: 7908400) -FeeQuoter_convertTokenAmount:test_ConvertTokenAmount_Success() (gas: 74951) -FeeQuoter_convertTokenAmount:test_LinkTokenNotSupported_Revert() (gas: 34055) -FeeQuoter_getDataAvailabilityCost:test_EmptyMessageCalculatesDataAvailabilityCost_Success() (gas: 124958) -FeeQuoter_getDataAvailabilityCost:test_SimpleMessageCalculatesDataAvailabilityCostUnsupportedDestChainSelector_Success() (gas: 20691) -FeeQuoter_getDataAvailabilityCost:test_SimpleMessageCalculatesDataAvailabilityCost_Success() (gas: 33048) -FeeQuoter_getTokenAndGasPrices:test_GetFeeTokenAndGasPrices_Success() (gas: 73952) -FeeQuoter_getTokenAndGasPrices:test_StaleGasPrice_Revert() (gas: 19223) -FeeQuoter_getTokenAndGasPrices:test_UnsupportedChain_Revert() (gas: 17728) -FeeQuoter_getTokenAndGasPrices:test_ZeroGasPrice_Success() (gas: 47642) -FeeQuoter_getTokenPrice:test_GetTokenPriceFromFeed_Success() (gas: 74567) -FeeQuoter_getTokenPrices:test_GetTokenPrices_Success() (gas: 87892) -FeeQuoter_getTokenTransferCost:test_CustomTokenBpsFee_Success() (gas: 51274) -FeeQuoter_getTokenTransferCost:test_FeeTokenBpsFee_Success() (gas: 46576) -FeeQuoter_getTokenTransferCost:test_LargeTokenTransferChargesMaxFeeAndGas_Success() (gas: 39182) -FeeQuoter_getTokenTransferCost:test_MixedTokenTransferFee_Success() (gas: 161432) -FeeQuoter_getTokenTransferCost:test_NoTokenTransferChargesZeroFee_Success() (gas: 25553) -FeeQuoter_getTokenTransferCost:test_SmallTokenTransferChargesMinFeeAndGas_Success() (gas: 38832) -FeeQuoter_getTokenTransferCost:test_ZeroAmountTokenTransferChargesMinFeeAndGas_Success() (gas: 38788) -FeeQuoter_getTokenTransferCost:test_ZeroFeeConfigChargesMinFee_Success() (gas: 53538) -FeeQuoter_getTokenTransferCost:test_getTokenTransferCost_selfServeUsesDefaults_Success() (gas: 40215) -FeeQuoter_getValidatedFee:test_DestinationChainNotEnabled_Revert() (gas: 23180) -FeeQuoter_getValidatedFee:test_EmptyMessage_Success() (gas: 126780) -FeeQuoter_getValidatedFee:test_EnforceOutOfOrder_Revert() (gas: 65331) -FeeQuoter_getValidatedFee:test_HighGasMessage_Success() (gas: 298759) -FeeQuoter_getValidatedFee:test_InvalidEVMAddress_Revert() (gas: 27952) -FeeQuoter_getValidatedFee:test_MessageGasLimitTooHigh_Revert() (gas: 37814) -FeeQuoter_getValidatedFee:test_MessageTooLarge_Revert() (gas: 113039) -FeeQuoter_getValidatedFee:test_MessageWithDataAndTokenTransfer_Success() (gas: 244565) -FeeQuoter_getValidatedFee:test_NotAFeeToken_Revert() (gas: 26700) -FeeQuoter_getValidatedFee:test_SingleTokenMessage_Success() (gas: 189634) -FeeQuoter_getValidatedFee:test_TooManyTokens_Revert() (gas: 29755) -FeeQuoter_getValidatedFee:test_ZeroDataAvailabilityMultiplier_Success() (gas: 82721) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedErc20Above18Decimals_Success() (gas: 3425326) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedErc20Below18Decimals_Success() (gas: 3425261) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFeedAt0Decimals_Success() (gas: 3405403) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFeedAt18Decimals_Success() (gas: 3425009) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFlippedDecimals_Success() (gas: 3425222) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedMaxInt224Value_Success() (gas: 3425016) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedOverStalenessPeriod_Success() (gas: 71128) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeed_Success() (gas: 70962) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPrice_Success() (gas: 63583) -FeeQuoter_getValidatedTokenPrice:test_OverflowFeedPrice_Revert() (gas: 3424704) -FeeQuoter_getValidatedTokenPrice:test_StaleFeeToken_Success() (gas: 66998) -FeeQuoter_getValidatedTokenPrice:test_TokenNotSupportedFeed_Revert() (gas: 122906) -FeeQuoter_getValidatedTokenPrice:test_TokenNotSupported_Revert() (gas: 15635) -FeeQuoter_getValidatedTokenPrice:test_UnderflowFeedPrice_Revert() (gas: 3422488) -FeeQuoter_onReport:test_OnReport_StaleUpdate_Revert() (gas: 55021) -FeeQuoter_onReport:test_onReport_InvalidForwarder_Reverts() (gas: 27666) -FeeQuoter_onReport:test_onReport_Success() (gas: 98820) -FeeQuoter_onReport:test_onReport_UnsupportedToken_Reverts() (gas: 31209) -FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsDefault_Success() (gas: 23993) -FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsEnforceOutOfOrder_Revert() (gas: 28138) -FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsGasLimitTooHigh_Revert() (gas: 25276) -FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsInvalidExtraArgsTag_Revert() (gas: 24171) -FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsV1_Success() (gas: 25547) -FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsV2_Success() (gas: 26085) -FeeQuoter_processMessageArgs:test_processMessageArgs_InvalidEVMAddressDestToken_Revert() (gas: 53875) -FeeQuoter_processMessageArgs:test_processMessageArgs_InvalidExtraArgs_Revert() (gas: 22252) -FeeQuoter_processMessageArgs:test_processMessageArgs_MalformedEVMExtraArgs_Revert() (gas: 22714) -FeeQuoter_processMessageArgs:test_processMessageArgs_MessageFeeTooHigh_Revert() (gas: 20791) -FeeQuoter_processMessageArgs:test_processMessageArgs_SourceTokenDataTooLarge_Revert() (gas: 159879) -FeeQuoter_processMessageArgs:test_processMessageArgs_TokenAmountArraysMismatching_Revert() (gas: 49920) -FeeQuoter_processMessageArgs:test_processMessageArgs_WitEVMExtraArgsV2_Success() (gas: 37697) -FeeQuoter_processMessageArgs:test_processMessageArgs_WithConvertedTokenAmount_Success() (gas: 36217) -FeeQuoter_processMessageArgs:test_processMessageArgs_WithCorrectPoolReturnData_Success() (gas: 96367) -FeeQuoter_processMessageArgs:test_processMessageArgs_WithEVMExtraArgsV1_Success() (gas: 36520) -FeeQuoter_processMessageArgs:test_processMessageArgs_WithEmptyEVMExtraArgs_Success() (gas: 33576) -FeeQuoter_processMessageArgs:test_processMessageArgs_WithLinkTokenAmount_Success() (gas: 22717) -FeeQuoter_updatePrices:test_OnlyCallableByUpdater_Revert() (gas: 13531) -FeeQuoter_updatePrices:test_OnlyGasPrice_Success() (gas: 27566) -FeeQuoter_updatePrices:test_OnlyTokenPrice_Success() (gas: 32627) -FeeQuoter_updatePrices:test_UpdatableByAuthorizedCaller_Success() (gas: 83557) -FeeQuoter_updatePrices:test_UpdateMultiplePrices_Success() (gas: 165439) -FeeQuoter_updateTokenPriceFeeds:test_FeedNotUpdated() (gas: 57411) -FeeQuoter_updateTokenPriceFeeds:test_FeedUnset_Success() (gas: 75829) -FeeQuoter_updateTokenPriceFeeds:test_FeedUpdatedByNonOwner_Revert() (gas: 22380) -FeeQuoter_updateTokenPriceFeeds:test_MultipleFeedUpdate_Success() (gas: 101508) -FeeQuoter_updateTokenPriceFeeds:test_SingleFeedUpdate_Success() (gas: 57373) -FeeQuoter_updateTokenPriceFeeds:test_ZeroFeeds_Success() (gas: 13342) -FeeQuoter_validateDestFamilyAddress:test_InvalidEVMAddressEncodePacked_Revert() (gas: 12222) -FeeQuoter_validateDestFamilyAddress:test_InvalidEVMAddressPrecompiles_Revert() (gas: 5634878) -FeeQuoter_validateDestFamilyAddress:test_InvalidEVMAddress_Revert() (gas: 12371) -FeeQuoter_validateDestFamilyAddress:test_ValidEVMAddress_Success() (gas: 7769) -FeeQuoter_validateDestFamilyAddress:test_ValidNonEVMAddress_Success() (gas: 7345) -HybridUSDCTokenPoolMigrationTests:test_LockOrBurn_LockReleaseMechanism_then_switchToPrimary_Success() (gas: 234768) -HybridUSDCTokenPoolMigrationTests:test_LockOrBurn_PrimaryMechanism_Success() (gas: 150751) -HybridUSDCTokenPoolMigrationTests:test_LockOrBurn_WhileMigrationPause_Revert() (gas: 113661) -HybridUSDCTokenPoolMigrationTests:test_LockOrBurn_onLockReleaseMechanism_Success() (gas: 154754) -HybridUSDCTokenPoolMigrationTests:test_MintOrRelease_OnLockReleaseMechanism_Success() (gas: 233895) -HybridUSDCTokenPoolMigrationTests:test_MintOrRelease_OnLockReleaseMechanism_then_switchToPrimary_Success() (gas: 509579) -HybridUSDCTokenPoolMigrationTests:test_MintOrRelease_incomingMessageWithPrimaryMechanism() (gas: 327065) -HybridUSDCTokenPoolMigrationTests:test_ReleaseOrMint_WhileMigrationPause_Revert() (gas: 122081) -HybridUSDCTokenPoolMigrationTests:test_burnLockedUSDC_invalidPermissions_Revert() (gas: 41448) -HybridUSDCTokenPoolMigrationTests:test_cancelExistingCCTPMigrationProposal() (gas: 35499) -HybridUSDCTokenPoolMigrationTests:test_cannotCancelANonExistentMigrationProposal() (gas: 12889) -HybridUSDCTokenPoolMigrationTests:test_cannotModifyLiquidityWithoutPermissions_Revert() (gas: 15409) -HybridUSDCTokenPoolMigrationTests:test_cannotTransferLiquidityDuringPendingMigration_Revert() (gas: 167516) -HybridUSDCTokenPoolMigrationTests:test_lockOrBurn_then_BurnInCCTPMigration_Success() (gas: 283817) -HybridUSDCTokenPoolMigrationTests:test_transferLiquidity_Success() (gas: 176428) -HybridUSDCTokenPoolMigrationTests:test_unstickManualTxAfterMigration_destChain_Success() (gas: 176729) -HybridUSDCTokenPoolMigrationTests:test_unstickManualTxAfterMigration_homeChain_Success() (gas: 538840) -HybridUSDCTokenPoolTests:test_LockOrBurn_LockReleaseMechanism_then_switchToPrimary_Success() (gas: 234786) -HybridUSDCTokenPoolTests:test_LockOrBurn_PrimaryMechanism_Success() (gas: 150729) -HybridUSDCTokenPoolTests:test_LockOrBurn_WhileMigrationPause_Revert() (gas: 113683) -HybridUSDCTokenPoolTests:test_LockOrBurn_onLockReleaseMechanism_Success() (gas: 154776) -HybridUSDCTokenPoolTests:test_MintOrRelease_OnLockReleaseMechanism_Success() (gas: 233917) -HybridUSDCTokenPoolTests:test_MintOrRelease_OnLockReleaseMechanism_then_switchToPrimary_Success() (gas: 509534) -HybridUSDCTokenPoolTests:test_MintOrRelease_incomingMessageWithPrimaryMechanism() (gas: 327020) -HybridUSDCTokenPoolTests:test_ReleaseOrMint_WhileMigrationPause_Revert() (gas: 122147) -HybridUSDCTokenPoolTests:test_cannotTransferLiquidityDuringPendingMigration_Revert() (gas: 167494) -HybridUSDCTokenPoolTests:test_transferLiquidity_Success() (gas: 176445) -LockReleaseTokenPoolAndProxy_setRebalancer:test_SetRebalancer_Revert() (gas: 11968) -LockReleaseTokenPoolAndProxy_setRebalancer:test_SetRebalancer_Success() (gas: 19761) -LockReleaseTokenPoolPoolAndProxy_canAcceptLiquidity:test_CanAcceptLiquidity_Success() (gas: 5147538) -LockReleaseTokenPoolPoolAndProxy_provideLiquidity:test_LiquidityNotAccepted_Revert() (gas: 5143388) -LockReleaseTokenPoolPoolAndProxy_provideLiquidity:test_Unauthorized_Revert() (gas: 12683) -LockReleaseTokenPoolPoolAndProxy_supportsInterface:test_SupportsInterface_Success() (gas: 11613) -LockReleaseTokenPoolPoolAndProxy_withdrawalLiquidity:test_InsufficientLiquidity_Revert() (gas: 64820) -LockReleaseTokenPoolPoolAndProxy_withdrawalLiquidity:test_Unauthorized_Revert() (gas: 12647) -LockReleaseTokenPool_canAcceptLiquidity:test_CanAcceptLiquidity_Success() (gas: 4775338) -LockReleaseTokenPool_lockOrBurn:test_LockOrBurnWithAllowList_Revert() (gas: 33986) -LockReleaseTokenPool_lockOrBurn:test_LockOrBurnWithAllowList_Success() (gas: 91128) -LockReleaseTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 64965) -LockReleaseTokenPool_provideLiquidity:test_LiquidityNotAccepted_Revert() (gas: 4771254) -LockReleaseTokenPool_provideLiquidity:test_Unauthorized_Revert() (gas: 12661) -LockReleaseTokenPool_releaseOrMint:test_ChainNotAllowed_Revert() (gas: 81914) -LockReleaseTokenPool_releaseOrMint:test_PoolMintNotHealthy_Revert() (gas: 63333) -LockReleaseTokenPool_releaseOrMint:test_ReleaseOrMint_Success() (gas: 274666) -LockReleaseTokenPool_setRebalancer:test_SetRebalancer_Revert() (gas: 11990) -LockReleaseTokenPool_setRebalancer:test_SetRebalancer_Success() (gas: 19783) -LockReleaseTokenPool_supportsInterface:test_SupportsInterface_Success() (gas: 11613) -LockReleaseTokenPool_transferLiquidity:test_transferLiquidity_Success() (gas: 88490) -LockReleaseTokenPool_transferLiquidity:test_transferLiquidity_transferTooMuch_Revert() (gas: 59808) -LockReleaseTokenPool_withdrawalLiquidity:test_InsufficientLiquidity_Revert() (gas: 64803) -LockReleaseTokenPool_withdrawalLiquidity:test_Unauthorized_Revert() (gas: 12647) -LockRelease_setRateLimitAdmin:test_SetRateLimitAdmin_Revert() (gas: 12033) -LockRelease_setRateLimitAdmin:test_SetRateLimitAdmin_Success() (gas: 36728) -MerkleMultiProofTest:test_CVE_2023_34459() (gas: 6372) -MerkleMultiProofTest:test_EmptyLeaf_Revert() (gas: 4019) -MerkleMultiProofTest:test_MerkleRoot256() (gas: 668330) -MerkleMultiProofTest:test_MerkleRootSingleLeaf_Success() (gas: 4074) -MerkleMultiProofTest:test_SpecSync_gas() (gas: 49338) -MockRouterTest:test_ccipSendWithInsufficientNativeTokens_Revert() (gas: 37132) -MockRouterTest:test_ccipSendWithInvalidMsgValue_Revert() (gas: 64034) -MockRouterTest:test_ccipSendWithLinkFeeTokenAndValidMsgValue_Success() (gas: 135267) -MockRouterTest:test_ccipSendWithLinkFeeTokenbutInsufficientAllowance_Revert() (gas: 68119) -MockRouterTest:test_ccipSendWithSufficientNativeFeeTokens_Success() (gas: 48403) -MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_MultipleConfigsBothLanes_Success() (gas: 150584) -MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_MultipleConfigs_Success() (gas: 357431) -MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_OnlyCallableByOwner_Revert() (gas: 20693) -MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_SingleConfigOutbound_Success() (gas: 85456) -MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_SingleConfig_Success() (gas: 85382) -MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_UpdateExistingConfigWithNoDifference_Success() (gas: 49626) -MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_UpdateExistingConfig_Success() (gas: 68052) -MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_ZeroChainSelector_Revert() (gas: 19536) -MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_ZeroConfigs_Success() (gas: 13331) -MultiAggregateRateLimiter_constructor:test_ConstructorNoAuthorizedCallers_Success() (gas: 3286151) -MultiAggregateRateLimiter_constructor:test_Constructor_Success() (gas: 3403578) -MultiAggregateRateLimiter_getTokenBucket:test_GetTokenBucket_Success() (gas: 38652) -MultiAggregateRateLimiter_getTokenBucket:test_Refill_Success() (gas: 63823) -MultiAggregateRateLimiter_getTokenBucket:test_TimeUnderflow_Revert() (gas: 18548) -MultiAggregateRateLimiter_getTokenValue:test_GetTokenValue_Success() (gas: 20837) -MultiAggregateRateLimiter_getTokenValue:test_NoTokenPrice_Reverts() (gas: 25361) -MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageFromUnauthorizedCaller_Revert() (gas: 17951) -MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithDifferentTokensOnDifferentChains_Success() (gas: 242409) -MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithDisabledRateLimitToken_Success() (gas: 68454) -MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithNoTokens_Success() (gas: 21034) -MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithRateLimitDisabled_Success() (gas: 53968) -MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithRateLimitExceeded_Revert() (gas: 56502) -MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithRateLimitReset_Success() (gas: 108389) -MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithTokensOnDifferentChains_Success() (gas: 344604) -MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithTokens_Success() (gas: 60097) -MultiAggregateRateLimiter_onOutboundMessage:test_RateLimitValueDifferentLanes_Success() (gas: 1073657377) -MultiAggregateRateLimiter_onOutboundMessage:test_ValidateMessageWithNoTokens_Success() (gas: 21497) -MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageFromUnauthorizedCaller_Revert() (gas: 18167) -MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithDifferentTokensOnDifferentChains_Success() (gas: 240199) -MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithDisabledRateLimitToken_Success() (gas: 69225) -MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithRateLimitDisabled_Success() (gas: 54803) -MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithRateLimitExceeded_Revert() (gas: 57316) -MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithRateLimitReset_Success() (gas: 105576) -MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithTokensOnDifferentChains_Success() (gas: 342731) -MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithTokens_Success() (gas: 60912) -MultiAggregateRateLimiter_setFeeQuoter:test_OnlyOwner_Revert() (gas: 12286) -MultiAggregateRateLimiter_setFeeQuoter:test_Owner_Success() (gas: 20439) -MultiAggregateRateLimiter_setFeeQuoter:test_ZeroAddress_Revert() (gas: 11124) -MultiAggregateRateLimiter_updateRateLimitTokens:test_NonOwner_Revert() (gas: 26352) -MultiAggregateRateLimiter_updateRateLimitTokens:test_UpdateRateLimitTokensMultipleChains_Success() (gas: 292916) -MultiAggregateRateLimiter_updateRateLimitTokens:test_UpdateRateLimitTokensSingleChain_Success() (gas: 265872) -MultiAggregateRateLimiter_updateRateLimitTokens:test_UpdateRateLimitTokens_AddsAndRemoves_Success() (gas: 214939) -MultiAggregateRateLimiter_updateRateLimitTokens:test_UpdateRateLimitTokens_RemoveNonExistentToken_Success() (gas: 32607) -MultiAggregateRateLimiter_updateRateLimitTokens:test_ZeroDestToken_Revert() (gas: 21085) -MultiAggregateRateLimiter_updateRateLimitTokens:test_ZeroSourceToken_Revert() (gas: 20891) -MultiOCR3Base_setOCR3Configs:test_FMustBePositive_Revert() (gas: 72005) -MultiOCR3Base_setOCR3Configs:test_FTooHigh_Revert() (gas: 49229) -MultiOCR3Base_setOCR3Configs:test_MoreTransmittersThanSigners_Revert() (gas: 115903) -MultiOCR3Base_setOCR3Configs:test_NoTransmitters_Revert() (gas: 23219) -MultiOCR3Base_setOCR3Configs:test_RepeatSignerAddress_Revert() (gas: 296831) -MultiOCR3Base_setOCR3Configs:test_RepeatTransmitterAddress_Revert() (gas: 437346) -MultiOCR3Base_setOCR3Configs:test_SetConfigIgnoreSigners_Success() (gas: 557001) -MultiOCR3Base_setOCR3Configs:test_SetConfigWithSignersMismatchingTransmitters_Success() (gas: 719687) -MultiOCR3Base_setOCR3Configs:test_SetConfigWithSigners_Success() (gas: 874847) -MultiOCR3Base_setOCR3Configs:test_SetConfigWithoutSigners_Success() (gas: 486312) -MultiOCR3Base_setOCR3Configs:test_SetConfigsZeroInput_Success() (gas: 13373) -MultiOCR3Base_setOCR3Configs:test_SetMultipleConfigs_Success() (gas: 2266810) -MultiOCR3Base_setOCR3Configs:test_SignerCannotBeZeroAddress_Revert() (gas: 152944) -MultiOCR3Base_setOCR3Configs:test_StaticConfigChange_Revert() (gas: 841242) -MultiOCR3Base_setOCR3Configs:test_TooManySigners_Revert() (gas: 312041) -MultiOCR3Base_setOCR3Configs:test_TooManyTransmitters_Revert() (gas: 261347) -MultiOCR3Base_setOCR3Configs:test_TransmitterCannotBeZeroAddress_Revert() (gas: 266581) -MultiOCR3Base_setOCR3Configs:test_UpdateConfigSigners_Success() (gas: 930576) -MultiOCR3Base_setOCR3Configs:test_UpdateConfigTransmittersWithoutSigners_Success() (gas: 516830) -MultiOCR3Base_transmit:test_ConfigDigestMismatch_Revert() (gas: 49771) -MultiOCR3Base_transmit:test_ForkedChain_Revert() (gas: 56488) -MultiOCR3Base_transmit:test_InsufficientSignatures_Revert() (gas: 87043) -MultiOCR3Base_transmit:test_NonUniqueSignature_Revert() (gas: 75511) -MultiOCR3Base_transmit:test_SignatureOutOfRegistration_Revert() (gas: 38453) -MultiOCR3Base_transmit:test_TooManySignatures_Revert() (gas: 92076) -MultiOCR3Base_transmit:test_TransmitSigners_gas_Success() (gas: 39865) -MultiOCR3Base_transmit:test_TransmitWithExtraCalldataArgs_Revert() (gas: 52756) -MultiOCR3Base_transmit:test_TransmitWithLessCalldataArgs_Revert() (gas: 30083) -MultiOCR3Base_transmit:test_TransmitWithoutSignatureVerification_gas_Success() (gas: 21035) -MultiOCR3Base_transmit:test_UnAuthorizedTransmitter_Revert() (gas: 29105) -MultiOCR3Base_transmit:test_UnauthorizedSigner_Revert() (gas: 69917) -MultiOCR3Base_transmit:test_UnconfiguredPlugin_Revert() (gas: 42537) -MultiOCR3Base_transmit:test_ZeroSignatures_Revert() (gas: 37478) +FeeQuoter_applyDestChainConfigUpdates:test_InvalidChainFamilySelector_Revert() (gas: 16686) +FeeQuoter_applyDestChainConfigUpdates:test_InvalidDestChainConfigDestChainSelectorEqZero_Revert() (gas: 16588) +FeeQuoter_applyDestChainConfigUpdates:test_applyDestChainConfigUpdatesDefaultTxGasLimitEqZero_Revert() (gas: 16630) +FeeQuoter_applyDestChainConfigUpdates:test_applyDestChainConfigUpdatesDefaultTxGasLimitGtMaxPerMessageGasLimit_Revert() (gas: 40326) +FeeQuoter_applyDestChainConfigUpdates:test_applyDestChainConfigUpdatesZeroIntput_Success() (gas: 12483) +FeeQuoter_applyDestChainConfigUpdates:test_applyDestChainConfigUpdates_Success() (gas: 137553) +FeeQuoter_applyFeeTokensUpdates:test_ApplyFeeTokensUpdates_Success() (gas: 80348) +FeeQuoter_applyFeeTokensUpdates:test_OnlyCallableByOwner_Revert() (gas: 12687) +FeeQuoter_applyPremiumMultiplierWeiPerEthUpdates:test_OnlyCallableByOwnerOrAdmin_Revert() (gas: 11547) +FeeQuoter_applyPremiumMultiplierWeiPerEthUpdates:test_applyPremiumMultiplierWeiPerEthUpdatesMultipleTokens_Success() (gas: 54684) +FeeQuoter_applyPremiumMultiplierWeiPerEthUpdates:test_applyPremiumMultiplierWeiPerEthUpdatesSingleToken_Success() (gas: 45130) +FeeQuoter_applyPremiumMultiplierWeiPerEthUpdates:test_applyPremiumMultiplierWeiPerEthUpdatesZeroInput() (gas: 12332) +FeeQuoter_applyTokenTransferFeeConfigUpdates:test_ApplyTokenTransferFeeConfig_Success() (gas: 87721) +FeeQuoter_applyTokenTransferFeeConfigUpdates:test_ApplyTokenTransferFeeZeroInput() (gas: 13233) +FeeQuoter_applyTokenTransferFeeConfigUpdates:test_InvalidDestBytesOverhead_Revert() (gas: 17278) +FeeQuoter_applyTokenTransferFeeConfigUpdates:test_OnlyCallableByOwnerOrAdmin_Revert() (gas: 12330) +FeeQuoter_constructor:test_InvalidLinkTokenEqZeroAddress_Revert() (gas: 106501) +FeeQuoter_constructor:test_InvalidMaxFeeJuelsPerMsg_Revert() (gas: 110851) +FeeQuoter_constructor:test_InvalidStalenessThreshold_Revert() (gas: 110904) +FeeQuoter_constructor:test_Setup_Success() (gas: 4972944) +FeeQuoter_convertTokenAmount:test_ConvertTokenAmount_Success() (gas: 68383) +FeeQuoter_convertTokenAmount:test_LinkTokenNotSupported_Revert() (gas: 29076) +FeeQuoter_getDataAvailabilityCost:test_EmptyMessageCalculatesDataAvailabilityCost_Success() (gas: 94781) +FeeQuoter_getDataAvailabilityCost:test_SimpleMessageCalculatesDataAvailabilityCostUnsupportedDestChainSelector_Success() (gas: 14670) +FeeQuoter_getDataAvailabilityCost:test_SimpleMessageCalculatesDataAvailabilityCost_Success() (gas: 20550) +FeeQuoter_getTokenAndGasPrices:test_GetFeeTokenAndGasPrices_Success() (gas: 68298) +FeeQuoter_getTokenAndGasPrices:test_StaleGasPrice_Revert() (gas: 16892) +FeeQuoter_getTokenAndGasPrices:test_UnsupportedChain_Revert() (gas: 16188) +FeeQuoter_getTokenAndGasPrices:test_ZeroGasPrice_Success() (gas: 43667) +FeeQuoter_getTokenPrice:test_GetTokenPriceFromFeed_Success() (gas: 66273) +FeeQuoter_getTokenPrices:test_GetTokenPrices_Success() (gas: 78322) +FeeQuoter_getTokenTransferCost:test_CustomTokenBpsFee_Success() (gas: 39244) +FeeQuoter_getTokenTransferCost:test_FeeTokenBpsFee_Success() (gas: 34880) +FeeQuoter_getTokenTransferCost:test_LargeTokenTransferChargesMaxFeeAndGas_Success() (gas: 27954) +FeeQuoter_getTokenTransferCost:test_MixedTokenTransferFee_Success() (gas: 97513) +FeeQuoter_getTokenTransferCost:test_NoTokenTransferChargesZeroFee_Success() (gas: 20468) +FeeQuoter_getTokenTransferCost:test_SmallTokenTransferChargesMinFeeAndGas_Success() (gas: 27829) +FeeQuoter_getTokenTransferCost:test_ZeroAmountTokenTransferChargesMinFeeAndGas_Success() (gas: 27785) +FeeQuoter_getTokenTransferCost:test_ZeroFeeConfigChargesMinFee_Success() (gas: 40376) +FeeQuoter_getTokenTransferCost:test_getTokenTransferCost_selfServeUsesDefaults_Success() (gas: 29503) +FeeQuoter_getValidatedFee:test_DestinationChainNotEnabled_Revert() (gas: 18315) +FeeQuoter_getValidatedFee:test_EmptyMessage_Success() (gas: 82344) +FeeQuoter_getValidatedFee:test_EnforceOutOfOrder_Revert() (gas: 52638) +FeeQuoter_getValidatedFee:test_HighGasMessage_Success() (gas: 238762) +FeeQuoter_getValidatedFee:test_InvalidEVMAddress_Revert() (gas: 22555) +FeeQuoter_getValidatedFee:test_MessageGasLimitTooHigh_Revert() (gas: 29847) +FeeQuoter_getValidatedFee:test_MessageTooLarge_Revert() (gas: 100292) +FeeQuoter_getValidatedFee:test_MessageWithDataAndTokenTransfer_Success() (gas: 141892) +FeeQuoter_getValidatedFee:test_NotAFeeToken_Revert() (gas: 21172) +FeeQuoter_getValidatedFee:test_SingleTokenMessage_Success() (gas: 113309) +FeeQuoter_getValidatedFee:test_TooManyTokens_Revert() (gas: 22691) +FeeQuoter_getValidatedFee:test_ZeroDataAvailabilityMultiplier_Success() (gas: 62714) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedErc20Above18Decimals_Success() (gas: 1973707) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedErc20Below18Decimals_Success() (gas: 1973665) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFeedAt0Decimals_Success() (gas: 1953784) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFeedAt18Decimals_Success() (gas: 1973439) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFlippedDecimals_Success() (gas: 1973643) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedMaxInt224Value_Success() (gas: 1973455) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedOverStalenessPeriod_Success() (gas: 64610) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeed_Success() (gas: 64490) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPrice_Success() (gas: 58894) +FeeQuoter_getValidatedTokenPrice:test_OverflowFeedPrice_Revert() (gas: 1973152) +FeeQuoter_getValidatedTokenPrice:test_StaleFeeToken_Success() (gas: 61764) +FeeQuoter_getValidatedTokenPrice:test_TokenNotSupportedFeed_Revert() (gas: 116495) +FeeQuoter_getValidatedTokenPrice:test_TokenNotSupported_Revert() (gas: 14037) +FeeQuoter_getValidatedTokenPrice:test_UnderflowFeedPrice_Revert() (gas: 1971829) +FeeQuoter_onReport:test_OnReport_StaleUpdate_Revert() (gas: 43631) +FeeQuoter_onReport:test_onReport_InvalidForwarder_Reverts() (gas: 23492) +FeeQuoter_onReport:test_onReport_Success() (gas: 80094) +FeeQuoter_onReport:test_onReport_UnsupportedToken_Reverts() (gas: 26860) +FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsDefault_Success() (gas: 17284) +FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsEnforceOutOfOrder_Revert() (gas: 21428) +FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsGasLimitTooHigh_Revert() (gas: 18516) +FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsInvalidExtraArgsTag_Revert() (gas: 18034) +FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsV1_Success() (gas: 18390) +FeeQuoter_parseEVMExtraArgsFromBytes:test_EVMExtraArgsV2_Success() (gas: 18512) +FeeQuoter_processMessageArgs:test_processMessageArgs_InvalidEVMAddressDestToken_Revert() (gas: 44703) +FeeQuoter_processMessageArgs:test_processMessageArgs_InvalidExtraArgs_Revert() (gas: 19914) +FeeQuoter_processMessageArgs:test_processMessageArgs_MalformedEVMExtraArgs_Revert() (gas: 20333) +FeeQuoter_processMessageArgs:test_processMessageArgs_MessageFeeTooHigh_Revert() (gas: 17904) +FeeQuoter_processMessageArgs:test_processMessageArgs_SourceTokenDataTooLarge_Revert() (gas: 122709) +FeeQuoter_processMessageArgs:test_processMessageArgs_TokenAmountArraysMismatching_Revert() (gas: 42032) +FeeQuoter_processMessageArgs:test_processMessageArgs_WitEVMExtraArgsV2_Success() (gas: 28518) +FeeQuoter_processMessageArgs:test_processMessageArgs_WithConvertedTokenAmount_Success() (gas: 29949) +FeeQuoter_processMessageArgs:test_processMessageArgs_WithCorrectPoolReturnData_Success() (gas: 76145) +FeeQuoter_processMessageArgs:test_processMessageArgs_WithEVMExtraArgsV1_Success() (gas: 28116) +FeeQuoter_processMessageArgs:test_processMessageArgs_WithEmptyEVMExtraArgs_Success() (gas: 25987) +FeeQuoter_processMessageArgs:test_processMessageArgs_WithLinkTokenAmount_Success() (gas: 19523) +FeeQuoter_updatePrices:test_OnlyCallableByUpdater_Revert() (gas: 12176) +FeeQuoter_updatePrices:test_OnlyGasPrice_Success() (gas: 23730) +FeeQuoter_updatePrices:test_OnlyTokenPrice_Success() (gas: 28505) +FeeQuoter_updatePrices:test_UpdatableByAuthorizedCaller_Success() (gas: 74598) +FeeQuoter_updatePrices:test_UpdateMultiplePrices_Success() (gas: 145320) +FeeQuoter_updateTokenPriceFeeds:test_FeedNotUpdated() (gas: 50875) +FeeQuoter_updateTokenPriceFeeds:test_FeedUnset_Success() (gas: 63847) +FeeQuoter_updateTokenPriceFeeds:test_FeedUpdatedByNonOwner_Revert() (gas: 20142) +FeeQuoter_updateTokenPriceFeeds:test_MultipleFeedUpdate_Success() (gas: 89470) +FeeQuoter_updateTokenPriceFeeds:test_SingleFeedUpdate_Success() (gas: 51121) +FeeQuoter_updateTokenPriceFeeds:test_ZeroFeeds_Success() (gas: 12437) +FeeQuoter_validateDestFamilyAddress:test_InvalidEVMAddressEncodePacked_Revert() (gas: 10655) +FeeQuoter_validateDestFamilyAddress:test_InvalidEVMAddressPrecompiles_Revert() (gas: 4001603) +FeeQuoter_validateDestFamilyAddress:test_InvalidEVMAddress_Revert() (gas: 10839) +FeeQuoter_validateDestFamilyAddress:test_ValidEVMAddress_Success() (gas: 6731) +FeeQuoter_validateDestFamilyAddress:test_ValidNonEVMAddress_Success() (gas: 6511) +HybridUSDCTokenPoolMigrationTests:test_LockOrBurn_LockReleaseMechanism_then_switchToPrimary_Success() (gas: 209248) +HybridUSDCTokenPoolMigrationTests:test_LockOrBurn_PrimaryMechanism_Success() (gas: 135879) +HybridUSDCTokenPoolMigrationTests:test_LockOrBurn_WhileMigrationPause_Revert() (gas: 107090) +HybridUSDCTokenPoolMigrationTests:test_LockOrBurn_onLockReleaseMechanism_Success() (gas: 144586) +HybridUSDCTokenPoolMigrationTests:test_MintOrRelease_OnLockReleaseMechanism_Success() (gas: 214817) +HybridUSDCTokenPoolMigrationTests:test_MintOrRelease_OnLockReleaseMechanism_then_switchToPrimary_Success() (gas: 423641) +HybridUSDCTokenPoolMigrationTests:test_MintOrRelease_incomingMessageWithPrimaryMechanism() (gas: 268928) +HybridUSDCTokenPoolMigrationTests:test_ReleaseOrMint_WhileMigrationPause_Revert() (gas: 111484) +HybridUSDCTokenPoolMigrationTests:test_burnLockedUSDC_invalidPermissions_Revert() (gas: 39362) +HybridUSDCTokenPoolMigrationTests:test_cancelExistingCCTPMigrationProposal() (gas: 33189) +HybridUSDCTokenPoolMigrationTests:test_cannotCancelANonExistentMigrationProposal() (gas: 12669) +HybridUSDCTokenPoolMigrationTests:test_cannotModifyLiquidityWithoutPermissions_Revert() (gas: 13329) +HybridUSDCTokenPoolMigrationTests:test_cannotTransferLiquidityDuringPendingMigration_Revert() (gas: 160900) +HybridUSDCTokenPoolMigrationTests:test_lockOrBurn_then_BurnInCCTPMigration_Success() (gas: 255982) +HybridUSDCTokenPoolMigrationTests:test_transferLiquidity_Success() (gas: 165921) +HybridUSDCTokenPoolMigrationTests:test_unstickManualTxAfterMigration_destChain_Success() (gas: 154242) +HybridUSDCTokenPoolMigrationTests:test_unstickManualTxAfterMigration_homeChain_Success() (gas: 463740) +HybridUSDCTokenPoolTests:test_LockOrBurn_LockReleaseMechanism_then_switchToPrimary_Success() (gas: 209230) +HybridUSDCTokenPoolTests:test_LockOrBurn_PrimaryMechanism_Success() (gas: 135880) +HybridUSDCTokenPoolTests:test_LockOrBurn_WhileMigrationPause_Revert() (gas: 107135) +HybridUSDCTokenPoolTests:test_LockOrBurn_onLockReleaseMechanism_Success() (gas: 144607) +HybridUSDCTokenPoolTests:test_MintOrRelease_OnLockReleaseMechanism_Success() (gas: 214795) +HybridUSDCTokenPoolTests:test_MintOrRelease_OnLockReleaseMechanism_then_switchToPrimary_Success() (gas: 423619) +HybridUSDCTokenPoolTests:test_MintOrRelease_incomingMessageWithPrimaryMechanism() (gas: 268910) +HybridUSDCTokenPoolTests:test_ReleaseOrMint_WhileMigrationPause_Revert() (gas: 111528) +HybridUSDCTokenPoolTests:test_cannotTransferLiquidityDuringPendingMigration_Revert() (gas: 160845) +HybridUSDCTokenPoolTests:test_transferLiquidity_Success() (gas: 165904) +LockReleaseTokenPoolAndProxy_setRebalancer:test_SetRebalancer_Revert() (gas: 10989) +LockReleaseTokenPoolAndProxy_setRebalancer:test_SetRebalancer_Success() (gas: 18028) +LockReleaseTokenPoolPoolAndProxy_canAcceptLiquidity:test_CanAcceptLiquidity_Success() (gas: 3051552) +LockReleaseTokenPoolPoolAndProxy_provideLiquidity:test_LiquidityNotAccepted_Revert() (gas: 3047988) +LockReleaseTokenPoolPoolAndProxy_provideLiquidity:test_Unauthorized_Revert() (gas: 11489) +LockReleaseTokenPoolPoolAndProxy_supportsInterface:test_SupportsInterface_Success() (gas: 10196) +LockReleaseTokenPoolPoolAndProxy_withdrawalLiquidity:test_InsufficientLiquidity_Revert() (gas: 60187) +LockReleaseTokenPoolPoolAndProxy_withdrawalLiquidity:test_Unauthorized_Revert() (gas: 11464) +LockReleaseTokenPool_canAcceptLiquidity:test_CanAcceptLiquidity_Success() (gas: 2836138) +LockReleaseTokenPool_lockOrBurn:test_LockOrBurnWithAllowList_Revert() (gas: 30062) +LockReleaseTokenPool_lockOrBurn:test_LockOrBurnWithAllowList_Success() (gas: 79943) +LockReleaseTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 59620) +LockReleaseTokenPool_provideLiquidity:test_LiquidityNotAccepted_Revert() (gas: 2832618) +LockReleaseTokenPool_provideLiquidity:test_Unauthorized_Revert() (gas: 11489) +LockReleaseTokenPool_releaseOrMint:test_ChainNotAllowed_Revert() (gas: 72743) +LockReleaseTokenPool_releaseOrMint:test_PoolMintNotHealthy_Revert() (gas: 56352) +LockReleaseTokenPool_releaseOrMint:test_ReleaseOrMint_Success() (gas: 225548) +LockReleaseTokenPool_setRebalancer:test_SetRebalancer_Revert() (gas: 11011) +LockReleaseTokenPool_setRebalancer:test_SetRebalancer_Success() (gas: 18094) +LockReleaseTokenPool_supportsInterface:test_SupportsInterface_Success() (gas: 10196) +LockReleaseTokenPool_transferLiquidity:test_transferLiquidity_Success() (gas: 83231) +LockReleaseTokenPool_transferLiquidity:test_transferLiquidity_transferTooMuch_Revert() (gas: 55953) +LockReleaseTokenPool_withdrawalLiquidity:test_InsufficientLiquidity_Revert() (gas: 60187) +LockReleaseTokenPool_withdrawalLiquidity:test_Unauthorized_Revert() (gas: 11464) +LockRelease_setRateLimitAdmin:test_SetRateLimitAdmin_Revert() (gas: 11054) +LockRelease_setRateLimitAdmin:test_SetRateLimitAdmin_Success() (gas: 35060) +MerkleMultiProofTest:test_CVE_2023_34459() (gas: 5478) +MerkleMultiProofTest:test_EmptyLeaf_Revert() (gas: 3585) +MerkleMultiProofTest:test_MerkleRoot256() (gas: 394891) +MerkleMultiProofTest:test_MerkleRootSingleLeaf_Success() (gas: 3661) +MerkleMultiProofTest:test_SpecSync_gas() (gas: 34129) +MockRouterTest:test_ccipSendWithInsufficientNativeTokens_Revert() (gas: 34037) +MockRouterTest:test_ccipSendWithInvalidMsgValue_Revert() (gas: 60842) +MockRouterTest:test_ccipSendWithLinkFeeTokenAndValidMsgValue_Success() (gas: 126576) +MockRouterTest:test_ccipSendWithLinkFeeTokenbutInsufficientAllowance_Revert() (gas: 63455) +MockRouterTest:test_ccipSendWithSufficientNativeFeeTokens_Success() (gas: 44012) +MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_MultipleConfigsBothLanes_Success() (gas: 133528) +MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_MultipleConfigs_Success() (gas: 315630) +MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_OnlyCallableByOwner_Revert() (gas: 17864) +MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_SingleConfigOutbound_Success() (gas: 76453) +MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_SingleConfig_Success() (gas: 76369) +MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_UpdateExistingConfigWithNoDifference_Success() (gas: 38736) +MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_UpdateExistingConfig_Success() (gas: 53869) +MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_ZeroChainSelector_Revert() (gas: 17109) +MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_ZeroConfigs_Success() (gas: 12436) +MultiAggregateRateLimiter_constructor:test_ConstructorNoAuthorizedCallers_Success() (gas: 1958738) +MultiAggregateRateLimiter_constructor:test_Constructor_Success() (gas: 2075046) +MultiAggregateRateLimiter_getTokenBucket:test_GetTokenBucket_Success() (gas: 30794) +MultiAggregateRateLimiter_getTokenBucket:test_Refill_Success() (gas: 48099) +MultiAggregateRateLimiter_getTokenBucket:test_TimeUnderflow_Revert() (gas: 15929) +MultiAggregateRateLimiter_getTokenValue:test_GetTokenValue_Success() (gas: 17525) +MultiAggregateRateLimiter_getTokenValue:test_NoTokenPrice_Reverts() (gas: 21408) +MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageFromUnauthorizedCaller_Revert() (gas: 14617) +MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithDifferentTokensOnDifferentChains_Success() (gas: 210107) +MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithDisabledRateLimitToken_Success() (gas: 58416) +MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithNoTokens_Success() (gas: 17743) +MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithRateLimitDisabled_Success() (gas: 45162) +MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithRateLimitExceeded_Revert() (gas: 46370) +MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithRateLimitReset_Success() (gas: 76561) +MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithTokensOnDifferentChains_Success() (gas: 308233) +MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithTokens_Success() (gas: 50558) +MultiAggregateRateLimiter_onOutboundMessage:test_RateLimitValueDifferentLanes_Success() (gas: 1073669578) +MultiAggregateRateLimiter_onOutboundMessage:test_ValidateMessageWithNoTokens_Success() (gas: 19302) +MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageFromUnauthorizedCaller_Revert() (gas: 15913) +MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithDifferentTokensOnDifferentChains_Success() (gas: 209885) +MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithDisabledRateLimitToken_Success() (gas: 60182) +MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithRateLimitDisabled_Success() (gas: 46935) +MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithRateLimitExceeded_Revert() (gas: 48179) +MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithRateLimitReset_Success() (gas: 77728) +MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithTokensOnDifferentChains_Success() (gas: 308237) +MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithTokens_Success() (gas: 52346) +MultiAggregateRateLimiter_setFeeQuoter:test_OnlyOwner_Revert() (gas: 11337) +MultiAggregateRateLimiter_setFeeQuoter:test_Owner_Success() (gas: 19090) +MultiAggregateRateLimiter_setFeeQuoter:test_ZeroAddress_Revert() (gas: 10609) +MultiAggregateRateLimiter_updateRateLimitTokens:test_NonOwner_Revert() (gas: 18878) +MultiAggregateRateLimiter_updateRateLimitTokens:test_UpdateRateLimitTokensMultipleChains_Success() (gas: 280256) +MultiAggregateRateLimiter_updateRateLimitTokens:test_UpdateRateLimitTokensSingleChain_Success() (gas: 254729) +MultiAggregateRateLimiter_updateRateLimitTokens:test_UpdateRateLimitTokens_AddsAndRemoves_Success() (gas: 204595) +MultiAggregateRateLimiter_updateRateLimitTokens:test_UpdateRateLimitTokens_RemoveNonExistentToken_Success() (gas: 28826) +MultiAggregateRateLimiter_updateRateLimitTokens:test_ZeroDestToken_Revert() (gas: 18324) +MultiAggregateRateLimiter_updateRateLimitTokens:test_ZeroSourceToken_Revert() (gas: 18253) +MultiOCR3Base_setOCR3Configs:test_FMustBePositive_Revert() (gas: 59397) +MultiOCR3Base_setOCR3Configs:test_FTooHigh_Revert() (gas: 44190) +MultiOCR3Base_setOCR3Configs:test_MoreTransmittersThanSigners_Revert() (gas: 104822) +MultiOCR3Base_setOCR3Configs:test_NoTransmitters_Revert() (gas: 18886) +MultiOCR3Base_setOCR3Configs:test_RepeatSignerAddress_Revert() (gas: 283736) +MultiOCR3Base_setOCR3Configs:test_RepeatTransmitterAddress_Revert() (gas: 422361) +MultiOCR3Base_setOCR3Configs:test_SetConfigIgnoreSigners_Success() (gas: 511918) +MultiOCR3Base_setOCR3Configs:test_SetConfigWithSignersMismatchingTransmitters_Success() (gas: 680323) +MultiOCR3Base_setOCR3Configs:test_SetConfigWithSigners_Success() (gas: 828900) +MultiOCR3Base_setOCR3Configs:test_SetConfigWithoutSigners_Success() (gas: 457292) +MultiOCR3Base_setOCR3Configs:test_SetConfigsZeroInput_Success() (gas: 12481) +MultiOCR3Base_setOCR3Configs:test_SetMultipleConfigs_Success() (gas: 2141722) +MultiOCR3Base_setOCR3Configs:test_SignerCannotBeZeroAddress_Revert() (gas: 141835) +MultiOCR3Base_setOCR3Configs:test_StaticConfigChange_Revert() (gas: 807623) +MultiOCR3Base_setOCR3Configs:test_TooManySigners_Revert() (gas: 158867) +MultiOCR3Base_setOCR3Configs:test_TooManyTransmitters_Revert() (gas: 112335) +MultiOCR3Base_setOCR3Configs:test_TransmitterCannotBeZeroAddress_Revert() (gas: 254201) +MultiOCR3Base_setOCR3Configs:test_UpdateConfigSigners_Success() (gas: 861206) +MultiOCR3Base_setOCR3Configs:test_UpdateConfigTransmittersWithoutSigners_Success() (gas: 475852) +MultiOCR3Base_transmit:test_ConfigDigestMismatch_Revert() (gas: 42956) +MultiOCR3Base_transmit:test_ForkedChain_Revert() (gas: 48639) +MultiOCR3Base_transmit:test_InsufficientSignatures_Revert() (gas: 77138) +MultiOCR3Base_transmit:test_NonUniqueSignature_Revert() (gas: 65912) +MultiOCR3Base_transmit:test_SignatureOutOfRegistration_Revert() (gas: 33495) +MultiOCR3Base_transmit:test_TooManySignatures_Revert() (gas: 79795) +MultiOCR3Base_transmit:test_TransmitSigners_gas_Success() (gas: 33664) +MultiOCR3Base_transmit:test_TransmitWithExtraCalldataArgs_Revert() (gas: 47200) +MultiOCR3Base_transmit:test_TransmitWithLessCalldataArgs_Revert() (gas: 25768) +MultiOCR3Base_transmit:test_TransmitWithoutSignatureVerification_gas_Success() (gas: 18745) +MultiOCR3Base_transmit:test_UnAuthorizedTransmitter_Revert() (gas: 24234) +MultiOCR3Base_transmit:test_UnauthorizedSigner_Revert() (gas: 61275) +MultiOCR3Base_transmit:test_UnconfiguredPlugin_Revert() (gas: 39933) +MultiOCR3Base_transmit:test_ZeroSignatures_Revert() (gas: 33049) MultiOnRampTokenPoolReentrancy:test_OnRampTokenPoolReentrancy_Success() (gas: 233635) MultiRampsE2E:test_E2E_3MessagesMMultiOffRampSuccess_gas() (gas: 1501725) NonceManager_NonceIncrementation:test_getIncrementedOutboundNonce_Success() (gas: 37934) @@ -615,166 +615,166 @@ NonceManager_applyPreviousRampsUpdates:test_PreviousRampAlreadySetOnRamp_Revert( NonceManager_applyPreviousRampsUpdates:test_SingleRampUpdate() (gas: 66666) NonceManager_applyPreviousRampsUpdates:test_ZeroInput() (gas: 12070) NonceManager_typeAndVersion:test_typeAndVersion() (gas: 9705) -OCR2BaseNoChecks_setOCR2Config:test_FMustBePositive_Revert() (gas: 15443) -OCR2BaseNoChecks_setOCR2Config:test_RepeatAddress_Revert() (gas: 48841) -OCR2BaseNoChecks_setOCR2Config:test_SetConfigSuccess_gas() (gas: 97138) -OCR2BaseNoChecks_setOCR2Config:test_TooManyTransmitter_Revert() (gas: 75615) -OCR2BaseNoChecks_setOCR2Config:test_TransmitterCannotBeZeroAddress_Revert() (gas: 32515) -OCR2BaseNoChecks_transmit:test_ConfigDigestMismatch_Revert() (gas: 20081) -OCR2BaseNoChecks_transmit:test_ForkedChain_Revert() (gas: 29888) -OCR2BaseNoChecks_transmit:test_TransmitSuccess_gas() (gas: 30530) -OCR2BaseNoChecks_transmit:test_UnAuthorizedTransmitter_Revert() (gas: 25249) -OCR2Base_setOCR2Config:test_FMustBePositive_Revert() (gas: 15449) -OCR2Base_setOCR2Config:test_FTooHigh_Revert() (gas: 15725) -OCR2Base_setOCR2Config:test_OracleOutOfRegister_Revert() (gas: 21647) -OCR2Base_setOCR2Config:test_RepeatAddress_Revert() (gas: 56234) -OCR2Base_setOCR2Config:test_SetConfigSuccess_gas() (gas: 169648) -OCR2Base_setOCR2Config:test_SingerCannotBeZeroAddress_Revert() (gas: 32751) -OCR2Base_setOCR2Config:test_TooManySigners_Revert() (gas: 34759) -OCR2Base_setOCR2Config:test_TransmitterCannotBeZeroAddress_Revert() (gas: 55992) -OCR2Base_transmit:test_ConfigDigestMismatch_Revert() (gas: 22520) -OCR2Base_transmit:test_ForkedChain_Revert() (gas: 42561) -OCR2Base_transmit:test_NonUniqueSignature_Revert() (gas: 62252) -OCR2Base_transmit:test_SignatureOutOfRegistration_Revert() (gas: 24538) -OCR2Base_transmit:test_Transmit2SignersSuccess_gas() (gas: 58490) -OCR2Base_transmit:test_UnAuthorizedTransmitter_Revert() (gas: 27448) -OCR2Base_transmit:test_UnauthorizedSigner_Revert() (gas: 45597) -OCR2Base_transmit:test_WrongNumberOfSignatures_Revert() (gas: 23593) -OffRamp_afterOC3ConfigSet:test_afterOCR3ConfigSet_SignatureVerificationDisabled_Revert() (gas: 9301256) -OffRamp_applySourceChainConfigUpdates:test_AddMultipleChains_Success() (gas: 652186) -OffRamp_applySourceChainConfigUpdates:test_AddNewChain_Success() (gas: 174768) -OffRamp_applySourceChainConfigUpdates:test_ApplyZeroUpdates_Success() (gas: 18224) -OffRamp_applySourceChainConfigUpdates:test_InvalidOnRampUpdate_Revert() (gas: 298010) -OffRamp_applySourceChainConfigUpdates:test_ReplaceExistingChainOnRamp_Success() (gas: 177903) -OffRamp_applySourceChainConfigUpdates:test_ReplaceExistingChain_Success() (gas: 195423) -OffRamp_applySourceChainConfigUpdates:test_RouterAddress_Revert() (gas: 15779) -OffRamp_applySourceChainConfigUpdates:test_ZeroOnRampAddress_Revert() (gas: 77864) -OffRamp_applySourceChainConfigUpdates:test_ZeroSourceChainSelector_Revert() (gas: 17916) -OffRamp_batchExecute:test_MultipleReportsDifferentChainsSkipCursedChain_Success() (gas: 224127) -OffRamp_batchExecute:test_MultipleReportsDifferentChains_Success() (gas: 426084) -OffRamp_batchExecute:test_MultipleReportsSameChain_Success() (gas: 369040) -OffRamp_batchExecute:test_MultipleReportsSkipDuplicate_Success() (gas: 208148) -OffRamp_batchExecute:test_OutOfBoundsGasLimitsAccess_Revert() (gas: 239377) -OffRamp_batchExecute:test_SingleReport_Success() (gas: 188697) -OffRamp_batchExecute:test_Unhealthy_Success() (gas: 717417) -OffRamp_batchExecute:test_ZeroReports_Revert() (gas: 12110) -OffRamp_ccipReceive:test_Reverts() (gas: 18775) -OffRamp_commit:test_CommitOnRampMismatch_Revert() (gas: 109720) -OffRamp_commit:test_FailedRMNVerification_Reverts() (gas: 77314) -OffRamp_commit:test_InvalidIntervalMinLargerThanMax_Revert() (gas: 83071) -OffRamp_commit:test_InvalidInterval_Revert() (gas: 77116) -OffRamp_commit:test_InvalidRootRevert() (gas: 75631) -OffRamp_commit:test_NoConfigWithOtherConfigPresent_Revert() (gas: 10104182) -OffRamp_commit:test_NoConfig_Revert() (gas: 9678313) -OffRamp_commit:test_OnlyGasPriceUpdates_Success() (gas: 130728) -OffRamp_commit:test_OnlyPriceUpdateStaleReport_Revert() (gas: 147353) -OffRamp_commit:test_OnlyTokenPriceUpdates_Success() (gas: 130749) -OffRamp_commit:test_PriceSequenceNumberCleared_Success() (gas: 424203) -OffRamp_commit:test_ReportAndPriceUpdate_Success() (gas: 190103) -OffRamp_commit:test_ReportOnlyRootSuccess_gas() (gas: 161941) -OffRamp_commit:test_RootAlreadyCommitted_Revert() (gas: 176263) -OffRamp_commit:test_SourceChainNotEnabled_Revert() (gas: 72480) -OffRamp_commit:test_StaleReportWithRoot_Success() (gas: 280609) -OffRamp_commit:test_UnauthorizedTransmitter_Revert() (gas: 144515) -OffRamp_commit:test_Unhealthy_Revert() (gas: 71728) -OffRamp_commit:test_ValidPriceUpdateThenStaleReportWithRoot_Success() (gas: 250314) -OffRamp_commit:test_ZeroEpochAndRound_Revert() (gas: 61202) -OffRamp_constructor:test_Constructor_Success() (gas: 9638677) -OffRamp_constructor:test_SourceChainSelector_Revert() (gas: 149544) -OffRamp_constructor:test_ZeroChainSelector_Revert() (gas: 113479) -OffRamp_constructor:test_ZeroNonceManager_Revert() (gas: 111281) -OffRamp_constructor:test_ZeroOnRampAddress_Revert() (gas: 175098) -OffRamp_constructor:test_ZeroRMNRemote_Revert() (gas: 111283) -OffRamp_constructor:test_ZeroTokenAdminRegistry_Revert() (gas: 111228) -OffRamp_execute:test_IncorrectArrayType_Revert() (gas: 19670) -OffRamp_execute:test_LargeBatch_Success() (gas: 4789695) -OffRamp_execute:test_MultipleReportsWithPartialValidationFailures_Success() (gas: 462410) -OffRamp_execute:test_MultipleReports_Success() (gas: 392458) -OffRamp_execute:test_NoConfigWithOtherConfigPresent_Revert() (gas: 10528542) -OffRamp_execute:test_NoConfig_Revert() (gas: 9735461) -OffRamp_execute:test_NonArray_Revert() (gas: 34048) -OffRamp_execute:test_SingleReport_Success() (gas: 209336) -OffRamp_execute:test_UnauthorizedTransmitter_Revert() (gas: 173222) -OffRamp_execute:test_WrongConfigWithSigners_Revert() (gas: 10536285) -OffRamp_execute:test_ZeroReports_Revert() (gas: 19285) -OffRamp_executeSingleMessage:test_MessageSender_Revert() (gas: 23999) -OffRamp_executeSingleMessage:test_NonContractWithTokens_Success() (gas: 277760) -OffRamp_executeSingleMessage:test_NonContract_Success() (gas: 26498) -OffRamp_executeSingleMessage:test_TokenHandlingError_Revert() (gas: 236604) -OffRamp_executeSingleMessage:test_ZeroGasDONExecution_Revert() (gas: 61012) -OffRamp_executeSingleMessage:test_executeSingleMessage_NoTokens_Success() (gas: 60154) -OffRamp_executeSingleMessage:test_executeSingleMessage_WithFailingValidationNoRouterCall_Revert() (gas: 267116) -OffRamp_executeSingleMessage:test_executeSingleMessage_WithFailingValidation_Revert() (gas: 98105) -OffRamp_executeSingleMessage:test_executeSingleMessage_WithTokens_Success() (gas: 320820) -OffRamp_executeSingleMessage:test_executeSingleMessage_WithVInterception_Success() (gas: 108693) -OffRamp_executeSingleReport:test_DisabledSourceChain_Revert() (gas: 36788) -OffRamp_executeSingleReport:test_EmptyReport_Revert() (gas: 24567) -OffRamp_executeSingleReport:test_InvalidSourcePoolAddress_Success() (gas: 595880) -OffRamp_executeSingleReport:test_ManualExecutionNotYetEnabled_Revert() (gas: 60490) -OffRamp_executeSingleReport:test_MismatchingDestChainSelector_Revert() (gas: 42477) -OffRamp_executeSingleReport:test_NonExistingSourceChain_Revert() (gas: 37234) -OffRamp_executeSingleReport:test_ReceiverError_Success() (gas: 221934) -OffRamp_executeSingleReport:test_RetryFailedMessageWithoutManualExecution_Revert() (gas: 238001) -OffRamp_executeSingleReport:test_RootNotCommitted_Revert() (gas: 52368) -OffRamp_executeSingleReport:test_RouterYULCall_Revert() (gas: 625062) -OffRamp_executeSingleReport:test_SingleMessageNoTokensOtherChain_Success() (gas: 298001) -OffRamp_executeSingleReport:test_SingleMessageNoTokensUnordered_Success() (gas: 252989) -OffRamp_executeSingleReport:test_SingleMessageNoTokens_Success() (gas: 272016) -OffRamp_executeSingleReport:test_SingleMessageToNonCCIPReceiver_Success() (gas: 307376) -OffRamp_executeSingleReport:test_SingleMessagesNoTokensSuccess_gas() (gas: 168302) -OffRamp_executeSingleReport:test_SkippedIncorrectNonceStillExecutes_Success() (gas: 502248) -OffRamp_executeSingleReport:test_SkippedIncorrectNonce_Success() (gas: 72021) -OffRamp_executeSingleReport:test_TokenDataMismatch_Revert() (gas: 86553) -OffRamp_executeSingleReport:test_TwoMessagesWithTokensAndGE_Success() (gas: 733747) -OffRamp_executeSingleReport:test_TwoMessagesWithTokensSuccess_gas() (gas: 666564) -OffRamp_executeSingleReport:test_UnexpectedTokenData_Revert() (gas: 42472) -OffRamp_executeSingleReport:test_UnhealthySingleChainCurse_Revert() (gas: 710808) -OffRamp_executeSingleReport:test_Unhealthy_Success() (gas: 710811) -OffRamp_executeSingleReport:test_WithCurseOnAnotherSourceChain_Success() (gas: 574200) -OffRamp_executeSingleReport:test__execute_SkippedAlreadyExecutedMessageUnordered_Success() (gas: 172842) -OffRamp_executeSingleReport:test__execute_SkippedAlreadyExecutedMessage_Success() (gas: 202303) -OffRamp_getExecutionState:test_FillExecutionState_Success() (gas: 5720172) -OffRamp_getExecutionState:test_GetDifferentChainExecutionState_Success() (gas: 148136) -OffRamp_getExecutionState:test_GetExecutionState_Success() (gas: 111630) -OffRamp_manuallyExecute:test_ManualExecGasLimitMismatchSingleReport_Revert() (gas: 127758) -OffRamp_manuallyExecute:test_manuallyExecute_DestinationGasAmountCountMismatch_Revert() (gas: 103837) -OffRamp_manuallyExecute:test_manuallyExecute_DoesNotRevertIfUntouched_Success() (gas: 208337) -OffRamp_manuallyExecute:test_manuallyExecute_FailedTx_Revert() (gas: 261274) -OffRamp_manuallyExecute:test_manuallyExecute_ForkedChain_Revert() (gas: 37621) -OffRamp_manuallyExecute:test_manuallyExecute_GasLimitMismatchMultipleReports_Revert() (gas: 267225) -OffRamp_manuallyExecute:test_manuallyExecute_InvalidReceiverExecutionGasLimit_Revert() (gas: 38149) -OffRamp_manuallyExecute:test_manuallyExecute_InvalidTokenGasOverride_Revert() (gas: 72989) -OffRamp_manuallyExecute:test_manuallyExecute_LowGasLimit_Success() (gas: 742493) -OffRamp_manuallyExecute:test_manuallyExecute_MultipleReportsWithSingleCursedLane_Revert() (gas: 408959) -OffRamp_manuallyExecute:test_manuallyExecute_ReentrancyFails_Success() (gas: 3573893) -OffRamp_manuallyExecute:test_manuallyExecute_SourceChainSelectorMismatch_Revert() (gas: 199675) -OffRamp_manuallyExecute:test_manuallyExecute_Success() (gas: 279996) -OffRamp_manuallyExecute:test_manuallyExecute_WithGasOverride_Success() (gas: 280692) -OffRamp_manuallyExecute:test_manuallyExecute_WithMultiReportGasOverride_Success() (gas: 1033938) -OffRamp_manuallyExecute:test_manuallyExecute_WithPartialMessages_Success() (gas: 461966) -OffRamp_releaseOrMintSingleToken:test__releaseOrMintSingleToken_NotACompatiblePool_Revert() (gas: 47670) -OffRamp_releaseOrMintSingleToken:test__releaseOrMintSingleToken_Success() (gas: 121919) -OffRamp_releaseOrMintSingleToken:test__releaseOrMintSingleToken_TokenHandlingError_transfer_Revert() (gas: 99377) -OffRamp_releaseOrMintSingleToken:test_releaseOrMintToken_InvalidDataLength_Revert() (gas: 44074) -OffRamp_releaseOrMintSingleToken:test_releaseOrMintToken_ReleaseOrMintBalanceMismatch_Revert() (gas: 109868) -OffRamp_releaseOrMintSingleToken:test_releaseOrMintToken_TokenHandlingError_BalanceOf_Revert() (gas: 46405) -OffRamp_releaseOrMintSingleToken:test_releaseOrMintToken_skip_ReleaseOrMintBalanceMismatch_if_pool_Revert() (gas: 101128) -OffRamp_releaseOrMintTokens:test_TokenHandlingError_Reverts() (gas: 187037) -OffRamp_releaseOrMintTokens:test__releaseOrMintTokens_PoolIsNotAPool_Reverts() (gas: 28901) -OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_InvalidDataLengthReturnData_Revert() (gas: 74851) -OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_PoolDoesNotSupportDest_Reverts() (gas: 94066) -OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_Success() (gas: 206891) -OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_WithGasOverride_Success() (gas: 209712) -OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_destDenominatedDecimals_Success() (gas: 217613) -OffRamp_setDynamicConfig:test_FeeQuoterZeroAddress_Revert() (gas: 12546) -OffRamp_setDynamicConfig:test_NonOwner_Revert() (gas: 15551) -OffRamp_setDynamicConfig:test_SetDynamicConfigWithInterceptor_Success() (gas: 50773) -OffRamp_setDynamicConfig:test_SetDynamicConfig_Success() (gas: 28739) -OffRamp_trialExecute:test_RateLimitError_Success() (gas: 259646) -OffRamp_trialExecute:test_TokenHandlingErrorIsCaught_Success() (gas: 269756) -OffRamp_trialExecute:test_TokenPoolIsNotAContract_Success() (gas: 386699) -OffRamp_trialExecute:test_trialExecute_Success() (gas: 329723) -OnRampTokenPoolReentrancy:test_OnRampTokenPoolReentrancy_Success() (gas: 508639) +OCR2BaseNoChecks_setOCR2Config:test_FMustBePositive_Revert() (gas: 12210) +OCR2BaseNoChecks_setOCR2Config:test_RepeatAddress_Revert() (gas: 42431) +OCR2BaseNoChecks_setOCR2Config:test_SetConfigSuccess_gas() (gas: 84597) +OCR2BaseNoChecks_setOCR2Config:test_TooManyTransmitter_Revert() (gas: 38177) +OCR2BaseNoChecks_setOCR2Config:test_TransmitterCannotBeZeroAddress_Revert() (gas: 24308) +OCR2BaseNoChecks_transmit:test_ConfigDigestMismatch_Revert() (gas: 17499) +OCR2BaseNoChecks_transmit:test_ForkedChain_Revert() (gas: 26798) +OCR2BaseNoChecks_transmit:test_TransmitSuccess_gas() (gas: 27499) +OCR2BaseNoChecks_transmit:test_UnAuthorizedTransmitter_Revert() (gas: 21335) +OCR2Base_setOCR2Config:test_FMustBePositive_Revert() (gas: 12216) +OCR2Base_setOCR2Config:test_FTooHigh_Revert() (gas: 12372) +OCR2Base_setOCR2Config:test_OracleOutOfRegister_Revert() (gas: 14919) +OCR2Base_setOCR2Config:test_RepeatAddress_Revert() (gas: 45469) +OCR2Base_setOCR2Config:test_SetConfigSuccess_gas() (gas: 155220) +OCR2Base_setOCR2Config:test_SingerCannotBeZeroAddress_Revert() (gas: 24425) +OCR2Base_setOCR2Config:test_TooManySigners_Revert() (gas: 20535) +OCR2Base_setOCR2Config:test_TransmitterCannotBeZeroAddress_Revert() (gas: 47316) +OCR2Base_transmit:test_ConfigDigestMismatch_Revert() (gas: 19668) +OCR2Base_transmit:test_ForkedChain_Revert() (gas: 37749) +OCR2Base_transmit:test_NonUniqueSignature_Revert() (gas: 55360) +OCR2Base_transmit:test_SignatureOutOfRegistration_Revert() (gas: 20989) +OCR2Base_transmit:test_Transmit2SignersSuccess_gas() (gas: 51689) +OCR2Base_transmit:test_UnAuthorizedTransmitter_Revert() (gas: 23511) +OCR2Base_transmit:test_UnauthorizedSigner_Revert() (gas: 39707) +OCR2Base_transmit:test_WrongNumberOfSignatures_Revert() (gas: 20584) +OffRamp_afterOC3ConfigSet:test_afterOCR3ConfigSet_SignatureVerificationDisabled_Revert() (gas: 5913989) +OffRamp_applySourceChainConfigUpdates:test_AddMultipleChains_Success() (gas: 626106) +OffRamp_applySourceChainConfigUpdates:test_AddNewChain_Success() (gas: 166490) +OffRamp_applySourceChainConfigUpdates:test_ApplyZeroUpdates_Success() (gas: 16763) +OffRamp_applySourceChainConfigUpdates:test_InvalidOnRampUpdate_Revert() (gas: 272148) +OffRamp_applySourceChainConfigUpdates:test_ReplaceExistingChainOnRamp_Success() (gas: 168572) +OffRamp_applySourceChainConfigUpdates:test_ReplaceExistingChain_Success() (gas: 181027) +OffRamp_applySourceChainConfigUpdates:test_RouterAddress_Revert() (gas: 13463) +OffRamp_applySourceChainConfigUpdates:test_ZeroOnRampAddress_Revert() (gas: 72746) +OffRamp_applySourceChainConfigUpdates:test_ZeroSourceChainSelector_Revert() (gas: 15519) +OffRamp_batchExecute:test_MultipleReportsDifferentChainsSkipCursedChain_Success() (gas: 177991) +OffRamp_batchExecute:test_MultipleReportsDifferentChains_Success() (gas: 335638) +OffRamp_batchExecute:test_MultipleReportsSameChain_Success() (gas: 278904) +OffRamp_batchExecute:test_MultipleReportsSkipDuplicate_Success() (gas: 169320) +OffRamp_batchExecute:test_OutOfBoundsGasLimitsAccess_Revert() (gas: 189033) +OffRamp_batchExecute:test_SingleReport_Success() (gas: 157144) +OffRamp_batchExecute:test_Unhealthy_Success() (gas: 554256) +OffRamp_batchExecute:test_ZeroReports_Revert() (gas: 10622) +OffRamp_ccipReceive:test_Reverts() (gas: 15407) +OffRamp_commit:test_CommitOnRampMismatch_Revert() (gas: 92905) +OffRamp_commit:test_FailedRMNVerification_Reverts() (gas: 64099) +OffRamp_commit:test_InvalidIntervalMinLargerThanMax_Revert() (gas: 68173) +OffRamp_commit:test_InvalidInterval_Revert() (gas: 64291) +OffRamp_commit:test_InvalidRootRevert() (gas: 63356) +OffRamp_commit:test_NoConfigWithOtherConfigPresent_Revert() (gas: 6674717) +OffRamp_commit:test_NoConfig_Revert() (gas: 6258389) +OffRamp_commit:test_OnlyGasPriceUpdates_Success() (gas: 113042) +OffRamp_commit:test_OnlyPriceUpdateStaleReport_Revert() (gas: 121403) +OffRamp_commit:test_OnlyTokenPriceUpdates_Success() (gas: 113063) +OffRamp_commit:test_PriceSequenceNumberCleared_Success() (gas: 355198) +OffRamp_commit:test_ReportAndPriceUpdate_Success() (gas: 164400) +OffRamp_commit:test_ReportOnlyRootSuccess_gas() (gas: 139413) +OffRamp_commit:test_RootAlreadyCommitted_Revert() (gas: 146555) +OffRamp_commit:test_SourceChainNotEnabled_Revert() (gas: 59858) +OffRamp_commit:test_StaleReportWithRoot_Success() (gas: 232042) +OffRamp_commit:test_UnauthorizedTransmitter_Revert() (gas: 125409) +OffRamp_commit:test_Unhealthy_Revert() (gas: 58633) +OffRamp_commit:test_ValidPriceUpdateThenStaleReportWithRoot_Success() (gas: 206713) +OffRamp_commit:test_ZeroEpochAndRound_Revert() (gas: 51722) +OffRamp_constructor:test_Constructor_Success() (gas: 6219782) +OffRamp_constructor:test_SourceChainSelector_Revert() (gas: 135943) +OffRamp_constructor:test_ZeroChainSelector_Revert() (gas: 103375) +OffRamp_constructor:test_ZeroNonceManager_Revert() (gas: 101269) +OffRamp_constructor:test_ZeroOnRampAddress_Revert() (gas: 161468) +OffRamp_constructor:test_ZeroRMNRemote_Revert() (gas: 101189) +OffRamp_constructor:test_ZeroTokenAdminRegistry_Revert() (gas: 101227) +OffRamp_execute:test_IncorrectArrayType_Revert() (gas: 17639) +OffRamp_execute:test_LargeBatch_Success() (gas: 3426335) +OffRamp_execute:test_MultipleReportsWithPartialValidationFailures_Success() (gas: 372990) +OffRamp_execute:test_MultipleReports_Success() (gas: 300979) +OffRamp_execute:test_NoConfigWithOtherConfigPresent_Revert() (gas: 7083612) +OffRamp_execute:test_NoConfig_Revert() (gas: 6308087) +OffRamp_execute:test_NonArray_Revert() (gas: 27562) +OffRamp_execute:test_SingleReport_Success() (gas: 176354) +OffRamp_execute:test_UnauthorizedTransmitter_Revert() (gas: 148372) +OffRamp_execute:test_WrongConfigWithSigners_Revert() (gas: 7086361) +OffRamp_execute:test_ZeroReports_Revert() (gas: 17361) +OffRamp_executeSingleMessage:test_MessageSender_Revert() (gas: 18533) +OffRamp_executeSingleMessage:test_NonContractWithTokens_Success() (gas: 244079) +OffRamp_executeSingleMessage:test_NonContract_Success() (gas: 20781) +OffRamp_executeSingleMessage:test_TokenHandlingError_Revert() (gas: 205116) +OffRamp_executeSingleMessage:test_ZeroGasDONExecution_Revert() (gas: 49306) +OffRamp_executeSingleMessage:test_executeSingleMessage_NoTokens_Success() (gas: 48750) +OffRamp_executeSingleMessage:test_executeSingleMessage_WithFailingValidationNoRouterCall_Revert() (gas: 218028) +OffRamp_executeSingleMessage:test_executeSingleMessage_WithFailingValidation_Revert() (gas: 85296) +OffRamp_executeSingleMessage:test_executeSingleMessage_WithTokens_Success() (gas: 274196) +OffRamp_executeSingleMessage:test_executeSingleMessage_WithVInterception_Success() (gas: 91724) +OffRamp_executeSingleReport:test_DisabledSourceChain_Revert() (gas: 28282) +OffRamp_executeSingleReport:test_EmptyReport_Revert() (gas: 22084) +OffRamp_executeSingleReport:test_InvalidSourcePoolAddress_Success() (gas: 481794) +OffRamp_executeSingleReport:test_ManualExecutionNotYetEnabled_Revert() (gas: 48394) +OffRamp_executeSingleReport:test_MismatchingDestChainSelector_Revert() (gas: 33981) +OffRamp_executeSingleReport:test_NonExistingSourceChain_Revert() (gas: 28458) +OffRamp_executeSingleReport:test_ReceiverError_Success() (gas: 188096) +OffRamp_executeSingleReport:test_RetryFailedMessageWithoutManualExecution_Revert() (gas: 198552) +OffRamp_executeSingleReport:test_RootNotCommitted_Revert() (gas: 40763) +OffRamp_executeSingleReport:test_RouterYULCall_Revert() (gas: 413245) +OffRamp_executeSingleReport:test_SingleMessageNoTokensOtherChain_Success() (gas: 249800) +OffRamp_executeSingleReport:test_SingleMessageNoTokensUnordered_Success() (gas: 193614) +OffRamp_executeSingleReport:test_SingleMessageNoTokens_Success() (gas: 213648) +OffRamp_executeSingleReport:test_SingleMessageToNonCCIPReceiver_Success() (gas: 249550) +OffRamp_executeSingleReport:test_SingleMessagesNoTokensSuccess_gas() (gas: 142163) +OffRamp_executeSingleReport:test_SkippedIncorrectNonceStillExecutes_Success() (gas: 409313) +OffRamp_executeSingleReport:test_SkippedIncorrectNonce_Success() (gas: 58315) +OffRamp_executeSingleReport:test_TokenDataMismatch_Revert() (gas: 73890) +OffRamp_executeSingleReport:test_TwoMessagesWithTokensAndGE_Success() (gas: 583427) +OffRamp_executeSingleReport:test_TwoMessagesWithTokensSuccess_gas() (gas: 532141) +OffRamp_executeSingleReport:test_UnexpectedTokenData_Revert() (gas: 33739) +OffRamp_executeSingleReport:test_UnhealthySingleChainCurse_Revert() (gas: 549786) +OffRamp_executeSingleReport:test_Unhealthy_Success() (gas: 549800) +OffRamp_executeSingleReport:test_WithCurseOnAnotherSourceChain_Success() (gas: 460521) +OffRamp_executeSingleReport:test__execute_SkippedAlreadyExecutedMessageUnordered_Success() (gas: 135944) +OffRamp_executeSingleReport:test__execute_SkippedAlreadyExecutedMessage_Success() (gas: 165649) +OffRamp_getExecutionState:test_FillExecutionState_Success() (gas: 3885554) +OffRamp_getExecutionState:test_GetDifferentChainExecutionState_Success() (gas: 120606) +OffRamp_getExecutionState:test_GetExecutionState_Success() (gas: 89288) +OffRamp_manuallyExecute:test_ManualExecGasLimitMismatchSingleReport_Revert() (gas: 81016) +OffRamp_manuallyExecute:test_manuallyExecute_DestinationGasAmountCountMismatch_Revert() (gas: 74027) +OffRamp_manuallyExecute:test_manuallyExecute_DoesNotRevertIfUntouched_Success() (gas: 173167) +OffRamp_manuallyExecute:test_manuallyExecute_FailedTx_Revert() (gas: 214124) +OffRamp_manuallyExecute:test_manuallyExecute_ForkedChain_Revert() (gas: 27085) +OffRamp_manuallyExecute:test_manuallyExecute_GasLimitMismatchMultipleReports_Revert() (gas: 164696) +OffRamp_manuallyExecute:test_manuallyExecute_InvalidReceiverExecutionGasLimit_Revert() (gas: 27622) +OffRamp_manuallyExecute:test_manuallyExecute_InvalidTokenGasOverride_Revert() (gas: 55193) +OffRamp_manuallyExecute:test_manuallyExecute_LowGasLimit_Success() (gas: 498549) +OffRamp_manuallyExecute:test_manuallyExecute_MultipleReportsWithSingleCursedLane_Revert() (gas: 316061) +OffRamp_manuallyExecute:test_manuallyExecute_ReentrancyFails_Success() (gas: 2245222) +OffRamp_manuallyExecute:test_manuallyExecute_SourceChainSelectorMismatch_Revert() (gas: 165525) +OffRamp_manuallyExecute:test_manuallyExecute_Success() (gas: 227169) +OffRamp_manuallyExecute:test_manuallyExecute_WithGasOverride_Success() (gas: 227709) +OffRamp_manuallyExecute:test_manuallyExecute_WithMultiReportGasOverride_Success() (gas: 781365) +OffRamp_manuallyExecute:test_manuallyExecute_WithPartialMessages_Success() (gas: 347346) +OffRamp_releaseOrMintSingleToken:test__releaseOrMintSingleToken_NotACompatiblePool_Revert() (gas: 37656) +OffRamp_releaseOrMintSingleToken:test__releaseOrMintSingleToken_Success() (gas: 104404) +OffRamp_releaseOrMintSingleToken:test__releaseOrMintSingleToken_TokenHandlingError_transfer_Revert() (gas: 85342) +OffRamp_releaseOrMintSingleToken:test_releaseOrMintToken_InvalidDataLength_Revert() (gas: 36752) +OffRamp_releaseOrMintSingleToken:test_releaseOrMintToken_ReleaseOrMintBalanceMismatch_Revert() (gas: 94382) +OffRamp_releaseOrMintSingleToken:test_releaseOrMintToken_TokenHandlingError_BalanceOf_Revert() (gas: 39741) +OffRamp_releaseOrMintSingleToken:test_releaseOrMintToken_skip_ReleaseOrMintBalanceMismatch_if_pool_Revert() (gas: 86516) +OffRamp_releaseOrMintTokens:test_TokenHandlingError_Reverts() (gas: 162381) +OffRamp_releaseOrMintTokens:test__releaseOrMintTokens_PoolIsNotAPool_Reverts() (gas: 23903) +OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_InvalidDataLengthReturnData_Revert() (gas: 62751) +OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_PoolDoesNotSupportDest_Reverts() (gas: 79790) +OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_Success() (gas: 174468) +OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_WithGasOverride_Success() (gas: 176380) +OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_destDenominatedDecimals_Success() (gas: 187679) +OffRamp_setDynamicConfig:test_FeeQuoterZeroAddress_Revert() (gas: 11291) +OffRamp_setDynamicConfig:test_NonOwner_Revert() (gas: 13906) +OffRamp_setDynamicConfig:test_SetDynamicConfigWithInterceptor_Success() (gas: 46378) +OffRamp_setDynamicConfig:test_SetDynamicConfig_Success() (gas: 24420) +OffRamp_trialExecute:test_RateLimitError_Success() (gas: 219377) +OffRamp_trialExecute:test_TokenHandlingErrorIsCaught_Success() (gas: 227999) +OffRamp_trialExecute:test_TokenPoolIsNotAContract_Success() (gas: 295396) +OffRamp_trialExecute:test_trialExecute_Success() (gas: 277896) +OnRampTokenPoolReentrancy:test_OnRampTokenPoolReentrancy_Success() (gas: 390842) OnRamp_applyAllowListUpdates:test_applyAllowListUpdates_InvalidAllowListRequestDisabledAllowListWithAdds() (gas: 18018) OnRamp_applyAllowListUpdates:test_applyAllowListUpdates_Revert() (gas: 67797) OnRamp_applyAllowListUpdates:test_applyAllowListUpdates_Success() (gas: 325198) @@ -824,248 +824,248 @@ OnRamp_setDynamicConfig:test_setDynamicConfig_InvalidConfigOnlyOwner_Revert() (g OnRamp_setDynamicConfig:test_setDynamicConfig_InvalidConfigReentrancyGuardEnteredEqTrue_Revert() (gas: 13265) OnRamp_setDynamicConfig:test_setDynamicConfig_Success() (gas: 56347) OnRamp_withdrawFeeTokens:test_WithdrawFeeTokens_Success() (gas: 97302) -PingPong_ccipReceive:test_CcipReceive_Success() (gas: 175023) -PingPong_plumbing:test_OutOfOrderExecution_Success() (gas: 21848) -PingPong_plumbing:test_Pausing_Success() (gas: 19077) -PingPong_startPingPong:test_StartPingPong_With_OOO_Success() (gas: 197173) -PingPong_startPingPong:test_StartPingPong_With_Sequenced_Ordered_Success() (gas: 215989) -RMNHome__validateStaticAndDynamicConfig:test_validateStaticAndDynamicConfig_DuplicateOffchainPublicKey_reverts() (gas: 27051) -RMNHome__validateStaticAndDynamicConfig:test_validateStaticAndDynamicConfig_DuplicatePeerId_reverts() (gas: 26895) -RMNHome__validateStaticAndDynamicConfig:test_validateStaticAndDynamicConfig_DuplicateSourceChain_reverts() (gas: 29030) -RMNHome__validateStaticAndDynamicConfig:test_validateStaticAndDynamicConfig_MinObserversTooHigh_reverts() (gas: 29826) -RMNHome__validateStaticAndDynamicConfig:test_validateStaticAndDynamicConfig_OutOfBoundsNodesLength_reverts() (gas: 370101) -RMNHome__validateStaticAndDynamicConfig:test_validateStaticAndDynamicConfig_OutOfBoundsObserverNodeIndex_reverts() (gas: 29288) -RMNHome_getConfigDigests:test_getConfigDigests_success() (gas: 1137234) -RMNHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_ConfigDigestMismatch_reverts() (gas: 27380) -RMNHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_NoOpStateTransitionNotAllowed_reverts() (gas: 11379) -RMNHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_OnlyOwner_reverts() (gas: 12167) -RMNHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_success() (gas: 1151630) -RMNHome_revokeCandidate:test_revokeCandidate_ConfigDigestMismatch_reverts() (gas: 20960) -RMNHome_revokeCandidate:test_revokeCandidate_OnlyOwner_reverts() (gas: 11983) -RMNHome_revokeCandidate:test_revokeCandidate_RevokingZeroDigestNotAllowed_reverts() (gas: 11190) -RMNHome_revokeCandidate:test_revokeCandidate_success() (gas: 34855) -RMNHome_setCandidate:test_setCandidate_ConfigDigestMismatch_reverts() (gas: 657738) -RMNHome_setCandidate:test_setCandidate_OnlyOwner_reverts() (gas: 19560) -RMNHome_setCandidate:test_setCandidate_success() (gas: 632748) -RMNHome_setDynamicConfig:test_setDynamicConfig_DigestNotFound_reverts() (gas: 35639) -RMNHome_setDynamicConfig:test_setDynamicConfig_MinObserversTooHigh_reverts() (gas: 21659) -RMNHome_setDynamicConfig:test_setDynamicConfig_OnlyOwner_reverts() (gas: 16974) -RMNHome_setDynamicConfig:test_setDynamicConfig_success() (gas: 128190) -RMNRemote_constructor:test_constructor_success() (gas: 8853) -RMNRemote_constructor:test_constructor_zeroChainSelector_reverts() (gas: 61072) -RMNRemote_curse:test_curse_AlreadyCursed_duplicateSubject_reverts() (gas: 156801) -RMNRemote_curse:test_curse_calledByNonOwner_reverts() (gas: 20544) -RMNRemote_curse:test_curse_success() (gas: 157167) -RMNRemote_global_and_legacy_curses:test_global_and_legacy_curses_success() (gas: 141492) -RMNRemote_setConfig:test_setConfig_addSigner_removeSigner_success() (gas: 1097399) -RMNRemote_setConfig:test_setConfig_duplicateOnChainPublicKey_reverts() (gas: 339136) -RMNRemote_setConfig:test_setConfig_invalidSignerOrder_reverts() (gas: 91696) -RMNRemote_setConfig:test_setConfig_minSignersIs0_success() (gas: 773860) -RMNRemote_setConfig:test_setConfig_minSignersTooHigh_reverts() (gas: 64566) -RMNRemote_uncurse:test_uncurse_NotCursed_duplicatedUncurseSubject_reverts() (gas: 53942) -RMNRemote_uncurse:test_uncurse_calledByNonOwner_reverts() (gas: 20525) -RMNRemote_uncurse:test_uncurse_success() (gas: 44264) -RMNRemote_verify_withConfigNotSet:test_verify_reverts() (gas: 14954) -RMNRemote_verify_withConfigSet:test_verify_InvalidSignature_reverts() (gas: 88745) -RMNRemote_verify_withConfigSet:test_verify_OutOfOrderSignatures_duplicateSignature_reverts() (gas: 86340) -RMNRemote_verify_withConfigSet:test_verify_OutOfOrderSignatures_not_sorted_reverts() (gas: 93570) -RMNRemote_verify_withConfigSet:test_verify_ThresholdNotMet_reverts() (gas: 177181) -RMNRemote_verify_withConfigSet:test_verify_UnexpectedSigner_reverts() (gas: 429818) -RMNRemote_verify_withConfigSet:test_verify_minSignersIsZero_success() (gas: 230707) -RMNRemote_verify_withConfigSet:test_verify_success() (gas: 77919) -RMN_constructor:test_Constructor_Success() (gas: 63037) -RMN_getRecordedCurseRelatedOps:test_OpsPostDeployment() (gas: 24609) -RMN_lazyVoteToCurseUpdate_Benchmark:test_VoteToCurseLazilyRetain3VotersUponConfigChange_gas() (gas: 159340) -RMN_ownerUnbless:test_Unbless_Success() (gas: 103665) -RMN_ownerUnvoteToCurse:test_CanBlessAndCurseAfterGlobalCurseIsLifted() (gas: 527240) -RMN_ownerUnvoteToCurse:test_IsIdempotent() (gas: 461028) -RMN_ownerUnvoteToCurse:test_NonOwner_Revert() (gas: 25696) -RMN_ownerUnvoteToCurse:test_OwnerUnvoteToCurseSuccess_gas() (gas: 402269) -RMN_ownerUnvoteToCurse:test_UnknownVoter_Revert() (gas: 37341) -RMN_ownerUnvoteToCurse_Benchmark:test_OwnerUnvoteToCurse_1Voter_LiftsCurse_gas() (gas: 310729) -RMN_permaBlessing:test_PermaBlessing() (gas: 234032) -RMN_setConfig:test_BlessVoterIsZeroAddress_Revert() (gas: 19944) -RMN_setConfig:test_EitherThresholdIsZero_Revert() (gas: 29093) -RMN_setConfig:test_NonOwner_Revert() (gas: 19180) -RMN_setConfig:test_RepeatedAddress_Revert() (gas: 24182) -RMN_setConfig:test_SetConfigSuccess_gas() (gas: 121383) -RMN_setConfig:test_TotalWeightsSmallerThanEachThreshold_Revert() (gas: 42230) -RMN_setConfig:test_VoteToBlessByEjectedVoter_Revert() (gas: 150092) -RMN_setConfig:test_VotersLengthIsZero_Revert() (gas: 13777) -RMN_setConfig:test_WeightIsZeroAddress_Revert() (gas: 20193) -RMN_setConfig_Benchmark_1:test_SetConfig_7Voters_gas() (gas: 699447) -RMN_setConfig_Benchmark_2:test_ResetConfig_7Voters_gas() (gas: 262912) -RMN_unvoteToCurse:test_InvalidCursesHash() (gas: 29467) -RMN_unvoteToCurse:test_OwnerSkips() (gas: 38039) -RMN_unvoteToCurse:test_OwnerSucceeds() (gas: 69773) -RMN_unvoteToCurse:test_UnauthorizedVoter() (gas: 59241) -RMN_unvoteToCurse:test_ValidCursesHash() (gas: 66142) -RMN_unvoteToCurse:test_VotersCantLiftCurseButOwnerCan() (gas: 729679) -RMN_voteToBless:test_Curse_Revert() (gas: 496801) -RMN_voteToBless:test_IsAlreadyBlessed_Revert() (gas: 147850) -RMN_voteToBless:test_RootSuccess() (gas: 745652) -RMN_voteToBless:test_SenderAlreadyVoted_Revert() (gas: 123496) -RMN_voteToBless:test_UnauthorizedVoter_Revert() (gas: 19508) -RMN_voteToBless_Benchmark:test_1RootSuccess_gas() (gas: 49435) -RMN_voteToBless_Benchmark:test_3RootSuccess_gas() (gas: 110271) -RMN_voteToBless_Benchmark:test_5RootSuccess_gas() (gas: 171045) -RMN_voteToBless_Blessed_Benchmark:test_1RootSuccessBecameBlessed_gas() (gas: 34790) -RMN_voteToBless_Blessed_Benchmark:test_1RootSuccess_gas() (gas: 32338) -RMN_voteToBless_Blessed_Benchmark:test_3RootSuccess_gas() (gas: 93196) -RMN_voteToBless_Blessed_Benchmark:test_5RootSuccess_gas() (gas: 153948) -RMN_voteToCurse:test_CurseOnlyWhenThresholdReached_Success() (gas: 1748779) -RMN_voteToCurse:test_EmptySubjects_Revert() (gas: 15996) -RMN_voteToCurse:test_EvenIfAlreadyCursed_Success() (gas: 564086) -RMN_voteToCurse:test_OwnerCanCurseAndUncurse() (gas: 471086) -RMN_voteToCurse:test_RepeatedSubject_Revert() (gas: 151480) -RMN_voteToCurse:test_ReusedCurseId_Revert() (gas: 155411) -RMN_voteToCurse:test_UnauthorizedVoter_Revert() (gas: 14537) -RMN_voteToCurse:test_VoteToCurse_NoCurse_Success() (gas: 203894) -RMN_voteToCurse:test_VoteToCurse_YesCurse_Success() (gas: 495649) -RMN_voteToCurse_2:test_VotesAreDroppedIfSubjectIsNotCursedDuringConfigChange() (gas: 417003) -RMN_voteToCurse_2:test_VotesAreRetainedIfSubjectIsCursedDuringConfigChange() (gas: 1339323) -RMN_voteToCurse_Benchmark_1:test_VoteToCurse_NewSubject_NewVoter_NoCurse_gas() (gas: 146898) -RMN_voteToCurse_Benchmark_1:test_VoteToCurse_NewSubject_NewVoter_YesCurse_gas() (gas: 171152) -RMN_voteToCurse_Benchmark_2:test_VoteToCurse_OldSubject_NewVoter_NoCurse_gas() (gas: 126446) -RMN_voteToCurse_Benchmark_2:test_VoteToCurse_OldSubject_OldVoter_NoCurse_gas() (gas: 102691) -RMN_voteToCurse_Benchmark_3:test_VoteToCurse_OldSubject_NewVoter_YesCurse_gas() (gas: 151187) -RateLimiter_constructor:test_Constructor_Success() (gas: 22964) -RateLimiter_consume:test_AggregateValueMaxCapacityExceeded_Revert() (gas: 19839) -RateLimiter_consume:test_AggregateValueRateLimitReached_Revert() (gas: 28311) -RateLimiter_consume:test_ConsumeAggregateValue_Success() (gas: 39405) -RateLimiter_consume:test_ConsumeTokens_Success() (gas: 21919) -RateLimiter_consume:test_ConsumeUnlimited_Success() (gas: 57402) -RateLimiter_consume:test_ConsumingMoreThanUint128_Revert() (gas: 19531) -RateLimiter_consume:test_RateLimitReachedOverConsecutiveBlocks_Revert() (gas: 33020) -RateLimiter_consume:test_Refill_Success() (gas: 48170) -RateLimiter_consume:test_TokenMaxCapacityExceeded_Revert() (gas: 22450) -RateLimiter_consume:test_TokenRateLimitReached_Revert() (gas: 31057) -RateLimiter_currentTokenBucketState:test_CurrentTokenBucketState_Success() (gas: 49681) -RateLimiter_currentTokenBucketState:test_Refill_Success() (gas: 63750) -RateLimiter_setTokenBucketConfig:test_SetRateLimiterConfig_Success() (gas: 48188) -RegistryModuleOwnerCustom_constructor:test_constructor_Revert() (gas: 36711) -RegistryModuleOwnerCustom_registerAdminViaGetCCIPAdmin:test_registerAdminViaGetCCIPAdmin_Revert() (gas: 22517) -RegistryModuleOwnerCustom_registerAdminViaGetCCIPAdmin:test_registerAdminViaGetCCIPAdmin_Success() (gas: 137341) -RegistryModuleOwnerCustom_registerAdminViaOwner:test_registerAdminViaOwner_Revert() (gas: 22359) -RegistryModuleOwnerCustom_registerAdminViaOwner:test_registerAdminViaOwner_Success() (gas: 137182) -Router_applyRampUpdates:test_OffRampMismatch_Revert() (gas: 93496) -Router_applyRampUpdates:test_OffRampUpdatesWithRouting() (gas: 12348645) -Router_applyRampUpdates:test_OnRampDisable() (gas: 65150) -Router_applyRampUpdates:test_OnlyOwner_Revert() (gas: 13275) -Router_ccipSend:test_CCIPSendLinkFeeNoTokenSuccess_gas() (gas: 133309) -Router_ccipSend:test_CCIPSendLinkFeeOneTokenSuccess_gas() (gas: 240131) -Router_ccipSend:test_CCIPSendNativeFeeNoTokenSuccess_gas() (gas: 147975) -Router_ccipSend:test_CCIPSendNativeFeeOneTokenSuccess_gas() (gas: 254777) -Router_ccipSend:test_FeeTokenAmountTooLow_Revert() (gas: 78020) -Router_ccipSend:test_InvalidMsgValue() (gas: 35871) -Router_ccipSend:test_NativeFeeTokenInsufficientValue() (gas: 80832) -Router_ccipSend:test_NativeFeeTokenOverpay_Success() (gas: 203317) -Router_ccipSend:test_NativeFeeTokenZeroValue() (gas: 65179) -Router_ccipSend:test_NativeFeeToken_Success() (gas: 201073) -Router_ccipSend:test_NonLinkFeeToken_Success() (gas: 266824) -Router_ccipSend:test_UnsupportedDestinationChain_Revert() (gas: 28660) -Router_ccipSend:test_WhenNotHealthy_Revert() (gas: 48532) -Router_ccipSend:test_WrappedNativeFeeToken_Success() (gas: 205616) -Router_ccipSend:test_ZeroFeeAndGasPrice_Success() (gas: 282163) -Router_constructor:test_Constructor_Success() (gas: 14515) -Router_getArmProxy:test_getArmProxy() (gas: 11328) -Router_getFee:test_GetFeeSupportedChain_Success() (gas: 55552) -Router_getFee:test_UnsupportedDestinationChain_Revert() (gas: 20945) -Router_getSupportedTokens:test_GetSupportedTokens_Revert() (gas: 11166) -Router_recoverTokens:test_RecoverTokensInvalidRecipient_Revert() (gas: 12807) -Router_recoverTokens:test_RecoverTokensNoFunds_Revert() (gas: 21382) -Router_recoverTokens:test_RecoverTokensNonOwner_Revert() (gas: 12776) -Router_recoverTokens:test_RecoverTokensValueReceiver_Revert() (gas: 603372) -Router_recoverTokens:test_RecoverTokens_Success() (gas: 59811) -Router_routeMessage:test_AutoExec_Success() (gas: 52571) -Router_routeMessage:test_ExecutionEvent_Success() (gas: 183071) -Router_routeMessage:test_ManualExec_Success() (gas: 41748) -Router_routeMessage:test_OnlyOffRamp_Revert() (gas: 28290) -Router_routeMessage:test_WhenNotHealthy_Revert() (gas: 47722) -Router_setWrappedNative:test_OnlyOwner_Revert() (gas: 11766) -SelfFundedPingPong_ccipReceive:test_FundingIfNotANop_Revert() (gas: 62294) -SelfFundedPingPong_ccipReceive:test_Funding_Success() (gas: 560135) -SelfFundedPingPong_setCountIncrBeforeFunding:test_setCountIncrBeforeFunding() (gas: 22195) -TokenAdminRegistry_acceptAdminRole:test_acceptAdminRole_OnlyPendingAdministrator_Revert() (gas: 58611) -TokenAdminRegistry_acceptAdminRole:test_acceptAdminRole_Success() (gas: 50532) -TokenAdminRegistry_addRegistryModule:test_addRegistryModule_OnlyOwner_Revert() (gas: 14159) -TokenAdminRegistry_addRegistryModule:test_addRegistryModule_Success() (gas: 70293) -TokenAdminRegistry_getAllConfiguredTokens:test_getAllConfiguredTokens_outOfBounds_Success() (gas: 12680) -TokenAdminRegistry_getPool:test_getPool_Success() (gas: 18649) -TokenAdminRegistry_getPools:test_getPools_Success() (gas: 48161) -TokenAdminRegistry_isAdministrator:test_isAdministrator_Success() (gas: 113861) -TokenAdminRegistry_proposeAdministrator:test_proposeAdministrator_AlreadyRegistered_Revert() (gas: 109470) -TokenAdminRegistry_proposeAdministrator:test_proposeAdministrator_OnlyRegistryModule_Revert() (gas: 17535) -TokenAdminRegistry_proposeAdministrator:test_proposeAdministrator_ZeroAddress_Revert() (gas: 16768) -TokenAdminRegistry_proposeAdministrator:test_proposeAdministrator_module_Success() (gas: 123148) -TokenAdminRegistry_proposeAdministrator:test_proposeAdministrator_owner_Success() (gas: 114227) -TokenAdminRegistry_proposeAdministrator:test_proposeAdministrator_reRegisterWhileUnclaimed_Success() (gas: 123889) -TokenAdminRegistry_removeRegistryModule:test_removeRegistryModule_OnlyOwner_Revert() (gas: 14115) -TokenAdminRegistry_removeRegistryModule:test_removeRegistryModule_Success() (gas: 58226) -TokenAdminRegistry_setPool:test_setPool_InvalidTokenPoolToken_Revert() (gas: 21992) -TokenAdminRegistry_setPool:test_setPool_OnlyAdministrator_Revert() (gas: 20133) -TokenAdminRegistry_setPool:test_setPool_Success() (gas: 41047) -TokenAdminRegistry_setPool:test_setPool_ZeroAddressRemovesPool_Success() (gas: 35795) -TokenAdminRegistry_transferAdminRole:test_transferAdminRole_OnlyAdministrator_Revert() (gas: 20198) -TokenAdminRegistry_transferAdminRole:test_transferAdminRole_Success() (gas: 54721) -TokenPoolAndProxy:test_lockOrBurn_burnMint_Success() (gas: 8984851) -TokenPoolAndProxy:test_lockOrBurn_burnWithFromMint_Success() (gas: 9018204) -TokenPoolAndProxy:test_lockOrBurn_lockRelease_Success() (gas: 9314221) -TokenPoolAndProxy:test_setPreviousPool_Success() (gas: 5168919) -TokenPoolAndProxyMigration:test_tokenPoolMigration_Success_1_2() (gas: 9975724) -TokenPoolAndProxyMigration:test_tokenPoolMigration_Success_1_4() (gas: 10174033) +PingPong_ccipReceive:test_CcipReceive_Success() (gas: 151349) +PingPong_plumbing:test_OutOfOrderExecution_Success() (gas: 20310) +PingPong_plumbing:test_Pausing_Success() (gas: 17810) +PingPong_startPingPong:test_StartPingPong_With_OOO_Success() (gas: 162091) +PingPong_startPingPong:test_StartPingPong_With_Sequenced_Ordered_Success() (gas: 181509) +RMNHome__validateStaticAndDynamicConfig:test_validateStaticAndDynamicConfig_DuplicateOffchainPublicKey_reverts() (gas: 18822) +RMNHome__validateStaticAndDynamicConfig:test_validateStaticAndDynamicConfig_DuplicatePeerId_reverts() (gas: 18682) +RMNHome__validateStaticAndDynamicConfig:test_validateStaticAndDynamicConfig_DuplicateSourceChain_reverts() (gas: 20371) +RMNHome__validateStaticAndDynamicConfig:test_validateStaticAndDynamicConfig_MinObserversTooHigh_reverts() (gas: 20810) +RMNHome__validateStaticAndDynamicConfig:test_validateStaticAndDynamicConfig_OutOfBoundsNodesLength_reverts() (gas: 137268) +RMNHome__validateStaticAndDynamicConfig:test_validateStaticAndDynamicConfig_OutOfBoundsObserverNodeIndex_reverts() (gas: 20472) +RMNHome_getConfigDigests:test_getConfigDigests_success() (gas: 1077745) +RMNHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_ConfigDigestMismatch_reverts() (gas: 23857) +RMNHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_NoOpStateTransitionNotAllowed_reverts() (gas: 10575) +RMNHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_OnlyOwner_reverts() (gas: 10936) +RMNHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive_success() (gas: 1083071) +RMNHome_revokeCandidate:test_revokeCandidate_ConfigDigestMismatch_reverts() (gas: 19063) +RMNHome_revokeCandidate:test_revokeCandidate_OnlyOwner_reverts() (gas: 10963) +RMNHome_revokeCandidate:test_revokeCandidate_RevokingZeroDigestNotAllowed_reverts() (gas: 10606) +RMNHome_revokeCandidate:test_revokeCandidate_success() (gas: 28147) +RMNHome_setCandidate:test_setCandidate_ConfigDigestMismatch_reverts() (gas: 594679) +RMNHome_setCandidate:test_setCandidate_OnlyOwner_reverts() (gas: 15177) +RMNHome_setCandidate:test_setCandidate_success() (gas: 588379) +RMNHome_setDynamicConfig:test_setDynamicConfig_DigestNotFound_reverts() (gas: 30159) +RMNHome_setDynamicConfig:test_setDynamicConfig_MinObserversTooHigh_reverts() (gas: 18848) +RMNHome_setDynamicConfig:test_setDynamicConfig_OnlyOwner_reverts() (gas: 14115) +RMNHome_setDynamicConfig:test_setDynamicConfig_success() (gas: 103911) +RMNRemote_constructor:test_constructor_success() (gas: 8334) +RMNRemote_constructor:test_constructor_zeroChainSelector_reverts() (gas: 59165) +RMNRemote_curse:test_curse_AlreadyCursed_duplicateSubject_reverts() (gas: 154457) +RMNRemote_curse:test_curse_calledByNonOwner_reverts() (gas: 18780) +RMNRemote_curse:test_curse_success() (gas: 149365) +RMNRemote_global_and_legacy_curses:test_global_and_legacy_curses_success() (gas: 133464) +RMNRemote_setConfig:test_setConfig_addSigner_removeSigner_success() (gas: 976479) +RMNRemote_setConfig:test_setConfig_duplicateOnChainPublicKey_reverts() (gas: 323272) +RMNRemote_setConfig:test_setConfig_invalidSignerOrder_reverts() (gas: 80138) +RMNRemote_setConfig:test_setConfig_minSignersIs0_success() (gas: 700548) +RMNRemote_setConfig:test_setConfig_minSignersTooHigh_reverts() (gas: 54024) +RMNRemote_uncurse:test_uncurse_NotCursed_duplicatedUncurseSubject_reverts() (gas: 51912) +RMNRemote_uncurse:test_uncurse_calledByNonOwner_reverts() (gas: 18748) +RMNRemote_uncurse:test_uncurse_success() (gas: 40151) +RMNRemote_verify_withConfigNotSet:test_verify_reverts() (gas: 13650) +RMNRemote_verify_withConfigSet:test_verify_InvalidSignature_reverts() (gas: 78519) +RMNRemote_verify_withConfigSet:test_verify_OutOfOrderSignatures_duplicateSignature_reverts() (gas: 76336) +RMNRemote_verify_withConfigSet:test_verify_OutOfOrderSignatures_not_sorted_reverts() (gas: 83399) +RMNRemote_verify_withConfigSet:test_verify_ThresholdNotMet_reverts() (gas: 153002) +RMNRemote_verify_withConfigSet:test_verify_UnexpectedSigner_reverts() (gas: 387667) +RMNRemote_verify_withConfigSet:test_verify_minSignersIsZero_success() (gas: 184524) +RMNRemote_verify_withConfigSet:test_verify_success() (gas: 68207) +RMN_constructor:test_Constructor_Success() (gas: 48994) +RMN_getRecordedCurseRelatedOps:test_OpsPostDeployment() (gas: 19732) +RMN_lazyVoteToCurseUpdate_Benchmark:test_VoteToCurseLazilyRetain3VotersUponConfigChange_gas() (gas: 152296) +RMN_ownerUnbless:test_Unbless_Success() (gas: 74936) +RMN_ownerUnvoteToCurse:test_CanBlessAndCurseAfterGlobalCurseIsLifted() (gas: 471829) +RMN_ownerUnvoteToCurse:test_IsIdempotent() (gas: 398492) +RMN_ownerUnvoteToCurse:test_NonOwner_Revert() (gas: 18723) +RMN_ownerUnvoteToCurse:test_OwnerUnvoteToCurseSuccess_gas() (gas: 358084) +RMN_ownerUnvoteToCurse:test_UnknownVoter_Revert() (gas: 33190) +RMN_ownerUnvoteToCurse_Benchmark:test_OwnerUnvoteToCurse_1Voter_LiftsCurse_gas() (gas: 262408) +RMN_permaBlessing:test_PermaBlessing() (gas: 202777) +RMN_setConfig:test_BlessVoterIsZeroAddress_Revert() (gas: 15500) +RMN_setConfig:test_EitherThresholdIsZero_Revert() (gas: 21107) +RMN_setConfig:test_NonOwner_Revert() (gas: 14725) +RMN_setConfig:test_RepeatedAddress_Revert() (gas: 18219) +RMN_setConfig:test_SetConfigSuccess_gas() (gas: 104154) +RMN_setConfig:test_TotalWeightsSmallerThanEachThreshold_Revert() (gas: 30185) +RMN_setConfig:test_VoteToBlessByEjectedVoter_Revert() (gas: 130461) +RMN_setConfig:test_VotersLengthIsZero_Revert() (gas: 12149) +RMN_setConfig:test_WeightIsZeroAddress_Revert() (gas: 15740) +RMN_setConfig_Benchmark_1:test_SetConfig_7Voters_gas() (gas: 659600) +RMN_setConfig_Benchmark_2:test_ResetConfig_7Voters_gas() (gas: 212652) +RMN_unvoteToCurse:test_InvalidCursesHash() (gas: 26430) +RMN_unvoteToCurse:test_OwnerSkips() (gas: 33831) +RMN_unvoteToCurse:test_OwnerSucceeds() (gas: 64005) +RMN_unvoteToCurse:test_UnauthorizedVoter() (gas: 47715) +RMN_unvoteToCurse:test_ValidCursesHash() (gas: 61145) +RMN_unvoteToCurse:test_VotersCantLiftCurseButOwnerCan() (gas: 629190) +RMN_voteToBless:test_Curse_Revert() (gas: 473408) +RMN_voteToBless:test_IsAlreadyBlessed_Revert() (gas: 115435) +RMN_voteToBless:test_RootSuccess() (gas: 558661) +RMN_voteToBless:test_SenderAlreadyVoted_Revert() (gas: 97234) +RMN_voteToBless:test_UnauthorizedVoter_Revert() (gas: 17126) +RMN_voteToBless_Benchmark:test_1RootSuccess_gas() (gas: 44718) +RMN_voteToBless_Benchmark:test_3RootSuccess_gas() (gas: 98694) +RMN_voteToBless_Benchmark:test_5RootSuccess_gas() (gas: 152608) +RMN_voteToBless_Blessed_Benchmark:test_1RootSuccessBecameBlessed_gas() (gas: 29682) +RMN_voteToBless_Blessed_Benchmark:test_1RootSuccess_gas() (gas: 27628) +RMN_voteToBless_Blessed_Benchmark:test_3RootSuccess_gas() (gas: 81626) +RMN_voteToBless_Blessed_Benchmark:test_5RootSuccess_gas() (gas: 135518) +RMN_voteToCurse:test_CurseOnlyWhenThresholdReached_Success() (gas: 1651170) +RMN_voteToCurse:test_EmptySubjects_Revert() (gas: 14061) +RMN_voteToCurse:test_EvenIfAlreadyCursed_Success() (gas: 535124) +RMN_voteToCurse:test_OwnerCanCurseAndUncurse() (gas: 400060) +RMN_voteToCurse:test_RepeatedSubject_Revert() (gas: 144405) +RMN_voteToCurse:test_ReusedCurseId_Revert() (gas: 146972) +RMN_voteToCurse:test_UnauthorizedVoter_Revert() (gas: 12666) +RMN_voteToCurse:test_VoteToCurse_NoCurse_Success() (gas: 187556) +RMN_voteToCurse:test_VoteToCurse_YesCurse_Success() (gas: 473079) +RMN_voteToCurse_2:test_VotesAreDroppedIfSubjectIsNotCursedDuringConfigChange() (gas: 371083) +RMN_voteToCurse_2:test_VotesAreRetainedIfSubjectIsCursedDuringConfigChange() (gas: 1154362) +RMN_voteToCurse_Benchmark_1:test_VoteToCurse_NewSubject_NewVoter_NoCurse_gas() (gas: 141118) +RMN_voteToCurse_Benchmark_1:test_VoteToCurse_NewSubject_NewVoter_YesCurse_gas() (gas: 165258) +RMN_voteToCurse_Benchmark_2:test_VoteToCurse_OldSubject_NewVoter_NoCurse_gas() (gas: 121437) +RMN_voteToCurse_Benchmark_2:test_VoteToCurse_OldSubject_OldVoter_NoCurse_gas() (gas: 98373) +RMN_voteToCurse_Benchmark_3:test_VoteToCurse_OldSubject_NewVoter_YesCurse_gas() (gas: 145784) +RateLimiter_constructor:test_Constructor_Success() (gas: 19734) +RateLimiter_consume:test_AggregateValueMaxCapacityExceeded_Revert() (gas: 16042) +RateLimiter_consume:test_AggregateValueRateLimitReached_Revert() (gas: 22390) +RateLimiter_consume:test_ConsumeAggregateValue_Success() (gas: 31518) +RateLimiter_consume:test_ConsumeTokens_Success() (gas: 20381) +RateLimiter_consume:test_ConsumeUnlimited_Success() (gas: 40687) +RateLimiter_consume:test_ConsumingMoreThanUint128_Revert() (gas: 15822) +RateLimiter_consume:test_RateLimitReachedOverConsecutiveBlocks_Revert() (gas: 25798) +RateLimiter_consume:test_Refill_Success() (gas: 37444) +RateLimiter_consume:test_TokenMaxCapacityExceeded_Revert() (gas: 18388) +RateLimiter_consume:test_TokenRateLimitReached_Revert() (gas: 24886) +RateLimiter_currentTokenBucketState:test_CurrentTokenBucketState_Success() (gas: 38944) +RateLimiter_currentTokenBucketState:test_Refill_Success() (gas: 46849) +RateLimiter_setTokenBucketConfig:test_SetRateLimiterConfig_Success() (gas: 38506) +RegistryModuleOwnerCustom_constructor:test_constructor_Revert() (gas: 36033) +RegistryModuleOwnerCustom_registerAdminViaGetCCIPAdmin:test_registerAdminViaGetCCIPAdmin_Revert() (gas: 19739) +RegistryModuleOwnerCustom_registerAdminViaGetCCIPAdmin:test_registerAdminViaGetCCIPAdmin_Success() (gas: 130086) +RegistryModuleOwnerCustom_registerAdminViaOwner:test_registerAdminViaOwner_Revert() (gas: 19559) +RegistryModuleOwnerCustom_registerAdminViaOwner:test_registerAdminViaOwner_Success() (gas: 129905) +Router_applyRampUpdates:test_OffRampMismatch_Revert() (gas: 89366) +Router_applyRampUpdates:test_OffRampUpdatesWithRouting() (gas: 10662612) +Router_applyRampUpdates:test_OnRampDisable() (gas: 56007) +Router_applyRampUpdates:test_OnlyOwner_Revert() (gas: 12356) +Router_ccipSend:test_CCIPSendLinkFeeNoTokenSuccess_gas() (gas: 114599) +Router_ccipSend:test_CCIPSendLinkFeeOneTokenSuccess_gas() (gas: 202430) +Router_ccipSend:test_CCIPSendNativeFeeNoTokenSuccess_gas() (gas: 126968) +Router_ccipSend:test_CCIPSendNativeFeeOneTokenSuccess_gas() (gas: 214801) +Router_ccipSend:test_FeeTokenAmountTooLow_Revert() (gas: 64520) +Router_ccipSend:test_InvalidMsgValue() (gas: 32155) +Router_ccipSend:test_NativeFeeTokenInsufficientValue() (gas: 67177) +Router_ccipSend:test_NativeFeeTokenOverpay_Success() (gas: 170385) +Router_ccipSend:test_NativeFeeTokenZeroValue() (gas: 54279) +Router_ccipSend:test_NativeFeeToken_Success() (gas: 168901) +Router_ccipSend:test_NonLinkFeeToken_Success() (gas: 239227) +Router_ccipSend:test_UnsupportedDestinationChain_Revert() (gas: 24854) +Router_ccipSend:test_WhenNotHealthy_Revert() (gas: 44811) +Router_ccipSend:test_WrappedNativeFeeToken_Success() (gas: 171189) +Router_ccipSend:test_ZeroFeeAndGasPrice_Success() (gas: 241701) +Router_constructor:test_Constructor_Success() (gas: 13128) +Router_getArmProxy:test_getArmProxy() (gas: 10573) +Router_getFee:test_GetFeeSupportedChain_Success() (gas: 44673) +Router_getFee:test_UnsupportedDestinationChain_Revert() (gas: 17192) +Router_getSupportedTokens:test_GetSupportedTokens_Revert() (gas: 10532) +Router_recoverTokens:test_RecoverTokensInvalidRecipient_Revert() (gas: 11334) +Router_recoverTokens:test_RecoverTokensNoFunds_Revert() (gas: 20267) +Router_recoverTokens:test_RecoverTokensNonOwner_Revert() (gas: 11171) +Router_recoverTokens:test_RecoverTokensValueReceiver_Revert() (gas: 358049) +Router_recoverTokens:test_RecoverTokens_Success() (gas: 52480) +Router_routeMessage:test_AutoExec_Success() (gas: 42816) +Router_routeMessage:test_ExecutionEvent_Success() (gas: 158520) +Router_routeMessage:test_ManualExec_Success() (gas: 35546) +Router_routeMessage:test_OnlyOffRamp_Revert() (gas: 25224) +Router_routeMessage:test_WhenNotHealthy_Revert() (gas: 44799) +Router_setWrappedNative:test_OnlyOwner_Revert() (gas: 10998) +SelfFundedPingPong_ccipReceive:test_FundingIfNotANop_Revert() (gas: 55660) +SelfFundedPingPong_ccipReceive:test_Funding_Success() (gas: 421258) +SelfFundedPingPong_setCountIncrBeforeFunding:test_setCountIncrBeforeFunding() (gas: 20181) +TokenAdminRegistry_acceptAdminRole:test_acceptAdminRole_OnlyPendingAdministrator_Revert() (gas: 51163) +TokenAdminRegistry_acceptAdminRole:test_acceptAdminRole_Success() (gas: 44004) +TokenAdminRegistry_addRegistryModule:test_addRegistryModule_OnlyOwner_Revert() (gas: 12653) +TokenAdminRegistry_addRegistryModule:test_addRegistryModule_Success() (gas: 67056) +TokenAdminRegistry_getAllConfiguredTokens:test_getAllConfiguredTokens_outOfBounds_Success() (gas: 11362) +TokenAdminRegistry_getPool:test_getPool_Success() (gas: 17602) +TokenAdminRegistry_getPools:test_getPools_Success() (gas: 39962) +TokenAdminRegistry_isAdministrator:test_isAdministrator_Success() (gas: 106006) +TokenAdminRegistry_proposeAdministrator:test_proposeAdministrator_AlreadyRegistered_Revert() (gas: 104346) +TokenAdminRegistry_proposeAdministrator:test_proposeAdministrator_OnlyRegistryModule_Revert() (gas: 15610) +TokenAdminRegistry_proposeAdministrator:test_proposeAdministrator_ZeroAddress_Revert() (gas: 15155) +TokenAdminRegistry_proposeAdministrator:test_proposeAdministrator_module_Success() (gas: 112962) +TokenAdminRegistry_proposeAdministrator:test_proposeAdministrator_owner_Success() (gas: 107965) +TokenAdminRegistry_proposeAdministrator:test_proposeAdministrator_reRegisterWhileUnclaimed_Success() (gas: 116067) +TokenAdminRegistry_removeRegistryModule:test_removeRegistryModule_OnlyOwner_Revert() (gas: 12609) +TokenAdminRegistry_removeRegistryModule:test_removeRegistryModule_Success() (gas: 54524) +TokenAdminRegistry_setPool:test_setPool_InvalidTokenPoolToken_Revert() (gas: 19316) +TokenAdminRegistry_setPool:test_setPool_OnlyAdministrator_Revert() (gas: 18137) +TokenAdminRegistry_setPool:test_setPool_Success() (gas: 36135) +TokenAdminRegistry_setPool:test_setPool_ZeroAddressRemovesPool_Success() (gas: 30842) +TokenAdminRegistry_transferAdminRole:test_transferAdminRole_OnlyAdministrator_Revert() (gas: 18103) +TokenAdminRegistry_transferAdminRole:test_transferAdminRole_Success() (gas: 49438) +TokenPoolAndProxy:test_lockOrBurn_burnMint_Success() (gas: 5586499) +TokenPoolAndProxy:test_lockOrBurn_burnWithFromMint_Success() (gas: 5618769) +TokenPoolAndProxy:test_lockOrBurn_lockRelease_Success() (gas: 5793246) +TokenPoolAndProxy:test_setPreviousPool_Success() (gas: 3070731) +TokenPoolAndProxyMigration:test_tokenPoolMigration_Success_1_2() (gas: 6434801) +TokenPoolAndProxyMigration:test_tokenPoolMigration_Success_1_4() (gas: 6634934) TokenPoolFactoryTests:test_TokenPoolFactory_Constructor_Revert() (gas: 1048467) TokenPoolFactoryTests:test_createTokenPoolLockRelease_ExistingToken_predict_Success() (gas: 11781716) TokenPoolFactoryTests:test_createTokenPool_ExistingRemoteToken_AndPredictPool_Success() (gas: 12423735) TokenPoolFactoryTests:test_createTokenPool_WithNoExistingRemoteContracts_predict_Success() (gas: 12765036) TokenPoolFactoryTests:test_createTokenPool_WithNoExistingTokenOnRemoteChain_Success() (gas: 5841282) TokenPoolFactoryTests:test_createTokenPool_WithRemoteTokenAndRemotePool_Success() (gas: 5981454) -TokenPoolWithAllowList_applyAllowListUpdates:test_AllowListNotEnabled_Revert() (gas: 3418174) -TokenPoolWithAllowList_applyAllowListUpdates:test_OnlyOwner_Revert() (gas: 13392) -TokenPoolWithAllowList_applyAllowListUpdates:test_SetAllowListSkipsZero_Success() (gas: 26742) -TokenPoolWithAllowList_applyAllowListUpdates:test_SetAllowList_Success() (gas: 189536) -TokenPoolWithAllowList_getAllowList:test_GetAllowList_Success() (gas: 25742) -TokenPoolWithAllowList_getAllowListEnabled:test_GetAllowListEnabled_Success() (gas: 8788) -TokenPoolWithAllowList_setRouter:test_SetRouter_Success() (gas: 28100) -TokenPool_applyChainUpdates:test_applyChainUpdates_DisabledNonZeroRateLimit_Revert() (gas: 282666) -TokenPool_applyChainUpdates:test_applyChainUpdates_InvalidRateLimitRate_Revert() (gas: 580050) -TokenPool_applyChainUpdates:test_applyChainUpdates_NonExistentChain_Revert() (gas: 22750) -TokenPool_applyChainUpdates:test_applyChainUpdates_OnlyCallableByOwner_Revert() (gas: 12333) -TokenPool_applyChainUpdates:test_applyChainUpdates_Success() (gas: 534354) -TokenPool_applyChainUpdates:test_applyChainUpdates_ZeroAddressNotAllowed_Revert() (gas: 165350) -TokenPool_constructor:test_ZeroAddressNotAllowed_Revert() (gas: 74247) -TokenPool_constructor:test_immutableFields_Success() (gas: 23251) -TokenPool_getRemotePool:test_getRemotePool_Success() (gas: 285082) -TokenPool_onlyOffRamp:test_CallerIsNotARampOnRouter_Revert() (gas: 287212) -TokenPool_onlyOffRamp:test_ChainNotAllowed_Revert() (gas: 305616) -TokenPool_onlyOffRamp:test_onlyOffRamp_Success() (gas: 361142) -TokenPool_onlyOnRamp:test_CallerIsNotARampOnRouter_Revert() (gas: 286591) -TokenPool_onlyOnRamp:test_ChainNotAllowed_Revert() (gas: 269389) -TokenPool_onlyOnRamp:test_onlyOnRamp_Success() (gas: 315814) -TokenPool_setChainRateLimiterConfig:test_NonExistentChain_Revert() (gas: 19578) -TokenPool_setChainRateLimiterConfig:test_OnlyOwnerOrRateLimitAdmin_Revert() (gas: 17926) -TokenPool_setRemotePool:test_setRemotePool_NonExistentChain_Reverts() (gas: 17612) -TokenPool_setRemotePool:test_setRemotePool_OnlyOwner_Reverts() (gas: 15337) -TokenPool_setRemotePool:test_setRemotePool_Success() (gas: 293732) -TokenProxy_ccipSend:test_CcipSendGasShouldBeZero_Revert() (gas: 20582) -TokenProxy_ccipSend:test_CcipSendInsufficientAllowance_Revert() (gas: 158368) -TokenProxy_ccipSend:test_CcipSendInvalidToken_Revert() (gas: 18599) -TokenProxy_ccipSend:test_CcipSendNative_Success() (gas: 288755) -TokenProxy_ccipSend:test_CcipSendNoDataAllowed_Revert() (gas: 19019) -TokenProxy_ccipSend:test_CcipSend_Success() (gas: 310931) -TokenProxy_constructor:test_Constructor() (gas: 15309) -TokenProxy_getFee:test_GetFeeGasShouldBeZero_Revert() (gas: 20176) -TokenProxy_getFee:test_GetFeeInvalidToken_Revert() (gas: 14693) -TokenProxy_getFee:test_GetFeeNoDataAllowed_Revert() (gas: 18513) -TokenProxy_getFee:test_GetFee_Success() (gas: 117905) -USDCTokenPool__validateMessage:test_ValidateInvalidMessage_Revert() (gas: 37856) -USDCTokenPool_lockOrBurn:test_CallerIsNotARampOnRouter_Revert() (gas: 40114) -USDCTokenPool_lockOrBurn:test_LockOrBurnWithAllowList_Revert() (gas: 34440) -USDCTokenPool_lockOrBurn:test_LockOrBurn_Success() (gas: 147394) -USDCTokenPool_lockOrBurn:test_UnknownDomain_Revert() (gas: 546719) -USDCTokenPool_releaseOrMint:test_ReleaseOrMintRealTx_Success() (gas: 326433) -USDCTokenPool_releaseOrMint:test_TokenMaxCapacityExceeded_Revert() (gas: 59047) -USDCTokenPool_releaseOrMint:test_UnlockingUSDCFailed_Revert() (gas: 112325) -USDCTokenPool_setDomains:test_InvalidDomain_Revert() (gas: 74539) -USDCTokenPool_setDomains:test_OnlyOwner_Revert() (gas: 12298) -USDCTokenPool_supportsInterface:test_SupportsInterface_Success() (gas: 11479) \ No newline at end of file +TokenPoolWithAllowList_applyAllowListUpdates:test_AllowListNotEnabled_Revert() (gas: 1979943) +TokenPoolWithAllowList_applyAllowListUpdates:test_OnlyOwner_Revert() (gas: 12113) +TokenPoolWithAllowList_applyAllowListUpdates:test_SetAllowListSkipsZero_Success() (gas: 23476) +TokenPoolWithAllowList_applyAllowListUpdates:test_SetAllowList_Success() (gas: 177848) +TokenPoolWithAllowList_getAllowList:test_GetAllowList_Success() (gas: 23764) +TokenPoolWithAllowList_getAllowListEnabled:test_GetAllowListEnabled_Success() (gas: 8375) +TokenPoolWithAllowList_setRouter:test_SetRouter_Success() (gas: 24867) +TokenPool_applyChainUpdates:test_applyChainUpdates_DisabledNonZeroRateLimit_Revert() (gas: 271569) +TokenPool_applyChainUpdates:test_applyChainUpdates_InvalidRateLimitRate_Revert() (gas: 542359) +TokenPool_applyChainUpdates:test_applyChainUpdates_NonExistentChain_Revert() (gas: 18449) +TokenPool_applyChainUpdates:test_applyChainUpdates_OnlyCallableByOwner_Revert() (gas: 11469) +TokenPool_applyChainUpdates:test_applyChainUpdates_Success() (gas: 479160) +TokenPool_applyChainUpdates:test_applyChainUpdates_ZeroAddressNotAllowed_Revert() (gas: 157422) +TokenPool_constructor:test_ZeroAddressNotAllowed_Revert() (gas: 70484) +TokenPool_constructor:test_immutableFields_Success() (gas: 20586) +TokenPool_getRemotePool:test_getRemotePool_Success() (gas: 274181) +TokenPool_onlyOffRamp:test_CallerIsNotARampOnRouter_Revert() (gas: 277296) +TokenPool_onlyOffRamp:test_ChainNotAllowed_Revert() (gas: 290028) +TokenPool_onlyOffRamp:test_onlyOffRamp_Success() (gas: 350050) +TokenPool_onlyOnRamp:test_CallerIsNotARampOnRouter_Revert() (gas: 277036) +TokenPool_onlyOnRamp:test_ChainNotAllowed_Revert() (gas: 254065) +TokenPool_onlyOnRamp:test_onlyOnRamp_Success() (gas: 305106) +TokenPool_setChainRateLimiterConfig:test_NonExistentChain_Revert() (gas: 17187) +TokenPool_setChainRateLimiterConfig:test_OnlyOwnerOrRateLimitAdmin_Revert() (gas: 15227) +TokenPool_setRemotePool:test_setRemotePool_NonExistentChain_Reverts() (gas: 15671) +TokenPool_setRemotePool:test_setRemotePool_OnlyOwner_Reverts() (gas: 13219) +TokenPool_setRemotePool:test_setRemotePool_Success() (gas: 282125) +TokenProxy_ccipSend:test_CcipSendGasShouldBeZero_Revert() (gas: 17226) +TokenProxy_ccipSend:test_CcipSendInsufficientAllowance_Revert() (gas: 134605) +TokenProxy_ccipSend:test_CcipSendInvalidToken_Revert() (gas: 16000) +TokenProxy_ccipSend:test_CcipSendNative_Success() (gas: 244013) +TokenProxy_ccipSend:test_CcipSendNoDataAllowed_Revert() (gas: 16384) +TokenProxy_ccipSend:test_CcipSend_Success() (gas: 262651) +TokenProxy_constructor:test_Constructor() (gas: 13836) +TokenProxy_getFee:test_GetFeeGasShouldBeZero_Revert() (gas: 16899) +TokenProxy_getFee:test_GetFeeInvalidToken_Revert() (gas: 12706) +TokenProxy_getFee:test_GetFeeNoDataAllowed_Revert() (gas: 15885) +TokenProxy_getFee:test_GetFee_Success() (gas: 85240) +USDCTokenPool__validateMessage:test_ValidateInvalidMessage_Revert() (gas: 25704) +USDCTokenPool_lockOrBurn:test_CallerIsNotARampOnRouter_Revert() (gas: 35481) +USDCTokenPool_lockOrBurn:test_LockOrBurnWithAllowList_Revert() (gas: 30235) +USDCTokenPool_lockOrBurn:test_LockOrBurn_Success() (gas: 133508) +USDCTokenPool_lockOrBurn:test_UnknownDomain_Revert() (gas: 478182) +USDCTokenPool_releaseOrMint:test_ReleaseOrMintRealTx_Success() (gas: 268672) +USDCTokenPool_releaseOrMint:test_TokenMaxCapacityExceeded_Revert() (gas: 50952) +USDCTokenPool_releaseOrMint:test_UnlockingUSDCFailed_Revert() (gas: 98987) +USDCTokenPool_setDomains:test_InvalidDomain_Revert() (gas: 66393) +USDCTokenPool_setDomains:test_OnlyOwner_Revert() (gas: 11363) +USDCTokenPool_supportsInterface:test_SupportsInterface_Success() (gas: 10041) \ No newline at end of file From 93558492d9ac8ac42784f7dac33635669d9425ef Mon Sep 17 00:00:00 2001 From: Josh Date: Tue, 15 Oct 2024 10:07:37 -0400 Subject: [PATCH 43/48] snapshot fix after a merge --- contracts/gas-snapshots/ccip.gas-snapshot | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot index fd27fde54c..a44ba77f12 100644 --- a/contracts/gas-snapshots/ccip.gas-snapshot +++ b/contracts/gas-snapshots/ccip.gas-snapshot @@ -399,12 +399,12 @@ FeeQuoter_getValidatedFee:test_NotAFeeToken_Revert() (gas: 21211) FeeQuoter_getValidatedFee:test_SingleTokenMessage_Success() (gas: 113826) FeeQuoter_getValidatedFee:test_TooManyTokens_Revert() (gas: 22729) FeeQuoter_getValidatedFee:test_ZeroDataAvailabilityMultiplier_Success() (gas: 63709) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedErc20Above18Decimals_Success() (gas: 1973907) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedErc20Below18Decimals_Success() (gas: 1973865) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFeedAt0Decimals_Success() (gas: 1953984) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFeedAt18Decimals_Success() (gas: 1973639) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFlippedDecimals_Success() (gas: 1973843) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedMaxInt224Value_Success() (gas: 1973655) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedErc20Above18Decimals_Success() (gas: 1973707) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedErc20Below18Decimals_Success() (gas: 1973665) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFeedAt0Decimals_Success() (gas: 1953784) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFeedAt18Decimals_Success() (gas: 1973439) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFlippedDecimals_Success() (gas: 1973643) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedMaxInt224Value_Success() (gas: 1973455) FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedOverStalenessPeriod_Success() (gas: 64610) FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeed_Success() (gas: 64490) FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPrice_Success() (gas: 58894) @@ -412,7 +412,7 @@ FeeQuoter_getValidatedTokenPrice:test_OverflowFeedPrice_Revert() (gas: 1973152) FeeQuoter_getValidatedTokenPrice:test_StaleFeeToken_Success() (gas: 61764) FeeQuoter_getValidatedTokenPrice:test_TokenNotSupportedFeed_Revert() (gas: 116495) FeeQuoter_getValidatedTokenPrice:test_TokenNotSupported_Revert() (gas: 14037) -FeeQuoter_getValidatedTokenPrice:test_UnderflowFeedPrice_Revert() (gas: 1972029) +FeeQuoter_getValidatedTokenPrice:test_UnderflowFeedPrice_Revert() (gas: 1971829) FeeQuoter_onReport:test_OnReport_StaleUpdate_Revert() (gas: 43675) FeeQuoter_onReport:test_onReport_InvalidForwarder_Reverts() (gas: 23514) FeeQuoter_onReport:test_onReport_Success() (gas: 80116) From 7ce7ea7662cb95982b771225a48c5cae3d7fe8b7 Mon Sep 17 00:00:00 2001 From: Josh Date: Tue, 15 Oct 2024 11:28:58 -0400 Subject: [PATCH 44/48] fix wrapper changes previously --- contracts/gas-snapshots/ccip.gas-snapshot | 28 +++++++++---------- .../TokenPoolFactory/TokenPoolFactory.sol | 4 +-- .../shared/token/ERC20/IBurnMintERC20.sol | 2 -- .../burn_mint_erc677/burn_mint_erc677.go | 2 +- .../shared/generated/link_token/link_token.go | 2 +- ...rapper-dependency-versions-do-not-edit.txt | 4 +-- 6 files changed, 20 insertions(+), 22 deletions(-) diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot index a44ba77f12..4f02741cef 100644 --- a/contracts/gas-snapshots/ccip.gas-snapshot +++ b/contracts/gas-snapshots/ccip.gas-snapshot @@ -333,7 +333,7 @@ FactoryBurnMintERC20burnFromAlias:testBurnFromSuccess() (gas: 58187) FactoryBurnMintERC20burnFromAlias:testExceedsBalanceReverts() (gas: 36094) FactoryBurnMintERC20burnFromAlias:testInsufficientAllowanceReverts() (gas: 22009) FactoryBurnMintERC20burnFromAlias:testSenderNotBurnerReverts() (gas: 13446) -FactoryBurnMintERC20constructor:testConstructorSuccess() (gas: 1500873) +FactoryBurnMintERC20constructor:testConstructorSuccess() (gas: 1501073) FactoryBurnMintERC20decreaseApproval:testDecreaseApprovalSuccess() (gas: 31323) FactoryBurnMintERC20grantMintAndBurnRoles:testGrantMintAndBurnRolesSuccess() (gas: 121439) FactoryBurnMintERC20grantRole:testGrantBurnAccessSuccess() (gas: 53612) @@ -399,20 +399,20 @@ FeeQuoter_getValidatedFee:test_NotAFeeToken_Revert() (gas: 21211) FeeQuoter_getValidatedFee:test_SingleTokenMessage_Success() (gas: 113826) FeeQuoter_getValidatedFee:test_TooManyTokens_Revert() (gas: 22729) FeeQuoter_getValidatedFee:test_ZeroDataAvailabilityMultiplier_Success() (gas: 63709) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedErc20Above18Decimals_Success() (gas: 1973707) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedErc20Below18Decimals_Success() (gas: 1973665) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFeedAt0Decimals_Success() (gas: 1953784) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFeedAt18Decimals_Success() (gas: 1973439) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFlippedDecimals_Success() (gas: 1973643) -FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedMaxInt224Value_Success() (gas: 1973455) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedErc20Above18Decimals_Success() (gas: 1973907) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedErc20Below18Decimals_Success() (gas: 1973865) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFeedAt0Decimals_Success() (gas: 1953984) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFeedAt18Decimals_Success() (gas: 1973639) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFlippedDecimals_Success() (gas: 1973843) +FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedMaxInt224Value_Success() (gas: 1973655) FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedOverStalenessPeriod_Success() (gas: 64610) FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeed_Success() (gas: 64490) FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPrice_Success() (gas: 58894) -FeeQuoter_getValidatedTokenPrice:test_OverflowFeedPrice_Revert() (gas: 1973152) +FeeQuoter_getValidatedTokenPrice:test_OverflowFeedPrice_Revert() (gas: 1973352) FeeQuoter_getValidatedTokenPrice:test_StaleFeeToken_Success() (gas: 61764) FeeQuoter_getValidatedTokenPrice:test_TokenNotSupportedFeed_Revert() (gas: 116495) FeeQuoter_getValidatedTokenPrice:test_TokenNotSupported_Revert() (gas: 14037) -FeeQuoter_getValidatedTokenPrice:test_UnderflowFeedPrice_Revert() (gas: 1971829) +FeeQuoter_getValidatedTokenPrice:test_UnderflowFeedPrice_Revert() (gas: 1972029) FeeQuoter_onReport:test_OnReport_StaleUpdate_Revert() (gas: 43675) FeeQuoter_onReport:test_onReport_InvalidForwarder_Reverts() (gas: 23514) FeeQuoter_onReport:test_onReport_Success() (gas: 80116) @@ -1016,11 +1016,11 @@ TokenPoolAndProxy:test_setPreviousPool_Success() (gas: 3070731) TokenPoolAndProxyMigration:test_tokenPoolMigration_Success_1_2() (gas: 6440241) TokenPoolAndProxyMigration:test_tokenPoolMigration_Success_1_4() (gas: 6640374) TokenPoolFactoryTests:test_TokenPoolFactory_Constructor_Revert() (gas: 1048467) -TokenPoolFactoryTests:test_createTokenPoolLockRelease_ExistingToken_predict_Success() (gas: 11781716) -TokenPoolFactoryTests:test_createTokenPool_ExistingRemoteToken_AndPredictPool_Success() (gas: 12423735) -TokenPoolFactoryTests:test_createTokenPool_WithNoExistingRemoteContracts_predict_Success() (gas: 12765036) -TokenPoolFactoryTests:test_createTokenPool_WithNoExistingTokenOnRemoteChain_Success() (gas: 5841282) -TokenPoolFactoryTests:test_createTokenPool_WithRemoteTokenAndRemotePool_Success() (gas: 5981454) +TokenPoolFactoryTests:test_createTokenPoolLockRelease_ExistingToken_predict_Success() (gas: 11782116) +TokenPoolFactoryTests:test_createTokenPool_ExistingRemoteToken_AndPredictPool_Success() (gas: 12424135) +TokenPoolFactoryTests:test_createTokenPool_WithNoExistingRemoteContracts_predict_Success() (gas: 12765436) +TokenPoolFactoryTests:test_createTokenPool_WithNoExistingTokenOnRemoteChain_Success() (gas: 5841482) +TokenPoolFactoryTests:test_createTokenPool_WithRemoteTokenAndRemotePool_Success() (gas: 5981654) TokenPoolWithAllowList_applyAllowListUpdates:test_AllowListNotEnabled_Revert() (gas: 1979943) TokenPoolWithAllowList_applyAllowListUpdates:test_OnlyOwner_Revert() (gas: 12113) TokenPoolWithAllowList_applyAllowListUpdates:test_SetAllowListSkipsZero_Success() (gas: 23476) diff --git a/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory/TokenPoolFactory.sol b/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory/TokenPoolFactory.sol index 7be091d5d2..4dc79b552f 100644 --- a/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory/TokenPoolFactory.sol +++ b/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory/TokenPoolFactory.sol @@ -3,12 +3,12 @@ pragma solidity 0.8.24; import {IOwnable} from "../../../shared/interfaces/IOwnable.sol"; import {ITypeAndVersion} from "../../../shared/interfaces/ITypeAndVersion.sol"; -import {IBurnMintERC20} from "../../../shared/token/ERC20/IBurnMintERC20.sol"; import {ITokenAdminRegistry} from "../../interfaces/ITokenAdminRegistry.sol"; import {RateLimiter} from "../../libraries/RateLimiter.sol"; import {TokenPool} from "../../pools/TokenPool.sol"; import {RegistryModuleOwnerCustom} from "../RegistryModuleOwnerCustom.sol"; +import {FactoryBurnMintERC20} from "./FactoryBurnMintERC20.sol"; import {Create2} from "../../../vendor/openzeppelin-solidity/v5.0.2/contracts/utils/Create2.sol"; @@ -113,7 +113,7 @@ contract TokenPoolFactory is ITypeAndVersion { address pool = _createTokenPool(token, remoteTokenPools, tokenPoolInitCode, salt, PoolType.BURN_MINT); // Grant the mint and burn roles to the pool for the token - IBurnMintERC20(token).grantMintAndBurnRoles(pool); + FactoryBurnMintERC20(token).grantMintAndBurnRoles(pool); // Set the token pool for token in the token admin registry since this contract is the token and pool owner _setTokenPoolInTokenAdminRegistry(token, pool); diff --git a/contracts/src/v0.8/shared/token/ERC20/IBurnMintERC20.sol b/contracts/src/v0.8/shared/token/ERC20/IBurnMintERC20.sol index 0ee844d34f..b9b3b54bf7 100644 --- a/contracts/src/v0.8/shared/token/ERC20/IBurnMintERC20.sol +++ b/contracts/src/v0.8/shared/token/ERC20/IBurnMintERC20.sol @@ -26,6 +26,4 @@ interface IBurnMintERC20 is IERC20 { /// @param amount The number of tokens to be burned. /// @dev this function decreases the total supply. function burnFrom(address account, uint256 amount) external; - - function grantMintAndBurnRoles(address account) external; } diff --git a/core/gethwrappers/shared/generated/burn_mint_erc677/burn_mint_erc677.go b/core/gethwrappers/shared/generated/burn_mint_erc677/burn_mint_erc677.go index c56b873a60..1d5b1c4ab1 100644 --- a/core/gethwrappers/shared/generated/burn_mint_erc677/burn_mint_erc677.go +++ b/core/gethwrappers/shared/generated/burn_mint_erc677/burn_mint_erc677.go @@ -32,7 +32,7 @@ var ( var BurnMintERC677MetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"decimals_\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"maxSupply_\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"supplyAfterMint\",\"type\":\"uint256\"}],\"name\":\"MaxSupplyExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SenderNotBurner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SenderNotMinter\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"}],\"name\":\"BurnAccessGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"}],\"name\":\"BurnAccessRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"MintAccessGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"MintAccessRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseApproval\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getBurners\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMinters\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"}],\"name\":\"grantBurnRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"burnAndMinter\",\"type\":\"address\"}],\"name\":\"grantMintAndBurnRoles\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"grantMintRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseApproval\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"}],\"name\":\"isBurner\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"isMinter\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"}],\"name\":\"revokeBurnRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"revokeMintRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"transferAndCall\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x60c06040523480156200001157600080fd5b50604051620022dd380380620022dd833981016040819052620000349162000277565b338060008686818160036200004a838262000391565b50600462000059828262000391565b5050506001600160a01b0384169150620000bc90505760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600580546001600160a01b0319166001600160a01b0384811691909117909155811615620000ef57620000ef8162000106565b50505060ff90911660805260a052506200045d9050565b336001600160a01b03821603620001605760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401620000b3565b600680546001600160a01b0319166001600160a01b03838116918217909255600554604051919216907fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae127890600090a350565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001da57600080fd5b81516001600160401b0380821115620001f757620001f7620001b2565b604051601f8301601f19908116603f01168101908282118183101715620002225762000222620001b2565b816040528381526020925086838588010111156200023f57600080fd5b600091505b8382101562000263578582018301518183018401529082019062000244565b600093810190920192909252949350505050565b600080600080608085870312156200028e57600080fd5b84516001600160401b0380821115620002a657600080fd5b620002b488838901620001c8565b95506020870151915080821115620002cb57600080fd5b50620002da87828801620001c8565b935050604085015160ff81168114620002f257600080fd5b6060959095015193969295505050565b600181811c908216806200031757607f821691505b6020821081036200033857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200038c57600081815260208120601f850160051c81016020861015620003675750805b601f850160051c820191505b81811015620003885782815560010162000373565b5050505b505050565b81516001600160401b03811115620003ad57620003ad620001b2565b620003c581620003be845462000302565b846200033e565b602080601f831160018114620003fd5760008415620003e45750858301515b600019600386901b1c1916600185901b17855562000388565b600085815260208120601f198616915b828110156200042e578886015182559484019460019091019084016200040d565b50858210156200044d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a051611e4c6200049160003960008181610447015281816108c301526108ed015260006102710152611e4c6000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c806379cc67901161010f578063c2e3273d116100a2578063d73dd62311610071578063d73dd6231461046b578063dd62ed3e1461047e578063f2fde38b146104c4578063f81094f3146104d757600080fd5b8063c2e3273d1461040c578063c630948d1461041f578063c64d0ebc14610432578063d5abeb011461044557600080fd5b80639dc29fac116100de5780639dc29fac146103c0578063a457c2d7146103d3578063a9059cbb146103e6578063aa271e1a146103f957600080fd5b806379cc67901461037557806386fe8b43146103885780638da5cb5b1461039057806395d89b41146103b857600080fd5b806340c10f19116101875780636618846311610156578063661884631461030f5780636b32810b1461032257806370a082311461033757806379ba50971461036d57600080fd5b806340c10f19146102c157806342966c68146102d65780634334614a146102e95780634f5632f8146102fc57600080fd5b806323b872dd116101c357806323b872dd14610257578063313ce5671461026a578063395093511461029b5780634000aea0146102ae57600080fd5b806301ffc9a7146101f557806306fdde031461021d578063095ea7b31461023257806318160ddd14610245575b600080fd5b6102086102033660046119b9565b6104ea565b60405190151581526020015b60405180910390f35b61022561061b565b6040516102149190611a5f565b610208610240366004611a9b565b6106ad565b6002545b604051908152602001610214565b610208610265366004611ac5565b6106c5565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610214565b6102086102a9366004611a9b565b6106e9565b6102086102bc366004611b30565b610735565b6102d46102cf366004611a9b565b610858565b005b6102d46102e4366004611c19565b61097f565b6102086102f7366004611c32565b6109cc565b6102d461030a366004611c32565b6109d9565b61020861031d366004611a9b565b610a35565b61032a610a48565b6040516102149190611c4d565b610249610345366004611c32565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6102d4610a59565b6102d4610383366004611a9b565b610b5a565b61032a610ba9565b60055460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610214565b610225610bb5565b6102d46103ce366004611a9b565b610bc4565b6102086103e1366004611a9b565b610bce565b6102086103f4366004611a9b565b610c9f565b610208610407366004611c32565b610cad565b6102d461041a366004611c32565b610cba565b6102d461042d366004611c32565b610d16565b6102d4610440366004611c32565b610d24565b7f0000000000000000000000000000000000000000000000000000000000000000610249565b6102d4610479366004611a9b565b610d80565b61024961048c366004611ca7565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6102d46104d2366004611c32565b610d8a565b6102d46104e5366004611c32565b610d9b565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f36372b0700000000000000000000000000000000000000000000000000000000148061057d57507fffffffff0000000000000000000000000000000000000000000000000000000082167f4000aea000000000000000000000000000000000000000000000000000000000145b806105c957507fffffffff0000000000000000000000000000000000000000000000000000000082167f20690fc000000000000000000000000000000000000000000000000000000000145b8061061557507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b60606003805461062a90611cda565b80601f016020809104026020016040519081016040528092919081815260200182805461065690611cda565b80156106a35780601f10610678576101008083540402835291602001916106a3565b820191906000526020600020905b81548152906001019060200180831161068657829003601f168201915b5050505050905090565b6000336106bb818585610df7565b5060019392505050565b6000336106d3858285610e2b565b6106de858585610efc565b506001949350505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906106bb9082908690610730908790611d5c565b610df7565b60006107418484610c9f565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fe19260aff97b920c7df27010903aeb9c8d2be5d310a2c67824cf3f15396e4c1685856040516107a1929190611d6f565b60405180910390a373ffffffffffffffffffffffffffffffffffffffff84163b156106bb576040517fa4c0ed3600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063a4c0ed369061081c90339087908790600401611d90565b600060405180830381600087803b15801561083657600080fd5b505af115801561084a573d6000803e3d6000fd5b505050505060019392505050565b61086133610cad565b61089e576040517fe2c8c9d50000000000000000000000000000000000000000000000000000000081523360048201526024015b60405180910390fd5b813073ffffffffffffffffffffffffffffffffffffffff8216036108c157600080fd5b7f00000000000000000000000000000000000000000000000000000000000000001580159061092257507f00000000000000000000000000000000000000000000000000000000000000008261091660025490565b6109209190611d5c565b115b15610970578161093160025490565b61093b9190611d5c565b6040517fcbbf111300000000000000000000000000000000000000000000000000000000815260040161089591815260200190565b61097a8383610f2a565b505050565b610988336109cc565b6109c0576040517fc820b10b000000000000000000000000000000000000000000000000000000008152336004820152602401610895565b6109c98161101d565b50565b6000610615600983611027565b6109e1611056565b6109ec6009826110d9565b156109c95760405173ffffffffffffffffffffffffffffffffffffffff8216907f0a675452746933cefe3d74182e78db7afe57ba60eaa4234b5d85e9aa41b0610c90600090a250565b6000610a418383610bce565b9392505050565b6060610a5460076110fb565b905090565b60065473ffffffffffffffffffffffffffffffffffffffff163314610ada576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610895565b600580547fffffffffffffffffffffffff00000000000000000000000000000000000000008082163390811790935560068054909116905560405173ffffffffffffffffffffffffffffffffffffffff909116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b610b63336109cc565b610b9b576040517fc820b10b000000000000000000000000000000000000000000000000000000008152336004820152602401610895565b610ba58282611108565b5050565b6060610a5460096110fb565b60606004805461062a90611cda565b610ba58282610b5a565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610c92576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610895565b6106de8286868403610df7565b6000336106bb818585610efc565b6000610615600783611027565b610cc2611056565b610ccd60078261111d565b156109c95760405173ffffffffffffffffffffffffffffffffffffffff8216907fe46fef8bbff1389d9010703cf8ebb363fb3daf5bf56edc27080b67bc8d9251ea90600090a250565b610d1f81610cba565b6109c9815b610d2c611056565b610d3760098261111d565b156109c95760405173ffffffffffffffffffffffffffffffffffffffff8216907f92308bb7573b2a3d17ddb868b39d8ebec433f3194421abc22d084f89658c9bad90600090a250565b61097a82826106e9565b610d92611056565b6109c98161113f565b610da3611056565b610dae6007826110d9565b156109c95760405173ffffffffffffffffffffffffffffffffffffffff8216907fed998b960f6340d045f620c119730f7aa7995e7425c2401d3a5b64ff998a59e990600090a250565b813073ffffffffffffffffffffffffffffffffffffffff821603610e1a57600080fd5b610e25848484611235565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610e255781811015610eef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610895565b610e258484848403610df7565b813073ffffffffffffffffffffffffffffffffffffffff821603610f1f57600080fd5b610e258484846113e8565b73ffffffffffffffffffffffffffffffffffffffff8216610fa7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610895565b8060026000828254610fb99190611d5c565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6109c93382611657565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001830160205260408120541515610a41565b60055473ffffffffffffffffffffffffffffffffffffffff1633146110d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610895565b565b6000610a418373ffffffffffffffffffffffffffffffffffffffff841661181b565b60606000610a418361190e565b611113823383610e2b565b610ba58282611657565b6000610a418373ffffffffffffffffffffffffffffffffffffffff841661196a565b3373ffffffffffffffffffffffffffffffffffffffff8216036111be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610895565b600680547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff838116918217909255600554604051919216907fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae127890600090a350565b73ffffffffffffffffffffffffffffffffffffffff83166112d7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff821661137a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff831661148b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff821661152e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040902054818110156115e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610e25565b73ffffffffffffffffffffffffffffffffffffffff82166116fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040902054818110156117b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b6000818152600183016020526040812054801561190457600061183f600183611dce565b855490915060009061185390600190611dce565b90508181146118b857600086600001828154811061187357611873611de1565b906000526020600020015490508087600001848154811061189657611896611de1565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806118c9576118c9611e10565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610615565b6000915050610615565b60608160000180548060200260200160405190810160405280929190818152602001828054801561195e57602002820191906000526020600020905b81548152602001906001019080831161194a575b50505050509050919050565b60008181526001830160205260408120546119b157508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610615565b506000610615565b6000602082840312156119cb57600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610a4157600080fd5b6000815180845260005b81811015611a2157602081850181015186830182015201611a05565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081526000610a4160208301846119fb565b803573ffffffffffffffffffffffffffffffffffffffff81168114611a9657600080fd5b919050565b60008060408385031215611aae57600080fd5b611ab783611a72565b946020939093013593505050565b600080600060608486031215611ada57600080fd5b611ae384611a72565b9250611af160208501611a72565b9150604084013590509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080600060608486031215611b4557600080fd5b611b4e84611a72565b925060208401359150604084013567ffffffffffffffff80821115611b7257600080fd5b818601915086601f830112611b8657600080fd5b813581811115611b9857611b98611b01565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611bde57611bde611b01565b81604052828152896020848701011115611bf757600080fd5b8260208601602083013760006020848301015280955050505050509250925092565b600060208284031215611c2b57600080fd5b5035919050565b600060208284031215611c4457600080fd5b610a4182611a72565b6020808252825182820181905260009190848201906040850190845b81811015611c9b57835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101611c69565b50909695505050505050565b60008060408385031215611cba57600080fd5b611cc383611a72565b9150611cd160208401611a72565b90509250929050565b600181811c90821680611cee57607f821691505b602082108103611d27577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561061557610615611d2d565b828152604060208201526000611d8860408301846119fb565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000611dc560608301846119fb565b95945050505050565b8181038181111561061557610615611d2d565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000813000a", + Bin: "0x60c06040523480156200001157600080fd5b50604051620022dd380380620022dd833981016040819052620000349162000277565b338060008686818160036200004a838262000391565b50600462000059828262000391565b5050506001600160a01b0384169150620000bc90505760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600580546001600160a01b0319166001600160a01b0384811691909117909155811615620000ef57620000ef8162000106565b50505060ff90911660805260a052506200045d9050565b336001600160a01b03821603620001605760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401620000b3565b600680546001600160a01b0319166001600160a01b03838116918217909255600554604051919216907fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae127890600090a350565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001da57600080fd5b81516001600160401b0380821115620001f757620001f7620001b2565b604051601f8301601f19908116603f01168101908282118183101715620002225762000222620001b2565b816040528381526020925086838588010111156200023f57600080fd5b600091505b8382101562000263578582018301518183018401529082019062000244565b600093810190920192909252949350505050565b600080600080608085870312156200028e57600080fd5b84516001600160401b0380821115620002a657600080fd5b620002b488838901620001c8565b95506020870151915080821115620002cb57600080fd5b50620002da87828801620001c8565b935050604085015160ff81168114620002f257600080fd5b6060959095015193969295505050565b600181811c908216806200031757607f821691505b6020821081036200033857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200038c57600081815260208120601f850160051c81016020861015620003675750805b601f850160051c820191505b81811015620003885782815560010162000373565b5050505b505050565b81516001600160401b03811115620003ad57620003ad620001b2565b620003c581620003be845462000302565b846200033e565b602080601f831160018114620003fd5760008415620003e45750858301515b600019600386901b1c1916600185901b17855562000388565b600085815260208120601f198616915b828110156200042e578886015182559484019460019091019084016200040d565b50858210156200044d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a051611e4c6200049160003960008181610447015281816108c301526108ed015260006102710152611e4c6000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c806379cc67901161010f578063c2e3273d116100a2578063d73dd62311610071578063d73dd6231461046b578063dd62ed3e1461047e578063f2fde38b146104c4578063f81094f3146104d757600080fd5b8063c2e3273d1461040c578063c630948d1461041f578063c64d0ebc14610432578063d5abeb011461044557600080fd5b80639dc29fac116100de5780639dc29fac146103c0578063a457c2d7146103d3578063a9059cbb146103e6578063aa271e1a146103f957600080fd5b806379cc67901461037557806386fe8b43146103885780638da5cb5b1461039057806395d89b41146103b857600080fd5b806340c10f19116101875780636618846311610156578063661884631461030f5780636b32810b1461032257806370a082311461033757806379ba50971461036d57600080fd5b806340c10f19146102c157806342966c68146102d65780634334614a146102e95780634f5632f8146102fc57600080fd5b806323b872dd116101c357806323b872dd14610257578063313ce5671461026a578063395093511461029b5780634000aea0146102ae57600080fd5b806301ffc9a7146101f557806306fdde031461021d578063095ea7b31461023257806318160ddd14610245575b600080fd5b6102086102033660046119b9565b6104ea565b60405190151581526020015b60405180910390f35b61022561061b565b6040516102149190611a5f565b610208610240366004611a9b565b6106ad565b6002545b604051908152602001610214565b610208610265366004611ac5565b6106c5565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610214565b6102086102a9366004611a9b565b6106e9565b6102086102bc366004611b30565b610735565b6102d46102cf366004611a9b565b610858565b005b6102d46102e4366004611c19565b61097f565b6102086102f7366004611c32565b6109cc565b6102d461030a366004611c32565b6109d9565b61020861031d366004611a9b565b610a35565b61032a610a48565b6040516102149190611c4d565b610249610345366004611c32565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6102d4610a59565b6102d4610383366004611a9b565b610b5a565b61032a610ba9565b60055460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610214565b610225610bb5565b6102d46103ce366004611a9b565b610bc4565b6102086103e1366004611a9b565b610bce565b6102086103f4366004611a9b565b610c9f565b610208610407366004611c32565b610cad565b6102d461041a366004611c32565b610cba565b6102d461042d366004611c32565b610d16565b6102d4610440366004611c32565b610d24565b7f0000000000000000000000000000000000000000000000000000000000000000610249565b6102d4610479366004611a9b565b610d80565b61024961048c366004611ca7565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6102d46104d2366004611c32565b610d8a565b6102d46104e5366004611c32565b610d9b565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f36372b0700000000000000000000000000000000000000000000000000000000148061057d57507fffffffff0000000000000000000000000000000000000000000000000000000082167f4000aea000000000000000000000000000000000000000000000000000000000145b806105c957507fffffffff0000000000000000000000000000000000000000000000000000000082167fe6599b4d00000000000000000000000000000000000000000000000000000000145b8061061557507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b60606003805461062a90611cda565b80601f016020809104026020016040519081016040528092919081815260200182805461065690611cda565b80156106a35780601f10610678576101008083540402835291602001916106a3565b820191906000526020600020905b81548152906001019060200180831161068657829003601f168201915b5050505050905090565b6000336106bb818585610df7565b5060019392505050565b6000336106d3858285610e2b565b6106de858585610efc565b506001949350505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906106bb9082908690610730908790611d5c565b610df7565b60006107418484610c9f565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fe19260aff97b920c7df27010903aeb9c8d2be5d310a2c67824cf3f15396e4c1685856040516107a1929190611d6f565b60405180910390a373ffffffffffffffffffffffffffffffffffffffff84163b156106bb576040517fa4c0ed3600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063a4c0ed369061081c90339087908790600401611d90565b600060405180830381600087803b15801561083657600080fd5b505af115801561084a573d6000803e3d6000fd5b505050505060019392505050565b61086133610cad565b61089e576040517fe2c8c9d50000000000000000000000000000000000000000000000000000000081523360048201526024015b60405180910390fd5b813073ffffffffffffffffffffffffffffffffffffffff8216036108c157600080fd5b7f00000000000000000000000000000000000000000000000000000000000000001580159061092257507f00000000000000000000000000000000000000000000000000000000000000008261091660025490565b6109209190611d5c565b115b15610970578161093160025490565b61093b9190611d5c565b6040517fcbbf111300000000000000000000000000000000000000000000000000000000815260040161089591815260200190565b61097a8383610f2a565b505050565b610988336109cc565b6109c0576040517fc820b10b000000000000000000000000000000000000000000000000000000008152336004820152602401610895565b6109c98161101d565b50565b6000610615600983611027565b6109e1611056565b6109ec6009826110d9565b156109c95760405173ffffffffffffffffffffffffffffffffffffffff8216907f0a675452746933cefe3d74182e78db7afe57ba60eaa4234b5d85e9aa41b0610c90600090a250565b6000610a418383610bce565b9392505050565b6060610a5460076110fb565b905090565b60065473ffffffffffffffffffffffffffffffffffffffff163314610ada576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610895565b600580547fffffffffffffffffffffffff00000000000000000000000000000000000000008082163390811790935560068054909116905560405173ffffffffffffffffffffffffffffffffffffffff909116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b610b63336109cc565b610b9b576040517fc820b10b000000000000000000000000000000000000000000000000000000008152336004820152602401610895565b610ba58282611108565b5050565b6060610a5460096110fb565b60606004805461062a90611cda565b610ba58282610b5a565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610c92576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610895565b6106de8286868403610df7565b6000336106bb818585610efc565b6000610615600783611027565b610cc2611056565b610ccd60078261111d565b156109c95760405173ffffffffffffffffffffffffffffffffffffffff8216907fe46fef8bbff1389d9010703cf8ebb363fb3daf5bf56edc27080b67bc8d9251ea90600090a250565b610d1f81610cba565b6109c9815b610d2c611056565b610d3760098261111d565b156109c95760405173ffffffffffffffffffffffffffffffffffffffff8216907f92308bb7573b2a3d17ddb868b39d8ebec433f3194421abc22d084f89658c9bad90600090a250565b61097a82826106e9565b610d92611056565b6109c98161113f565b610da3611056565b610dae6007826110d9565b156109c95760405173ffffffffffffffffffffffffffffffffffffffff8216907fed998b960f6340d045f620c119730f7aa7995e7425c2401d3a5b64ff998a59e990600090a250565b813073ffffffffffffffffffffffffffffffffffffffff821603610e1a57600080fd5b610e25848484611235565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610e255781811015610eef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610895565b610e258484848403610df7565b813073ffffffffffffffffffffffffffffffffffffffff821603610f1f57600080fd5b610e258484846113e8565b73ffffffffffffffffffffffffffffffffffffffff8216610fa7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610895565b8060026000828254610fb99190611d5c565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6109c93382611657565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001830160205260408120541515610a41565b60055473ffffffffffffffffffffffffffffffffffffffff1633146110d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610895565b565b6000610a418373ffffffffffffffffffffffffffffffffffffffff841661181b565b60606000610a418361190e565b611113823383610e2b565b610ba58282611657565b6000610a418373ffffffffffffffffffffffffffffffffffffffff841661196a565b3373ffffffffffffffffffffffffffffffffffffffff8216036111be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610895565b600680547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff838116918217909255600554604051919216907fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae127890600090a350565b73ffffffffffffffffffffffffffffffffffffffff83166112d7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff821661137a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff831661148b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff821661152e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040902054818110156115e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610e25565b73ffffffffffffffffffffffffffffffffffffffff82166116fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040902054818110156117b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b6000818152600183016020526040812054801561190457600061183f600183611dce565b855490915060009061185390600190611dce565b90508181146118b857600086600001828154811061187357611873611de1565b906000526020600020015490508087600001848154811061189657611896611de1565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806118c9576118c9611e10565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610615565b6000915050610615565b60608160000180548060200260200160405190810160405280929190818152602001828054801561195e57602002820191906000526020600020905b81548152602001906001019080831161194a575b50505050509050919050565b60008181526001830160205260408120546119b157508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610615565b506000610615565b6000602082840312156119cb57600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610a4157600080fd5b6000815180845260005b81811015611a2157602081850181015186830182015201611a05565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081526000610a4160208301846119fb565b803573ffffffffffffffffffffffffffffffffffffffff81168114611a9657600080fd5b919050565b60008060408385031215611aae57600080fd5b611ab783611a72565b946020939093013593505050565b600080600060608486031215611ada57600080fd5b611ae384611a72565b9250611af160208501611a72565b9150604084013590509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080600060608486031215611b4557600080fd5b611b4e84611a72565b925060208401359150604084013567ffffffffffffffff80821115611b7257600080fd5b818601915086601f830112611b8657600080fd5b813581811115611b9857611b98611b01565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611bde57611bde611b01565b81604052828152896020848701011115611bf757600080fd5b8260208601602083013760006020848301015280955050505050509250925092565b600060208284031215611c2b57600080fd5b5035919050565b600060208284031215611c4457600080fd5b610a4182611a72565b6020808252825182820181905260009190848201906040850190845b81811015611c9b57835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101611c69565b50909695505050505050565b60008060408385031215611cba57600080fd5b611cc383611a72565b9150611cd160208401611a72565b90509250929050565b600181811c90821680611cee57607f821691505b602082108103611d27577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561061557610615611d2d565b828152604060208201526000611d8860408301846119fb565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000611dc560608301846119fb565b95945050505050565b8181038181111561061557610615611d2d565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000813000a", } var BurnMintERC677ABI = BurnMintERC677MetaData.ABI diff --git a/core/gethwrappers/shared/generated/link_token/link_token.go b/core/gethwrappers/shared/generated/link_token/link_token.go index 6f9dd62134..1467680626 100644 --- a/core/gethwrappers/shared/generated/link_token/link_token.go +++ b/core/gethwrappers/shared/generated/link_token/link_token.go @@ -32,7 +32,7 @@ var ( var LinkTokenMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"supplyAfterMint\",\"type\":\"uint256\"}],\"name\":\"MaxSupplyExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SenderNotBurner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SenderNotMinter\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"}],\"name\":\"BurnAccessGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"}],\"name\":\"BurnAccessRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"MintAccessGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"MintAccessRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burnFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseApproval\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getBurners\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMinters\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"}],\"name\":\"grantBurnRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"burnAndMinter\",\"type\":\"address\"}],\"name\":\"grantMintAndBurnRoles\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"grantMintRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseApproval\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"}],\"name\":\"isBurner\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"isMinter\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"burner\",\"type\":\"address\"}],\"name\":\"revokeBurnRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"}],\"name\":\"revokeMintRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"transferAndCall\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x60c06040523480156200001157600080fd5b506040518060400160405280600f81526020016e21b430b4b72634b735902a37b5b2b760891b815250604051806040016040528060048152602001634c494e4b60e01b81525060126b033b2e3c9fd0803ce8000000338060008686818181600390816200007f91906200028c565b5060046200008e82826200028c565b5050506001600160a01b0384169150620000f190505760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600580546001600160a01b0319166001600160a01b0384811691909117909155811615620001245762000124816200013b565b50505060ff90911660805260a05250620003589050565b336001600160a01b03821603620001955760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401620000e8565b600680546001600160a01b0319166001600160a01b03838116918217909255600554604051919216907fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae127890600090a350565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200021257607f821691505b6020821081036200023357634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200028757600081815260208120601f850160051c81016020861015620002625750805b601f850160051c820191505b8181101562000283578281556001016200026e565b5050505b505050565b81516001600160401b03811115620002a857620002a8620001e7565b620002c081620002b98454620001fd565b8462000239565b602080601f831160018114620002f85760008415620002df5750858301515b600019600386901b1c1916600185901b17855562000283565b600085815260208120601f198616915b82811015620003295788860151825594840194600190910190840162000308565b5085821015620003485787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a051611e4c6200038c60003960008181610447015281816108c301526108ed015260006102710152611e4c6000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c806379cc67901161010f578063c2e3273d116100a2578063d73dd62311610071578063d73dd6231461046b578063dd62ed3e1461047e578063f2fde38b146104c4578063f81094f3146104d757600080fd5b8063c2e3273d1461040c578063c630948d1461041f578063c64d0ebc14610432578063d5abeb011461044557600080fd5b80639dc29fac116100de5780639dc29fac146103c0578063a457c2d7146103d3578063a9059cbb146103e6578063aa271e1a146103f957600080fd5b806379cc67901461037557806386fe8b43146103885780638da5cb5b1461039057806395d89b41146103b857600080fd5b806340c10f19116101875780636618846311610156578063661884631461030f5780636b32810b1461032257806370a082311461033757806379ba50971461036d57600080fd5b806340c10f19146102c157806342966c68146102d65780634334614a146102e95780634f5632f8146102fc57600080fd5b806323b872dd116101c357806323b872dd14610257578063313ce5671461026a578063395093511461029b5780634000aea0146102ae57600080fd5b806301ffc9a7146101f557806306fdde031461021d578063095ea7b31461023257806318160ddd14610245575b600080fd5b6102086102033660046119b9565b6104ea565b60405190151581526020015b60405180910390f35b61022561061b565b6040516102149190611a5f565b610208610240366004611a9b565b6106ad565b6002545b604051908152602001610214565b610208610265366004611ac5565b6106c5565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610214565b6102086102a9366004611a9b565b6106e9565b6102086102bc366004611b30565b610735565b6102d46102cf366004611a9b565b610858565b005b6102d46102e4366004611c19565b61097f565b6102086102f7366004611c32565b6109cc565b6102d461030a366004611c32565b6109d9565b61020861031d366004611a9b565b610a35565b61032a610a48565b6040516102149190611c4d565b610249610345366004611c32565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6102d4610a59565b6102d4610383366004611a9b565b610b5a565b61032a610ba9565b60055460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610214565b610225610bb5565b6102d46103ce366004611a9b565b610bc4565b6102086103e1366004611a9b565b610bce565b6102086103f4366004611a9b565b610c9f565b610208610407366004611c32565b610cad565b6102d461041a366004611c32565b610cba565b6102d461042d366004611c32565b610d16565b6102d4610440366004611c32565b610d24565b7f0000000000000000000000000000000000000000000000000000000000000000610249565b6102d4610479366004611a9b565b610d80565b61024961048c366004611ca7565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6102d46104d2366004611c32565b610d8a565b6102d46104e5366004611c32565b610d9b565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f36372b0700000000000000000000000000000000000000000000000000000000148061057d57507fffffffff0000000000000000000000000000000000000000000000000000000082167f4000aea000000000000000000000000000000000000000000000000000000000145b806105c957507fffffffff0000000000000000000000000000000000000000000000000000000082167f20690fc000000000000000000000000000000000000000000000000000000000145b8061061557507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b60606003805461062a90611cda565b80601f016020809104026020016040519081016040528092919081815260200182805461065690611cda565b80156106a35780601f10610678576101008083540402835291602001916106a3565b820191906000526020600020905b81548152906001019060200180831161068657829003601f168201915b5050505050905090565b6000336106bb818585610df7565b5060019392505050565b6000336106d3858285610e2b565b6106de858585610efc565b506001949350505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906106bb9082908690610730908790611d5c565b610df7565b60006107418484610c9f565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fe19260aff97b920c7df27010903aeb9c8d2be5d310a2c67824cf3f15396e4c1685856040516107a1929190611d6f565b60405180910390a373ffffffffffffffffffffffffffffffffffffffff84163b156106bb576040517fa4c0ed3600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063a4c0ed369061081c90339087908790600401611d90565b600060405180830381600087803b15801561083657600080fd5b505af115801561084a573d6000803e3d6000fd5b505050505060019392505050565b61086133610cad565b61089e576040517fe2c8c9d50000000000000000000000000000000000000000000000000000000081523360048201526024015b60405180910390fd5b813073ffffffffffffffffffffffffffffffffffffffff8216036108c157600080fd5b7f00000000000000000000000000000000000000000000000000000000000000001580159061092257507f00000000000000000000000000000000000000000000000000000000000000008261091660025490565b6109209190611d5c565b115b15610970578161093160025490565b61093b9190611d5c565b6040517fcbbf111300000000000000000000000000000000000000000000000000000000815260040161089591815260200190565b61097a8383610f2a565b505050565b610988336109cc565b6109c0576040517fc820b10b000000000000000000000000000000000000000000000000000000008152336004820152602401610895565b6109c98161101d565b50565b6000610615600983611027565b6109e1611056565b6109ec6009826110d9565b156109c95760405173ffffffffffffffffffffffffffffffffffffffff8216907f0a675452746933cefe3d74182e78db7afe57ba60eaa4234b5d85e9aa41b0610c90600090a250565b6000610a418383610bce565b9392505050565b6060610a5460076110fb565b905090565b60065473ffffffffffffffffffffffffffffffffffffffff163314610ada576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610895565b600580547fffffffffffffffffffffffff00000000000000000000000000000000000000008082163390811790935560068054909116905560405173ffffffffffffffffffffffffffffffffffffffff909116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b610b63336109cc565b610b9b576040517fc820b10b000000000000000000000000000000000000000000000000000000008152336004820152602401610895565b610ba58282611108565b5050565b6060610a5460096110fb565b60606004805461062a90611cda565b610ba58282610b5a565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610c92576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610895565b6106de8286868403610df7565b6000336106bb818585610efc565b6000610615600783611027565b610cc2611056565b610ccd60078261111d565b156109c95760405173ffffffffffffffffffffffffffffffffffffffff8216907fe46fef8bbff1389d9010703cf8ebb363fb3daf5bf56edc27080b67bc8d9251ea90600090a250565b610d1f81610cba565b6109c9815b610d2c611056565b610d3760098261111d565b156109c95760405173ffffffffffffffffffffffffffffffffffffffff8216907f92308bb7573b2a3d17ddb868b39d8ebec433f3194421abc22d084f89658c9bad90600090a250565b61097a82826106e9565b610d92611056565b6109c98161113f565b610da3611056565b610dae6007826110d9565b156109c95760405173ffffffffffffffffffffffffffffffffffffffff8216907fed998b960f6340d045f620c119730f7aa7995e7425c2401d3a5b64ff998a59e990600090a250565b813073ffffffffffffffffffffffffffffffffffffffff821603610e1a57600080fd5b610e25848484611235565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610e255781811015610eef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610895565b610e258484848403610df7565b813073ffffffffffffffffffffffffffffffffffffffff821603610f1f57600080fd5b610e258484846113e8565b73ffffffffffffffffffffffffffffffffffffffff8216610fa7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610895565b8060026000828254610fb99190611d5c565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6109c93382611657565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001830160205260408120541515610a41565b60055473ffffffffffffffffffffffffffffffffffffffff1633146110d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610895565b565b6000610a418373ffffffffffffffffffffffffffffffffffffffff841661181b565b60606000610a418361190e565b611113823383610e2b565b610ba58282611657565b6000610a418373ffffffffffffffffffffffffffffffffffffffff841661196a565b3373ffffffffffffffffffffffffffffffffffffffff8216036111be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610895565b600680547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff838116918217909255600554604051919216907fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae127890600090a350565b73ffffffffffffffffffffffffffffffffffffffff83166112d7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff821661137a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff831661148b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff821661152e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040902054818110156115e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610e25565b73ffffffffffffffffffffffffffffffffffffffff82166116fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040902054818110156117b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b6000818152600183016020526040812054801561190457600061183f600183611dce565b855490915060009061185390600190611dce565b90508181146118b857600086600001828154811061187357611873611de1565b906000526020600020015490508087600001848154811061189657611896611de1565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806118c9576118c9611e10565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610615565b6000915050610615565b60608160000180548060200260200160405190810160405280929190818152602001828054801561195e57602002820191906000526020600020905b81548152602001906001019080831161194a575b50505050509050919050565b60008181526001830160205260408120546119b157508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610615565b506000610615565b6000602082840312156119cb57600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610a4157600080fd5b6000815180845260005b81811015611a2157602081850181015186830182015201611a05565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081526000610a4160208301846119fb565b803573ffffffffffffffffffffffffffffffffffffffff81168114611a9657600080fd5b919050565b60008060408385031215611aae57600080fd5b611ab783611a72565b946020939093013593505050565b600080600060608486031215611ada57600080fd5b611ae384611a72565b9250611af160208501611a72565b9150604084013590509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080600060608486031215611b4557600080fd5b611b4e84611a72565b925060208401359150604084013567ffffffffffffffff80821115611b7257600080fd5b818601915086601f830112611b8657600080fd5b813581811115611b9857611b98611b01565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611bde57611bde611b01565b81604052828152896020848701011115611bf757600080fd5b8260208601602083013760006020848301015280955050505050509250925092565b600060208284031215611c2b57600080fd5b5035919050565b600060208284031215611c4457600080fd5b610a4182611a72565b6020808252825182820181905260009190848201906040850190845b81811015611c9b57835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101611c69565b50909695505050505050565b60008060408385031215611cba57600080fd5b611cc383611a72565b9150611cd160208401611a72565b90509250929050565b600181811c90821680611cee57607f821691505b602082108103611d27577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561061557610615611d2d565b828152604060208201526000611d8860408301846119fb565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000611dc560608301846119fb565b95945050505050565b8181038181111561061557610615611d2d565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000813000a", + Bin: "0x60c06040523480156200001157600080fd5b506040518060400160405280600f81526020016e21b430b4b72634b735902a37b5b2b760891b815250604051806040016040528060048152602001634c494e4b60e01b81525060126b033b2e3c9fd0803ce8000000338060008686818181600390816200007f91906200028c565b5060046200008e82826200028c565b5050506001600160a01b0384169150620000f190505760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600580546001600160a01b0319166001600160a01b0384811691909117909155811615620001245762000124816200013b565b50505060ff90911660805260a05250620003589050565b336001600160a01b03821603620001955760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401620000e8565b600680546001600160a01b0319166001600160a01b03838116918217909255600554604051919216907fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae127890600090a350565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200021257607f821691505b6020821081036200023357634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200028757600081815260208120601f850160051c81016020861015620002625750805b601f850160051c820191505b8181101562000283578281556001016200026e565b5050505b505050565b81516001600160401b03811115620002a857620002a8620001e7565b620002c081620002b98454620001fd565b8462000239565b602080601f831160018114620002f85760008415620002df5750858301515b600019600386901b1c1916600185901b17855562000283565b600085815260208120601f198616915b82811015620003295788860151825594840194600190910190840162000308565b5085821015620003485787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a051611e4c6200038c60003960008181610447015281816108c301526108ed015260006102710152611e4c6000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c806379cc67901161010f578063c2e3273d116100a2578063d73dd62311610071578063d73dd6231461046b578063dd62ed3e1461047e578063f2fde38b146104c4578063f81094f3146104d757600080fd5b8063c2e3273d1461040c578063c630948d1461041f578063c64d0ebc14610432578063d5abeb011461044557600080fd5b80639dc29fac116100de5780639dc29fac146103c0578063a457c2d7146103d3578063a9059cbb146103e6578063aa271e1a146103f957600080fd5b806379cc67901461037557806386fe8b43146103885780638da5cb5b1461039057806395d89b41146103b857600080fd5b806340c10f19116101875780636618846311610156578063661884631461030f5780636b32810b1461032257806370a082311461033757806379ba50971461036d57600080fd5b806340c10f19146102c157806342966c68146102d65780634334614a146102e95780634f5632f8146102fc57600080fd5b806323b872dd116101c357806323b872dd14610257578063313ce5671461026a578063395093511461029b5780634000aea0146102ae57600080fd5b806301ffc9a7146101f557806306fdde031461021d578063095ea7b31461023257806318160ddd14610245575b600080fd5b6102086102033660046119b9565b6104ea565b60405190151581526020015b60405180910390f35b61022561061b565b6040516102149190611a5f565b610208610240366004611a9b565b6106ad565b6002545b604051908152602001610214565b610208610265366004611ac5565b6106c5565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610214565b6102086102a9366004611a9b565b6106e9565b6102086102bc366004611b30565b610735565b6102d46102cf366004611a9b565b610858565b005b6102d46102e4366004611c19565b61097f565b6102086102f7366004611c32565b6109cc565b6102d461030a366004611c32565b6109d9565b61020861031d366004611a9b565b610a35565b61032a610a48565b6040516102149190611c4d565b610249610345366004611c32565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6102d4610a59565b6102d4610383366004611a9b565b610b5a565b61032a610ba9565b60055460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610214565b610225610bb5565b6102d46103ce366004611a9b565b610bc4565b6102086103e1366004611a9b565b610bce565b6102086103f4366004611a9b565b610c9f565b610208610407366004611c32565b610cad565b6102d461041a366004611c32565b610cba565b6102d461042d366004611c32565b610d16565b6102d4610440366004611c32565b610d24565b7f0000000000000000000000000000000000000000000000000000000000000000610249565b6102d4610479366004611a9b565b610d80565b61024961048c366004611ca7565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6102d46104d2366004611c32565b610d8a565b6102d46104e5366004611c32565b610d9b565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f36372b0700000000000000000000000000000000000000000000000000000000148061057d57507fffffffff0000000000000000000000000000000000000000000000000000000082167f4000aea000000000000000000000000000000000000000000000000000000000145b806105c957507fffffffff0000000000000000000000000000000000000000000000000000000082167fe6599b4d00000000000000000000000000000000000000000000000000000000145b8061061557507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b60606003805461062a90611cda565b80601f016020809104026020016040519081016040528092919081815260200182805461065690611cda565b80156106a35780601f10610678576101008083540402835291602001916106a3565b820191906000526020600020905b81548152906001019060200180831161068657829003601f168201915b5050505050905090565b6000336106bb818585610df7565b5060019392505050565b6000336106d3858285610e2b565b6106de858585610efc565b506001949350505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906106bb9082908690610730908790611d5c565b610df7565b60006107418484610c9f565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fe19260aff97b920c7df27010903aeb9c8d2be5d310a2c67824cf3f15396e4c1685856040516107a1929190611d6f565b60405180910390a373ffffffffffffffffffffffffffffffffffffffff84163b156106bb576040517fa4c0ed3600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063a4c0ed369061081c90339087908790600401611d90565b600060405180830381600087803b15801561083657600080fd5b505af115801561084a573d6000803e3d6000fd5b505050505060019392505050565b61086133610cad565b61089e576040517fe2c8c9d50000000000000000000000000000000000000000000000000000000081523360048201526024015b60405180910390fd5b813073ffffffffffffffffffffffffffffffffffffffff8216036108c157600080fd5b7f00000000000000000000000000000000000000000000000000000000000000001580159061092257507f00000000000000000000000000000000000000000000000000000000000000008261091660025490565b6109209190611d5c565b115b15610970578161093160025490565b61093b9190611d5c565b6040517fcbbf111300000000000000000000000000000000000000000000000000000000815260040161089591815260200190565b61097a8383610f2a565b505050565b610988336109cc565b6109c0576040517fc820b10b000000000000000000000000000000000000000000000000000000008152336004820152602401610895565b6109c98161101d565b50565b6000610615600983611027565b6109e1611056565b6109ec6009826110d9565b156109c95760405173ffffffffffffffffffffffffffffffffffffffff8216907f0a675452746933cefe3d74182e78db7afe57ba60eaa4234b5d85e9aa41b0610c90600090a250565b6000610a418383610bce565b9392505050565b6060610a5460076110fb565b905090565b60065473ffffffffffffffffffffffffffffffffffffffff163314610ada576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610895565b600580547fffffffffffffffffffffffff00000000000000000000000000000000000000008082163390811790935560068054909116905560405173ffffffffffffffffffffffffffffffffffffffff909116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b610b63336109cc565b610b9b576040517fc820b10b000000000000000000000000000000000000000000000000000000008152336004820152602401610895565b610ba58282611108565b5050565b6060610a5460096110fb565b60606004805461062a90611cda565b610ba58282610b5a565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610c92576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610895565b6106de8286868403610df7565b6000336106bb818585610efc565b6000610615600783611027565b610cc2611056565b610ccd60078261111d565b156109c95760405173ffffffffffffffffffffffffffffffffffffffff8216907fe46fef8bbff1389d9010703cf8ebb363fb3daf5bf56edc27080b67bc8d9251ea90600090a250565b610d1f81610cba565b6109c9815b610d2c611056565b610d3760098261111d565b156109c95760405173ffffffffffffffffffffffffffffffffffffffff8216907f92308bb7573b2a3d17ddb868b39d8ebec433f3194421abc22d084f89658c9bad90600090a250565b61097a82826106e9565b610d92611056565b6109c98161113f565b610da3611056565b610dae6007826110d9565b156109c95760405173ffffffffffffffffffffffffffffffffffffffff8216907fed998b960f6340d045f620c119730f7aa7995e7425c2401d3a5b64ff998a59e990600090a250565b813073ffffffffffffffffffffffffffffffffffffffff821603610e1a57600080fd5b610e25848484611235565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610e255781811015610eef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610895565b610e258484848403610df7565b813073ffffffffffffffffffffffffffffffffffffffff821603610f1f57600080fd5b610e258484846113e8565b73ffffffffffffffffffffffffffffffffffffffff8216610fa7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610895565b8060026000828254610fb99190611d5c565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6109c93382611657565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001830160205260408120541515610a41565b60055473ffffffffffffffffffffffffffffffffffffffff1633146110d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610895565b565b6000610a418373ffffffffffffffffffffffffffffffffffffffff841661181b565b60606000610a418361190e565b611113823383610e2b565b610ba58282611657565b6000610a418373ffffffffffffffffffffffffffffffffffffffff841661196a565b3373ffffffffffffffffffffffffffffffffffffffff8216036111be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610895565b600680547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff838116918217909255600554604051919216907fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae127890600090a350565b73ffffffffffffffffffffffffffffffffffffffff83166112d7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff821661137a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff831661148b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff821661152e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260208190526040902054818110156115e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610e25565b73ffffffffffffffffffffffffffffffffffffffff82166116fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040902054818110156117b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610895565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b6000818152600183016020526040812054801561190457600061183f600183611dce565b855490915060009061185390600190611dce565b90508181146118b857600086600001828154811061187357611873611de1565b906000526020600020015490508087600001848154811061189657611896611de1565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806118c9576118c9611e10565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610615565b6000915050610615565b60608160000180548060200260200160405190810160405280929190818152602001828054801561195e57602002820191906000526020600020905b81548152602001906001019080831161194a575b50505050509050919050565b60008181526001830160205260408120546119b157508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610615565b506000610615565b6000602082840312156119cb57600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610a4157600080fd5b6000815180845260005b81811015611a2157602081850181015186830182015201611a05565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081526000610a4160208301846119fb565b803573ffffffffffffffffffffffffffffffffffffffff81168114611a9657600080fd5b919050565b60008060408385031215611aae57600080fd5b611ab783611a72565b946020939093013593505050565b600080600060608486031215611ada57600080fd5b611ae384611a72565b9250611af160208501611a72565b9150604084013590509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080600060608486031215611b4557600080fd5b611b4e84611a72565b925060208401359150604084013567ffffffffffffffff80821115611b7257600080fd5b818601915086601f830112611b8657600080fd5b813581811115611b9857611b98611b01565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611bde57611bde611b01565b81604052828152896020848701011115611bf757600080fd5b8260208601602083013760006020848301015280955050505050509250925092565b600060208284031215611c2b57600080fd5b5035919050565b600060208284031215611c4457600080fd5b610a4182611a72565b6020808252825182820181905260009190848201906040850190845b81811015611c9b57835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101611c69565b50909695505050505050565b60008060408385031215611cba57600080fd5b611cc383611a72565b9150611cd160208401611a72565b90509250929050565b600181811c90821680611cee57607f821691505b602082108103611d27577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561061557610615611d2d565b828152604060208201526000611d8860408301846119fb565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000611dc560608301846119fb565b95945050505050565b8181038181111561061557610615611d2d565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000813000a", } var LinkTokenABI = LinkTokenMetaData.ABI diff --git a/core/gethwrappers/shared/generation/generated-wrapper-dependency-versions-do-not-edit.txt b/core/gethwrappers/shared/generation/generated-wrapper-dependency-versions-do-not-edit.txt index 03414421c7..3268bb55bd 100644 --- a/core/gethwrappers/shared/generation/generated-wrapper-dependency-versions-do-not-edit.txt +++ b/core/gethwrappers/shared/generation/generated-wrapper-dependency-versions-do-not-edit.txt @@ -1,5 +1,5 @@ GETH_VERSION: 1.13.8 -burn_mint_erc677: ../../../contracts/solc/v0.8.19/BurnMintERC677/BurnMintERC677.abi ../../../contracts/solc/v0.8.19/BurnMintERC677/BurnMintERC677.bin 38eb38ae083b00ca93912ad687745fc8e3735449354ffea58cc5b0db5faa8b39 +burn_mint_erc677: ../../../contracts/solc/v0.8.19/BurnMintERC677/BurnMintERC677.abi ../../../contracts/solc/v0.8.19/BurnMintERC677/BurnMintERC677.bin 405c9016171e614b17e10588653ef8d33dcea21dd569c3fddc596a46fcff68a3 erc20: ../../../contracts/solc/v0.8.19/ERC20/ERC20.abi ../../../contracts/solc/v0.8.19/ERC20/ERC20.bin 5b1a93d9b24f250e49a730c96335a8113c3f7010365cba578f313b483001d4fc -link_token: ../../../contracts/solc/v0.8.19/LinkToken/LinkToken.abi ../../../contracts/solc/v0.8.19/LinkToken/LinkToken.bin 87be5670a484afd3e246c521154e36151f20ab5da633f620ae626b5b72d163a4 +link_token: ../../../contracts/solc/v0.8.19/LinkToken/LinkToken.abi ../../../contracts/solc/v0.8.19/LinkToken/LinkToken.bin c0ef9b507103aae541ebc31d87d051c2764ba9d843076b30ec505d37cdfffaba werc20_mock: ../../../contracts/solc/v0.8.19/WERC20Mock/WERC20Mock.abi ../../../contracts/solc/v0.8.19/WERC20Mock/WERC20Mock.bin ff2ca3928b2aa9c412c892cb8226c4d754c73eeb291bb7481c32c48791b2aa94 From a8e6726331d74bba1cf40984b490370f0fbf9266 Mon Sep 17 00:00:00 2001 From: Josh Date: Tue, 15 Oct 2024 16:51:21 -0400 Subject: [PATCH 45/48] pragma fix, formatting, and remove unused files --- contracts/src/v0.8/ccip/FeeQuoter.sol | 5 ++-- .../interfaces/IRegistryModuleOwnerCustom.sol | 14 ----------- .../FactoryBurnMintERC20.t.sol | 23 ++++++++----------- .../tokenAdminRegistry/TokenPoolFactory.t.sol | 2 +- .../token/ERC677/OpStackBurnMintERC677.sol | 6 ++--- 5 files changed, 16 insertions(+), 34 deletions(-) delete mode 100644 contracts/src/v0.8/ccip/interfaces/IRegistryModuleOwnerCustom.sol diff --git a/contracts/src/v0.8/ccip/FeeQuoter.sol b/contracts/src/v0.8/ccip/FeeQuoter.sol index 9c6d6a5331..86ae68e8e4 100644 --- a/contracts/src/v0.8/ccip/FeeQuoter.sol +++ b/contracts/src/v0.8/ccip/FeeQuoter.sol @@ -984,7 +984,8 @@ contract FeeQuoter is AuthorizedCallers, IFeeQuoter, ITypeAndVersion, IReceiver, uint64 destChainSelector = destChainConfigArgs[i].destChainSelector; DestChainConfig memory destChainConfig = destChainConfigArg.destChainConfig; - // NOTE: when supporting non-EVM chains, update chainFamilySelector validations + // Do not allow chain selector of zero or an invalid default gas limit. + // Note: Only EVM chains are supported at the moment, and more validation may be needed for other chain types. if ( destChainSelector == 0 || destChainConfig.defaultTxGasLimit == 0 || destChainConfig.chainFamilySelector != Internal.CHAIN_FAMILY_SELECTOR_EVM @@ -993,7 +994,7 @@ contract FeeQuoter is AuthorizedCallers, IFeeQuoter, ITypeAndVersion, IReceiver, revert InvalidDestChainConfig(destChainSelector); } - // The chain family selector cannot be zero - indicates that it is a new chain + // Chain family selector of zero indicates that the chain has not been added yet, so emit different event if (s_destChainConfigs[destChainSelector].chainFamilySelector == 0) { emit DestChainAdded(destChainSelector, destChainConfig); } else { diff --git a/contracts/src/v0.8/ccip/interfaces/IRegistryModuleOwnerCustom.sol b/contracts/src/v0.8/ccip/interfaces/IRegistryModuleOwnerCustom.sol deleted file mode 100644 index f0412015d3..0000000000 --- a/contracts/src/v0.8/ccip/interfaces/IRegistryModuleOwnerCustom.sol +++ /dev/null @@ -1,14 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.19; - -interface IRegistryModuleOwnerCustom { - /// @notice Registers the admin of the token using the `getCCIPAdmin` method. - /// @param token The token to register the admin for. - /// @dev The caller must be the admin returned by the `getCCIPAdmin` method. - function registerAdminViaGetCCIPAdmin(address token) external; - - /// @notice Registers the admin of the token using the `owner` method. - /// @param token The token to register the admin for. - /// @dev The caller must be the admin returned by the `owner` method. - function registerAdminViaOwner(address token) external; -} diff --git a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20.t.sol b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20.t.sol index 49e309c0a4..dffd91083d 100644 --- a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20.t.sol +++ b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; +pragma solidity 0.8.24; import {IBurnMintERC20} from "../../../shared/token/ERC20/IBurnMintERC20.sol"; @@ -10,11 +10,6 @@ import {IERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/tok import {IERC165} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/introspection/IERC165.sol"; contract BurnMintERC20Setup is BaseTest { - event Transfer(address indexed from, address indexed to, uint256 value); - event MintAccessGranted(address indexed minter); - event BurnAccessGranted(address indexed burner); - event MintAccessRevoked(address indexed minter); - event BurnAccessRevoked(address indexed burner); FactoryBurnMintERC20 internal s_burnMintERC20; @@ -106,7 +101,7 @@ contract FactoryBurnMintERC20mint is BurnMintERC20Setup { s_burnMintERC20.grantMintAndBurnRoles(OWNER); vm.expectEmit(); - emit Transfer(address(0), OWNER, s_amount); + emit IERC20.Transfer(address(0), OWNER, s_amount); s_burnMintERC20.mint(OWNER, s_amount); @@ -141,7 +136,7 @@ contract FactoryBurnMintERC20burn is BurnMintERC20Setup { deal(address(s_burnMintERC20), OWNER, s_amount); vm.expectEmit(); - emit Transfer(OWNER, address(0), s_amount); + emit IERC20.Transfer(OWNER, address(0), s_amount); s_burnMintERC20.burn(s_amount); @@ -263,14 +258,14 @@ contract FactoryBurnMintERC20grantRole is BurnMintERC20Setup { assertFalse(s_burnMintERC20.isMinter(STRANGER)); vm.expectEmit(); - emit MintAccessGranted(STRANGER); + emit FactoryBurnMintERC20.MintAccessGranted(STRANGER); s_burnMintERC20.grantMintAndBurnRoles(STRANGER); assertTrue(s_burnMintERC20.isMinter(STRANGER)); vm.expectEmit(); - emit MintAccessRevoked(STRANGER); + emit FactoryBurnMintERC20.MintAccessRevoked(STRANGER); s_burnMintERC20.revokeMintRole(STRANGER); @@ -281,14 +276,14 @@ contract FactoryBurnMintERC20grantRole is BurnMintERC20Setup { assertFalse(s_burnMintERC20.isBurner(STRANGER)); vm.expectEmit(); - emit BurnAccessGranted(STRANGER); + emit FactoryBurnMintERC20.BurnAccessGranted(STRANGER); s_burnMintERC20.grantBurnRole(STRANGER); assertTrue(s_burnMintERC20.isBurner(STRANGER)); vm.expectEmit(); - emit BurnAccessRevoked(STRANGER); + emit FactoryBurnMintERC20.BurnAccessRevoked(STRANGER); s_burnMintERC20.revokeBurnRole(STRANGER); @@ -321,9 +316,9 @@ contract FactoryBurnMintERC20grantMintAndBurnRoles is BurnMintERC20Setup { assertFalse(s_burnMintERC20.isBurner(STRANGER)); vm.expectEmit(); - emit MintAccessGranted(STRANGER); + emit FactoryBurnMintERC20.MintAccessGranted(STRANGER); vm.expectEmit(); - emit BurnAccessGranted(STRANGER); + emit FactoryBurnMintERC20.BurnAccessGranted(STRANGER); s_burnMintERC20.grantMintAndBurnRoles(STRANGER); diff --git a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol index aa6a6bba0a..58ee2c4d9b 100644 --- a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol +++ b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.24; +pragma solidity 0.8.24; import {IBurnMintERC20} from "../../../shared/token/ERC20/IBurnMintERC20.sol"; import {IOwner} from "../../interfaces/IOwner.sol"; diff --git a/contracts/src/v0.8/shared/token/ERC677/OpStackBurnMintERC677.sol b/contracts/src/v0.8/shared/token/ERC677/OpStackBurnMintERC677.sol index 95c64c9cd2..0ca02bc05b 100644 --- a/contracts/src/v0.8/shared/token/ERC677/OpStackBurnMintERC677.sol +++ b/contracts/src/v0.8/shared/token/ERC677/OpStackBurnMintERC677.sol @@ -1,12 +1,12 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import {IOptimismMintableERC20Minimal, IOptimismMintableERC20} from "../ERC20/IOptimismMintableERC20.sol"; +import {IOptimismMintableERC20Minimal} from "../ERC20/IOptimismMintableERC20.sol"; +import {IOptimismMintableERC20} from "../ERC20/IOptimismMintableERC20.sol"; +import {IERC165} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/introspection/IERC165.sol"; import {BurnMintERC677} from "./BurnMintERC677.sol"; -import {IERC165} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/introspection/IERC165.sol"; - /// @notice A basic ERC677 compatible token contract with burn and minting roles that supports /// the native L2 bridging requirements of the Optimism Stack. /// @dev Note: the L2 bridge contract needs to be given burn and mint privileges manually, From 0bd89b50366c09ee4ed29cb293c5896044efd0ab Mon Sep 17 00:00:00 2001 From: Josh Date: Tue, 15 Oct 2024 16:55:55 -0400 Subject: [PATCH 46/48] more formatting --- .../v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20.t.sol | 1 - 1 file changed, 1 deletion(-) diff --git a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20.t.sol b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20.t.sol index dffd91083d..5467d48176 100644 --- a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20.t.sol +++ b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20.t.sol @@ -10,7 +10,6 @@ import {IERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/tok import {IERC165} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/introspection/IERC165.sol"; contract BurnMintERC20Setup is BaseTest { - FactoryBurnMintERC20 internal s_burnMintERC20; address internal s_mockPool = address(6243783892); From ba9c0041e3fc8c8a2f8210919362c6fa8f9f7d36 Mon Sep 17 00:00:00 2001 From: Josh Date: Tue, 22 Oct 2024 10:35:01 -0400 Subject: [PATCH 47/48] formatting and naming fixes --- contracts/gas-snapshots/ccip.gas-snapshot | 70 +++++++++---------- .../FactoryBurnMintERC20.t.sol | 56 +++++++-------- .../tokenAdminRegistry/TokenPoolFactory.t.sol | 2 +- .../TokenPoolFactory/FactoryBurnMintERC20.sol | 1 - .../token/ERC677/OpStackBurnMintERC677.sol | 3 +- 5 files changed, 66 insertions(+), 66 deletions(-) diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot index 4f02741cef..0dc4f0aa41 100644 --- a/contracts/gas-snapshots/ccip.gas-snapshot +++ b/contracts/gas-snapshots/ccip.gas-snapshot @@ -114,13 +114,13 @@ CommitStore_verify:test_Paused_Revert() (gas: 18568) CommitStore_verify:test_TooManyLeaves_Revert() (gas: 36848) DefensiveExampleTest:test_HappyPath_Success() (gas: 200200) DefensiveExampleTest:test_Recovery() (gas: 424476) -E2E:test_E2E_3MessagesSuccess_gas() (gas: 1108425) +E2E:test_E2E_3MessagesSuccess_gas() (gas: 1141917) EVM2EVMOffRamp__releaseOrMintToken:test__releaseOrMintToken_NotACompatiblePool_Revert() (gas: 38322) EVM2EVMOffRamp__releaseOrMintToken:test__releaseOrMintToken_Success() (gas: 104438) -EVM2EVMOffRamp__releaseOrMintToken:test__releaseOrMintToken_TokenHandlingError_transfer_Revert() (gas: 86026) +EVM2EVMOffRamp__releaseOrMintToken:test__releaseOrMintToken_TokenHandlingError_transfer_Revert() (gas: 83526) EVM2EVMOffRamp__releaseOrMintToken:test_releaseOrMintToken_InvalidDataLength_Revert() (gas: 37365) EVM2EVMOffRamp__releaseOrMintToken:test_releaseOrMintToken_ReleaseOrMintBalanceMismatch_Revert() (gas: 95013) -EVM2EVMOffRamp__releaseOrMintToken:test_releaseOrMintToken_TokenHandlingError_BalanceOf_Revert() (gas: 40341) +EVM2EVMOffRamp__releaseOrMintToken:test_releaseOrMintToken_TokenHandlingError_BalanceOf_Revert() (gas: 37841) EVM2EVMOffRamp__releaseOrMintToken:test_releaseOrMintToken_skip_ReleaseOrMintBalanceMismatch_if_pool_Revert() (gas: 87189) EVM2EVMOffRamp__releaseOrMintTokens:test_OverValueWithARLOff_Success() (gas: 381594) EVM2EVMOffRamp__releaseOrMintTokens:test_PriceNotFoundForToken_Reverts() (gas: 140568) @@ -319,33 +319,33 @@ EtherSenderReceiverTest_validatedMessage:test_validatedMessage_emptyDataOverwrit EtherSenderReceiverTest_validatedMessage:test_validatedMessage_invalidTokenAmounts() (gas: 17925) EtherSenderReceiverTest_validatedMessage:test_validatedMessage_tokenOverwrittenToWeth() (gas: 25329) EtherSenderReceiverTest_validatedMessage:test_validatedMessage_validMessage_extraArgs() (gas: 26370) -FactoryBurnMintERC20approve:testApproveSuccess() (gas: 55767) -FactoryBurnMintERC20approve:testInvalidAddressReverts() (gas: 10709) -FactoryBurnMintERC20burn:testBasicBurnSuccess() (gas: 172380) -FactoryBurnMintERC20burn:testBurnFromZeroAddressReverts() (gas: 47384) -FactoryBurnMintERC20burn:testExceedsBalanceReverts() (gas: 21962) -FactoryBurnMintERC20burn:testSenderNotBurnerReverts() (gas: 13491) -FactoryBurnMintERC20burnFrom:testBurnFromSuccess() (gas: 58212) -FactoryBurnMintERC20burnFrom:testExceedsBalanceReverts() (gas: 36130) -FactoryBurnMintERC20burnFrom:testInsufficientAllowanceReverts() (gas: 22054) -FactoryBurnMintERC20burnFrom:testSenderNotBurnerReverts() (gas: 13491) -FactoryBurnMintERC20burnFromAlias:testBurnFromSuccess() (gas: 58187) -FactoryBurnMintERC20burnFromAlias:testExceedsBalanceReverts() (gas: 36094) -FactoryBurnMintERC20burnFromAlias:testInsufficientAllowanceReverts() (gas: 22009) -FactoryBurnMintERC20burnFromAlias:testSenderNotBurnerReverts() (gas: 13446) -FactoryBurnMintERC20constructor:testConstructorSuccess() (gas: 1501073) -FactoryBurnMintERC20decreaseApproval:testDecreaseApprovalSuccess() (gas: 31323) -FactoryBurnMintERC20grantMintAndBurnRoles:testGrantMintAndBurnRolesSuccess() (gas: 121439) -FactoryBurnMintERC20grantRole:testGrantBurnAccessSuccess() (gas: 53612) -FactoryBurnMintERC20grantRole:testGrantManySuccess() (gas: 963184) -FactoryBurnMintERC20grantRole:testGrantMintAccessSuccess() (gas: 94434) -FactoryBurnMintERC20increaseApproval:testIncreaseApprovalSuccess() (gas: 44368) -FactoryBurnMintERC20mint:testBasicMintSuccess() (gas: 149987) -FactoryBurnMintERC20mint:testMaxSupplyExceededReverts() (gas: 50703) -FactoryBurnMintERC20mint:testSenderNotMinterReverts() (gas: 11328) -FactoryBurnMintERC20supportsInterface:testConstructorSuccess() (gas: 11396) -FactoryBurnMintERC20transfer:testInvalidAddressReverts() (gas: 10707) -FactoryBurnMintERC20transfer:testTransferSuccess() (gas: 42427) +FactoryBurnMintERC20approve:test_Approve_Success() (gas: 55766) +FactoryBurnMintERC20approve:test_InvalidAddress_Reverts() (gas: 10709) +FactoryBurnMintERC20burn:test_BasicBurn_Success() (gas: 172431) +FactoryBurnMintERC20burn:test_BurnFromZeroAddress_Reverts() (gas: 47352) +FactoryBurnMintERC20burn:test_ExceedsBalance_Reverts() (gas: 21939) +FactoryBurnMintERC20burn:test_SenderNotBurner_Reverts() (gas: 13493) +FactoryBurnMintERC20burnFrom:test_BurnFrom_Success() (gas: 58231) +FactoryBurnMintERC20burnFrom:test_ExceedsBalance_Reverts() (gas: 36138) +FactoryBurnMintERC20burnFrom:test_InsufficientAllowance_Reverts() (gas: 22031) +FactoryBurnMintERC20burnFrom:test_SenderNotBurner_Reverts() (gas: 13460) +FactoryBurnMintERC20burnFromAlias:test_BurnFrom_Success() (gas: 58205) +FactoryBurnMintERC20burnFromAlias:test_ExceedsBalance_Reverts() (gas: 36102) +FactoryBurnMintERC20burnFromAlias:test_InsufficientAllowance_Reverts() (gas: 21986) +FactoryBurnMintERC20burnFromAlias:test_SenderNotBurner_Reverts() (gas: 13415) +FactoryBurnMintERC20constructor:test_Constructor_Success() (gas: 1501116) +FactoryBurnMintERC20decreaseApproval:test_DecreaseApproval_Success() (gas: 31340) +FactoryBurnMintERC20grantMintAndBurnRoles:test_GrantMintAndBurnRoles_Success() (gas: 121440) +FactoryBurnMintERC20grantRole:test_GrantBurnAccess_Success() (gas: 53630) +FactoryBurnMintERC20grantRole:test_GrantMany_Success() (gas: 963163) +FactoryBurnMintERC20grantRole:test_GrantMintAccess_Success() (gas: 94417) +FactoryBurnMintERC20increaseApproval:test_IncreaseApproval_Success() (gas: 44345) +FactoryBurnMintERC20mint:test_BasicMint_Success() (gas: 149943) +FactoryBurnMintERC20mint:test_MaxSupplyExceeded_Reverts() (gas: 50681) +FactoryBurnMintERC20mint:test_SenderNotMinter_Reverts() (gas: 11372) +FactoryBurnMintERC20supportsInterface:test_SupportsInterface_Success() (gas: 11439) +FactoryBurnMintERC20transfer:test_InvalidAddress_Reverts() (gas: 10707) +FactoryBurnMintERC20transfer:test_Transfer_Success() (gas: 42449) FeeQuoter_applyDestChainConfigUpdates:test_InvalidChainFamilySelector_Revert() (gas: 16878) FeeQuoter_applyDestChainConfigUpdates:test_InvalidDestChainConfigDestChainSelectorEqZero_Revert() (gas: 16780) FeeQuoter_applyDestChainConfigUpdates:test_applyDestChainConfigUpdatesDefaultTxGasLimitEqZero_Revert() (gas: 16822) @@ -539,7 +539,7 @@ MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithRateLimitExce MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithRateLimitReset_Success() (gas: 76561) MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithTokensOnDifferentChains_Success() (gas: 308233) MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithTokens_Success() (gas: 50558) -MultiAggregateRateLimiter_onOutboundMessage:test_RateLimitValueDifferentLanes_Success() (gas: 1073669578) +MultiAggregateRateLimiter_onOutboundMessage:test_RateLimitValueDifferentLanes_Success() (gas: 51181) MultiAggregateRateLimiter_onOutboundMessage:test_ValidateMessageWithNoTokens_Success() (gas: 19302) MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageFromUnauthorizedCaller_Revert() (gas: 15913) MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithDifferentTokensOnDifferentChains_Success() (gas: 209885) @@ -593,7 +593,7 @@ MultiOCR3Base_transmit:test_UnauthorizedSigner_Revert() (gas: 61275) MultiOCR3Base_transmit:test_UnconfiguredPlugin_Revert() (gas: 39933) MultiOCR3Base_transmit:test_ZeroSignatures_Revert() (gas: 33049) MultiOnRampTokenPoolReentrancy:test_OnRampTokenPoolReentrancy_Success() (gas: 233732) -MultiRampsE2E:test_E2E_3MessagesMMultiOffRampSuccess_gas() (gas: 1501821) +MultiRampsE2E:test_E2E_3MessagesMMultiOffRampSuccess_gas() (gas: 1518567) NonceManager_NonceIncrementation:test_getIncrementedOutboundNonce_Success() (gas: 37934) NonceManager_NonceIncrementation:test_incrementInboundNonce_Skip() (gas: 23706) NonceManager_NonceIncrementation:test_incrementInboundNonce_Success() (gas: 38778) @@ -661,7 +661,7 @@ OffRamp_batchExecute:test_Unhealthy_Success() (gas: 554256) OffRamp_batchExecute:test_ZeroReports_Revert() (gas: 10622) OffRamp_ccipReceive:test_Reverts() (gas: 15407) OffRamp_commit:test_CommitOnRampMismatch_Revert() (gas: 92905) -OffRamp_commit:test_FailedRMNVerification_Reverts() (gas: 64099) +OffRamp_commit:test_FailedRMNVerification_Reverts() (gas: 61599) OffRamp_commit:test_InvalidIntervalMinLargerThanMax_Revert() (gas: 68173) OffRamp_commit:test_InvalidInterval_Revert() (gas: 64291) OffRamp_commit:test_InvalidRootRevert() (gas: 63356) @@ -755,10 +755,10 @@ OffRamp_manuallyExecute:test_manuallyExecute_WithMultiReportGasOverride_Success( OffRamp_manuallyExecute:test_manuallyExecute_WithPartialMessages_Success() (gas: 347346) OffRamp_releaseOrMintSingleToken:test__releaseOrMintSingleToken_NotACompatiblePool_Revert() (gas: 37656) OffRamp_releaseOrMintSingleToken:test__releaseOrMintSingleToken_Success() (gas: 104404) -OffRamp_releaseOrMintSingleToken:test__releaseOrMintSingleToken_TokenHandlingError_transfer_Revert() (gas: 85342) +OffRamp_releaseOrMintSingleToken:test__releaseOrMintSingleToken_TokenHandlingError_transfer_Revert() (gas: 82842) OffRamp_releaseOrMintSingleToken:test_releaseOrMintToken_InvalidDataLength_Revert() (gas: 36752) OffRamp_releaseOrMintSingleToken:test_releaseOrMintToken_ReleaseOrMintBalanceMismatch_Revert() (gas: 94382) -OffRamp_releaseOrMintSingleToken:test_releaseOrMintToken_TokenHandlingError_BalanceOf_Revert() (gas: 39741) +OffRamp_releaseOrMintSingleToken:test_releaseOrMintToken_TokenHandlingError_BalanceOf_Revert() (gas: 37241) OffRamp_releaseOrMintSingleToken:test_releaseOrMintToken_skip_ReleaseOrMintBalanceMismatch_if_pool_Revert() (gas: 86516) OffRamp_releaseOrMintTokens:test_TokenHandlingError_Reverts() (gas: 162381) OffRamp_releaseOrMintTokens:test__releaseOrMintTokens_PoolIsNotAPool_Reverts() (gas: 23903) diff --git a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20.t.sol b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20.t.sol index 5467d48176..56f28d23cc 100644 --- a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20.t.sol +++ b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/FactoryBurnMintERC20.t.sol @@ -12,7 +12,7 @@ import {IERC165} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/ut contract BurnMintERC20Setup is BaseTest { FactoryBurnMintERC20 internal s_burnMintERC20; - address internal s_mockPool = address(6243783892); + address internal s_mockPool = makeAddr("s_mockPool"); uint256 internal s_amount = 1e18; address internal s_alice; @@ -31,7 +31,7 @@ contract BurnMintERC20Setup is BaseTest { } contract FactoryBurnMintERC20constructor is BurnMintERC20Setup { - function testConstructorSuccess() public { + function test_Constructor_Success() public { string memory name = "Chainlink token v2"; string memory symbol = "LINK2"; uint8 decimals = 19; @@ -52,7 +52,7 @@ contract FactoryBurnMintERC20constructor is BurnMintERC20Setup { } contract FactoryBurnMintERC20approve is BurnMintERC20Setup { - function testApproveSuccess() public { + function test_Approve_Success() public { uint256 balancePre = s_burnMintERC20.balanceOf(STRANGER); uint256 sendingAmount = s_amount / 2; @@ -67,7 +67,7 @@ contract FactoryBurnMintERC20approve is BurnMintERC20Setup { // Reverts - function testInvalidAddressReverts() public { + function test_InvalidAddress_Reverts() public { vm.expectRevert(); s_burnMintERC20.approve(address(s_burnMintERC20), s_amount); @@ -75,7 +75,7 @@ contract FactoryBurnMintERC20approve is BurnMintERC20Setup { } contract FactoryBurnMintERC20transfer is BurnMintERC20Setup { - function testTransferSuccess() public { + function test_Transfer_Success() public { uint256 balancePre = s_burnMintERC20.balanceOf(STRANGER); uint256 sendingAmount = s_amount / 2; @@ -86,7 +86,7 @@ contract FactoryBurnMintERC20transfer is BurnMintERC20Setup { // Reverts - function testInvalidAddressReverts() public { + function test_InvalidAddress_Reverts() public { vm.expectRevert(); s_burnMintERC20.transfer(address(s_burnMintERC20), s_amount); @@ -94,7 +94,7 @@ contract FactoryBurnMintERC20transfer is BurnMintERC20Setup { } contract FactoryBurnMintERC20mint is BurnMintERC20Setup { - function testBasicMintSuccess() public { + function test_BasicMint_Success() public { uint256 balancePre = s_burnMintERC20.balanceOf(OWNER); s_burnMintERC20.grantMintAndBurnRoles(OWNER); @@ -109,12 +109,12 @@ contract FactoryBurnMintERC20mint is BurnMintERC20Setup { // Revert - function testSenderNotMinterReverts() public { + function test_SenderNotMinter_Reverts() public { vm.expectRevert(abi.encodeWithSelector(FactoryBurnMintERC20.SenderNotMinter.selector, OWNER)); s_burnMintERC20.mint(STRANGER, 1e18); } - function testMaxSupplyExceededReverts() public { + function test_MaxSupplyExceeded_Reverts() public { changePrank(s_mockPool); // Mint max supply @@ -130,7 +130,7 @@ contract FactoryBurnMintERC20mint is BurnMintERC20Setup { } contract FactoryBurnMintERC20burn is BurnMintERC20Setup { - function testBasicBurnSuccess() public { + function test_BasicBurn_Success() public { s_burnMintERC20.grantBurnRole(OWNER); deal(address(s_burnMintERC20), OWNER, s_amount); @@ -144,13 +144,13 @@ contract FactoryBurnMintERC20burn is BurnMintERC20Setup { // Revert - function testSenderNotBurnerReverts() public { + function test_SenderNotBurner_Reverts() public { vm.expectRevert(abi.encodeWithSelector(FactoryBurnMintERC20.SenderNotBurner.selector, OWNER)); s_burnMintERC20.burnFrom(STRANGER, s_amount); } - function testExceedsBalanceReverts() public { + function test_ExceedsBalance_Reverts() public { changePrank(s_mockPool); vm.expectRevert("ERC20: burn amount exceeds balance"); @@ -158,7 +158,7 @@ contract FactoryBurnMintERC20burn is BurnMintERC20Setup { s_burnMintERC20.burn(s_amount * 2); } - function testBurnFromZeroAddressReverts() public { + function test_BurnFromZeroAddress_Reverts() public { s_burnMintERC20.grantBurnRole(address(0)); changePrank(address(0)); @@ -173,7 +173,7 @@ contract FactoryBurnMintERC20burnFromAlias is BurnMintERC20Setup { BurnMintERC20Setup.setUp(); } - function testBurnFromSuccess() public { + function test_BurnFrom_Success() public { s_burnMintERC20.approve(s_mockPool, s_amount); changePrank(s_mockPool); @@ -185,13 +185,13 @@ contract FactoryBurnMintERC20burnFromAlias is BurnMintERC20Setup { // Reverts - function testSenderNotBurnerReverts() public { + function test_SenderNotBurner_Reverts() public { vm.expectRevert(abi.encodeWithSelector(FactoryBurnMintERC20.SenderNotBurner.selector, OWNER)); s_burnMintERC20.burn(OWNER, s_amount); } - function testInsufficientAllowanceReverts() public { + function test_InsufficientAllowance_Reverts() public { changePrank(s_mockPool); vm.expectRevert("ERC20: insufficient allowance"); @@ -199,7 +199,7 @@ contract FactoryBurnMintERC20burnFromAlias is BurnMintERC20Setup { s_burnMintERC20.burn(OWNER, s_amount); } - function testExceedsBalanceReverts() public { + function test_ExceedsBalance_Reverts() public { s_burnMintERC20.approve(s_mockPool, s_amount * 2); changePrank(s_mockPool); @@ -215,7 +215,7 @@ contract FactoryBurnMintERC20burnFrom is BurnMintERC20Setup { BurnMintERC20Setup.setUp(); } - function testBurnFromSuccess() public { + function test_BurnFrom_Success() public { s_burnMintERC20.approve(s_mockPool, s_amount); changePrank(s_mockPool); @@ -227,13 +227,13 @@ contract FactoryBurnMintERC20burnFrom is BurnMintERC20Setup { // Reverts - function testSenderNotBurnerReverts() public { + function test_SenderNotBurner_Reverts() public { vm.expectRevert(abi.encodeWithSelector(FactoryBurnMintERC20.SenderNotBurner.selector, OWNER)); s_burnMintERC20.burnFrom(OWNER, s_amount); } - function testInsufficientAllowanceReverts() public { + function test_InsufficientAllowance_Reverts() public { changePrank(s_mockPool); vm.expectRevert("ERC20: insufficient allowance"); @@ -241,7 +241,7 @@ contract FactoryBurnMintERC20burnFrom is BurnMintERC20Setup { s_burnMintERC20.burnFrom(OWNER, s_amount); } - function testExceedsBalanceReverts() public { + function test_ExceedsBalance_Reverts() public { s_burnMintERC20.approve(s_mockPool, s_amount * 2); changePrank(s_mockPool); @@ -253,7 +253,7 @@ contract FactoryBurnMintERC20burnFrom is BurnMintERC20Setup { } contract FactoryBurnMintERC20grantRole is BurnMintERC20Setup { - function testGrantMintAccessSuccess() public { + function test_GrantMintAccess_Success() public { assertFalse(s_burnMintERC20.isMinter(STRANGER)); vm.expectEmit(); @@ -271,7 +271,7 @@ contract FactoryBurnMintERC20grantRole is BurnMintERC20Setup { assertFalse(s_burnMintERC20.isMinter(STRANGER)); } - function testGrantBurnAccessSuccess() public { + function test_GrantBurnAccess_Success() public { assertFalse(s_burnMintERC20.isBurner(STRANGER)); vm.expectEmit(); @@ -289,7 +289,7 @@ contract FactoryBurnMintERC20grantRole is BurnMintERC20Setup { assertFalse(s_burnMintERC20.isBurner(STRANGER)); } - function testGrantManySuccess() public { + function test_GrantMany_Success() public { // Since alice was already granted mint and burn roles in the setup, we will revoke them // and then grant them again for the purposes of the test s_burnMintERC20.revokeMintRole(s_alice); @@ -310,7 +310,7 @@ contract FactoryBurnMintERC20grantRole is BurnMintERC20Setup { } contract FactoryBurnMintERC20grantMintAndBurnRoles is BurnMintERC20Setup { - function testGrantMintAndBurnRolesSuccess() public { + function test_GrantMintAndBurnRoles_Success() public { assertFalse(s_burnMintERC20.isMinter(STRANGER)); assertFalse(s_burnMintERC20.isBurner(STRANGER)); @@ -327,7 +327,7 @@ contract FactoryBurnMintERC20grantMintAndBurnRoles is BurnMintERC20Setup { } contract FactoryBurnMintERC20decreaseApproval is BurnMintERC20Setup { - function testDecreaseApprovalSuccess() public { + function test_DecreaseApproval_Success() public { s_burnMintERC20.approve(s_mockPool, s_amount); uint256 allowance = s_burnMintERC20.allowance(OWNER, s_mockPool); assertEq(allowance, s_amount); @@ -337,7 +337,7 @@ contract FactoryBurnMintERC20decreaseApproval is BurnMintERC20Setup { } contract FactoryBurnMintERC20increaseApproval is BurnMintERC20Setup { - function testIncreaseApprovalSuccess() public { + function test_IncreaseApproval_Success() public { s_burnMintERC20.approve(s_mockPool, s_amount); uint256 allowance = s_burnMintERC20.allowance(OWNER, s_mockPool); assertEq(allowance, s_amount); @@ -347,7 +347,7 @@ contract FactoryBurnMintERC20increaseApproval is BurnMintERC20Setup { } contract FactoryBurnMintERC20supportsInterface is BurnMintERC20Setup { - function testConstructorSuccess() public view { + function test_SupportsInterface_Success() public view { assertTrue(s_burnMintERC20.supportsInterface(type(IERC20).interfaceId)); assertTrue(s_burnMintERC20.supportsInterface(type(IBurnMintERC20).interfaceId)); assertTrue(s_burnMintERC20.supportsInterface(type(IERC165).interfaceId)); diff --git a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol index 58ee2c4d9b..4f1b90098e 100644 --- a/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol +++ b/contracts/src/v0.8/ccip/test/tokenAdminRegistry/TokenPoolFactory.t.sol @@ -36,7 +36,7 @@ contract TokenPoolFactorySetup is TokenAdminRegistrySetup { bytes internal s_tokenCreationParams; bytes internal s_tokenInitCode; - uint256 public constant PREMINT_AMOUNT = 1e20; // 100 tokens in 18 decimals + uint256 public constant PREMINT_AMOUNT = 100 ether; function setUp() public virtual override { TokenAdminRegistrySetup.setUp(); diff --git a/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory/FactoryBurnMintERC20.sol b/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory/FactoryBurnMintERC20.sol index 5b05ba5fd2..70607cee76 100644 --- a/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory/FactoryBurnMintERC20.sol +++ b/contracts/src/v0.8/ccip/tokenAdminRegistry/TokenPoolFactory/FactoryBurnMintERC20.sol @@ -29,7 +29,6 @@ contract FactoryBurnMintERC20 is IBurnMintERC20, IGetCCIPAdmin, IERC165, ERC20Bu event BurnAccessGranted(address indexed burner); event MintAccessRevoked(address indexed minter); event BurnAccessRevoked(address indexed burner); - event CCIPAdminTransferred(address indexed previousAdmin, address indexed newAdmin); /// @dev The number of decimals for the token diff --git a/contracts/src/v0.8/shared/token/ERC677/OpStackBurnMintERC677.sol b/contracts/src/v0.8/shared/token/ERC677/OpStackBurnMintERC677.sol index 0ca02bc05b..e32ce9e65f 100644 --- a/contracts/src/v0.8/shared/token/ERC677/OpStackBurnMintERC677.sol +++ b/contracts/src/v0.8/shared/token/ERC677/OpStackBurnMintERC677.sol @@ -3,10 +3,11 @@ pragma solidity ^0.8.0; import {IOptimismMintableERC20Minimal} from "../ERC20/IOptimismMintableERC20.sol"; import {IOptimismMintableERC20} from "../ERC20/IOptimismMintableERC20.sol"; -import {IERC165} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/introspection/IERC165.sol"; import {BurnMintERC677} from "./BurnMintERC677.sol"; +import {IERC165} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/introspection/IERC165.sol"; + /// @notice A basic ERC677 compatible token contract with burn and minting roles that supports /// the native L2 bridging requirements of the Optimism Stack. /// @dev Note: the L2 bridge contract needs to be given burn and mint privileges manually, From d3ab62801d941a10d9f06cded5309900376ecb10 Mon Sep 17 00:00:00 2001 From: Josh Date: Tue, 22 Oct 2024 10:58:20 -0400 Subject: [PATCH 48/48] *sighs in snapshotting* --- contracts/gas-snapshots/ccip.gas-snapshot | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot index 0dc4f0aa41..b6ddb4bcd7 100644 --- a/contracts/gas-snapshots/ccip.gas-snapshot +++ b/contracts/gas-snapshots/ccip.gas-snapshot @@ -114,13 +114,13 @@ CommitStore_verify:test_Paused_Revert() (gas: 18568) CommitStore_verify:test_TooManyLeaves_Revert() (gas: 36848) DefensiveExampleTest:test_HappyPath_Success() (gas: 200200) DefensiveExampleTest:test_Recovery() (gas: 424476) -E2E:test_E2E_3MessagesSuccess_gas() (gas: 1141917) +E2E:test_E2E_3MessagesSuccess_gas() (gas: 1108425) EVM2EVMOffRamp__releaseOrMintToken:test__releaseOrMintToken_NotACompatiblePool_Revert() (gas: 38322) EVM2EVMOffRamp__releaseOrMintToken:test__releaseOrMintToken_Success() (gas: 104438) -EVM2EVMOffRamp__releaseOrMintToken:test__releaseOrMintToken_TokenHandlingError_transfer_Revert() (gas: 83526) +EVM2EVMOffRamp__releaseOrMintToken:test__releaseOrMintToken_TokenHandlingError_transfer_Revert() (gas: 86026) EVM2EVMOffRamp__releaseOrMintToken:test_releaseOrMintToken_InvalidDataLength_Revert() (gas: 37365) EVM2EVMOffRamp__releaseOrMintToken:test_releaseOrMintToken_ReleaseOrMintBalanceMismatch_Revert() (gas: 95013) -EVM2EVMOffRamp__releaseOrMintToken:test_releaseOrMintToken_TokenHandlingError_BalanceOf_Revert() (gas: 37841) +EVM2EVMOffRamp__releaseOrMintToken:test_releaseOrMintToken_TokenHandlingError_BalanceOf_Revert() (gas: 40341) EVM2EVMOffRamp__releaseOrMintToken:test_releaseOrMintToken_skip_ReleaseOrMintBalanceMismatch_if_pool_Revert() (gas: 87189) EVM2EVMOffRamp__releaseOrMintTokens:test_OverValueWithARLOff_Success() (gas: 381594) EVM2EVMOffRamp__releaseOrMintTokens:test_PriceNotFoundForToken_Reverts() (gas: 140568) @@ -539,7 +539,7 @@ MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithRateLimitExce MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithRateLimitReset_Success() (gas: 76561) MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithTokensOnDifferentChains_Success() (gas: 308233) MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithTokens_Success() (gas: 50558) -MultiAggregateRateLimiter_onOutboundMessage:test_RateLimitValueDifferentLanes_Success() (gas: 51181) +MultiAggregateRateLimiter_onOutboundMessage:test_RateLimitValueDifferentLanes_Success() (gas: 1073669578) MultiAggregateRateLimiter_onOutboundMessage:test_ValidateMessageWithNoTokens_Success() (gas: 19302) MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageFromUnauthorizedCaller_Revert() (gas: 15913) MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithDifferentTokensOnDifferentChains_Success() (gas: 209885) @@ -593,7 +593,7 @@ MultiOCR3Base_transmit:test_UnauthorizedSigner_Revert() (gas: 61275) MultiOCR3Base_transmit:test_UnconfiguredPlugin_Revert() (gas: 39933) MultiOCR3Base_transmit:test_ZeroSignatures_Revert() (gas: 33049) MultiOnRampTokenPoolReentrancy:test_OnRampTokenPoolReentrancy_Success() (gas: 233732) -MultiRampsE2E:test_E2E_3MessagesMMultiOffRampSuccess_gas() (gas: 1518567) +MultiRampsE2E:test_E2E_3MessagesMMultiOffRampSuccess_gas() (gas: 1501821) NonceManager_NonceIncrementation:test_getIncrementedOutboundNonce_Success() (gas: 37934) NonceManager_NonceIncrementation:test_incrementInboundNonce_Skip() (gas: 23706) NonceManager_NonceIncrementation:test_incrementInboundNonce_Success() (gas: 38778) @@ -661,7 +661,7 @@ OffRamp_batchExecute:test_Unhealthy_Success() (gas: 554256) OffRamp_batchExecute:test_ZeroReports_Revert() (gas: 10622) OffRamp_ccipReceive:test_Reverts() (gas: 15407) OffRamp_commit:test_CommitOnRampMismatch_Revert() (gas: 92905) -OffRamp_commit:test_FailedRMNVerification_Reverts() (gas: 61599) +OffRamp_commit:test_FailedRMNVerification_Reverts() (gas: 64099) OffRamp_commit:test_InvalidIntervalMinLargerThanMax_Revert() (gas: 68173) OffRamp_commit:test_InvalidInterval_Revert() (gas: 64291) OffRamp_commit:test_InvalidRootRevert() (gas: 63356) @@ -755,10 +755,10 @@ OffRamp_manuallyExecute:test_manuallyExecute_WithMultiReportGasOverride_Success( OffRamp_manuallyExecute:test_manuallyExecute_WithPartialMessages_Success() (gas: 347346) OffRamp_releaseOrMintSingleToken:test__releaseOrMintSingleToken_NotACompatiblePool_Revert() (gas: 37656) OffRamp_releaseOrMintSingleToken:test__releaseOrMintSingleToken_Success() (gas: 104404) -OffRamp_releaseOrMintSingleToken:test__releaseOrMintSingleToken_TokenHandlingError_transfer_Revert() (gas: 82842) +OffRamp_releaseOrMintSingleToken:test__releaseOrMintSingleToken_TokenHandlingError_transfer_Revert() (gas: 85342) OffRamp_releaseOrMintSingleToken:test_releaseOrMintToken_InvalidDataLength_Revert() (gas: 36752) OffRamp_releaseOrMintSingleToken:test_releaseOrMintToken_ReleaseOrMintBalanceMismatch_Revert() (gas: 94382) -OffRamp_releaseOrMintSingleToken:test_releaseOrMintToken_TokenHandlingError_BalanceOf_Revert() (gas: 37241) +OffRamp_releaseOrMintSingleToken:test_releaseOrMintToken_TokenHandlingError_BalanceOf_Revert() (gas: 39741) OffRamp_releaseOrMintSingleToken:test_releaseOrMintToken_skip_ReleaseOrMintBalanceMismatch_if_pool_Revert() (gas: 86516) OffRamp_releaseOrMintTokens:test_TokenHandlingError_Reverts() (gas: 162381) OffRamp_releaseOrMintTokens:test__releaseOrMintTokens_PoolIsNotAPool_Reverts() (gas: 23903)