pragma solidity 0.5.17;
contract GAMMA { // Γ - mv - NFT - mkt - γ
address payable public dao = 0x057e820D740D5AAaFfa3c6De08C5c98d990dB00d;
uint256 public constant GAMMA_MAX = 5772156649015328606065120900824024310421;
uint256 public totalSupply;
string public name = "GAMMA";
string public symbol = "GAMMA";
mapping(address => uint256) public balanceOf;
mapping(uint256 => address) public getApproved;
mapping(uint256 => address) public ownerOf;
mapping(uint256 => uint256) public tokenByIndex;
mapping(uint256 => string) public tokenURI;
mapping(uint256 => Sale) public sale;
mapping(bytes4 => bool) public supportsInterface; // eip-165
mapping(address => mapping(address => bool)) public isApprovedForAll;
mapping(address => mapping(uint256 => uint256)) public tokenOfOwnerByIndex;
event Approval(address indexed approver, address indexed spender, uint256 indexed tokenId);
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
event UpdateSale(uint256 indexed ethPrice, uint256 indexed tokenId, bool forSale);
struct Sale {
uint256 ethPrice;
bool forSale;
}
constructor () public {
supportsInterface[0x80ac58cd] = true; // ERC721
supportsInterface[0x5b5e139f] = true; // METADATA
supportsInterface[0x780e9d63] = true; // ENUMERABLE
}
function approve(address spender, uint256 tokenId) external {
require(msg.sender == ownerOf[tokenId] || isApprovedForAll[ownerOf[tokenId]][msg.sender], "!owner/operator");
getApproved[tokenId] = spender;
emit Approval(msg.sender, spender, tokenId);
}
function mint(uint256 ethPrice, string calldata _tokenURI, bool forSale) external {
totalSupply++;
require(totalSupply <= GAMMA_MAX, "maxed");
uint256 tokenId = totalSupply;
balanceOf[msg.sender]++;
ownerOf[tokenId] = msg.sender;
tokenByIndex[tokenId - 1] = tokenId;
tokenURI[tokenId] = _tokenURI;
sale[tokenId].ethPrice = ethPrice;
sale[tokenId].forSale = forSale;
tokenOfOwnerByIndex[msg.sender][tokenId - 1] = tokenId;
emit Transfer(address(0), msg.sender, tokenId);
emit UpdateSale(ethPrice, tokenId, forSale);
}
function purchase(uint256 tokenId) payable external {
require(msg.value == sale[tokenId].ethPrice, "!ethPrice");
require(sale[tokenId].forSale, "!forSale");
address owner = ownerOf[tokenId];
(bool success, ) = owner.call.value(msg.value)("");
require(success, "!transfer");
_transfer(owner, msg.sender, tokenId);
}
function setApprovalForAll(address operator, bool approved) external {
isApprovedForAll[msg.sender][operator] = approved;
emit ApprovalForAll(msg.sender, operator, approved);
}
function _transfer(address from, address to, uint256 tokenId) internal {
balanceOf[from]--;
balanceOf[to]++;
getApproved[tokenId] = address(0);
ownerOf[tokenId] = to;
sale[tokenId].forSale = false;
tokenOfOwnerByIndex[from][tokenId - 1] = 0;
tokenOfOwnerByIndex[to][tokenId - 1] = tokenId;
emit Transfer(from, to, tokenId);
}
function transfer(address to, uint256 tokenId) external {
require(msg.sender == ownerOf[tokenId], "!owner");
_transfer(msg.sender, to, tokenId);
}
function transferBatch(address[] calldata to, uint256[] calldata tokenId) external {
require(to.length == tokenId.length, "!to/tokenId");
for (uint256 i = 0; i < to.length; i++) {
require(msg.sender == ownerOf[tokenId[i]], "!owner");
_transfer(msg.sender, to[i], tokenId[i]);
}
}
function transferFrom(address from, address to, uint256 tokenId) external {
require(msg.sender == ownerOf[tokenId] || getApproved[tokenId] == msg.sender || isApprovedForAll[ownerOf[tokenId]][msg.sender], "!owner/spender/operator");
_transfer(from, to, tokenId);
}
function updateDao(address payable _dao) external {
require(msg.sender == dao, "!dao");
dao = _dao;
}
function updateSale(uint256 ethPrice, uint256 tokenId, bool forSale) payable external {
require(msg.sender == ownerOf[tokenId], "!owner");
sale[tokenId].ethPrice = ethPrice;
sale[tokenId].forSale = forSale;
(bool success, ) = dao.call.value(msg.value)("");
require(success, "!transfer");
emit UpdateSale(ethPrice, tokenId, forSale);
}
}
{
"compilationTarget": {
"GAMMA.sol": "GAMMA"
},
"evmVersion": "istanbul",
"libraries": {},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"approver","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"ethPrice","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"forSale","type":"bool"}],"name":"UpdateSale","type":"event"},{"constant":true,"inputs":[],"name":"GAMMA_MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"dao","outputs":[{"internalType":"address payable","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"ethPrice","type":"uint256"},{"internalType":"string","name":"_tokenURI","type":"string"},{"internalType":"bool","name":"forSale","type":"bool"}],"name":"mint","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"purchase","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"sale","outputs":[{"internalType":"uint256","name":"ethPrice","type":"uint256"},{"internalType":"bool","name":"forSale","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"to","type":"address[]"},{"internalType":"uint256[]","name":"tokenId","type":"uint256[]"}],"name":"transferBatch","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address payable","name":"_dao","type":"address"}],"name":"updateDao","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"ethPrice","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bool","name":"forSale","type":"bool"}],"name":"updateSale","outputs":[],"payable":true,"stateMutability":"payable","type":"function"}]