Created
September 24, 2018 14:40
-
-
Save maurelian/6c6ee72b2d63efc5d17db5d07cc04a85 to your computer and use it in GitHub Desktop.
This file contains 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.24; | |
contract Delegator { | |
bytes32 controllerLookupName = 0xabba; | |
function() external payable { | |
// Do nothing if we haven't properly set up the delegator to delegate calls | |
// if (controllerLookupName == 0) { | |
// return; | |
// } | |
// Get the delegation target contract | |
// address _target = controller.lookup(controllerLookupName); | |
address _target = 0xacdc; | |
assembly { | |
//0x40 is the address where the next free memory slot is stored in Solidity | |
let _calldataMemoryOffset := mload(0x40) | |
// new "memory end" including padding. The bitwise operations here ensure we get rounded up to the nearest 32 byte boundary | |
let _size := and(add(calldatasize, 0x1f), not(0x1f)) | |
// Update the pointer at 0x40 to point at new free memory location so any theoretical allocation doesn't stomp our memory in this call | |
mstore(0x40, add(_calldataMemoryOffset, _size)) | |
// Copy method signature and parameters of this call into memory | |
calldatacopy(_calldataMemoryOffset, 0x0, calldatasize) | |
// Call the actual method via delegation | |
let _retval := delegatecall(gas, _target, _calldataMemoryOffset, calldatasize, 0, 0) | |
switch _retval | |
case 0 { | |
// 0 == it threw, so we revert | |
revert(0,0) | |
} default { | |
// If the call succeeded return the return data from the delegate call | |
let _returndataMemoryOffset := mload(0x40) | |
// Update the pointer at 0x40 again to point at new free memory location so any theoretical allocation doesn't stomp our memory in this call | |
mstore(0x40, add(_returndataMemoryOffset, returndatasize)) | |
returndatacopy(_returndataMemoryOffset, 0x0, returndatasize) | |
return(_returndataMemoryOffset, returndatasize) | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment