contract ERC20Token is DSMath, ERC20 {
    // Standard EIP20 Name, Symbol, Decimals
    string public symbol = "USDC";
    string public name = "UnityCoinTest";
    string public version = "1.0.0";
    uint8 public decimals = 18;

    // Balances for each account
    mapping(address => uint256) balances;

    // Owner of account approves the transfer of an amount to another account
    mapping(address => mapping (address => uint256)) approvals;

    // Standard EIP20: BalanceOf, Transfer, TransferFrom, Allow, Allowance methods..
    // Get the token balance for account `tokenOwner`
    function balanceOf(address tokenOwner) public view returns (uint balance) {
        return balances[tokenOwner];
    }

    // Transfer the balance from owner's account to another account
    function transfer(address to, uint256 tokens) external returns (bool success) {
        return transferFrom(msg.sender, to, tokens);
    }

    // Send `tokens` amount of tokens from address `from` to address `to`
    // The transferFrom method is used for a withdraw workflow, allowing contracts to send
    // tokens on your behalf, for example to "deposit" to a contract address and/or to charge
    // fees in sub-currencies; the command should fail unless the from account has
    // deliberately authorized the sender of the message via some mechanism; we propose
    // these standardized APIs for approval:
    function transferFrom(address from, address to, uint256 tokens) public returns (bool success) {
        if (from != msg.sender) {
            approvals[from][msg.sender] = sub(approvals[from][msg.sender], tokens);
        }

        balances[from] = sub(balances[from], tokens);
        balances[to] = add(balances[to], tokens);

        emit Transfer(from, to, tokens);
        return true;
    }

    // Allow `spender` to withdraw from your account, multiple times, up to the `tokens` amount.
    // If this function is called again it overwrites the current allowance with _value.
    function approve(address spender, uint256 tokens) public returns (bool success) {
        approvals[msg.sender][spender] = tokens;

        emit Approval(msg.sender, spender, tokens);
        return true;
    }

    // ------------------------------------------------------------------------
    // Returns the amount of tokens approved by the owner that can be
    // transferred to the spender's account
    // ------------------------------------------------------------------------
    function allowance(address tokenOwner, address spender) external view returns (uint remaining) {
        return approvals[tokenOwner][spender];
    }
}
/**
 * @title ERC20Token
 * @author BokkyPooBah / Bok Consulting Pty Ltd 2018.
 * @author UnityCoin Team
 * @author MakerDAO
 * @notice An ERC20 Token implimentation based roughly off of MakerDAO's
 *       version DSToken.
 */
function allowance(address tokenOwner, address spender) external view returns (uint remaining) {
    return approvals[tokenOwner][spender];
}

// ------------------------------------------------------------------------
// Returns the amount of tokens approved by the owner that can be
// transferred to the spender's account
// ------------------------------------------------------------------------