Skip to content

Commit f4e2277

Browse files
authored
evm: don't use burnFrom as it's not supported by some tokens (#237)
1 parent 6effa29 commit f4e2277

File tree

2 files changed

+24
-31
lines changed

2 files changed

+24
-31
lines changed

evm/src/NttManager/NttManager.sol

+15-26
Original file line numberDiff line numberDiff line change
@@ -259,27 +259,20 @@ contract NttManager is INttManager, NttManagerState {
259259

260260
{
261261
// Lock/burn tokens before checking rate limits
262-
if (mode == Mode.LOCKING) {
263-
{
264-
// use transferFrom to pull tokens from the user and lock them
265-
// query own token balance before transfer
266-
uint256 balanceBefore = _getTokenBalanceOf(token, address(this));
262+
// use transferFrom to pull tokens from the user and lock them
263+
// query own token balance before transfer
264+
uint256 balanceBefore = _getTokenBalanceOf(token, address(this));
267265

268-
// transfer tokens
269-
IERC20(token).safeTransferFrom(msg.sender, address(this), amount);
266+
// transfer tokens
267+
IERC20(token).safeTransferFrom(msg.sender, address(this), amount);
270268

271-
// query own token balance after transfer
272-
uint256 balanceAfter = _getTokenBalanceOf(token, address(this));
269+
// query own token balance after transfer
270+
uint256 balanceAfter = _getTokenBalanceOf(token, address(this));
273271

274-
// correct amount for potential transfer fees
275-
amount = balanceAfter - balanceBefore;
276-
}
277-
} else if (mode == Mode.BURNING) {
272+
// correct amount for potential transfer fees
273+
amount = balanceAfter - balanceBefore;
274+
if (mode == Mode.BURNING) {
278275
{
279-
// query sender's token balance before burn
280-
uint256 balanceBefore = _getTokenBalanceOf(token, msg.sender);
281-
282-
// call the token's burn function to burn the sender's token
283276
// NOTE: We don't account for burn fees in this code path.
284277
// We verify that the user's change in balance is equal to the amount that's burned.
285278
// Accounting for burn fees can be non-trivial, since there
@@ -291,18 +284,14 @@ contract NttManager is INttManager, NttManagerState {
291284
// Since there is no standard way to query for burn fee amounts with burnable tokens,
292285
// and NTT would be used on a per-token basis, implementing this functionality
293286
// is left to integrating projects who may need to account for burn fees on their tokens.
294-
ERC20Burnable(token).burnFrom(msg.sender, amount);
295-
296-
// query sender's token balance after transfer
297-
uint256 balanceAfter = _getTokenBalanceOf(token, msg.sender);
287+
ERC20Burnable(token).burn(amount);
298288

299-
uint256 balanceDiff = balanceBefore - balanceAfter;
300-
if (balanceDiff != amount) {
301-
revert BurnAmountDifferentThanBalanceDiff(amount, balanceDiff);
289+
// tokens held by the contract after the operation should be the same as before
290+
uint256 balanceAfterBurn = _getTokenBalanceOf(token, address(this));
291+
if (balanceBefore != balanceAfterBurn) {
292+
revert BurnAmountDifferentThanBalanceDiff(balanceBefore, balanceAfterBurn);
302293
}
303294
}
304-
} else {
305-
revert InvalidMode(uint8(mode));
306295
}
307296
}
308297

evm/test/mocks/DummyToken.sol

+9-5
Original file line numberDiff line numberDiff line change
@@ -18,18 +18,22 @@ contract DummyToken is ERC20 {
1818
}
1919

2020
function burnFrom(address, uint256) public virtual {
21-
revert("Locking nttManager should not call 'burnFrom()'");
21+
revert("No nttManager should call 'burnFrom()'");
22+
}
23+
24+
function burn(address, uint256) public virtual {
25+
revert("Locking nttManager should not call 'burn()'");
2226
}
2327
}
2428

2529
contract DummyTokenMintAndBurn is DummyToken {
2630
function mint(address to, uint256 amount) public override {
27-
// TODO - add access control here
31+
// TODO - add access control here?
2832
_mint(to, amount);
2933
}
3034

31-
function burnFrom(address to, uint256 amount) public override {
32-
// TODO - add access control here
33-
_burn(to, amount);
35+
function burn(uint256 amount) public {
36+
// TODO - add access control here?
37+
_burn(msg.sender, amount);
3438
}
3539
}

0 commit comments

Comments
 (0)