# The transfer flow

<figure><img src="https://2540391201-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FDp4xlYT3A4hNguxDyFzM%2Fuploads%2FvmhsByarj9GXxksMcmR6%2Fimage.png?alt=media&#x26;token=a8804d43-5c7a-4fcd-a575-3aacab8b9065" alt=""><figcaption><p>Transafer flow architecture</p></figcaption></figure>

### **1.** User enters a request to transfer funds on Brine. <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 Brine.

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

Brine 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 Brine, 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.
