when i am going to call approve function of erc20 contract.log prints tokenOwner and tokenSpender address same which is contract address msg.sender returns contract address. but i want tokenWner = caller address and tokenSpender = contract address please help.
THis is erc20 method
function approve(address spender, uint256 tokens) public returns (bool success) {
allowed[msg.sender][spender] = tokens;
emit Approval(msg.sender, spender, tokens);
return true;
}
And this is my contract method that is calling token method
function approve(address token, uint256 _value) public returns (bool) {
return ERC20Interface(token).approve(this, _value);
}
1 Like
Hi @love_chawda,
Welcome to the community
Only the holder of the tokens can call approve
to set an allowance for a spender.
A contract cannot call approve
on behalf of a holder as the ERC20 token uses msg.sender
to determine the holder.
To spend an ERC20 token a holder must:
- Approve an allowance for the spender by calling
approve
on the token
- Call the contract which will use the token and the contract will call
transferFrom
(using the allowance for the contract for that holder).
If you are creating a token yourself you could look at creating ERC777 tokens (no need to do approve
and transferFrom
in two separate transactions). See the documentation for details: https://docs.openzeppelin.com/contracts/2.x/tokens#ERC777
Hi @love_chawda,
I wanted to check that the above answered your question.
yes i have checked. Thankyou for your reply
1 Like