Handling unfulfilled transfer requests

Loop does some validations when transfer requests are sent to our backend to ensure that only transfer requests that will be fulfilled are processed on-chain; however, there may be instances where a transaction is executed on-chain, but the transfer request was never fulfilled (i.e. no funds were transferred from the "from" wallet).

Reasons for an unfulfilled transfer request

1) the wrong signer wallet is used,

We validate that the transfer request came from an authorized source by having the details of that transfer request signed by the approved wallet (signer wallet) stored in the contract. Thus, a transfer request will not execute if the signer wallet that produced the signature in the transfer request does not match the signer wallet saved on-chain.

2) the transfer request's signature has already been processed

As a security measure, every transfer request needs a unique signature to be processed. Thus, if a request is sent with a signature that has already been processed on-chain, the transaction will fail.

3) the from wallet has an insufficient balance or token allowance

The keeper network will ignore a transfer request where the from wallet has insufficient balance or allowance. However, it could be the case that when the keeper checked the balance/allowance it was sufficient, and by the time the transaction was sent to the mempool and eventually mined on-chain, that status has changed.

4) if applicable, the inbound treasury address is incorrect

When a transfer request is executed, the contract will validate that the "to" address is the same as the inbound treasury address (if the address is saved in the contract). If the address does not match the inbound treasury address, the transfer request will not be fulfilled.

Loop does not validate on our backend that the inbound treasury address matches what is stored in the contract. Therefore, the keeper network could pick up and try to process a transfer request with an invalid treasury address.

How to handle unfulfilled transfer requests

When a transaction is processed on chain, you will receive a "transaction processed" webhook with a status (success or failed). If you receive a failed transaction and you want to reprocess the transfer request (i.e. the same parameters), you must send the request with a new invoiceID. This is because if you use the exact same 6 parameters and sign with the same wallet, the signature will be the same as the transaction that just failed and thus it will also fail (see reason 2 for failing).

Last updated