mirror of
https://github.com/lens-protocol/core.git
synced 2026-04-22 03:02:03 -04:00
45 lines
2.8 KiB
Solidity
45 lines
2.8 KiB
Solidity
// SPDX-License-Identifier: MIT
|
|
pragma solidity >=0.6.0 <0.9.0;
|
|
|
|
import "./console.sol";
|
|
import "./console2.sol";
|
|
import "./StdJson.sol";
|
|
|
|
abstract contract Script {
|
|
bool public IS_SCRIPT = true;
|
|
address constant private VM_ADDRESS =
|
|
address(bytes20(uint160(uint256(keccak256('hevm cheat code')))));
|
|
|
|
Vm public constant vm = Vm(VM_ADDRESS);
|
|
|
|
/// @dev Compute the address a contract will be deployed at for a given deployer address and nonce
|
|
/// @notice adapated from Solmate implementation (https://github.com/transmissions11/solmate/blob/main/src/utils/LibRLP.sol)
|
|
function computeCreateAddress(address deployer, uint256 nonce) internal pure returns (address) {
|
|
// The integer zero is treated as an empty byte string, and as a result it only has a length prefix, 0x80, computed via 0x80 + 0.
|
|
// A one byte integer uses its own value as its length prefix, there is no additional "0x80 + length" prefix that comes before it.
|
|
if (nonce == 0x00) return addressFromLast20Bytes(keccak256(abi.encodePacked(bytes1(0xd6), bytes1(0x94), deployer, bytes1(0x80))));
|
|
if (nonce <= 0x7f) return addressFromLast20Bytes(keccak256(abi.encodePacked(bytes1(0xd6), bytes1(0x94), deployer, uint8(nonce))));
|
|
|
|
// Nonces greater than 1 byte all follow a consistent encoding scheme, where each value is preceded by a prefix of 0x80 + length.
|
|
if (nonce <= 2**8 - 1) return addressFromLast20Bytes(keccak256(abi.encodePacked(bytes1(0xd7), bytes1(0x94), deployer, bytes1(0x81), uint8(nonce))));
|
|
if (nonce <= 2**16 - 1) return addressFromLast20Bytes(keccak256(abi.encodePacked(bytes1(0xd8), bytes1(0x94), deployer, bytes1(0x82), uint16(nonce))));
|
|
if (nonce <= 2**24 - 1) return addressFromLast20Bytes(keccak256(abi.encodePacked(bytes1(0xd9), bytes1(0x94), deployer, bytes1(0x83), uint24(nonce))));
|
|
|
|
// More details about RLP encoding can be found here: https://eth.wiki/fundamentals/rlp
|
|
// 0xda = 0xc0 (short RLP prefix) + 0x16 (length of: 0x94 ++ proxy ++ 0x84 ++ nonce)
|
|
// 0x94 = 0x80 + 0x14 (0x14 = the length of an address, 20 bytes, in hex)
|
|
// 0x84 = 0x80 + 0x04 (0x04 = the bytes length of the nonce, 4 bytes, in hex)
|
|
// We assume nobody can have a nonce large enough to require more than 32 bytes.
|
|
return addressFromLast20Bytes(keccak256(abi.encodePacked(bytes1(0xda), bytes1(0x94), deployer, bytes1(0x84), uint32(nonce))));
|
|
}
|
|
|
|
function addressFromLast20Bytes(bytes32 bytesValue) internal pure returns (address) {
|
|
return address(uint160(uint256(bytesValue)));
|
|
}
|
|
|
|
function deriveRememberKey(string memory mnemonic, uint32 index) internal returns (address who, uint256 privateKey) {
|
|
privateKey = vm.deriveKey(mnemonic, index);
|
|
who = vm.rememberKey(privateKey);
|
|
}
|
|
}
|