mirror of
https://github.com/luxfi/vault.git
synced 2026-10-30 15:13:45 +00:00
50 lines
1.3 KiB
Solidity
50 lines
1.3 KiB
Solidity
// SPDX-License-Identifier: MIT
|
|
pragma solidity ^0.8.0;
|
|
|
|
/**
|
|
* @title InitializedProxy
|
|
* @author Anna Carroll
|
|
*/
|
|
contract InitializedProxy {
|
|
// address of logic contract
|
|
address public immutable logic;
|
|
|
|
// ======== Constructor =========
|
|
|
|
constructor(
|
|
address _logic,
|
|
bytes memory _initializationCalldata
|
|
) {
|
|
logic = _logic;
|
|
// Delegatecall into the logic contract, supplying initialization calldata
|
|
(bool _ok, bytes memory returnData) =
|
|
_logic.delegatecall(_initializationCalldata);
|
|
// Revert if delegatecall to implementation reverts
|
|
require(_ok, string(returnData));
|
|
}
|
|
|
|
// ======== Fallback =========
|
|
|
|
fallback() external payable {
|
|
address _impl = logic;
|
|
assembly {
|
|
let ptr := mload(0x40)
|
|
calldatacopy(ptr, 0, calldatasize())
|
|
let result := delegatecall(gas(), _impl, ptr, calldatasize(), 0, 0)
|
|
let size := returndatasize()
|
|
returndatacopy(ptr, 0, size)
|
|
|
|
switch result
|
|
case 0 {
|
|
revert(ptr, size)
|
|
}
|
|
default {
|
|
return(ptr, size)
|
|
}
|
|
}
|
|
}
|
|
|
|
// ======== Receive =========
|
|
|
|
receive() external payable {} // solhint-disable-line no-empty-blocks
|
|
} |