// SPDX-License-Identifier: GPL-3.0/*
This file is part of the Enzyme Protocol.
(c) Enzyme Council <council@enzyme.finance>
For the full license information, please view the LICENSE
file that was distributed with this source code.
*/pragmasolidity 0.6.12;import"../../../utils/NonUpgradableProxy.sol";
/// @title ComptrollerProxy Contract/// @author Enzyme Council <security@enzyme.finance>/// @notice A proxy contract for all ComptrollerProxy instancescontractComptrollerProxyisNonUpgradableProxy{
constructor(bytesmemory _constructData, address _comptrollerLib)
publicNonUpgradableProxy(_constructData, _comptrollerLib)
{}
}
Contract Source Code
File 2 of 2: NonUpgradableProxy.sol
// SPDX-License-Identifier: GPL-3.0/*
This file is part of the Enzyme Protocol.
(c) Enzyme Council <council@enzyme.finance>
For the full license information, please view the LICENSE
file that was distributed with this source code.
*/pragmasolidity 0.6.12;/// @title NonUpgradableProxy Contract/// @author Enzyme Council <security@enzyme.finance>/// @notice A proxy contract for use with non-upgradable libs/// @dev The recommended constructor-fallback pattern of a proxy in EIP-1822, updated for solc 0.6.12,/// and using an immutable lib value to save on gas (since not upgradable)./// The EIP-1967 storage slot for the lib is still assigned,/// for ease of referring to UIs that understand the pattern, i.e., Etherscan.abstractcontractNonUpgradableProxy{
addressprivateimmutable CONTRACT_LOGIC;
constructor(bytesmemory _constructData, address _contractLogic) public{
CONTRACT_LOGIC = _contractLogic;
assembly {
// EIP-1967 slot: `bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)`sstore(
0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc,
_contractLogic
)
}
(bool success, bytesmemory returnData) = _contractLogic.delegatecall(_constructData);
require(success, string(returnData));
}
// solhint-disable-next-line no-complex-fallbackfallback() externalpayable{
address contractLogic = CONTRACT_LOGIC;
assembly {
calldatacopy(0x0, 0x0, calldatasize())
let success :=delegatecall(
sub(gas(), 10000),
contractLogic,
0x0,
calldatasize(),
0,
0
)
let retSz :=returndatasize()
returndatacopy(0, 0, retSz)
switch success
case0 {
revert(0, retSz)
}
default {
return(0, retSz)
}
}
}
}