Skip to content

Commit

Permalink
use safe transferFrom for ERC721
Browse files Browse the repository at this point in the history
  • Loading branch information
Aodhgan committed Jun 29, 2021
1 parent 26a41f1 commit 432584e
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 1 deletion.
13 changes: 12 additions & 1 deletion contracts/prize-pool/PrizePool.sol
Expand Up @@ -27,6 +27,7 @@ abstract contract PrizePool is PrizePoolInterface, OwnableUpgradeable, Reentranc
using SafeMathUpgradeable for uint256;
using SafeCastUpgradeable for uint256;
using SafeERC20Upgradeable for IERC20Upgradeable;
using SafeERC20Upgradeable for IERC721Upgradeable;
using MappedSinglyLinkedList for MappedSinglyLinkedList.Mapping;
using ERC165CheckerUpgradeable for address;

Expand Down Expand Up @@ -159,6 +160,10 @@ abstract contract PrizePool is PrizePoolInterface, OwnableUpgradeable, Reentranc
uint256 amount
);

/// @dev Emitted when there was an error thrown awarding an External ERC721
event ErrorAwardingExternalERC721(bytes error);


struct CreditPlan {
uint128 creditLimitMantissa;
uint128 creditRateMantissa;
Expand Down Expand Up @@ -599,7 +604,13 @@ abstract contract PrizePool is PrizePoolInterface, OwnableUpgradeable, Reentranc
}

for (uint256 i = 0; i < tokenIds.length; i++) {
IERC721Upgradeable(externalToken).transferFrom(address(this), to, tokenIds[i]);
try IERC721Upgradeable(externalToken).safeTransferFrom(address(this), to, tokenIds[i]){

}
catch(bytes memory error){
emit ErrorAwardingExternalERC721(error);
}

}

emit AwardedExternalERC721(to, externalToken, tokenIds);
Expand Down
9 changes: 9 additions & 0 deletions test/PrizePool.test.js
Expand Up @@ -962,5 +962,14 @@ describe('PrizePool', function() {
.to.emit(prizePool, 'AwardedExternalERC721')
.withArgs(wallet.address, erc721token.address, [NFT_TOKEN_ID])
})

it('should not DoS with faulty ERC721s', async () => {

await yieldSourceStub.mock.canAwardExternal.withArgs(erc721token.address).returns(true)
await erc721token.mock.transferFrom.withArgs(prizePool.address, wallet.address, NFT_TOKEN_ID).reverts()

await expect(prizeStrategy.call(prizePool, 'awardExternalERC721', wallet.address, erc721token.address, [NFT_TOKEN_ID]))
.to.emit(prizePool, 'ErrorAwardingExternalERC721')
})
})
});

0 comments on commit 432584e

Please sign in to comment.