2018-05-13 05:47:51 +00:00
|
|
|
pragma solidity ^0.4.23;
|
2017-11-28 03:33:25 +00:00
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @title DelegatedCall
|
|
|
|
* @author Ricardo Guilherme Schmidt (Status Research & Development GmbH)
|
2018-03-11 15:11:42 +00:00
|
|
|
* @dev Abstract contract that delegates calls by `delegated` modifier to result of `targetDelegatedCall()`
|
|
|
|
* Important to avoid overwriting wrong storage pointers is that never define storage to this contract
|
2017-11-28 03:33:25 +00:00
|
|
|
*/
|
|
|
|
contract DelegatedCall {
|
2018-05-13 05:47:51 +00:00
|
|
|
|
|
|
|
constructor() internal {
|
|
|
|
|
|
|
|
}
|
2017-11-28 03:33:25 +00:00
|
|
|
/**
|
|
|
|
* @dev delegates the call of this function
|
|
|
|
*/
|
|
|
|
modifier delegated {
|
2017-12-01 06:45:26 +00:00
|
|
|
//require successfull delegate call to remote `_target()`
|
2018-03-11 15:11:42 +00:00
|
|
|
require(targetDelegatedCall().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)
|
|
|
|
}
|
2018-03-11 15:11:42 +00:00
|
|
|
assert(false); //should never reach here
|
2017-11-28 03:33:25 +00:00
|
|
|
_; //never will execute local logic
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @dev defines the address for delegation of calls
|
|
|
|
*/
|
2018-03-11 15:11:42 +00:00
|
|
|
function targetDelegatedCall()
|
2017-11-28 03:33:25 +00:00
|
|
|
internal
|
2018-03-30 05:31:08 +00:00
|
|
|
view
|
2017-11-28 03:33:25 +00:00
|
|
|
returns(address);
|
|
|
|
|
|
|
|
}
|