Unverified Commit baaadde3 by Nicolás Venturo Committed by GitHub

Remove ERC20._burnFrom (#2119)

* Remove ERC20._burnFrom

* Add changelog entry
parent 68ad1ed1
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
### Breaking Changes ### Breaking Changes
* `ECDSA`: when receiving an invalid signature, `recover` now reverts instead of returning the zero address. ([#2114](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2114)) * `ECDSA`: when receiving an invalid signature, `recover` now reverts instead of returning the zero address. ([#2114](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2114))
* `ERC20`: removed `_burnFrom`. ([#2119](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2119))
## 2.5.0 (2020-02-04) ## 2.5.0 (2020-02-04)
......
...@@ -16,10 +16,6 @@ contract ERC20Mock is ERC20 { ...@@ -16,10 +16,6 @@ contract ERC20Mock is ERC20 {
_burn(account, amount); _burn(account, amount);
} }
function burnFrom(address account, uint256 amount) public {
_burnFrom(account, amount);
}
function transferInternal(address from, address to, uint256 value) public { function transferInternal(address from, address to, uint256 value) public {
_transfer(from, to, value); _transfer(from, to, value);
} }
......
...@@ -224,17 +224,6 @@ contract ERC20 is Context, IERC20 { ...@@ -224,17 +224,6 @@ contract ERC20 is Context, IERC20 {
} }
/** /**
* @dev Destroys `amount` tokens from `account`.`amount` is then deducted
* from the caller's allowance.
*
* See {_burn} and {_approve}.
*/
function _burnFrom(address account, uint256 amount) internal virtual {
_burn(account, amount);
_approve(account, _msgSender(), _allowances[account][_msgSender()].sub(amount, "ERC20: burn amount exceeds allowance"));
}
/**
* @dev Hook that is called before any transfer of tokens. This includes * @dev Hook that is called before any transfer of tokens. This includes
* minting and burning. * minting and burning.
* *
......
...@@ -19,9 +19,20 @@ contract ERC20Burnable is Context, ERC20 { ...@@ -19,9 +19,20 @@ contract ERC20Burnable is Context, ERC20 {
} }
/** /**
* @dev See {ERC20-_burnFrom}. * @dev Destroys `amount` tokens from `account`, deducting from the caller's
* allowance.
*
* See {ERC20-_burn} and {ERC20-allowance}.
*
* Requirements:
*
* - the caller must have allowance for `accounts`'s tokens of at least
* `amount`.
*/ */
function burnFrom(address account, uint256 amount) public virtual { function burnFrom(address account, uint256 amount) public virtual {
_burnFrom(account, amount); uint256 decreasedAllowance = allowance(account, _msgSender()).sub(amount, "ERC20: burn amount exceeds allowance");
_approve(account, _msgSender(), decreasedAllowance);
_burn(account, amount);
} }
} }
...@@ -262,80 +262,6 @@ describe('ERC20', function () { ...@@ -262,80 +262,6 @@ describe('ERC20', function () {
}); });
}); });
describe('_burnFrom', function () {
const allowance = new BN(70);
const spender = anotherAccount;
beforeEach('approving', async function () {
await this.token.approve(spender, allowance, { from: initialHolder });
});
it('rejects a null account', async function () {
await expectRevert(this.token.burnFrom(ZERO_ADDRESS, new BN(1)),
'ERC20: burn from the zero address'
);
});
describe('for a non zero account', function () {
it('rejects burning more than allowance', async function () {
await expectRevert(this.token.burnFrom(initialHolder, allowance.addn(1)),
'ERC20: burn amount exceeds allowance'
);
});
it('rejects burning more than balance', async function () {
await expectRevert(this.token.burnFrom(initialHolder, initialSupply.addn(1)),
'ERC20: burn amount exceeds balance'
);
});
const describeBurnFrom = function (description, amount) {
describe(description, function () {
beforeEach('burning', async function () {
const { logs } = await this.token.burnFrom(initialHolder, amount, { from: spender });
this.logs = logs;
});
it('decrements totalSupply', async function () {
const expectedSupply = initialSupply.sub(amount);
expect(await this.token.totalSupply()).to.be.bignumber.equal(expectedSupply);
});
it('decrements initialHolder balance', async function () {
const expectedBalance = initialSupply.sub(amount);
expect(await this.token.balanceOf(initialHolder)).to.be.bignumber.equal(expectedBalance);
});
it('decrements spender allowance', async function () {
const expectedAllowance = allowance.sub(amount);
expect(await this.token.allowance(initialHolder, spender)).to.be.bignumber.equal(expectedAllowance);
});
it('emits a Transfer event', async function () {
const event = expectEvent.inLogs(this.logs, 'Transfer', {
from: initialHolder,
to: ZERO_ADDRESS,
});
expect(event.args.value).to.be.bignumber.equal(amount);
});
it('emits an Approval event', async function () {
expectEvent.inLogs(this.logs, 'Approval', {
owner: initialHolder,
spender: spender,
value: await this.token.allowance(initialHolder, spender),
});
});
});
};
describeBurnFrom('for entire allowance', allowance);
describeBurnFrom('for less amount than allowance', allowance.subn(1));
});
});
describe('_transfer', function () { describe('_transfer', function () {
shouldBehaveLikeERC20Transfer('ERC20', initialHolder, recipient, initialSupply, function (from, to, amount) { shouldBehaveLikeERC20Transfer('ERC20', initialHolder, recipient, initialSupply, function (from, to, amount) {
return this.token.transferInternal(from, to, amount); return this.token.transferInternal(from, to, amount);
......
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