Cannot estimate gas; transaction may fail or may require manual gas limit ERC721: transfer of token that is not own

I'm getting ERC721 transfer of token that is not own. any help, please?

Unhandled Rejection (Error): cannot estimate gas; transaction may fail or may require manual gas limit (error={"code":-32603,"message":"execution reverted: ERC721: transfer of token that is not own","data":{"originalError":{"code":3,"data":"0x08c379a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000294552433732313a207472616e73666572206f6620746f6b656e2074686174206973206e6f74206f776e0000000000000000000000000000000000000000000000","message":"execution reverted: ERC721: transfer of token that is not own"}}}, method="estimateGas", transaction={"from":"0xFeB43BA464258c453D7aA678210fD49zxnFRgfBN","to":"0x81b6BfD84f5FBa7c737382Bd535875DDF4bFD443","value":

Creat ERC721 Token:

contract NFT is ERC721URIStorage {
    using Counters for Counters.Counter;
    Counters.Counter private _tokenIds;
    address contractAddress;
    constructor(address marketplaceAddress) ERC721(name, symbol) {
        contractAddress = marketplaceAddress;


function createToken(string memory _tokenURI) public returns (uint) {
    uint256 newItemId = _tokenIds.current();

    _mint(msg.sender, newItemId);
    _setTokenURI(newItemId, _tokenURI);
    setApprovalForAll(contractAddress, true);
    return newItemId;}

Put on Sale and transfer:

 function createSale( 
        address nftContract,
        uint256 itemId
    ) public payable nonReentrant {
    uint price = idToMarketItem[itemId].price;
    uint tokenId = idToMarketItem[itemId].tokenId;
    require(msg.value == price, "Please submit the asking price in order to complete the 

    IERC721(nftContract).transferFrom(owner, msg.sender, tokenId);
    idToMarketItem[itemId].owner = payable(msg.sender);
    idToMarketItem[itemId].sold = true;

Please read the error message. "Transfer of token that is not own": you're trying to transfer a token that is not owned by or approved to the account initiating the transfer.

    IERC721(nftContract).transferFrom(owner, msg.sender, tokenId);

In order for this to succeed the Sale contract needs to either own tokenId, or have approval for it provided by the actual owner.