Product Docs
  • Introduction
  • Overview
    • Getting started
      • Approve ERC20 tokens
      • Initiating a payment
      • Getting paid
  • DEVELOPERS
    • Developer docs
      • Function payInvoiceERC20
      • Function payInvoiceERC20Escrow
      • Function payOutERC20Invoice
      • Helper functions
  • SUPPORT
    • Contact
Powered by GitBook
On this page
  1. DEVELOPERS
  2. Developer docs

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);         
    }
Parameter
Description

_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
      );

interface IPaytr{
    function payInvoiceERC20Escrow(
        address _payee,
        address _feeAddress,
        uint256 _amount,
        uint256 _feeAmount,
        bytes calldata _paymentReference,
        uint8 _shouldPayoutViaRequestNetwork
    ) external;
}

IPaytr(deployedPaytrAddress).payInvoiceERC20Escrow(
    address _payee,
    address _feeAddress,
    uint256 _amount,
    uint256 _feeAmount,
    bytes calldata _paymentReference,
    uint8 _shouldPayoutViaRequestNetwork
    );
    
//example
IPaytr(deployedPaytrAddress).payInvoiceERC20Escrow(
    0x67B94473D81D0cd00849D563C94d0432Ac988B49,
    0xbF7Dc06Bd27BA2C4013cE02380a85aa7fe860f0A,
    100_000_000, //100 USDC
    5_000_000, //5 USDC fee
    "0x494e56332d32343034",
    0 //the payment will not be routed through Request Network
    );
    
    
PreviousFunction payInvoiceERC20NextFunction payOutERC20Invoice

Last updated 1 year ago