Sfoglia il codice sorgente

Replace some uses of abi.encodePacked with more explicit alternatives (#4296)

Co-authored-by: Francisco <fg@frang.io>
Hadrien Croubois 2 anni fa
parent
commit
ef103f37e4

+ 5 - 0
.changeset/flat-bottles-wonder.md

@@ -0,0 +1,5 @@
+---
+'openzeppelin-solidity': minor
+---
+
+Replace some uses of `abi.encodePacked` with clearer alternatives (e.g. `bytes.concat`, `string.concat`).

+ 1 - 1
contracts/governance/compatibility/GovernorCompatibilityBravo.sol

@@ -155,7 +155,7 @@ abstract contract GovernorCompatibilityBravo is IGovernorTimelock, IGovernorComp
         for (uint256 i = 0; i < fullcalldatas.length; ++i) {
             fullcalldatas[i] = bytes(signatures[i]).length == 0
                 ? calldatas[i]
-                : abi.encodePacked(bytes4(keccak256(bytes(signatures[i]))), calldatas[i]);
+                : bytes.concat(abi.encodeWithSignature(signatures[i]), calldatas[i]);
         }
 
         return fullcalldatas;

+ 2 - 2
contracts/mocks/ReentrancyAttack.sol

@@ -5,8 +5,8 @@ pragma solidity ^0.8.19;
 import "../utils/Context.sol";
 
 contract ReentrancyAttack is Context {
-    function callSender(bytes4 data) public {
-        (bool success, ) = _msgSender().call(abi.encodeWithSelector(data));
+    function callSender(bytes calldata data) public {
+        (bool success, ) = _msgSender().call(data);
         require(success, "ReentrancyAttack: failed call");
     }
 }

+ 1 - 2
contracts/mocks/ReentrancyMock.sol

@@ -33,8 +33,7 @@ contract ReentrancyMock is ReentrancyGuard {
 
     function countAndCall(ReentrancyAttack attacker) public nonReentrant {
         _count();
-        bytes4 func = bytes4(keccak256("callback()"));
-        attacker.callSender(func);
+        attacker.callSender(abi.encodeCall(this.callback, ()));
     }
 
     function _count() private {

+ 2 - 2
contracts/token/ERC1155/extensions/ERC1155URIStorage.sol

@@ -42,8 +42,8 @@ abstract contract ERC1155URIStorage is ERC1155 {
     function uri(uint256 tokenId) public view virtual override returns (string memory) {
         string memory tokenURI = _tokenURIs[tokenId];
 
-        // If token URI is set, concatenate base URI and tokenURI (via abi.encodePacked).
-        return bytes(tokenURI).length > 0 ? string(abi.encodePacked(_baseURI, tokenURI)) : super.uri(tokenId);
+        // If token URI is set, concatenate base URI and tokenURI (via string.concat).
+        return bytes(tokenURI).length > 0 ? string.concat(_baseURI, tokenURI) : super.uri(tokenId);
     }
 
     /**

+ 1 - 1
contracts/token/ERC721/ERC721.sol

@@ -97,7 +97,7 @@ abstract contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Er
         _requireMinted(tokenId);
 
         string memory baseURI = _baseURI();
-        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
+        return bytes(baseURI).length > 0 ? string.concat(baseURI, tokenId.toString()) : "";
     }
 
     /**

+ 2 - 2
contracts/token/ERC721/extensions/ERC721URIStorage.sol

@@ -35,9 +35,9 @@ abstract contract ERC721URIStorage is IERC4906, ERC721 {
         if (bytes(base).length == 0) {
             return _tokenURI;
         }
-        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
+        // If both are set, concatenate the baseURI and tokenURI (via string.concat).
         if (bytes(_tokenURI).length > 0) {
-            return string(abi.encodePacked(base, _tokenURI));
+            return string.concat(base, _tokenURI);
         }
 
         return super.tokenURI(tokenId);

+ 1 - 1
contracts/utils/Strings.sol

@@ -47,7 +47,7 @@ library Strings {
      * @dev Converts a `int256` to its ASCII `string` decimal representation.
      */
     function toString(int256 value) internal pure returns (string memory) {
-        return string(abi.encodePacked(value < 0 ? "-" : "", toString(SignedMath.abs(value))));
+        return string.concat(value < 0 ? "-" : "", toString(SignedMath.abs(value)));
     }
 
     /**