function createAuction(
        address _tokenAddress,
        uint256 _startingPrice,
        uint256 _endingPrice,
        uint256 _duration,
        uint256 _tokenQuantity
    )
        external
    {
        require(_owns(_tokenAddress, msg.sender, _tokenQuantity));

        
        
        

        
        
        require(_startingPrice == uint256(uint128(_startingPrice)));
        require(_endingPrice == uint256(uint128(_endingPrice)));
        require(_duration == uint256(uint64(_duration)));

        require(this == address(cryptiblesAuctionContract));

        uint256 auctionNumber = auctionCounter[_tokenAddress];
        
        
        if(auctionNumber == 0){
            auctionNumber = 1;
        }else{
            auctionNumber += 1;
        }

        auctionCounter[_tokenAddress] = auctionNumber;
        
        _escrow(_tokenAddress, msg.sender, _tokenQuantity);

        Auction memory auction = Auction(
            msg.sender,
            uint128(_startingPrice),
            uint128(_endingPrice),
            uint64(_duration),
            uint64(now),
            uint256(_tokenQuantity),
            _tokenAddress,
            auctionNumber
        );

        tokensAuction[_tokenAddress][auctionNumber] = auction;
        
        _addAuction(_tokenAddress, auction);
    }