// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity 0.8.10;
/**
* @title MirrorProxy
* @author MirrorXYZ
* The MirrorProxy contract is used to deploy minimal proxies.
*/
contract MirrorProxy {
/**
* @dev Storage slot with the address of the current implementation.
* This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is
* validated in the constructor.
*/
bytes32 internal constant _IMPLEMENTATION_SLOT =
0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
/**
* @notice Initializes a proxy by delegating logic to the implementation,
* and reverts if the call is not successful. Stores implementation logic.
* @param implementation - the implementation holds the logic for all proxies
* @param initializationData - initialization call
*/
constructor(address implementation, bytes memory initializationData) {
// Delegatecall into the implementation, supplying initialization calldata.
(bool ok, ) = implementation.delegatecall(initializationData);
// Revert and include revert data if delegatecall to implementation reverts.
if (!ok) {
assembly {
returndatacopy(0, 0, returndatasize())
revert(0, returndatasize())
}
}
assembly {
sstore(_IMPLEMENTATION_SLOT, implementation)
}
}
/**
* @notice When any function is called on this contract, we delegate to
* the logic contract stored in the implementation storage slot.
*/
fallback() external payable {
assembly {
let ptr := mload(0x40)
calldatacopy(ptr, 0, calldatasize())
let result := delegatecall(
gas(),
sload(_IMPLEMENTATION_SLOT),
ptr,
calldatasize(),
0,
0
)
let size := returndatasize()
returndatacopy(ptr, 0, size)
switch result
case 0 {
revert(ptr, size)
}
default {
return(ptr, size)
}
}
}
}
{
"compilationTarget": {
"MirrorProxy.sol": "MirrorProxy"
},
"evmVersion": "london",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 2000
},
"remappings": []
}
[{"inputs":[{"internalType":"address","name":"implementation","type":"address"},{"internalType":"bytes","name":"initializationData","type":"bytes"}],"stateMutability":"nonpayable","type":"constructor"},{"stateMutability":"payable","type":"fallback"}]