{"file_path":"lib/vault-v2/src/periphery/WhitelistSendAssetsGate.sol","creation_status":"success","source_code":"// SPDX-License-Identifier: GPL-2.0-or-later\n// Copyright (c) 2026 Morpho Association\npragma solidity 0.8.28;\n\nimport {\n    IWhitelistSendAssetsGate,\n    IIntermediary,\n    SET_IS_WHITELISTED_TYPEHASH\n} from \"./interfaces/IWhitelistSendAssetsGate.sol\";\nimport {DOMAIN_TYPEHASH} from \"../libraries/ConstantsLib.sol\";\n\n/// @dev Using this gate allows to restrict who the funds are initially owned by in a vault's deposits/mints.\n/// @dev As with any send assets gate, nothing prevents whitelisted accounts from using a non whitelisted account's\n/// funds.\n/// @dev If account is registered as a trusted intermediary, IIntermediary(account).initiator() is checked for\n/// whitelisted status instead of account itself. Thus the intermediary should only deposit and mint using assets\n/// initially owned by its current initiator.\n/// @dev No-ops are allowed.\n/// @dev Zero checks are not systematically performed.\ncontract WhitelistSendAssetsGate is IWhitelistSendAssetsGate {\n    address public roleSetter;\n    address public whitelister;\n    mapping(address => uint256) public nonces;\n    mapping(address => bool) public isWhitelisted;\n    mapping(address => bool) public isIntermediary;\n\n    constructor(address _roleSetter) {\n        roleSetter = _roleSetter;\n        emit Constructor(_roleSetter);\n    }\n\n    /// @dev Useful for EOAs to batch privileged calls.\n    /// @dev Does not return anything, because accounts who would use the return data would be contracts, which can do\n    /// the multicall themselves.\n    function multicall(bytes[] calldata data) external {\n        for (uint256 i = 0; i < data.length; i++) {\n            (bool success, bytes memory returnData) = address(this).delegatecall(data[i]);\n            if (!success) {\n                assembly (\"memory-safe\") {\n                    revert(add(32, returnData), mload(returnData))\n                }\n            }\n        }\n    }\n\n    /// @dev Reverts if isIntermediary[account] but account reverts on initiator().\n    function canSendAssets(address account) external view returns (bool) {\n        return isWhitelisted[isIntermediary[account] ? IIntermediary(account).initiator() : account];\n    }\n\n    function setRoleSetter(address newRoleSetter) external {\n        require(msg.sender == roleSetter, NotRoleSetter());\n        roleSetter = newRoleSetter;\n        emit SetRoleSetter(newRoleSetter);\n    }\n\n    function setWhitelister(address newWhitelister) external {\n        require(msg.sender == roleSetter, NotRoleSetter());\n        whitelister = newWhitelister;\n        emit SetWhitelister(newWhitelister);\n    }\n\n    function setIsWhitelisted(address account, bool newIsWhitelisted) external {\n        require(msg.sender == whitelister, NotWhitelister());\n        isWhitelisted[account] = newIsWhitelisted;\n        emit SetIsWhitelisted(account, newIsWhitelisted);\n    }\n\n    function setIsIntermediary(address intermediary, bool newIsIntermediary) external {\n        require(msg.sender == whitelister, NotWhitelister());\n        isIntermediary[intermediary] = newIsIntermediary;\n        emit SetIsIntermediary(intermediary, newIsIntermediary);\n    }\n\n    /// @dev Signature malleability is not explicitly prevented but it is not a problem thanks to the nonce.\n    /// @dev Allows to batch setIsWhitelisted with the deposit, without requiring a transaction from the whitelister.\n    function setIsWhitelistedWithSig(\n        address account,\n        bool newIsWhitelisted,\n        uint256 deadline,\n        uint8 v,\n        bytes32 r,\n        bytes32 s\n    ) external {\n        require(deadline >= block.timestamp, DeadlineExpired());\n        bytes32 hashStruct =\n            keccak256(abi.encode(SET_IS_WHITELISTED_TYPEHASH, account, newIsWhitelisted, nonces[account]++, deadline));\n        bytes32 digest = keccak256(abi.encodePacked(\"\\x19\\x01\", DOMAIN_SEPARATOR(), hashStruct));\n        address recovered = ecrecover(digest, v, r, s);\n        require(recovered != address(0) && recovered == whitelister, InvalidSigner());\n        isWhitelisted[account] = newIsWhitelisted;\n        emit SetIsWhitelistedWithSig(account, newIsWhitelisted);\n    }\n\n    /// forge-lint: disable-next-item(mixed-case-function)\n    function DOMAIN_SEPARATOR() public view returns (bytes32) {\n        return keccak256(abi.encode(DOMAIN_TYPEHASH, block.chainid, address(this)));\n    }\n}\n","deployed_bytecode":"0x6080806040526004361015610012575f80fd5b5f3560e01c90816309ec923a14610724575080631e45fc781461068757806320fe8d58146105b657806322758a4a1461058e5780633644e5151461056c5780633af32abf1461052f5780633f6481ad14610508578063692bf818146104cb5780637af7da2f146102f25780637ecebe00146102ba578063ac9650d81461019b578063c2adf6071461012d5763f98f5b92146100ab575f80fd5b34610129576020366003190112610129576100c46107b0565b5f546001600160a01b0316330361011a57600180546001600160a01b0319166001600160a01b039290921691821790557f0ca44eaf19ec8e07aaa42c7f82892b8ff7de9faf7b420a750585730a0b0b38785f80a2005b631ed3e76760e01b5f5260045ffd5b5f80fd5b34610129576020366003190112610129576101466107b0565b5f54906001600160a01b038216330361011a576001600160a01b03166001600160a01b03199190911681175f9081557f358c2e79948268accd81a80fa201c92db9ed2d8361c9c1f53ae7ed3ba11b8edf9080a2005b346101295760203660031901126101295760043567ffffffffffffffff8111610129573660238201121561012957806004013567ffffffffffffffff8111610129573660248260051b8401011161012957903681900360421901905f5b838110156102b85760248160051b830101358381121561012957820160248101359067ffffffffffffffff821161012957604401813603811361012957815f92918392604051928392833781018381520390305af43d156102b0573d9067ffffffffffffffff821161029c576040519161027c601f8201601f1916602001846107d5565b82523d5f602084013e5b1561029457506001016101f8565b805190602001fd5b634e487b7160e01b5f52604160045260245ffd5b606090610286565b005b34610129576020366003190112610129576001600160a01b036102db6107b0565b165f526002602052602060405f2054604051908152f35b346101295760c03660031901126101295761030b6107b0565b6103136107c6565b604435906064359260ff8416809403610129574283106104bc576001600160a01b03165f818152600260205260409020805491949193905f1985146104a8576020925f92608092600188019055604051858101917f658b76f01cdfb3d4509e5a8fe196d95b6bbbd60743cb439c44d2b7edb24f23428352896040830152871515988960608401528583015260a082015260a081526103b260c0826107d5565b5190206103bd6107f7565b90604051908682019261190160f01b845260228301526042820152604281526103e76062826107d5565b5190209060405191825284820152608435604082015260a435606082015282805260015afa1561049d575f516001600160a01b03168015159081610488575b5015610479577f19dbed4570f9a796de78ad5e026256e46a12cafe74ec773fc000d9db60b9876d91610470602092855f526003845260405f209060ff801983541691151516179055565b604051908152a2005b632057875960e21b5f5260045ffd5b6001546001600160a01b031614905084610426565b6040513d5f823e3d90fd5b634e487b7160e01b5f52601160045260245ffd5b631ab7da6b60e01b5f5260045ffd5b34610129576020366003190112610129576001600160a01b036104ec6107b0565b165f526004602052602060ff60405f2054166040519015158152f35b34610129575f366003190112610129575f546040516001600160a01b039091168152602090f35b34610129576020366003190112610129576001600160a01b036105506107b0565b165f526003602052602060ff60405f2054166040519015158152f35b34610129575f3660031901126101295760206105866107f7565b604051908152f35b34610129575f366003190112610129576001546040516001600160a01b039091168152602090f35b34610129576020366003190112610129576105cf6107b0565b6001600160a01b0381165f8181526004602052604090205490919060ff16156106805750602060049160405192838092635c39fcc160e01b82525afa90811561049d575f9161063e575b505b60018060a01b03165f526003602052602060ff60405f2054166040519015158152f35b90506020813d602011610678575b81610659602093836107d5565b8101031261012957516001600160a01b03811681036101295781610619565b3d915061064c565b905061061b565b34610129576040366003190112610129576106a06107b0565b6106a86107c6565b6001549091906001600160a01b031633036107155760207f0c5ff604abcbf3e8df50076cc648f6fff02fff877927397b53d0976adfd245c69160018060a01b031692835f526004825261070a8160405f209060ff801983541691151516179055565b6040519015158152a2005b63b8088f8760e01b5f5260045ffd5b346101295760403660031901126101295761073d6107b0565b906107466107c6565b6001549092906001600160a01b03163303610715577f6c2c1966a276b3dc858097a7ea49424990d1fe95a57b7d865a85e016c3b94e759160209160018060a01b031693845f52600383526107a98160405f209060ff801983541691151516179055565b15158152a2005b600435906001600160a01b038216820361012957565b60243590811515820361012957565b90601f8019910116810190811067ffffffffffffffff82111761029c57604052565b60405160208101907f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a7946921882524660408201523060608201526060815261083d6080826107d5565b5190209056fea264697066735822122029259289b2e5172b7555caaea600232062d32cc24a0d9c42dff51c9ee9bb411764736f6c634300081c0033","optimization_enabled":true,"verified_twin_address_hash":null,"is_verified":true,"compiler_settings":{"evmVersion":"cancun","libraries":{},"metadata":{"appendCBOR":true,"bytecodeHash":"ipfs","useLiteralContent":false},"optimizer":{"enabled":true,"runs":100},"outputSelection":{"*":{"":["*"],"*":["*"]}},"remappings":["@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/","@vault-v2/=lib/vault-v2/","@morpho-blue/=lib/morpho-blue/src/","@aragon/osx/=lib/osx/packages/contracts/src/","ds-test/=lib/morpho-blue/lib/forge-std/lib/ds-test/src/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","halmos-cheatcodes/=lib/morpho-blue/lib/halmos-cheatcodes/src/","metamorpho-v1.1/=lib/vault-v2/lib/metamorpho-v1.1/","metamorpho/=lib/vault-v2/lib/metamorpho/","morpho-blue-irm/=lib/vault-v2/lib/morpho-blue-irm/","morpho-blue/=lib/morpho-blue/","openzeppelin-contracts/=lib/openzeppelin-contracts/","osx/=lib/osx/","solmate/=lib/vault-v2/lib/morpho-blue-irm/lib/solmate/src/","vault-v2/=lib/vault-v2/"],"viaIR":true},"optimization_runs":100,"sourcify_repo_url":null,"decoded_constructor_args":[["0xfeed46c11F57B7126a773EeC6ae9cA7aE1C03C9a",{"internalType":"address","name":"_roleSetter","type":"address"}]],"compiler_version":"v0.8.28+commit.7893614a","is_verified_via_verifier_alliance":false,"verified_at":"2026-06-26T13:18:29.575579Z","implementations":[],"proxy_type":null,"external_libraries":[],"creation_bytecode":"0x608034609357601f61092538819003918201601f19168301916001600160401b03831184841017609757808492602094604052833981010312609357516001600160a01b038116908190036093575f80546001600160a01b0319168217815560405191907f385bc760a35ad4b8b2c11c6a4c6d27daa5e72ce47836b34da36a3f1258ec45ec9080a261087990816100ac8239f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe6080806040526004361015610012575f80fd5b5f3560e01c90816309ec923a14610724575080631e45fc781461068757806320fe8d58146105b657806322758a4a1461058e5780633644e5151461056c5780633af32abf1461052f5780633f6481ad14610508578063692bf818146104cb5780637af7da2f146102f25780637ecebe00146102ba578063ac9650d81461019b578063c2adf6071461012d5763f98f5b92146100ab575f80fd5b34610129576020366003190112610129576100c46107b0565b5f546001600160a01b0316330361011a57600180546001600160a01b0319166001600160a01b039290921691821790557f0ca44eaf19ec8e07aaa42c7f82892b8ff7de9faf7b420a750585730a0b0b38785f80a2005b631ed3e76760e01b5f5260045ffd5b5f80fd5b34610129576020366003190112610129576101466107b0565b5f54906001600160a01b038216330361011a576001600160a01b03166001600160a01b03199190911681175f9081557f358c2e79948268accd81a80fa201c92db9ed2d8361c9c1f53ae7ed3ba11b8edf9080a2005b346101295760203660031901126101295760043567ffffffffffffffff8111610129573660238201121561012957806004013567ffffffffffffffff8111610129573660248260051b8401011161012957903681900360421901905f5b838110156102b85760248160051b830101358381121561012957820160248101359067ffffffffffffffff821161012957604401813603811361012957815f92918392604051928392833781018381520390305af43d156102b0573d9067ffffffffffffffff821161029c576040519161027c601f8201601f1916602001846107d5565b82523d5f602084013e5b1561029457506001016101f8565b805190602001fd5b634e487b7160e01b5f52604160045260245ffd5b606090610286565b005b34610129576020366003190112610129576001600160a01b036102db6107b0565b165f526002602052602060405f2054604051908152f35b346101295760c03660031901126101295761030b6107b0565b6103136107c6565b604435906064359260ff8416809403610129574283106104bc576001600160a01b03165f818152600260205260409020805491949193905f1985146104a8576020925f92608092600188019055604051858101917f658b76f01cdfb3d4509e5a8fe196d95b6bbbd60743cb439c44d2b7edb24f23428352896040830152871515988960608401528583015260a082015260a081526103b260c0826107d5565b5190206103bd6107f7565b90604051908682019261190160f01b845260228301526042820152604281526103e76062826107d5565b5190209060405191825284820152608435604082015260a435606082015282805260015afa1561049d575f516001600160a01b03168015159081610488575b5015610479577f19dbed4570f9a796de78ad5e026256e46a12cafe74ec773fc000d9db60b9876d91610470602092855f526003845260405f209060ff801983541691151516179055565b604051908152a2005b632057875960e21b5f5260045ffd5b6001546001600160a01b031614905084610426565b6040513d5f823e3d90fd5b634e487b7160e01b5f52601160045260245ffd5b631ab7da6b60e01b5f5260045ffd5b34610129576020366003190112610129576001600160a01b036104ec6107b0565b165f526004602052602060ff60405f2054166040519015158152f35b34610129575f366003190112610129575f546040516001600160a01b039091168152602090f35b34610129576020366003190112610129576001600160a01b036105506107b0565b165f526003602052602060ff60405f2054166040519015158152f35b34610129575f3660031901126101295760206105866107f7565b604051908152f35b34610129575f366003190112610129576001546040516001600160a01b039091168152602090f35b34610129576020366003190112610129576105cf6107b0565b6001600160a01b0381165f8181526004602052604090205490919060ff16156106805750602060049160405192838092635c39fcc160e01b82525afa90811561049d575f9161063e575b505b60018060a01b03165f526003602052602060ff60405f2054166040519015158152f35b90506020813d602011610678575b81610659602093836107d5565b8101031261012957516001600160a01b03811681036101295781610619565b3d915061064c565b905061061b565b34610129576040366003190112610129576106a06107b0565b6106a86107c6565b6001549091906001600160a01b031633036107155760207f0c5ff604abcbf3e8df50076cc648f6fff02fff877927397b53d0976adfd245c69160018060a01b031692835f526004825261070a8160405f209060ff801983541691151516179055565b6040519015158152a2005b63b8088f8760e01b5f5260045ffd5b346101295760403660031901126101295761073d6107b0565b906107466107c6565b6001549092906001600160a01b03163303610715577f6c2c1966a276b3dc858097a7ea49424990d1fe95a57b7d865a85e016c3b94e759160209160018060a01b031693845f52600383526107a98160405f209060ff801983541691151516179055565b15158152a2005b600435906001600160a01b038216820361012957565b60243590811515820361012957565b90601f8019910116810190811067ffffffffffffffff82111761029c57604052565b60405160208101907f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a7946921882524660408201523060608201526060815261083d6080826107d5565b5190209056fea264697066735822122029259289b2e5172b7555caaea600232062d32cc24a0d9c42dff51c9ee9bb411764736f6c634300081c0033000000000000000000000000feed46c11f57b7126a773eec6ae9ca7ae1c03c9a","name":"WhitelistSendAssetsGate","is_blueprint":false,"license_type":"none","is_fully_verified":true,"is_verified_via_eth_bytecode_db":false,"language":"solidity","evm_version":"cancun","can_be_visualized_via_sol2uml":true,"is_verified_via_sourcify":false,"additional_sources":[{"file_path":"lib/vault-v2/src/interfaces/IGate.sol","source_code":"// SPDX-License-Identifier: GPL-2.0-or-later\n// Copyright (c) 2025 Morpho Association\npragma solidity >=0.5.0;\n\ninterface IReceiveSharesGate {\n    function canReceiveShares(address account) external view returns (bool);\n}\n\ninterface ISendSharesGate {\n    function canSendShares(address account) external view returns (bool);\n}\n\ninterface IReceiveAssetsGate {\n    function canReceiveAssets(address account) external view returns (bool);\n}\n\ninterface ISendAssetsGate {\n    function canSendAssets(address account) external view returns (bool);\n}\n"},{"file_path":"lib/vault-v2/src/libraries/ConstantsLib.sol","source_code":"// SPDX-License-Identifier: GPL-2.0-or-later\n// Copyright (c) 2025 Morpho Association\npragma solidity ^0.8.0;\n\nuint256 constant WAD = 1e18;\nbytes32 constant DOMAIN_TYPEHASH = keccak256(\"EIP712Domain(uint256 chainId,address verifyingContract)\");\nbytes32 constant PERMIT_TYPEHASH =\n    keccak256(\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\");\nuint256 constant MAX_MAX_RATE = 200e16 / uint256(365 days); // 200% APR\nuint256 constant MAX_PERFORMANCE_FEE = 0.5e18; // 50%\nuint256 constant MAX_MANAGEMENT_FEE = 0.05e18 / uint256(365 days); // 5%\nuint256 constant MAX_FORCE_DEALLOCATE_PENALTY = 0.02e18; // 2%\n"},{"file_path":"lib/vault-v2/src/periphery/interfaces/IWhitelistSendAssetsGate.sol","source_code":"// SPDX-License-Identifier: GPL-2.0-or-later\n// Copyright (c) 2026 Morpho Association\npragma solidity >=0.5.0;\n\nimport {ISendAssetsGate} from \"../../interfaces/IGate.sol\";\n\nbytes32 constant SET_IS_WHITELISTED_TYPEHASH =\n    keccak256(\"SetIsWhitelisted(address account,bool newIsWhitelisted,uint256 nonce,uint256 deadline)\");\n\ninterface IIntermediary {\n    function initiator() external view returns (address);\n}\n\ninterface IWhitelistSendAssetsGate is ISendAssetsGate {\n    /* EVENTS */\n\n    event Constructor(address indexed roleSetter);\n    event SetRoleSetter(address indexed newRoleSetter);\n    event SetWhitelister(address indexed newWhitelister);\n    event SetIsWhitelisted(address indexed account, bool newIsWhitelisted);\n    event SetIsWhitelistedWithSig(address indexed account, bool newIsWhitelisted);\n    event SetIsIntermediary(address indexed intermediary, bool newIsIntermediary);\n\n    /* ERRORS */\n\n    error NotRoleSetter();\n    error NotWhitelister();\n    error DeadlineExpired();\n    error InvalidSigner();\n\n    /* FUNCTIONS */\n\n    function roleSetter() external view returns (address);\n    function whitelister() external view returns (address);\n    function nonces(address account) external view returns (uint256);\n    function isWhitelisted(address account) external view returns (bool);\n    function isIntermediary(address account) external view returns (bool);\n    function setRoleSetter(address newRoleSetter) external;\n    function setWhitelister(address newWhitelister) external;\n    function setIsWhitelisted(address account, bool newIsWhitelisted) external;\n    function setIsIntermediary(address intermediary, bool newIsIntermediary) external;\n    function setIsWhitelistedWithSig(\n        address account,\n        bool newIsWhitelisted,\n        uint256 deadline,\n        uint8 v,\n        bytes32 r,\n        bytes32 s\n    ) external;\n    function DOMAIN_SEPARATOR() external view returns (bytes32);\n    function multicall(bytes[] calldata data) external;\n}\n"}],"certified":false,"conflicting_implementations":null,"abi":[{"inputs":[{"internalType":"address","name":"_roleSetter","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"DeadlineExpired","type":"error"},{"inputs":[],"name":"InvalidSigner","type":"error"},{"inputs":[],"name":"NotRoleSetter","type":"error"},{"inputs":[],"name":"NotWhitelister","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"roleSetter","type":"address"}],"name":"Constructor","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"intermediary","type":"address"},{"indexed":false,"internalType":"bool","name":"newIsIntermediary","type":"bool"}],"name":"SetIsIntermediary","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"newIsWhitelisted","type":"bool"}],"name":"SetIsWhitelisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"newIsWhitelisted","type":"bool"}],"name":"SetIsWhitelistedWithSig","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newRoleSetter","type":"address"}],"name":"SetRoleSetter","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWhitelister","type":"address"}],"name":"SetWhitelister","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"canSendAssets","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isIntermediary","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"name":"multicall","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"roleSetter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"intermediary","type":"address"},{"internalType":"bool","name":"newIsIntermediary","type":"bool"}],"name":"setIsIntermediary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"newIsWhitelisted","type":"bool"}],"name":"setIsWhitelisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"newIsWhitelisted","type":"bool"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"setIsWhitelistedWithSig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRoleSetter","type":"address"}],"name":"setRoleSetter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWhitelister","type":"address"}],"name":"setWhitelister","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelister","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}],"is_changed_bytecode":false,"is_partially_verified":false,"constructor_args":"0x000000000000000000000000feed46c11f57b7126a773eec6ae9ca7ae1c03c9a"}