文件 1 的 9: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 的 9:ERC20.sol
pragma solidity ^0.8.0;
import "./IERC20.sol";
import "./extensions/IERC20Metadata.sol";
import "../../utils/Context.sol";
contract ERC20 is Context, IERC20, IERC20Metadata {
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
function name() public view virtual override returns (string memory) {
return _name;
}
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
function decimals() public view virtual override returns (uint8) {
return 18;
}
function totalSupply() public view virtual override returns (uint256) {
return _totalSupply;
}
function balanceOf(address account) public view virtual override returns (uint256) {
return _balances[account];
}
function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
_transfer(_msgSender(), recipient, amount);
return true;
}
function allowance(address owner, address spender) public view virtual override returns (uint256) {
return _allowances[owner][spender];
}
function approve(address spender, uint256 amount) public virtual override returns (bool) {
_approve(_msgSender(), spender, amount);
return true;
}
function transferFrom(
address sender,
address recipient,
uint256 amount
) public virtual override returns (bool) {
_transfer(sender, recipient, amount);
uint256 currentAllowance = _allowances[sender][_msgSender()];
require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
unchecked {
_approve(sender, _msgSender(), currentAllowance - amount);
}
return true;
}
function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
_approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);
return true;
}
function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
uint256 currentAllowance = _allowances[_msgSender()][spender];
require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
unchecked {
_approve(_msgSender(), spender, currentAllowance - subtractedValue);
}
return true;
}
function _transfer(
address sender,
address recipient,
uint256 amount
) internal virtual {
require(sender != address(0), "ERC20: transfer from the zero address");
require(recipient != address(0), "ERC20: transfer to the zero address");
_beforeTokenTransfer(sender, recipient, amount);
uint256 senderBalance = _balances[sender];
require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
unchecked {
_balances[sender] = senderBalance - amount;
}
_balances[recipient] += amount;
emit Transfer(sender, recipient, amount);
_afterTokenTransfer(sender, recipient, amount);
}
function _mint(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: mint to the zero address");
_beforeTokenTransfer(address(0), account, amount);
_totalSupply += amount;
_balances[account] += amount;
emit Transfer(address(0), account, amount);
_afterTokenTransfer(address(0), account, amount);
}
function _burn(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: burn from the zero address");
_beforeTokenTransfer(account, address(0), amount);
uint256 accountBalance = _balances[account];
require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
unchecked {
_balances[account] = accountBalance - amount;
}
_totalSupply -= amount;
emit Transfer(account, address(0), amount);
_afterTokenTransfer(account, address(0), amount);
}
function _approve(
address owner,
address spender,
uint256 amount
) internal virtual {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
function _beforeTokenTransfer(
address from,
address to,
uint256 amount
) internal virtual {}
function _afterTokenTransfer(
address from,
address to,
uint256 amount
) internal virtual {}
}
文件 3 的 9:IERC165.sol
pragma solidity ^0.8.0;
interface IERC165 {
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
文件 4 的 9:IERC20.sol
pragma solidity ^0.8.0;
interface IERC20 {
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address recipient, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(
address sender,
address recipient,
uint256 amount
) external returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
文件 5 的 9:IERC20Metadata.sol
pragma solidity ^0.8.0;
import "../IERC20.sol";
interface IERC20Metadata is IERC20 {
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function decimals() external view returns (uint8);
}
文件 6 的 9:IERC721.sol
pragma solidity ^0.8.0;
import "../../utils/introspection/IERC165.sol";
interface IERC721 is IERC165 {
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
function balanceOf(address owner) external view returns (uint256 balance);
function ownerOf(uint256 tokenId) external view returns (address owner);
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) external;
function transferFrom(
address from,
address to,
uint256 tokenId
) external;
function approve(address to, uint256 tokenId) external;
function getApproved(uint256 tokenId) external view returns (address operator);
function setApprovalForAll(address operator, bool _approved) external;
function isApprovedForAll(address owner, address operator) external view returns (bool);
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes calldata data
) external;
}
文件 7 的 9:IERC721Enumerable.sol
pragma solidity ^0.8.0;
import "../IERC721.sol";
interface IERC721Enumerable is IERC721 {
function totalSupply() external view returns (uint256);
function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);
function tokenByIndex(uint256 index) external view returns (uint256);
}
文件 8 的 9: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);
}
}
文件 9 的 9:StimmySwap.sol
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
contract STIMMY is ERC20, Ownable {
string token_name = "STIMMY";
string token_symbol = "STIMMY";
uint supply_initial = (100 * 10**12) * 10**decimals();
uint supply_burn = ( 99 * 10**12) * 10**decimals();
uint supply_official = ( 1 * 10**12) * 10**decimals();
uint supply_lp = (400 * 10**9) * 10**decimals();
uint supply_punks = (100 * 10**9) * 10**decimals();
uint supply_apes = (100 * 10**9) * 10**decimals();
uint supply_coolCats = (100 * 10**9) * 10**decimals();
uint supply_doodles = (100 * 10**9) * 10**decimals();
uint supply_beasts = (100 * 10**9) * 10**decimals();
uint supply_green = (100 * 10**9) * 10**decimals();
uint256 txn_max = ( 15 * 10**9) * 10**decimals();
uint reward_punks = supply_punks / 10000;
uint reward_apes = supply_apes / 10000;
uint reward_coolCats = supply_coolCats / 10000;
uint reward_doodles = supply_doodles / 10000;
uint reward_beasts = supply_beasts / 10000;
uint reward_green = supply_green / 10000;
uint claimed_official = 0;
uint claimed_lp = 0;
uint claimed_punks = 0;
uint claimed_apes = 0;
uint claimed_coolCats = 0;
uint claimed_doodles = 0;
uint claimed_beasts = 0;
uint claimed_green = 0;
mapping(uint256 => bool) public claimedByTokenId_punks;
mapping(uint256 => bool) public claimedByTokenId_apes;
mapping(uint256 => bool) public claimedByTokenId_coolCats;
mapping(uint256 => bool) public claimedByTokenId_doodles;
mapping(uint256 => bool) public claimedByTokenId_beasts;
mapping(uint256 => bool) public claimedBySlotId_green;
address contract_punks = address(0xb47e3cd837dDF8e4c57F05d70Ab865de6e193BBB);
address contract_apes = address(0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D);
address contract_coolCats = address(0x1A92f7381B9F03921564a437210bB9396471050C);
address contract_doodles = address(0x8a90CAb2b38dba80c64b7734e58Ee1dB38B8992e);
address contract_beasts = address(0xA74E199990FF572A320508547Ab7f44EA51e6F28);
address address_uniswap = address(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
using ECDSA for bytes32;
constructor() ERC20(token_name, token_symbol) {
_mint(address(this), supply_initial);
_burn(address(this), supply_burn);
_safeTransfer_lp(supply_lp);
}
function claim_punks(uint[] memory nfts) public {
address user = msg.sender;
CryptoPunks _contract = CryptoPunks(contract_punks);
uint owned = nfts.length;
uint rewards = 0;
for (uint256 i = 0; i < owned; ++i) {
uint256 nft = nfts[i];
if(_contract.punkIndexToAddress(nft) == user && !claimedByTokenId_punks[nft]){
rewards++;
claimedByTokenId_punks[nft] = true;
}
}
_safeTransfer_punks(reward_punks * rewards);
}
function claim_apes() public {
address user = msg.sender;
IERC721Enumerable _contract = IERC721Enumerable(contract_apes);
uint owned = _contract.balanceOf(user);
uint rewards = 0;
for (uint256 i = 0; i < owned; ++i) {
uint nft = _contract.tokenOfOwnerByIndex(user, i);
if(!claimedByTokenId_apes[nft]){
rewards++;
claimedByTokenId_apes[nft] = true;
}
}
_safeTransfer_apes(reward_apes * rewards);
}
function claim_coolCats() public {
address user = msg.sender;
IERC721Enumerable _contract = IERC721Enumerable(contract_coolCats);
uint owned = _contract.balanceOf(user);
uint rewards = 0;
for (uint256 i = 0; i < owned; ++i) {
uint nft = _contract.tokenOfOwnerByIndex(user, i);
if (!claimedByTokenId_coolCats[nft]){
rewards++;
claimedByTokenId_coolCats[nft] = true;
}
claimedByTokenId_coolCats[nft] = true;
}
_safeTransfer_coolCats(reward_coolCats * rewards);
}
function claim_doodles() public {
address user = msg.sender;
IERC721Enumerable _contract = IERC721Enumerable(contract_doodles);
uint owned = _contract.balanceOf(user);
uint rewards = 0;
for (uint256 i = 0; i < owned; ++i) {
uint nft = _contract.tokenOfOwnerByIndex(user, i);
if (!claimedByTokenId_doodles[nft]){
rewards++;
claimedByTokenId_doodles[nft] = true;
}
}
_safeTransfer_doodles(reward_doodles * rewards);
}
function claim_beasts() public {
address user = msg.sender;
IERC721Enumerable _contract = IERC721Enumerable(contract_beasts);
uint owned = _contract.balanceOf(user);
uint rewards = 0;
for (uint256 i = 0; i < owned; ++i) {
uint nft = _contract.tokenOfOwnerByIndex(user, i);
if (!claimedByTokenId_beasts[nft]){
rewards++;
claimedByTokenId_beasts[nft] = true;
}
}
_safeTransfer_beasts(reward_beasts * rewards);
}
function claim_green(uint slotId, bytes memory sig) public {
require(_verifySignature(slotId, sig), "Invalid signature.");
require(slotId >= 0 && slotId <= 9999, "Invalid slot number.");
require(!claimedBySlotId_green[slotId], "Slot already claimed.");
claimedBySlotId_green[slotId] = true;
_safeTransfer_green(reward_green);
}
function _expire_green() public onlyOwner {
uint remaining_green = supply_green - claimed_green;
_safeTransfer_green(remaining_green);
}
function _verifySignature(uint256 slotId, bytes memory sig) internal view returns (bool) {
bytes32 message = keccak256(abi.encodePacked(slotId, msg.sender)).toHash();
address signer = message.recover(sig);
return signer == owner();
}
function claim_1() public{
claim_apes();
claim_coolCats();
claim_doodles();
claim_beasts();
}
function claim_2(uint[] memory punks) public{
claim_punks(punks);
claim_apes();
claim_coolCats();
claim_doodles();
claim_beasts();
}
function claim_3(uint256 slotId, bytes memory sig) public{
claim_apes();
claim_coolCats();
claim_doodles();
claim_beasts();
claim_green(slotId, sig);
}
function claim_4(uint[] memory punks, uint256 slotId, bytes memory sig) public{
claim_punks(punks);
claim_apes();
claim_coolCats();
claim_doodles();
claim_beasts();
claim_green(slotId, sig);
}
function _safeTransfer_punks(uint amount) internal {
claimed_punks += amount;
require(supply_punks >= claimed_punks, "CryptoPunks fund fully claimed.");
_safeTransfer(amount);
}
function _safeTransfer_apes(uint amount) internal {
claimed_apes += amount;
require(supply_apes >= claimed_apes, "Apes fund fully claimed.");
_safeTransfer(amount);
}
function _safeTransfer_coolCats(uint amount) internal {
claimed_coolCats += amount;
require(supply_coolCats >= claimed_coolCats, "Cool Cats fund fully claimed.");
_safeTransfer(amount);
}
function _safeTransfer_doodles(uint amount) internal {
claimed_doodles += amount;
require(supply_doodles >= claimed_doodles, "Doodles fund fully claimed.");
_safeTransfer(amount);
}
function _safeTransfer_beasts(uint amount) internal {
claimed_beasts += amount;
require(supply_beasts >= claimed_beasts, "CryptoBeasts fund fully claimed.");
_safeTransfer(amount);
}
function _safeTransfer_green(uint amount) internal {
claimed_green += amount;
require(supply_green >= claimed_green, "Green fund fully claimed.");
_safeTransfer(amount);
}
function _safeTransfer_lp(uint amount) internal {
claimed_lp += amount;
require(supply_lp >= claimed_lp, "LP fund fully claimed.");
_safeTransfer(amount);
}
function _safeTransfer(uint amount) internal {
claimed_official += amount;
require(supply_official >= claimed_official, "Official fund fully claimed.");
_transfer(address(this), msg.sender, amount);
}
function _beforeTokenTransfer(address from, address to, uint256 amount) internal override virtual {
if(from != owner() && to != owner() && from != address(this) && to != address(this) && from != address_uniswap && to != address_uniswap)
require(amount <= txn_max, "Transfer amount exceeds the maximum transaction amount.");
}
function _setTxnMax(uint _txn_max) public onlyOwner {
txn_max = _txn_max;
}
}
library ECDSA {
function recover(bytes32 hash, bytes memory sig) internal pure returns (address) {
uint8 v;
bytes32 r;
bytes32 s;
assembly {
r := mload(add(sig, 32))
s := mload(add(sig, 64))
v := byte(0, mload(add(sig, 96)))
}
return ecrecover(hash, v, r, s);
}
function toHash(bytes32 hash) internal pure returns (bytes32) {
return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
}
}
interface CryptoPunks {
function punkIndexToAddress(uint index) external view returns(address);
}
{
"compilationTarget": {
"contracts/StimmySwap.sol": "STIMMY"
},
"evmVersion": "london",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": false,
"runs": 200
},
"remappings": []
}
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"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":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_expire_green","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_txn_max","type":"uint256"}],"name":"_setTxnMax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim_1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"punks","type":"uint256[]"}],"name":"claim_2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"slotId","type":"uint256"},{"internalType":"bytes","name":"sig","type":"bytes"}],"name":"claim_3","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"punks","type":"uint256[]"},{"internalType":"uint256","name":"slotId","type":"uint256"},{"internalType":"bytes","name":"sig","type":"bytes"}],"name":"claim_4","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claim_apes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claim_beasts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claim_coolCats","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claim_doodles","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"slotId","type":"uint256"},{"internalType":"bytes","name":"sig","type":"bytes"}],"name":"claim_green","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"nfts","type":"uint256[]"}],"name":"claim_punks","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"claimedBySlotId_green","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"claimedByTokenId_apes","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"claimedByTokenId_beasts","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"claimedByTokenId_coolCats","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"claimedByTokenId_doodles","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"claimedByTokenId_punks","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]