2017-11-28 03:33:25 +00:00
|
|
|
pragma solidity ^0.4.17;
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @title DelegatedCall
|
|
|
|
* @author Ricardo Guilherme Schmidt (Status Research & Development GmbH)
|
|
|
|
* @dev Abstract contract that delegates calls by `delegated` modifier to result of `_target()`
|
|
|
|
*/
|
|
|
|
contract DelegatedCall {
|
|
|
|
/**
|
|
|
|
* @dev delegates the call of this function
|
|
|
|
*/
|
|
|
|
modifier delegated {
|
2017-12-01 06:45:26 +00:00
|
|
|
//require successfull delegate call to remote `_target()`
|
|
|
|
require(_target().delegatecall(msg.data));
|
2017-11-28 03:33:25 +00:00
|
|
|
assembly {
|
|
|
|
let outSize := returndatasize
|
|
|
|
let outDataPtr := mload(0x40) //load memory
|
|
|
|
returndatacopy(outDataPtr, 0, outSize) //copy last return into pointer
|
|
|
|
return(outDataPtr, outSize)
|
|
|
|
}
|
|
|
|
_; //never will execute local logic
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @dev defines the address for delegation of calls
|
|
|
|
*/
|
|
|
|
function _target()
|
|
|
|
internal
|
|
|
|
constant
|
|
|
|
returns(address);
|
|
|
|
|
|
|
|
}
|