Created
October 31, 2020 03:30
-
-
Save aodhgan/4d9e2eabf213462daae7d8281e02a9ff 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
function makeChild() internal returns (address addr) { | |
assembly { | |
// EVM assembler of runtime portion of child contract: | |
// ;; Pseudocode: if (msg.sender != 0x0000000000b3f879cb30fe243b4dfee438691c04) { throw; } | |
// ;; selfdestruct(msg.sender) | |
// PUSH15 0xb3f879cb30fe243b4dfee438691c04 ;; hardcoded address of this contract | |
// CALLER | |
// XOR | |
// PC | |
// JUMPI | |
// CALLER | |
// SELFDESTRUCT | |
// Or in binary: 6eb3f879cb30fe243b4dfee438691c043318585733ff | |
// Since the binary is so short (22 bytes), we can get away | |
// with a very simple initcode: | |
// PUSH22 0x6eb3f879cb30fe243b4dfee438691c043318585733ff | |
// PUSH1 0 | |
// MSTORE ;; at this point, memory locations mem[10] through | |
// ;; mem[31] contain the runtime portion of the child | |
// ;; contract. all that's left to do is to RETURN this | |
// ;; chunk of memory. | |
// PUSH1 22 ;; length | |
// PUSH1 10 ;; offset | |
// RETURN | |
// Or in binary: 756eb3f879cb30fe243b4dfee438691c043318585733ff6000526016600af3 | |
// Almost done! All we have to do is put this short (31 bytes) blob into | |
// memory and call CREATE with the appropriate offsets. | |
let solidity_free_mem_ptr := mload(0x40) | |
mstore(solidity_free_mem_ptr, 0x00756eb3f879cb30fe243b4dfee438691c043318585733ff6000526016600af3) | |
addr := create(0, add(solidity_free_mem_ptr, 1), 31) | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment