✅Naught Coin
ERC20
Description
NaughtCoin is an ERC20 token and you're already holding all of them. The catch is that you'll only be able to transfer them after a 10 year lockout period. Can you figure out how to get them out to another address so that you can transfer them freely? Complete this level by getting your token balance to 0.
Things that might help:
The ERC20 Spec
The OpenZeppelin codebase
Background Knowledge
OpenZeppelin ERC20
https://docs.openzeppelin.com/contracts/4.x/api/token/erc20
Code Audit
The transfer()
function from ERC20 gets overridden. A modifier lockTokens
is added to transfer()
and there is no way to bypass it. However, recall that transfer()
is not the only function for transferring tokens in ERC20. There is approve()
+ transferFrom()
combo that does the same job (in a different way):
Since contract NaughtCoin is ERC20
, we have access to both approve()
and transferFrom()
.
Solution
Fix the import statement:
Copy and paste the above contract into Remix and interact with it via "At Address".
Invoke
player()
to get player's address. This should be your Metamask wallet address.Call
balanceOf(player)
to enumerate player's balance. The balance is 1000000000000000000000000.Call
approve(<player,1000000000000000000000000>)
to set allowance. This means "letplayer
have the right to manage 1000000000000000000000000 tokens from this contract".Call
transferFrom(player, _to, 1000000000000000000000000)
, where_to
is some random address, it does not matter. I just used my backup Metamask wallet address here.If you call
balanceOf()
again, you will see the balance became 0.
Summary
When using code that's not your own, it's a good idea to familiarize yourself with it to get a good understanding of how everything fits together. This can be particularly important when there are multiple levels of imports (your imports have imports) or when you are implementing authorization controls, e.g. when you're allowing or disallowing people from doing things. In this example, a developer might scan through the code and think that transfer
is the only way to move tokens around, low and behold there are other ways of performing the same operation with a different implementation.
Last updated