mirror of
				https://github.com/ethereum/solidity
				synced 2023-10-03 13:03:40 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			40 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Solidity
		
	
	
	
	
	
			
		
		
	
	
			40 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Solidity
		
	
	
	
	
	
| contract C {
 | |
|     function addr() external returns (address) {
 | |
|         return address(this);
 | |
|     }
 | |
| 
 | |
|     function testRunner() external returns (address a1, address a2) {
 | |
|         assembly {
 | |
|             // This is `return(0, 1)`. We are using a simplified/fixed initcode to avoid
 | |
|             // instability due to metadata changes.
 | |
|             let initcode := hex"60016000f3"
 | |
|             mstore(0, initcode)
 | |
| 
 | |
|             a1 := create(0, 0, 5)
 | |
|             a2 := create2(0, 0, 5, address())
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     function testCalc() external returns (address a1, address a2) {
 | |
|         a1 = calculateCreate(address(this), 1);
 | |
|         a2 = calculateCreate2(address(this), keccak256(hex"60016000f3"), bytes32(uint256(uint160(address(this)))));
 | |
|     }
 | |
| 
 | |
|     function calculateCreate(address from, uint256 nonce) private pure returns (address) {
 | |
|         assert(nonce <= 127);
 | |
|         bytes memory data =
 | |
|             bytes.concat(hex"d694", bytes20(uint160(from)), nonce == 0 ? bytes1(hex"80") : bytes1(uint8(nonce)));
 | |
|         return address(uint160(uint256(keccak256(data)))); // Take the lower 160-bits
 | |
|     }
 | |
| 
 | |
|     function calculateCreate2(address creator, bytes32 codehash, bytes32 salt) private pure returns (address) {
 | |
|         return address(uint160(uint256(keccak256(abi.encodePacked(bytes1(0xff), creator, salt, codehash)))));
 | |
|     }
 | |
| }
 | |
| // ====
 | |
| // EVMVersion: >=constantinople
 | |
| // ----
 | |
| // addr() -> 0xc06afe3a8444fc0004668591e8306bfb9968e79e
 | |
| // testRunner() -> 0x137aa4dfc0911524504fcd4d98501f179bc13b4a, 0x2c1c30623ddd93e0b765a6caaca0c859eeb0644d
 | |
| // testCalc() -> 0x137aa4dfc0911524504fcd4d98501f179bc13b4a, 0x2c1c30623ddd93e0b765a6caaca0c859eeb0644d
 |