文件 1 的 4:Allowlist.sol
pragma solidity ^0.8.3;
import "@openzeppelin/contracts/access/Ownable.sol";
import "./interfaces/IAllowlist.sol";
contract Allowlist is IAllowlist, Ownable {
mapping(address => bool) public override allowlist;
uint256 public override remainingSeats = 2500;
uint256 public override deadline = 1642248000;
function addAddressToAllowlist(address _addr) external override {
require(block.timestamp <= deadline, "RetroPhonesAllowlist: Allowlist already closed");
require(remainingSeats > 0, "RetroPhonesAllowlist: Allowlist is full");
require(!allowlist[_addr], "RetroPhonesAllowlist: Already on the list");
remainingSeats--;
allowlist[_addr] = true;
}
function removeSelfFromAllowlist() external override {
require(allowlist[msg.sender], "RetroPhonesAllowlist: Not on the list");
remainingSeats++;
allowlist[msg.sender] = false;
}
function addSeats(uint256 _seatsToAdd) external override onlyOwner {
remainingSeats = remainingSeats + _seatsToAdd;
}
function reduceSeats(uint256 _seatsToSubstract) external override onlyOwner {
remainingSeats = remainingSeats - _seatsToSubstract;
}
function setDeadline(uint256 _newDeadline) external override onlyOwner {
deadline = _newDeadline;
}
function addAddressesToAllowlist(address[] calldata _addrs) external override onlyOwner {
require(block.timestamp <= deadline, "RetroPhonesAllowlist: Allowlist already closed");
require(remainingSeats >= _addrs.length, "RetroPhonesAllowlist: Allowlist is full");
for (uint256 i = 0; i < _addrs.length; i++) {
if (!allowlist[_addrs[i]]) {
remainingSeats--;
allowlist[_addrs[i]] = true;
}
}
}
}
文件 2 的 4: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;
}
}
文件 3 的 4:IAllowlist.sol
pragma solidity ^0.8.3;
interface IAllowlist {
function allowlist(address) external returns (bool);
function remainingSeats() external returns (uint256);
function deadline() external returns (uint256);
function addAddressToAllowlist(address _addr) external;
function removeSelfFromAllowlist() external;
function addSeats(uint256 _seatsToAdd) external;
function reduceSeats(uint256 _seatsToSubstract) external;
function setDeadline(uint256 _newDeadline) external;
function addAddressesToAllowlist(address[] calldata _addrs) external;
}
文件 4 的 4: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() {
_setOwner(_msgSender());
}
function owner() public view virtual returns (address) {
return _owner;
}
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
function renounceOwnership() public virtual onlyOwner {
_setOwner(address(0));
}
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_setOwner(newOwner);
}
function _setOwner(address newOwner) private {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
{
"compilationTarget": {
"contracts/Allowlist.sol": "Allowlist"
},
"evmVersion": "istanbul",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 1000
},
"remappings": []
}
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"addAddressToAllowlist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addrs","type":"address[]"}],"name":"addAddressesToAllowlist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_seatsToAdd","type":"uint256"}],"name":"addSeats","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"allowlist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deadline","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_seatsToSubstract","type":"uint256"}],"name":"reduceSeats","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"remainingSeats","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeSelfFromAllowlist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newDeadline","type":"uint256"}],"name":"setDeadline","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]