pragma solidity 0.8;
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/utils/ERC721Holder.sol";
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/IERC721.sol";
contract TokenTicket1 is ERC721Holder{
IERC721 public Token;
constructor (address _token) public {
Token = IERC721(_token);
}
function _approval(uint id) external{
Token.approve(address(this), id);
}
function deposit(uint id) external{
Token.safeTransferFrom(msg.sender, address(this), id);
}
function withdraw(uint Id) external{
Token.safeTransferFrom(address(this), msg.sender, Id);
}
}令牌地址-> https://rinkeby.etherscan.io/token/0x5ff5a01a288c44f5bacab3291532a74c16642556
这是我得到的错误:

发布于 2021-03-15 14:38:34
这一行Token.approve(address(this), id)是错的。它请求令牌来批准合同本身,这是不需要的。
其意图应该是msg.sender请求令牌来批准合同。该操作不能在约定中编码,必须由用户显式执行。
在javascript中,
Token.approve(TokenTicket1_address, ID).send({from: user_address})发布于 2021-03-15 11:37:21
首先,除非您在etherscan.io中验证您的合同,否则合同代码将不会为任何人所读。
您正在使用一个接口来访问ERC721协议。该契约有任何mint()函数来创建令牌吗?谁是目前的权杖所有者?
您没有提到哪个函数调用会给您带来这个错误,但我猜这是approve()函数调用方,并告诉您该函数的调用方不拥有令牌或不具有审批角色。
您目前在本合同中拥有的approval()和deposit()函数只有在以前已被铸造到正在执行这些函数的帐户上时才能工作。
https://ethereum.stackexchange.com/questions/94656
复制相似问题