对市场的批准是否允许市场合同部署人员在他们愿意的情况下移动资产?
发布于 2022-08-08 22:02:45
让我们检查一下OpenZeppelin的标准实现:
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes memory data
) public virtual override {
require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved");
_safeTransfer(from, to, tokenId, data);
}这条线
require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved");将函数"_isApprovedOrOwner“与msg.sender和tokenId一起使用。让我们来看看这个函数:
/**
* @dev Returns whether `spender` is allowed to manage `tokenId`.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
address owner = ERC721.ownerOf(tokenId);
return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
}在这里,函数使用一个函数"isApprovedForAll“进行检查。让我们也检查一下:
/**
* @dev See {IERC721-isApprovedForAll}.
*/
function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
return _operatorApprovals[owner][operator];
}该函数使用映射"_operatorApprovals“,定义为:
// Mapping from owner to operator approvals
mapping(address => mapping(address => bool)) private _operatorApprovals;这意味着所有者可以批准操作员移动所有者拥有的任何令牌。
让我们最后看一看著名的"setApprovalForAll":
/**
* @dev Approve `operator` to operate on all of `owner` tokens
*
* Emits an {ApprovalForAll} event.
*/
function _setApprovalForAll(
address owner,
address operator,
bool approved
) internal virtual {
require(owner != operator, "ERC721: approve to caller");
_operatorApprovals[owner][operator] = approved;
emit ApprovalForAll(owner, operator, approved);
}这就是:
_operatorApprovals[owner][operator] = approved;这是部分,其中所有者和操作符之间的映射被设置为"true“。这意味着对"isApprovedOrOwner“的函数调用将返回true,从而允许调用方传输所有者的任何令牌。
https://ethereum.stackexchange.com/questions/133244
复制相似问题