pragma solidity ^0.6.2;
contract NFT{
string public name = "Cocktail NFT"; // token名字
string public symbol = "CNFT"; // token简称
uint256 public totalSupply = 1000000; // 允许的最大发行量
uint256 public maxTokenId; // 已经发行的token数量
mapping(address => uint256) public balances; // 余额
mapping(uint256 => bool) public tokenExists; // token是否存在
mapping(uint256 => address) public tokenOwners; // token拥有者
mapping(address => mapping(address => uint256)) allowed; // 代理
address public owner; // 铸币人
event Approval(address,address,uint256);
event Transfer(address,address,uint256);
constructor() public{
owner = msg.sender; // 设置铸币人
}
// 查询token的拥有者
function ownerOf(uint256 _tokenId) public view returns (address) {
require(tokenExists[_tokenId]);
return tokenOwners[_tokenId];
}
// 授权
function approve(address _to,uint256 _tokenId) public{
require(msg.sender ==ownerOf(_tokenId)); // 证明我是该token的拥有者
require(msg.sender != _to);
allowed[msg.sender][_to] = _tokenId; // 授权指定地址可以动用我的指定token
emit Approval(msg.sender, _to, _tokenId);
}
// token代理人提币
function takeOwnership(uint256 _tokenId) public{
require(tokenExists[_tokenId]); // 该token是存在的
address oldOwner = ownerOf(_tokenId); // 该token的拥有者地址
require(msg.sender != oldOwner);
require(allowed[oldOwner][msg.sender] == _tokenId); // 该token的拥有者已对我授权可以动用该资产
balances[oldOwner] -= 1;
tokenOwners[_tokenId] = msg.sender; // 转账
balances[msg.sender] += 1;
emit Transfer(oldOwner, msg.sender,_tokenId);
}
// 转账
function transfer(address _to, uint256 _tokenId) public{
require(tokenExists[_tokenId]); // 该token是存在的
require(msg.sender == ownerOf(_tokenId)); // 该token的拥有者为我
require(msg.sender != _to); // 不允许自己给自己转账
require(_to != address(0)); // 接收人不能为空
balances[msg.sender] -= 1;
tokenOwners[_tokenId] = _to; // 转账
balances[_to] += 1;
emit Transfer(msg.sender, _to, _tokenId);
}
// 铸币
function mint() public{
maxTokenId += 1;
require(maxTokenId <= totalSupply);
balances[msg.sender] += 1;
tokenExists[maxTokenId] = true;
tokenOwners[maxTokenId] = msg.sender;
}
// 仅限管理员操作
modifier onlyOwner(){
require(msg.sender == owner, "No authority");
_;
}
}
网友评论