krakas
krakas

Reputation: 43

ERC20 Payment processing

What's wrong with my smart contract, because I get "Error: cannot estimate gas; transaction may fail or may require manual gas limit". On frontend I am calling approveTokens() first and acceptPayment() later

pragma solidity ^0.8.11;

import '@openzeppelin/contracts/token/ERC20/IERC20.sol';

contract PaymentProcessor {
   address public owner;
   IERC20 public token;

constructor(address _owner, address _token) {
    owner = _owner;
    token = IERC20(_token);
}

event PaymentCompleted(
    address payer,
    uint256 amount,
    uint paymentId,
    uint timestamp
);

function approveTokens(uint256 amount) public returns(bool){
   token.approve(owner, amount);
   return true;
}

function getAllowance() public view returns(uint256){
    return token.allowance(msg.sender, owner);
}

function acceptPayment(uint256 amount, uint paymentId) payable public {
    require(amount > getAllowance(), "Please approve tokens before transferring");
    token.transfer(owner, amount);

    emit PaymentCompleted(msg.sender, amount, paymentId, block.timestamp);
}

}

Upvotes: 0

Views: 104

Answers (1)

Petr Hejda
Petr Hejda

Reputation: 43521

Users need to call approve() directly on the token address - not through your contract.

Your current implementation approves owner to spend PaymentProcessor's tokens because PaymentProcessor is the msg.sender in the context of the token contract.

Upvotes: 1

Related Questions