contract BICAProxy is ERC20Interface, BICALogicUpgradeable {

    /**
     * MEMBER: The name of the token.
     */
    string public name;

    /**
     * MEMBER: The symbol of the token.
     */
    string public symbol;

    /**
     * MEMBER: The number of decimals of the token.
     */
    uint public decimals;

    /**
     * CONSTRUCTOR: Initialize with an admin address.
     */
    constructor (address _admin) public BICALogicUpgradeable(_admin){
        name = "BitCapital Coin";
        symbol = 'BICA';
        decimals = 2;
    }
    
    /**
     * METHOD: Get `totalSupply` of token.
     * @dev It is the standard method of ERC20.
     * @return The total token supply.
     */
    function totalSupply() public view returns (uint256) {
        return bicaLogic.totalSupply();
    }

    /**
     * METHOD: Get the balance of a owner.
     * @dev It is the standard method of ERC20.
     * @return The balance of a owner.
     */
    function balanceOf(address _owner) public view returns (uint256 balance) {
        return bicaLogic.balanceOf(_owner);
    }

    /**
     * METHOD: Emit a Transfer event in proxy contract.
     */
    function emitTransfer(address _from, address _to, uint256 _value) public onlyLogic {
        emit Transfer(_from, _to, _value);
    }

    /**
     * METHOD: The message sender sends some amount of token to receiver.
     * @dev It will call the logic contract to send some token to receiver.
     * It is the standard method of ERC20.
     * @return success or not
     */
    function transfer(address _to, uint256 _value) public returns (bool success) {
        return bicaLogic.transferWithSender(msg.sender, _to, _value);
    }

    /**
     * METHOD: Transfer amount of tokens from `_from` to `_to`.
     * @dev It is the standard method of ERC20.
     * @return success or not
     */
    function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {
        return bicaLogic.transferFromWithSender(msg.sender, _from, _to, _value);
    }

    /**
     * METHOD: Emit a Approval event in proxy contract.
     */
    function emitApproval(address _owner, address _spender, uint256 _value) public onlyLogic {
        emit Approval(_owner, _spender, _value);
    }

    /**
     * METHOD: Allow `_spender` to be able to spend `_value` token.
     * @dev It is the standard method of ERC20.
     * @return success or not
     */
    function approve(address _spender, uint256 _value) public returns (bool success) {
        return bicaLogic.approveWithSender(msg.sender, _spender, _value);
    }

    /**
     * METHOD: Increase allowance value of message sender to `_spender`.
     * @return success or not
     */
    function increaseApproval(address _spender, uint256 _addedValue) public returns (bool success) {
        return bicaLogic.increaseApprovalWithSender(msg.sender, _spender, _addedValue);
    }

    /**
     * METHOD: Decrease allowance value of message sender to `_spender`.
     * @return success or not
     */
    function decreaseApproval(address _spender, uint256 _subtractedValue) public returns (bool success) {
        return bicaLogic.decreaseApprovalWithSender(msg.sender, _spender, _subtractedValue);
    }

    /**
     * METHOD: Return the allowance value of `_owner` to `_spender`.
     */
    function allowance(address _owner, address _spender) public view returns (uint256 remaining) {
        return bicaLogic.allowance(_owner, _spender);
    }
}
/**
 * @dev This contract is a viewer of ERC20 token standard.
 * It includes no logic and data.
 */
function transfer(address _to, uint256 _value) public returns (bool success) {
    return bicaLogic.transferWithSender(msg.sender, _to, _value);
}

/**
 * METHOD: The message sender sends some amount of token to receiver.
 * @dev It will call the logic contract to send some token to receiver.
 * It is the standard method of ERC20.
 * @return success or not
 */