|
|
|
const { BN, constants, expectEvent, expectRevert } = require('@openzeppelin/test-helpers');
|
|
|
|
const { ZERO_ADDRESS } = constants;
|
|
|
|
|
|
|
|
const { expect } = require('chai');
|
|
|
|
|
Rename ERC interfaces to I prefix (#1252)
* rename ERC20 to IERC20
* move ERC20.sol to IERC20.sol
* rename StandardToken to ERC20
* rename StandardTokenMock to ERC20Mock
* move StandardToken.sol to ERC20.sol, likewise test and mock files
* rename MintableToken to ERC20Mintable
* move MintableToken.sol to ERC20Mintable.sol, likewise test and mock files
* rename BurnableToken to ERC20Burnable
* move BurnableToken.sol to ERC20Burnable.sol, likewise for related files
* rename CappedToken to ERC20Capped
* move CappedToken.sol to ERC20Capped.sol, likewise for related files
* rename PausableToken to ERC20Pausable
* move PausableToken.sol to ERC20Pausable.sol, likewise for related files
* rename DetailedERC20 to ERC20Detailed
* move DetailedERC20.sol to ERC20Detailed.sol, likewise for related files
* rename ERC721 to IERC721, and likewise for other related interfaces
* move ERC721.sol to IERC721.sol, likewise for other 721 interfaces
* rename ERC721Token to ERC721
* move ERC721Token.sol to ERC721.sol, likewise for related files
* rename ERC721BasicToken to ERC721Basic
* move ERC721BasicToken.sol to ERC721Basic.sol, likewise for related files
* rename ERC721PausableToken to ERC721Pausable
* move ERC721PausableToken.sol to ERC721Pausable.sol
* rename ERC165 to IERC165
* move ERC165.sol to IERC165.sol
* amend comment that ERC20 is based on FirstBlood
* fix comments mentioning IERC721Receiver
7 years ago
|
|
|
function shouldBehaveLikeERC20Burnable (owner, initialBalance, [burner]) {
|
|
|
|
describe('burn', function () {
|
|
|
|
describe('when the given amount is not greater than balance of the sender', function () {
|
|
|
|
context('for a zero amount', function () {
|
|
|
|
shouldBurn(new BN(0));
|
|
|
|
});
|
|
|
|
|
|
|
|
context('for a non-zero amount', function () {
|
|
|
|
shouldBurn(new BN(100));
|
|
|
|
});
|
|
|
|
|
|
|
|
function shouldBurn (amount) {
|
|
|
|
beforeEach(async function () {
|
|
|
|
(this.receipt = await this.token.burn(amount, { from: owner }));
|
|
|
|
});
|
|
|
|
|
|
|
|
it('burns the requested amount', async function () {
|
|
|
|
expect(await this.token.balanceOf(owner)).to.be.bignumber.equal(initialBalance.sub(amount));
|
|
|
|
});
|
|
|
|
|
|
|
|
it('emits a transfer event', async function () {
|
|
|
|
expectEvent(this.receipt, 'Transfer', {
|
|
|
|
from: owner,
|
|
|
|
to: ZERO_ADDRESS,
|
|
|
|
value: amount,
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('when the given amount is greater than the balance of the sender', function () {
|
|
|
|
const amount = initialBalance.addn(1);
|
|
|
|
|
|
|
|
it('reverts', async function () {
|
|
|
|
await expectRevert(this.token.burn(amount, { from: owner }),
|
|
|
|
'ERC20: burn amount exceeds balance',
|
|
|
|
);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('burnFrom', function () {
|
|
|
|
describe('on success', function () {
|
|
|
|
context('for a zero amount', function () {
|
|
|
|
shouldBurnFrom(new BN(0));
|
|
|
|
});
|
|
|
|
|
|
|
|
context('for a non-zero amount', function () {
|
|
|
|
shouldBurnFrom(new BN(100));
|
|
|
|
});
|
|
|
|
|
|
|
|
function shouldBurnFrom (amount) {
|
|
|
|
const originalAllowance = amount.muln(3);
|
|
|
|
|
|
|
|
beforeEach(async function () {
|
|
|
|
await this.token.approve(burner, originalAllowance, { from: owner });
|
|
|
|
this.receipt = await this.token.burnFrom(owner, amount, { from: burner });
|
|
|
|
});
|
|
|
|
|
|
|
|
it('burns the requested amount', async function () {
|
|
|
|
expect(await this.token.balanceOf(owner)).to.be.bignumber.equal(initialBalance.sub(amount));
|
|
|
|
});
|
|
|
|
|
|
|
|
it('decrements allowance', async function () {
|
|
|
|
expect(await this.token.allowance(owner, burner)).to.be.bignumber.equal(originalAllowance.sub(amount));
|
|
|
|
});
|
|
|
|
|
|
|
|
it('emits a transfer event', async function () {
|
|
|
|
expectEvent(this.receipt, 'Transfer', {
|
|
|
|
from: owner,
|
|
|
|
to: ZERO_ADDRESS,
|
|
|
|
value: amount,
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('when the given amount is greater than the balance of the sender', function () {
|
|
|
|
const amount = initialBalance.addn(1);
|
|
|
|
|
|
|
|
it('reverts', async function () {
|
|
|
|
await this.token.approve(burner, amount, { from: owner });
|
|
|
|
await expectRevert(this.token.burnFrom(owner, amount, { from: burner }),
|
|
|
|
'ERC20: burn amount exceeds balance',
|
|
|
|
);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('when the given amount is greater than the allowance', function () {
|
|
|
|
const allowance = new BN(100);
|
|
|
|
|
|
|
|
it('reverts', async function () {
|
|
|
|
await this.token.approve(burner, allowance, { from: owner });
|
|
|
|
await expectRevert(this.token.burnFrom(owner, allowance.addn(1), { from: burner }),
|
|
|
|
'ERC20: insufficient allowance',
|
|
|
|
);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
module.exports = {
|
Rename ERC interfaces to I prefix (#1252)
* rename ERC20 to IERC20
* move ERC20.sol to IERC20.sol
* rename StandardToken to ERC20
* rename StandardTokenMock to ERC20Mock
* move StandardToken.sol to ERC20.sol, likewise test and mock files
* rename MintableToken to ERC20Mintable
* move MintableToken.sol to ERC20Mintable.sol, likewise test and mock files
* rename BurnableToken to ERC20Burnable
* move BurnableToken.sol to ERC20Burnable.sol, likewise for related files
* rename CappedToken to ERC20Capped
* move CappedToken.sol to ERC20Capped.sol, likewise for related files
* rename PausableToken to ERC20Pausable
* move PausableToken.sol to ERC20Pausable.sol, likewise for related files
* rename DetailedERC20 to ERC20Detailed
* move DetailedERC20.sol to ERC20Detailed.sol, likewise for related files
* rename ERC721 to IERC721, and likewise for other related interfaces
* move ERC721.sol to IERC721.sol, likewise for other 721 interfaces
* rename ERC721Token to ERC721
* move ERC721Token.sol to ERC721.sol, likewise for related files
* rename ERC721BasicToken to ERC721Basic
* move ERC721BasicToken.sol to ERC721Basic.sol, likewise for related files
* rename ERC721PausableToken to ERC721Pausable
* move ERC721PausableToken.sol to ERC721Pausable.sol
* rename ERC165 to IERC165
* move ERC165.sol to IERC165.sol
* amend comment that ERC20 is based on FirstBlood
* fix comments mentioning IERC721Receiver
7 years ago
|
|
|
shouldBehaveLikeERC20Burnable,
|
|
|
|
};
|