Commit f96156f4 by github-actions

Merge upstream openzeppelin-contracts into upstream-patched

parents 16ee514b 165e6f19
# Changelog # Changelog
## Unreleased ## Unreleased
* Enumerables: Improve gas cost of removal in `EnumerableSet` and `EnumerableMap`.
* Enumerables: Improve gas cost of lookup in `EnumerableSet` and `EnumerableMap`.
## Unreleased
* `IERC20Metadata`: add a new extended interface that includes the optional `name()`, `symbol()` and `decimals()` functions. ([#2561](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2561)) * `IERC20Metadata`: add a new extended interface that includes the optional `name()`, `symbol()` and `decimals()` functions. ([#2561](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2561))
* `ERC777`: make reception acquirement optional in `_mint`. ([#2552](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2552)) * `ERC777`: make reception acquirement optional in `_mint`. ([#2552](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2552))
......
...@@ -81,15 +81,14 @@ library EnumerableSet { ...@@ -81,15 +81,14 @@ library EnumerableSet {
uint256 toDeleteIndex = valueIndex - 1; uint256 toDeleteIndex = valueIndex - 1;
uint256 lastIndex = set._values.length - 1; uint256 lastIndex = set._values.length - 1;
// When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs if (lastIndex != toDeleteIndex) {
// so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. bytes32 lastvalue = set._values[lastIndex];
bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is
set._values[toDeleteIndex] = lastvalue;
// Move the last value to the index where the value to delete is // Update the index for the moved value
set._values[toDeleteIndex] = lastvalue; set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex
// Update the index for the moved value }
set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex
// Delete the slot where the moved value was stored // Delete the slot where the moved value was stored
set._values.pop(); set._values.pop();
...@@ -128,7 +127,6 @@ library EnumerableSet { ...@@ -128,7 +127,6 @@ library EnumerableSet {
* - `index` must be strictly less than {length}. * - `index` must be strictly less than {length}.
*/ */
function _at(Set storage set, uint256 index) private view returns (bytes32) { function _at(Set storage set, uint256 index) private view returns (bytes32) {
require(set._values.length > index, "EnumerableSet: index out of bounds");
return set._values[index]; return set._values[index];
} }
......
...@@ -16,7 +16,6 @@ Here's what a contract for tokenized items might look like: ...@@ -16,7 +16,6 @@ Here's what a contract for tokenized items might look like:
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
pragma solidity ^0.8.0; pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol"; import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
import "@openzeppelin/contracts/utils/Counters.sol"; import "@openzeppelin/contracts/utils/Counters.sol";
...@@ -41,7 +40,7 @@ contract GameItem is ERC721URIStorage { ...@@ -41,7 +40,7 @@ contract GameItem is ERC721URIStorage {
} }
---- ----
The xref:api:token/ERC721.adoc#ERC721[`ERC721`] contract includes all standard extensions (xref:api:token/ERC721.adoc#IERC721Metadata[`IERC721Metadata`] and xref:api:token/ERC721.adoc#IERC721Enumerable[`IERC721Enumerable`]). That's where the xref:api:token/ERC721.adoc#ERC721-_setTokenURI-uint256-string-[`_setTokenURI`] method comes from: we use it to store an item's metadata. The xref:api:token/ERC721.adoc#ERC721URIStorage[`ERC721URIStorage`] contract is an implementation of ERC721 that includes all standard extensions (xref:api:token/ERC721.adoc#IERC721Metadata[`IERC721Metadata`] and xref:api:token/ERC721.adoc#IERC721Enumerable[`IERC721Enumerable`]). That's where the xref:api:token/ERC721.adoc#ERC721-_setTokenURI-uint256-string-[`_setTokenURI`] method comes from: we use it to store an item's metadata.
Also note that, unlike ERC20, ERC721 lacks a `decimals` field, since each token is distinct and cannot be partitioned. Also note that, unlike ERC20, ERC721 lacks a `decimals` field, since each token is distinct and cannot be partitioned.
......
...@@ -51,7 +51,7 @@ function shouldBehaveLikeSet (valueA, valueB, valueC) { ...@@ -51,7 +51,7 @@ function shouldBehaveLikeSet (valueA, valueB, valueC) {
describe('at', function () { describe('at', function () {
it('reverts when retrieving non-existent elements', async function () { it('reverts when retrieving non-existent elements', async function () {
await expectRevert(this.set.at(0), 'EnumerableSet: index out of bounds'); await expectRevert.unspecified(this.set.at(0));
}); });
}); });
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment