# The transfer flow

<figure><img src="https://3437812349-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FzLrVMuCawk9OpwBGSbAw%2Fuploads%2Fxar4vs6cP1Cpb3qnAw18%2Fimage%20(9).png?alt=media&#x26;token=e2c218c7-1c4c-4b49-b79e-b969ea175b79" alt=""><figcaption><p>Transafer flow architecture</p></figcaption></figure>

### **1.** User enters a request to transfer funds on tanX. <a href="#alice_enters_a_request_to_transfer_funds_in_the_application_spot" id="alice_enters_a_request_to_transfer_funds_in_the_application_spot"></a>

User enters a request to transfer funds using tanX.

### **2.** tanX sends a `TransferRequest` transaction to Starkware.

tanX sends out a transfer request transaction to the Starkware gateway, using the `add_transaction` API with the `TransferRequest` transaction type.

The request includes the following information:

| `amount`               | The quantized amount of the asset to transfer.                                      |
| ---------------------- | ----------------------------------------------------------------------------------- |
| `sender_public_key`    | The sender’s public Stark key.                                                      |
| `sender_vault_id`      | The sender’s vault id.                                                              |
| `receiver_public_key`  | The receiver’s public Stark key.                                                    |
| `receiver_vault_id`    | The receiver’s vault id.                                                            |
| `token`                | The token to be transferred.                                                        |
| `fee_info_user`        | The maximum fee that the sender is willing to pay for the transaction.              |
| `expiration_timestamp` | The time after which the request is no longer valid, in hours since the Unix epoch. |
| `nonce`                | A nonce issued by tanX, to prevent replay attacks.                                  |
| `signature`            | The sender’s signature.                                                             |

### **3.** Starkware checks the validity of the request.

Starkware checks the following to validate the transfer request:

* The balance in the sender’s vault is sufficient to fulfill the transaction.
* The maximum fee that the party is willing to pay for the transaction is not less than the actual fee.
* The transaction request has not expired.
* According to the orders tree, the order has not already been fulfilled.

### **4.** Starkware includes the transfer in a batch.

If the transfer request is valid, the transfer is included in a batch to be submitted on-chain along with a validity proof.
