From 198a10ee9e896d5b4c86abdf8a464a925a022f1d Mon Sep 17 00:00:00 2001 From: Truls Asheim Date: Tue, 29 Jan 2019 17:49:29 +0100 Subject: [PATCH] Emit Approval events from burnFrom and transferFrom (Closes #74) (#81) * Emit Approval events from burnFrom and transferFrom (Closes #74) * Emit absolute approval amounts with approval events --- contracts/token/ERC20/ExternalERC20.sol | 2 ++ .../ERC20/behaviors/ERC20.public.behavior.js | 27 ++++++++++++++----- .../ERC20/behaviors/ERC20Burnable.behavior.js | 8 ++++++ 3 files changed, 31 insertions(+), 6 deletions(-) diff --git a/contracts/token/ERC20/ExternalERC20.sol b/contracts/token/ERC20/ExternalERC20.sol index a984089..d9f2fcb 100644 --- a/contracts/token/ERC20/ExternalERC20.sol +++ b/contracts/token/ERC20/ExternalERC20.sol @@ -181,6 +181,7 @@ contract ExternalERC20 is IERC20 { _externalERC20Storage.allowed(from, originSender).sub(value) ); _transfer(from, to, value); + emit Approval(from, originSender, _externalERC20Storage.allowed(from, originSender)); } /** @@ -283,5 +284,6 @@ contract ExternalERC20 is IERC20 { _externalERC20Storage.allowed(account, burner).sub(value) ); _burn(account, value); + emit Approval(account, burner, _externalERC20Storage.allowed(account, burner)); } } diff --git a/test/token/ERC20/behaviors/ERC20.public.behavior.js b/test/token/ERC20/behaviors/ERC20.public.behavior.js index 9e6e37a..42dc54a 100644 --- a/test/token/ERC20/behaviors/ERC20.public.behavior.js +++ b/test/token/ERC20/behaviors/ERC20.public.behavior.js @@ -186,13 +186,28 @@ function shouldBehaveLikeERC20PublicAPI (owner, recipient, anotherAccount) { (await this.token.allowance(owner, spender)).should.be.bignumber.equal(0); }); - it('emits a transfer event', async function () { - const { logs } = await this.token.transferFrom(owner, to, amount, { from: spender }); + describe('emits', function () { + let events; - expectEvent.inLogs(logs, 'Transfer', { - from: owner, - to: to, - value: amount + beforeEach(async function () { + const { logs } = await this.token.transferFrom(owner, to, amount, { from: spender }); + events = logs; + }); + + it('a transfer event', async function () { + expectEvent.inLogs(events, 'Transfer', { + from: owner, + to: to, + value: amount + }); + }); + + it('an approval event', async function () { + expectEvent.inLogs(events, 'Approval', { + owner: owner, + spender: spender, + value: 0 + }); }); }); }); diff --git a/test/token/ERC20/behaviors/ERC20Burnable.behavior.js b/test/token/ERC20/behaviors/ERC20Burnable.behavior.js index 61e9d23..dd00b54 100644 --- a/test/token/ERC20/behaviors/ERC20Burnable.behavior.js +++ b/test/token/ERC20/behaviors/ERC20Burnable.behavior.js @@ -84,6 +84,14 @@ function shouldBehaveLikeERC20Burnable (owner, initialBalance, [burner]) { value: amount }); }); + + it('emits an approval event', async function () { + expectEvent.inLogs(this.logs, 'Approval', { + owner: owner, + spender: burner, + value: originalAllowance - amount + }); + }); } });