Function payInvoiceERC20Escrow

This function allows anyone to make an escrow payment. There is no due date to be passed upon creating the payment. The function automatically sets a due date of 0.

The payment can be released at a later time by calling the releaseEscrowPayment function.

function payInvoiceERC20Escrow(
        address _payee,
        address _feeAddress,
        uint256 _amount,
        uint256 _feeAmount,
        bytes calldata _paymentReference,
        uint8 _shouldPayoutViaRequestNetwork
        ) external nonReentrant whenNotPaused {

            PaymentERC20 storage paymentERC20 = paymentMapping[_paymentReference];
            uint256 totalAmount = _amount + _feeAmount;

            if(_amount == 0) revert ZeroAmount();
            if(_payee == address(0)) revert ZeroPayeeAddress();
            if(_feeAddress == address(0)) revert ZeroFeeAddress();
            if(paymentERC20.amount != 0) revert PaymentReferenceInUse();
            if(totalAmount < minTotalAmountParameter) revert InvalidTotalAmount();

            IERC20(baseAsset).safeTransferFrom(msg.sender, address(this), totalAmount);
            
            uint256 cUsdcbalanceBeforeSupply = getContractCometBalance();
            IComet(cometAddress).supply(baseAsset, totalAmount);
            uint256 cUsdcbalanceAfterSupply = getContractCometBalance();
            uint256 cUsdcAmountToWrap = cUsdcbalanceAfterSupply - cUsdcbalanceBeforeSupply;         

            uint256 wrappedShares = IWrapper(wrapperAddress).deposit(cUsdcAmountToWrap, address(this));

            paymentMapping[_paymentReference] = PaymentERC20({
                amount: _amount,
                feeAmount: _feeAmount,
                wrapperSharesReceived: wrappedShares,
                dueDate: 0,
                payer: msg.sender,
                payee: _payee,
                feeAddress: _feeAddress,
                shouldPayoutViaRequestNetwork: _shouldPayoutViaRequestNetwork
            });

        emit PaymentERC20Event(baseAsset, _payee, _feeAddress, _amount, 0, _feeAmount, _paymentReference);         
    }
ParameterDescription

_payee

The receiver of the principal amount.

_feeAddress

In case you want to charge an extra fee, this is the receiving address of the fee.

_amount

The fee amount in wei. Make sure to double-check the number of decimals of the baseAsset.

_feeAmount

The fee amount in wei. Make sure to double-check the number of decimals of the baseAsset.

_paymentReference

Reference of the related payment. Make sure to add salt to and hash the _paymentReference to increase privacy and prevent double references.

_shouldPayOutViaRequestNetwork

This is a uint8 parameter. Pass a value != 0 if you want the payout of the invoice routed through Request Network's ERC20FeeProxy contract.

The _amount and _feeAmount total are transferred to Compound Finance's Comet contract, to earn yield. The payment details are stored in the paymentMapping.

Parameter _shouldPayOutViaRequestNetwork is a uint8 to save on gas fees (compared to a bool). You can pass a value of 0 if you don't want the payment to be routed through Request Network.

Interact with the payInvoiceERC20 function:

const paytrContract = new ethers.Contract(paytrContractAddress, PaytrABI, signer);

await paytrContract.payInvoiceERC20Escrow(
      payeeAddress,
      feeAddress,
      amount,
      feeAmount,
      paymentReference, //bytes
      shouldPayOutViaRequestNetwork
      );

//example:      
await paytrContract.payInvoiceERC20(
      "0x67B94473D81D0cd00849D563C94d0432Ac988B49",
      "0xbF7Dc06Bd27BA2C4013cE02380a85aa7fe860f0A",
      100_000_000, //100 USDC
      5_000_000, //5 USDC fee
      "0x494e56332d32343034",
      0 //the payment will not be routed through Request Network
      );

Last updated