// SPDX-License-Identifier: CC0
/*
/$$$$$$$$ /$$$$$$$ /$$$$$$$$ /$$$$$$$$ /$$ /$$$$$$
| $$_____/| $$__ $$| $$_____/| $$_____/ /$$$$ /$$__ $$
| $$ | $$ \ $$| $$ | $$ |_ $$ |__/ \ $$
| $$$$$ | $$$$$$$/| $$$$$ | $$$$$ | $$ /$$$$$/
| $$__/ | $$__ $$| $$__/ | $$__/ | $$ |___ $$
| $$ | $$ \ $$| $$ | $$ | $$ /$$ \ $$
| $$ | $$ | $$| $$$$$$$$| $$$$$$$$ /$$$$$$| $$$$$$/
|__/ |__/ |__/|________/|________/ |______/ \______/
/$$
| $$
| $$$$$$$ /$$ /$$
| $$__ $$| $$ | $$
| $$ \ $$| $$ | $$
| $$ | $$| $$ | $$
| $$$$$$$/| $$$$$$$
|_______/ \____ $$
/$$ | $$
| $$$$$$/
\______/
/$$$$$$ /$$$$$$$$ /$$$$$$$$ /$$ /$$ /$$$$$$ /$$$$$$$$ /$$$$$$$
/$$__ $$|__ $$__/| $$_____/| $$ | $$|_ $$_/| $$_____/| $$__ $$
| $$ \__/ | $$ | $$ | $$ | $$ | $$ | $$ | $$ \ $$
| $$$$$$ | $$ | $$$$$ | $$ / $$/ | $$ | $$$$$ | $$$$$$$/
\____ $$ | $$ | $$__/ \ $$ $$/ | $$ | $$__/ | $$____/
/$$ \ $$ | $$ | $$ \ $$$/ | $$ | $$ | $$
| $$$$$$/ | $$ | $$$$$$$$ \ $/ /$$$$$$| $$$$$$$$| $$
\______/ |__/ |________/ \_/ |______/|________/|__/
CC0 2022
*/
pragma solidity ^0.8.17;
interface IFree {
function mint(uint256 collectionId, address to) external;
function ownerOf(uint256 tokenId) external returns (address owner);
function tokenIdToCollectionId(uint256 tokenId) external returns (uint256 collectionId);
function appendAttributeToToken(uint256 tokenId, string memory attrKey, string memory attrValue) external;
}
contract Free13 {
IFree public immutable free;
uint256 public constant midnight_jan13_2023_utc = 1673568000;
mapping(uint256 => bool) public free0TokenIdUsed;
constructor(address freeAddr) {
free = IFree(freeAddr);
}
function claim(uint256 free0TokenId) public {
require(free.tokenIdToCollectionId(free0TokenId) == 0, 'Invalid Free0');
require(!free0TokenIdUsed[free0TokenId], 'This Free0 has already been used to mint a Free13');
require(free.ownerOf(free0TokenId) == msg.sender, 'You must be the owner of this Free0');
require(
block.timestamp > midnight_jan13_2023_utc &&
((block.timestamp - midnight_jan13_2023_utc) / 1 days) % 7 == 0,
'Can only be claimed on a Friday'
);
require(block.basefee <= 5 gwei, 'Base fee must be 5gwei or less');
free0TokenIdUsed[free0TokenId] = true;
free.appendAttributeToToken(free0TokenId, 'Used For Free13 Mint', 'true');
free.mint(13, msg.sender);
}
}
{
"compilationTarget": {
"Free13.sol": "Free13"
},
"evmVersion": "london",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": false,
"runs": 200
},
"remappings": []
}
[{"inputs":[{"internalType":"address","name":"freeAddr","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"free0TokenId","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"free","outputs":[{"internalType":"contract IFree","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"free0TokenIdUsed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"midnight_jan13_2023_utc","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]