pragma solidity >=0.6.0;

// solc --allow-paths ., --abi --bin --overwrite --optimize -o cmd/pics/contracts/build cmd/pics/contracts/token.sol
// ./build/bin/abigen -abi cmd/pics/contracts/build/Token.abi -bin cmd/pics/contracts/build/Token.bin -pkg contracts -type token -out cmd/pics/contracts/gen_token.go
contract Token {
    uint256 public totalSupply;
    mapping(address => uint256) public balanceOf;
    address public minter;

    constructor(address _minter) public {
        minter = _minter;
    }

    /* Send tokens */
    function transfer(address _to, uint256 _value) public returns (bool) {
        uint256 fromBalance = balanceOf[msg.sender];
        uint256 toBalance = balanceOf[_to];
        require(fromBalance >= _value);                // Check if the sender has enough
        require(toBalance + _value >= toBalance);      // Check for overflows
        balanceOf[msg.sender] = fromBalance - _value;  // Subtract from the sender
        balanceOf[_to] = toBalance + _value;
        return true;
    }

    /* Allows the owner to mint more tokens */
    function mint(address _to, uint256 _value) public returns (bool) {
        require(msg.sender == minter);                       // Only the minter is allowed to mint
        uint256 toBalance = balanceOf[_to];
        require(toBalance + _value >= toBalance);  // Check for overflows
        balanceOf[_to] = toBalance + _value;
        totalSupply += _value;
        return true;
    }
}
