abstract contract BaseContractData is Context{
    address internal _tokenSaleContractAddress;

    /**
    @dev Make sure function can be called only be _tokenSaleContractAddress
     */
    modifier onlyTokenSaleContract{
        require(_tokenSaleContractAddress != address(0), "Token sale contract address has not been initialized yet");
        require(_msgSender() == _tokenSaleContractAddress, "Only token sale contract can process this");
        _;
    }

    /**
    @dev Set _tokenSaleContractAddress
    */
    function setTokenSaleContractAddress(address contractAddress) external onlyOwner{
        _setTokenSaleContractAddress(contractAddress);
    }

    function _setTokenSaleContractAddress(address contractAddress) internal virtual{
        _tokenSaleContractAddress = contractAddress;
    }
}
function setTokenSaleContractAddress(address contractAddress) external onlyOwner{
    _setTokenSaleContractAddress(contractAddress);
}

/**
 @dev Set _tokenSaleContractAddress
 */