编译器
0.8.23+commit.f704f362
文件 1 的 8:Context.sol
pragma solidity ^0.8.0;
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
文件 2 的 8:EFPListMinter.sol
pragma solidity ^0.8.23;
import {Ownable} from 'lib/openzeppelin-contracts/contracts/access/Ownable.sol';
import {Pausable} from 'lib/openzeppelin-contracts/contracts/security/Pausable.sol';
import {IEFPAccountMetadata} from './interfaces/IEFPAccountMetadata.sol';
import {IEFPListRegistry} from './interfaces/IEFPListRegistry.sol';
import {IEFPListRecords} from './interfaces/IEFPListRecords.sol';
import {ENSReverseClaimer} from './lib/ENSReverseClaimer.sol';
interface IEFPListRegistry_ERC721 is IEFPListRegistry {
function ownerOf(uint256 tokenId) external view returns (address);
function totalSupply() external view returns (uint256);
}
contract EFPListMinter is ENSReverseClaimer, Pausable {
IEFPListRegistry_ERC721 public registry;
IEFPAccountMetadata public accountMetadata;
IEFPListRecords public listRecordsL1;
constructor(address _registryAddress, address _accountMetadataAddress, address _listRecordsL1) {
registry = IEFPListRegistry_ERC721(_registryAddress);
accountMetadata = IEFPAccountMetadata(_accountMetadataAddress);
listRecordsL1 = IEFPListRecords(_listRecordsL1);
}
function pause() public onlyOwner {
_pause();
}
function unpause() public onlyOwner {
_unpause();
}
function decodeL1ListStorageLocation(bytes calldata listStorageLocation) internal pure returns (uint256, address) {
require(listStorageLocation.length == 1 + 1 + 32 + 20 + 32, 'EFPListMinter: invalid list storage location');
require(listStorageLocation[0] == 0x01, 'EFPListMinter: invalid list storage location version');
require(listStorageLocation[1] == 0x01, 'EFPListMinter: invalid list storage location type');
address contractAddress = _bytesToAddress(listStorageLocation, 34);
uint256 slot = _bytesToUint(listStorageLocation, 54);
return (slot, contractAddress);
}
function easyMint(bytes calldata listStorageLocation) public payable whenNotPaused {
(uint256 slot, address recordsContract) = decodeL1ListStorageLocation(listStorageLocation);
uint256 tokenId = registry.totalSupply();
registry.mintTo{value: msg.value}(msg.sender, listStorageLocation);
_setDefaultListForAccount(msg.sender, tokenId);
if (recordsContract == address(listRecordsL1)) {
listRecordsL1.setListUser(slot, msg.sender);
listRecordsL1.setListManager(slot, msg.sender);
}
}
function easyMintTo(address to, bytes calldata listStorageLocation) public payable whenNotPaused {
(uint256 slot, address recordsContract) = decodeL1ListStorageLocation(listStorageLocation);
uint256 tokenId = registry.totalSupply();
registry.mintTo{value: msg.value}(to, listStorageLocation);
_setDefaultListForAccount(msg.sender, tokenId);
if (recordsContract == address(listRecordsL1)) {
listRecordsL1.setListUser(slot, msg.sender);
listRecordsL1.setListManager(slot, msg.sender);
}
}
function mintPrimaryListNoMeta(bytes calldata listStorageLocation) public payable whenNotPaused {
decodeL1ListStorageLocation(listStorageLocation);
uint256 tokenId = registry.totalSupply();
_setDefaultListForAccount(msg.sender, tokenId);
registry.mintTo{value: msg.value}(msg.sender, listStorageLocation);
}
function mintNoMeta(bytes calldata listStorageLocation) public payable whenNotPaused {
decodeL1ListStorageLocation(listStorageLocation);
registry.mintTo{value: msg.value}(msg.sender, listStorageLocation);
}
function mintToNoMeta(address to, bytes calldata listStorageLocation) public payable whenNotPaused {
decodeL1ListStorageLocation(listStorageLocation);
registry.mintTo{value: msg.value}(to, listStorageLocation);
}
function _setDefaultListForAccount(address to, uint256 tokenId) internal {
accountMetadata.setValueForAddress(to, 'primary-list', abi.encodePacked(tokenId));
}
function _getChainId() internal view returns (uint256) {
uint256 id;
assembly {
id := chainid()
}
return id;
}
function _bytesToUint(bytes memory data, uint256 offset) internal pure returns (uint256) {
require(data.length >= offset + 32, 'Data too short');
uint256 value;
assembly {
value := mload(add(data, add(32, offset)))
}
return value;
}
function _bytesToAddress(bytes memory data, uint256 offset) internal pure returns (address addr) {
require(data.length >= offset + 20, 'Data too short');
assembly {
addr := mload(add(add(data, 20), offset))
addr := and(addr, 0x000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)
}
return addr;
}
}
文件 3 的 8:ENSReverseClaimer.sol
pragma solidity ^0.8.23;
import {Ownable} from 'lib/openzeppelin-contracts/contracts/access/Ownable.sol';
interface ENS {
function owner(bytes32 node) external view returns (address);
}
interface IReverseRegistrar {
function claim(address owner) external returns (bytes32);
function setName(string memory name) external returns (bytes32);
}
abstract contract ENSReverseClaimer is Ownable {
bytes32 constant ADDR_REVERSE_NODE = 0x91d1777781884d03a6757a803996e38de2a42967fb37eeaca72729271025a9e2;
function claimReverseENS(ENS ens, address claimant) external onlyOwner returns (bytes32) {
return IReverseRegistrar(ens.owner(ADDR_REVERSE_NODE)).claim(claimant);
}
function setReverseENS(ENS ens, string calldata name) external onlyOwner returns (bytes32) {
return IReverseRegistrar(ens.owner(ADDR_REVERSE_NODE)).setName(name);
}
}
文件 4 的 8:IEFPAccountMetadata.sol
pragma solidity ^0.8.23;
interface IEFPAccountMetadata {
function addProxy(address proxy) external;
function removeProxy(address proxy) external;
function isProxy(address proxy) external view returns (bool);
event UpdateAccountMetadata(address indexed addr, string key, bytes value);
struct KeyValue {
string key;
bytes value;
}
function getValue(address addr, string calldata key) external view returns (bytes memory);
function setValue(string calldata key, bytes calldata value) external;
function setValueForAddress(address addr, string calldata key, bytes calldata value) external;
function setValues(KeyValue[] calldata records) external;
function setValuesForAddress(address addr, KeyValue[] calldata records) external;
}
文件 5 的 8:IEFPListRecords.sol
pragma solidity ^0.8.23;
interface IEFPListMetadata {
event UpdateListMetadata(uint256 indexed slot, string key, bytes value);
struct KeyValue {
string key;
bytes value;
}
function getMetadataValue(uint256 slot, string calldata key) external view returns (bytes memory);
function getMetadataValues(uint256 slot, string[] calldata keys) external view returns (bytes[] memory);
function setMetadataValue(uint256 slot, string calldata key, bytes calldata value) external;
function setMetadataValues(uint256 slot, KeyValue[] calldata records) external;
function claimListManager(uint256 slot) external;
function claimListManagerForAddress(uint256 slot, address manager) external;
function getListManager(uint256 slot) external view returns (address);
function setListManager(uint256 slot, address manager) external;
function getListUser(uint256 slot) external view returns (address);
function setListUser(uint256 slot, address user) external;
}
interface IEFPListRecords is IEFPListMetadata {
event ListOp(uint256 indexed slot, bytes op);
function getListOpCount(uint256 slot) external view returns (uint256);
function getListOp(uint256 slot, uint256 index) external view returns (bytes memory);
function getListOpsInRange(uint256 slot, uint256 start, uint256 end) external view returns (bytes[] memory);
function getAllListOps(uint256 slot) external view returns (bytes[] memory);
function applyListOp(uint256 slot, bytes calldata op) external;
function applyListOps(uint256 slot, bytes[] calldata ops) external;
function setMetadataValuesAndApplyListOps(uint256 slot, KeyValue[] calldata records, bytes[] calldata ops) external;
}
文件 6 的 8:IEFPListRegistry.sol
pragma solidity ^0.8.23;
interface IEFPListRegistry {
enum MintState {
Disabled,
OwnerOnly,
PublicMint,
PublicBatch
}
event UpdateListStorageLocation(uint256 indexed tokenId, bytes listStorageLocation);
function getListStorageLocation(uint256 tokenId) external view returns (bytes memory);
function setListStorageLocation(uint256 tokenId, bytes calldata listStorageLocation) external;
function getMintState() external view returns (MintState);
function setMintState(MintState _mintState) external;
function getMaxMintBatchSize() external view returns (uint256);
function setMaxMintBatchSize(uint256 _maxMintBatchSize) external;
function mint(bytes calldata listStorageLocation) external payable;
function mintTo(address recipient, bytes calldata listStorageLocation) external payable;
function mintBatch(uint256 quantity) external payable;
function mintBatchTo(address recipient, uint256 quantity) external payable;
}
文件 7 的 8:Ownable.sol
pragma solidity ^0.8.0;
import "../utils/Context.sol";
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor() {
_transferOwnership(_msgSender());
}
modifier onlyOwner() {
_checkOwner();
_;
}
function owner() public view virtual returns (address) {
return _owner;
}
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
文件 8 的 8:Pausable.sol
pragma solidity ^0.8.0;
import "../utils/Context.sol";
abstract contract Pausable is Context {
event Paused(address account);
event Unpaused(address account);
bool private _paused;
constructor() {
_paused = false;
}
modifier whenNotPaused() {
_requireNotPaused();
_;
}
modifier whenPaused() {
_requirePaused();
_;
}
function paused() public view virtual returns (bool) {
return _paused;
}
function _requireNotPaused() internal view virtual {
require(!paused(), "Pausable: paused");
}
function _requirePaused() internal view virtual {
require(paused(), "Pausable: not paused");
}
function _pause() internal virtual whenNotPaused {
_paused = true;
emit Paused(_msgSender());
}
function _unpause() internal virtual whenPaused {
_paused = false;
emit Unpaused(_msgSender());
}
}
{
"compilationTarget": {
"src/EFPListMinter.sol": "EFPListMinter"
},
"evmVersion": "paris",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": [
":ERC721A/=lib/ERC721A/contracts/",
":ds-test/=lib/forge-std/lib/ds-test/src/",
":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
":forge-std/=lib/forge-std/src/",
":openzeppelin-contracts/=lib/openzeppelin-contracts/",
":openzeppelin/=lib/openzeppelin-contracts/contracts/"
]
}
[{"inputs":[{"internalType":"address","name":"_registryAddress","type":"address"},{"internalType":"address","name":"_accountMetadataAddress","type":"address"},{"internalType":"address","name":"_listRecordsL1","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"accountMetadata","outputs":[{"internalType":"contract IEFPAccountMetadata","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract ENS","name":"ens","type":"address"},{"internalType":"address","name":"claimant","type":"address"}],"name":"claimReverseENS","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"listStorageLocation","type":"bytes"}],"name":"easyMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"bytes","name":"listStorageLocation","type":"bytes"}],"name":"easyMintTo","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"listRecordsL1","outputs":[{"internalType":"contract IEFPListRecords","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"listStorageLocation","type":"bytes"}],"name":"mintNoMeta","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes","name":"listStorageLocation","type":"bytes"}],"name":"mintPrimaryListNoMeta","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"bytes","name":"listStorageLocation","type":"bytes"}],"name":"mintToNoMeta","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"registry","outputs":[{"internalType":"contract IEFPListRegistry_ERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ENS","name":"ens","type":"address"},{"internalType":"string","name":"name","type":"string"}],"name":"setReverseENS","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]