Skip to content

Instantly share code, notes, and snippets.

@shingonu
Created November 18, 2018 05:05
Show Gist options
  • Select an option

  • Save shingonu/232b38770bd968ea78fe7955842d6430 to your computer and use it in GitHub Desktop.

Select an option

Save shingonu/232b38770bd968ea78fe7955842d6430 to your computer and use it in GitHub Desktop.
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