Created
November 18, 2018 05:05
-
-
Save shingonu/232b38770bd968ea78fe7955842d6430 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| pragma solidity ^0.4.18; | |
| /** | |
| * @title Proxy | |
| * @dev Gives the possibility to delegate any call to a foreign implementation. | |
| */ | |
| contract Proxy { | |
| /** | |
| * @dev Tells the address of the implementation where every call will be delegated. | |
| * @return address of the implementation to which it will be delegated | |
| */ | |
| function implementation() public view returns (address); | |
| /** | |
| * @dev Fallback function allowing to perform a delegatecall to the given implementation. | |
| * This function will return whatever the implementation call returns | |
| */ | |
| function () payable public { | |
| address _impl = implementation(); | |
| require(_impl != address(0)); | |
| 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) } | |
| } | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment