pragma solidity ^0.4.11;
contract LedgerLegendsToken {
address public owner;
mapping(address => bool) public minters;
event Approval(address indexed owner, address indexed approved, uint256 tokenId);
event Transfer(address indexed from, address indexed to, uint256 tokenId);
event Mint(address indexed owner, uint256 tokenId);
uint256 public tokenIdCounter = 1;
mapping (uint256 => address) public tokenIdToOwner;
mapping (uint256 => bytes32) public tokenIdToData;
mapping (uint256 => address) public tokenIdToApproved;
mapping (address => uint256[]) public ownerToTokenIds;
mapping (uint256 => uint256) public tokenIdToOwnerArrayIndex;
function LedgerLegendsToken() public {
owner = msg.sender;
}
/* Admin */
modifier onlyOwner() {
require(msg.sender == owner);
_;
}
modifier onlyMinters() {
require(minters[msg.sender]);
_;
}
function setOwner(address _owner) onlyOwner() public {
owner = _owner;
}
function addMinter(address _minter) onlyOwner() public {
minters[_minter] = true;
}
function removeMinter(address _minter) onlyOwner() public {
delete minters[_minter];
}
/* Internal */
function _addTokenToOwnersList(address _owner, uint256 _tokenId) internal {
ownerToTokenIds[_owner].push(_tokenId);
tokenIdToOwnerArrayIndex[_tokenId] = ownerToTokenIds[_owner].length - 1;
}
function _removeTokenFromOwnersList(address _owner, uint256 _tokenId) internal {
uint256 length = ownerToTokenIds[_owner].length;
uint256 index = tokenIdToOwnerArrayIndex[_tokenId];
uint256 swapToken = ownerToTokenIds[_owner][length - 1];
ownerToTokenIds[_owner][index] = swapToken;
tokenIdToOwnerArrayIndex[swapToken] = index;
delete ownerToTokenIds[_owner][length - 1];
ownerToTokenIds[_owner].length--;
}
function _transfer(address _from, address _to, uint256 _tokenId) internal {
require(tokenExists(_tokenId));
require(ownerOf(_tokenId) == _from);
require(_to != address(0));
require(_to != address(this));
tokenIdToOwner[_tokenId] = _to;
delete tokenIdToApproved[_tokenId];
_removeTokenFromOwnersList(_from, _tokenId);
_addTokenToOwnersList(_to, _tokenId);
Transfer(msg.sender, _to, _tokenId);
}
/* Minting */
function mint(address _owner, bytes32 _data) onlyMinters() public returns (uint256 tokenId) {
tokenId = tokenIdCounter;
tokenIdCounter += 1;
tokenIdToOwner[tokenId] = _owner;
tokenIdToData[tokenId] = _data;
_addTokenToOwnersList(_owner, tokenId);
Mint(_owner, tokenId);
}
/* ERC721 */
function name() public pure returns (string) {
return "Ledger Legends Cards";
}
function symbol() public pure returns (string) {
return "LLC";
}
function totalSupply() public view returns (uint256) {
return tokenIdCounter - 1;
}
function balanceOf(address _owner) public view returns (uint256) {
return ownerToTokenIds[_owner].length;
}
function ownerOf(uint256 _tokenId) public view returns (address) {
return tokenIdToOwner[_tokenId];
}
function approvedFor(uint256 _tokenId) public view returns (address) {
return tokenIdToApproved[_tokenId];
}
function tokenExists(uint256 _tokenId) public view returns (bool) {
return _tokenId < tokenIdCounter;
}
function tokenData(uint256 _tokenId) public view returns (bytes32) {
return tokenIdToData[_tokenId];
}
function tokensOfOwner(address _owner) public view returns (uint256[]) {
return ownerToTokenIds[_owner];
}
function tokenOfOwnerByIndex(address _owner, uint256 _index) public view returns (uint256) {
return ownerToTokenIds[_owner][_index];
}
function approve(address _to, uint256 _tokenId) public {
require(msg.sender != _to);
require(tokenExists(_tokenId));
require(ownerOf(_tokenId) == msg.sender);
if (_to == 0) {
if (tokenIdToApproved[_tokenId] != 0) {
delete tokenIdToApproved[_tokenId];
Approval(msg.sender, 0, _tokenId);
}
} else {
tokenIdToApproved[_tokenId] = _to;
Approval(msg.sender, _to, _tokenId);
}
}
function transfer(address _to, uint256 _tokenId) public {
_transfer(msg.sender, _to, _tokenId);
}
function transferFrom(address _from, address _to, uint256 _tokenId) public {
require(tokenIdToApproved[_tokenId] == msg.sender);
_transfer(_from, _to, _tokenId);
}
}
{
"compilationTarget": {
"LedgerLegendsToken.sol": "LedgerLegendsToken"
},
"libraries": {},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"tokenExists","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_owner","type":"address"}],"name":"setOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"tokenIdToData","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"approvedFor","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_owner","type":"address"},{"name":"_data","type":"bytes32"}],"name":"mint","outputs":[{"name":"tokenId","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_minter","type":"address"}],"name":"removeMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"tokenIdToOwnerArrayIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"uint256"}],"name":"ownerToTokenIds","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"tokenIdToOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"_minter","type":"address"}],"name":"addMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"tokenIdCounter","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"transfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"tokenData","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"tokenIdToApproved","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"minters","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"approved","type":"address"},{"indexed":false,"name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":false,"name":"tokenId","type":"uint256"}],"name":"Mint","type":"event"}]