37 lines
1.1 KiB
Solidity
37 lines
1.1 KiB
Solidity
// SPDX-License-Identifier: MIT
|
|
pragma solidity ^0.8.20;
|
|
|
|
/// @dev Minimal non-upgradeable delegatecall proxy for testing upgradeable
|
|
/// contracts (WTFControllerV2 uses an initializer + _disableInitializers()).
|
|
contract TestProxy {
|
|
bytes32 private constant _IMPLEMENTATION_SLOT =
|
|
bytes32(uint256(keccak256("test.proxy.implementation")) - 1);
|
|
|
|
constructor(address implementation_) {
|
|
bytes32 slot = _IMPLEMENTATION_SLOT;
|
|
assembly {
|
|
sstore(slot, implementation_)
|
|
}
|
|
}
|
|
|
|
fallback() external payable {
|
|
bytes32 slot = _IMPLEMENTATION_SLOT;
|
|
address impl;
|
|
assembly {
|
|
impl := sload(slot)
|
|
}
|
|
assembly {
|
|
calldatacopy(0, 0, calldatasize())
|
|
let result := delegatecall(gas(), impl, 0, calldatasize(), 0, 0)
|
|
returndatacopy(0, 0, returndatasize())
|
|
switch result
|
|
case 0 {
|
|
revert(0, returndatasize())
|
|
}
|
|
default {
|
|
return(0, returndatasize())
|
|
}
|
|
}
|
|
}
|
|
}
|