Unverified Commit 5f7eda1f by Vladislav Committed by GitHub

Tokens: wrap safe substractions in uchecked block (#2669)

* Tokens: wrap definitely safe subs in unchecked

* Add change in changelog

Co-authored-by: Hadrien Croubois <hadrien.croubois@gmail.com>
parent f8f6d56c
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
* Enumerables: Improve gas cost of removal in `EnumerableSet` and `EnumerableMap`. * Enumerables: Improve gas cost of removal in `EnumerableSet` and `EnumerableMap`.
* Enumerables: Improve gas cost of lookup in `EnumerableSet` and `EnumerableMap`. * Enumerables: Improve gas cost of lookup in `EnumerableSet` and `EnumerableMap`.
* `Counter`: add a reset method. ([#2678](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2678)) * `Counter`: add a reset method. ([#2678](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2678))
* Tokens: Wrap definitely safe subtractions in `unchecked` blocks.
## 4.1.0 (2021-04-29) ## 4.1.0 (2021-04-29)
......
...@@ -187,7 +187,9 @@ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI { ...@@ -187,7 +187,9 @@ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
uint256 fromBalance = _balances[id][from]; uint256 fromBalance = _balances[id][from];
require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
_balances[id][from] = fromBalance - amount; unchecked {
_balances[id][from] = fromBalance - amount;
}
_balances[id][to] += amount; _balances[id][to] += amount;
emit TransferSingle(operator, from, to, id, amount); emit TransferSingle(operator, from, to, id, amount);
...@@ -228,7 +230,9 @@ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI { ...@@ -228,7 +230,9 @@ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
uint256 fromBalance = _balances[id][from]; uint256 fromBalance = _balances[id][from];
require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
_balances[id][from] = fromBalance - amount; unchecked {
_balances[id][from] = fromBalance - amount;
}
_balances[id][to] += amount; _balances[id][to] += amount;
} }
...@@ -327,7 +331,9 @@ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI { ...@@ -327,7 +331,9 @@ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
uint256 accountBalance = _balances[id][account]; uint256 accountBalance = _balances[id][account];
require(accountBalance >= amount, "ERC1155: burn amount exceeds balance"); require(accountBalance >= amount, "ERC1155: burn amount exceeds balance");
_balances[id][account] = accountBalance - amount; unchecked {
_balances[id][account] = accountBalance - amount;
}
emit TransferSingle(operator, account, address(0), id, amount); emit TransferSingle(operator, account, address(0), id, amount);
} }
...@@ -353,7 +359,9 @@ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI { ...@@ -353,7 +359,9 @@ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
uint256 accountBalance = _balances[id][account]; uint256 accountBalance = _balances[id][account];
require(accountBalance >= amount, "ERC1155: burn amount exceeds balance"); require(accountBalance >= amount, "ERC1155: burn amount exceeds balance");
_balances[id][account] = accountBalance - amount; unchecked {
_balances[id][account] = accountBalance - amount;
}
} }
emit TransferBatch(operator, account, address(0), ids, amounts); emit TransferBatch(operator, account, address(0), ids, amounts);
......
...@@ -150,7 +150,9 @@ contract ERC20 is Context, IERC20, IERC20Metadata { ...@@ -150,7 +150,9 @@ contract ERC20 is Context, IERC20, IERC20Metadata {
uint256 currentAllowance = _allowances[sender][_msgSender()]; uint256 currentAllowance = _allowances[sender][_msgSender()];
require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance"); require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
_approve(sender, _msgSender(), currentAllowance - amount); unchecked {
_approve(sender, _msgSender(), currentAllowance - amount);
}
return true; return true;
} }
...@@ -189,7 +191,9 @@ contract ERC20 is Context, IERC20, IERC20Metadata { ...@@ -189,7 +191,9 @@ contract ERC20 is Context, IERC20, IERC20Metadata {
function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
uint256 currentAllowance = _allowances[_msgSender()][spender]; uint256 currentAllowance = _allowances[_msgSender()][spender];
require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
_approve(_msgSender(), spender, currentAllowance - subtractedValue); unchecked {
_approve(_msgSender(), spender, currentAllowance - subtractedValue);
}
return true; return true;
} }
...@@ -216,7 +220,9 @@ contract ERC20 is Context, IERC20, IERC20Metadata { ...@@ -216,7 +220,9 @@ contract ERC20 is Context, IERC20, IERC20Metadata {
uint256 senderBalance = _balances[sender]; uint256 senderBalance = _balances[sender];
require(senderBalance >= amount, "ERC20: transfer amount exceeds balance"); require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
_balances[sender] = senderBalance - amount; unchecked {
_balances[sender] = senderBalance - amount;
}
_balances[recipient] += amount; _balances[recipient] += amount;
emit Transfer(sender, recipient, amount); emit Transfer(sender, recipient, amount);
...@@ -259,8 +265,10 @@ contract ERC20 is Context, IERC20, IERC20Metadata { ...@@ -259,8 +265,10 @@ contract ERC20 is Context, IERC20, IERC20Metadata {
uint256 accountBalance = _balances[account]; uint256 accountBalance = _balances[account];
require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
_balances[account] = accountBalance - amount; unchecked {
_totalSupply -= amount; _balances[account] = accountBalance - amount;
_totalSupply -= amount;
}
emit Transfer(account, address(0), amount); emit Transfer(account, address(0), amount);
} }
......
...@@ -34,7 +34,9 @@ abstract contract ERC20Burnable is Context, ERC20 { ...@@ -34,7 +34,9 @@ abstract contract ERC20Burnable is Context, ERC20 {
function burnFrom(address account, uint256 amount) public virtual { function burnFrom(address account, uint256 amount) public virtual {
uint256 currentAllowance = allowance(account, _msgSender()); uint256 currentAllowance = allowance(account, _msgSender());
require(currentAllowance >= amount, "ERC20: burn amount exceeds allowance"); require(currentAllowance >= amount, "ERC20: burn amount exceeds allowance");
_approve(account, _msgSender(), currentAllowance - amount); unchecked {
_approve(account, _msgSender(), currentAllowance - amount);
}
_burn(account, amount); _burn(account, amount);
} }
} }
...@@ -419,8 +419,10 @@ contract ERC777 is Context, IERC777, IERC20 { ...@@ -419,8 +419,10 @@ contract ERC777 is Context, IERC777, IERC20 {
// Update state variables // Update state variables
uint256 fromBalance = _balances[from]; uint256 fromBalance = _balances[from];
require(fromBalance >= amount, "ERC777: burn amount exceeds balance"); require(fromBalance >= amount, "ERC777: burn amount exceeds balance");
_balances[from] = fromBalance - amount; unchecked {
_totalSupply -= amount; _balances[from] = fromBalance - amount;
_totalSupply -= amount;
}
emit Burned(operator, from, amount, data, operatorData); emit Burned(operator, from, amount, data, operatorData);
emit Transfer(from, address(0), amount); emit Transfer(from, address(0), amount);
...@@ -440,7 +442,9 @@ contract ERC777 is Context, IERC777, IERC20 { ...@@ -440,7 +442,9 @@ contract ERC777 is Context, IERC777, IERC20 {
uint256 fromBalance = _balances[from]; uint256 fromBalance = _balances[from];
require(fromBalance >= amount, "ERC777: transfer amount exceeds balance"); require(fromBalance >= amount, "ERC777: transfer amount exceeds balance");
_balances[from] = fromBalance - amount; unchecked {
_balances[from] = fromBalance - amount;
}
_balances[to] += amount; _balances[to] += amount;
emit Sent(operator, from, to, amount, userData, operatorData); emit Sent(operator, from, to, amount, userData, operatorData);
......
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