Gas estimation failed when I use one contract to call another ERC721 contract

here is my code, the another contract is a normal ERC721 contract.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.2;

interface IRC721 {
    function approve(address _to, uint256 _tokenid) external returns(uint256);
    function setERC20ContractAddress (address _address) external;
    function setApprovalForAll(address _to, bool _approved) external returns(uint256);
    function ownerOf(uint256 _tokenid) external returns(address);
    function owner() external returns(address);
    function transferFrom(address _from, address _to, uint256 _tokenid) external returns(uint256);
    function safeTransferFrom(address _from, address _to, uint256 _tokenid) external returns(uint256);
}

contract Transer721 {
    IRC721 public tract;

    constructor () {
        tract = IRC721(0x2f4B8B1545B47a8420C36a7be4b4Fa2896a732ca);
    }

    function transferFromCrontract(uint256 _tokenid) payable public {
        address owner = tract.ownerOf(_tokenid);
        tract.safeTransferFrom(owner, msg.sender, _tokenid);
    }

}