Solidity

如果 ERC20 或 ERC721 transferFrom 失敗,整個功能是否會恢復?

  • July 19, 2022

我對恢復的情況有一些安全疑問和困惑。正如我發現transfer的那樣,如果本機函式失敗,函式的全部更改都會被還原。但是 ERC721 和 ERC20 的transfer, transferFrom,safeTransferFrom呢?

例如:

  1. 如果 (1) 或 (2) 失敗,函式是否會中斷並恢復offer.isAccepted?
  2. 如果 (2) 失敗,是濕轉移,因此整個功能恢復了嗎?
function acceptBid(uint256 _offerId) public nonReentrant {
Offer storage offer = offers[_offerId];

IERC20 weth = IERC20(0xc778417E063141139Fce010982780140Aa0cD5Ab);
IERC721 nftContract = IERC721(offer.nftContractAddress);

address nftOwner = nftContract.ownerOf(offer.tokenId);

offer.isAccepted = true; // *
weth.transferFrom(
   address(offer.userAddress),
   payable(msg.sender),
   offer.price
); // (1)

nftContract.transferFrom(
   address(this),
   offer.userAddress,
   offer.tokenId
); // (2)

emit AcceptedOffer();}

智能合約方法以交易方式執行。這意味著,如果執行了或 failed中的任何一個revert,則整個事務將被還原,回滾所做的任何更改。require``assert

所以:

  • weth.transferFrom恢復時,offer.isAccepted將被清除
  • nftContract.transferFrom還原時,weth.transferFrom將被回滾並被offer.isAccepted清除。

引用自:https://ethereum.stackexchange.com/questions/131958