> ## Documentation Index
> Fetch the complete documentation index at: https://docs.hedera.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Transfer cryptocurrency

A transaction that transfers HBAR and tokens between Hedera accounts. You can enter multiple transfers in a single transaction. The net value of HBAR between the sending accounts and receiving accounts must equal zero.

For a CryptoTransferTransactionBody:

<Warning>
  * Max of 10 balance adjustments in its HBAR transfer list.
  * Max of 10 fungible token balance adjustments across all its token transfer list.
  * Max of 10 NFT ownership changes across all its token transfer list.
  * Max of 20 balance adjustments or NFT ownership changes implied by a transaction (including custom fees).
  * If you are transferring a token with custom fees, only two levels of nesting fees are allowed.
  * The sending account is responsible to pay for the custom token fees.
</Warning>

**Transaction Fees**

* Please see the transaction and query [fees](/learn/networks/mainnet/fees#transaction-and-query-fees) table for the base transaction fee
* Please use the [Hedera fee estimator](https://hedera.com/fees) to estimate your transaction fee cost

**Spender Account Allowances**

An account can have [another account](/native/accounts/approve-allowance) spend tokens on its behalf. If the delegated spender account is transacting tokens from the owner account that authorized the allowance, the owner account needs to be specified in the transfer transaction by calling one of the following:

* `addApprovedHbarTransfer()`
* `addApprovedTokenTransfer()`
* `addApprovedNftTransfer()`
* `addApprovedTokenTransferWithDecimals()`

The debiting account is the owner's account when using this feature.

<Info>
  **Note**: The allowance spender must pay the fee for the transaction.
</Info>

**Transaction Signing Requirements**

* The accounts the tokens are being debited from are required to sign the transaction
  * If an authorized spender account is spending on behalf of the account that owns the tokens then the spending account is required to sign
* The transaction fee-paying account is required to sign the transaction

## Constructor

| **Constructor**             | **Description**                            |
| --------------------------- | ------------------------------------------ |
| `new TransferTransaction()` | Initializes the TransferTransaction object |

## Transaction Properties

| **Method**                                                                          | **Type**                      | **Requirement** |
| ----------------------------------------------------------------------------------- | ----------------------------- | --------------- |
| `addHbarTransfer(<accountId, amount>)`                                              | AccountId, Hbar               | Required        |
| `addTokenTransfer(<tokenId, accountId, amount>)`                                    | TokenId, AccountId, long      | Optional        |
| `addNftTransfer(<nftId, sender, receiver>)`                                         | NftId, AccountId, AccountId   | Optional        |
| `addTokenTransferWithDecimals(<tokenId, accountId, amount, decimals>)`              | TokenId, AccountId, long, int | Optional        |
| `addApprovedHbarTransfer(<ownerAccountId, amount>)`                                 | AccountId, Hbar               | Optional        |
| `addApprovedTokenTransfer(<tokenId, ownerAccountId, amount>)`                       | TokenId, AccountId, long      | Optional        |
| `addApprovedNftTransfer(<nftId, sender, receiver>)`                                 | NftId, AccountId, AccountId   | Optional        |
| `addApprovedTokenTransferWithDecimals(<tokenId, ownerAccountId, amount, decimals>)` | TokenId, AccountId, long, int | Optional        |
| `setHighVolume(<highVolume>)`                                                       | boolean                       | Optional        |

<Info>
  This transaction supports [high-volume entity creation](/learn/core-concepts/high-volume-entity-creation)
  (HIP-1313) when the transfer **auto-creates new accounts**. Setting `setHighVolume(true)`
  routes the account-creation portion of the transfer through dedicated high-volume throttle
  capacity with variable-rate pricing. The transfer portion itself uses standard throttles
  regardless of this flag. Always pair this with `setMaxTransactionFee()` to cap your costs.
</Info>

<CodeGroup>
  ```java Java theme={null}
  // Create a transaction to transfer 1 HBAR
  TransferTransaction transaction = new TransferTransaction()
       .addHbarTransfer(OPERATOR_ID, new Hbar(-1))
       .addHbarTransfer(newAccountId, evmAddress, new Hbar(1));

  //Submit the transaction to a Hedera network
  TransactionResponse txResponse = transaction.execute(client);

  //Request the receipt of the transaction
  TransactionReceipt receipt = txResponse.getReceipt(client);

  //Get the transaction consensus status
  Status transactionStatus = receipt.status;

  System.out.println("The transaction consensus status is " +transactionStatus);

  //Version 2.0.0
  ```

  ```javascript JavaScript theme={null}
  // Create a transaction to transfer 1 HBAR
  const transaction = new TransferTransaction()
      .addHbarTransfer(OPERATOR_ID, new Hbar(-1))
      .addHbarTransfer(newAccountId, evmAddress, new Hbar(1));

  //Submit the transaction to a Hedera network
  const txResponse = await transaction.execute(client);

  //Request the receipt of the transaction
  const receipt = await txResponse.getReceipt(client);

  //Get the transaction consensus status
  const transactionStatus = receipt.status;

  console.log("The transaction consensus status is " +transactionStatus.toString());

  //v2.0.0
  ```

  ```go Go theme={null}
  // Create a transaction to transfer 1 HBAR
  transaction := hedera.NewTransferTransaction().
  		AddHbarTransfer(client.GetOperatorAccountID(), hedera.NewHbar(-1)).
  		AddHbarTransfer(hedera.AccountID{Account: 3}, hedera.NewHbar(1))

  //Submit the transaction to a Hedera network
  txResponse, err := transaction.Execute(client)

  if err != nil {
      panic(err)
  }

  //Request the receipt of the transaction
  receipt, err := txResponse.GetReceipt(client)

  if err != nil {
      panic(err)
  }

  //Get the transaction consensus status
  transactionStatus := receipt.Status

  fmt.Printf("The transaction consensus status is %v\n", transactionReceipt.Status)

  //Version 2.0.0
  ```

  ```rust Rust theme={null}
  // Create the transfer transaction
  let transaction = TransferTransaction::new()
      .hbar_transfer(account_id, Hbar::from(-10))
      .hbar_transfer(recipient_id, Hbar::from(10));

  // Freeze the transaction for signing, sign with the private key of the account that is sending hbars
  let tx_response = transaction
      .freeze_with(&client)?
      .sign(account_key)
      .execute(&client).await?;

  // Request the receipt of the transaction
  let receipt = tx_response.get_receipt(&client).await?;

  // Get the transaction consensus status
  let status = receipt.status;

  println!("The transaction consensus status is {:?}", status);

  // v0.34.0
  ```
</CodeGroup>

## Get Transaction Values

| **Method**               | **Type**                               | **Description**                                                                                                 |
| ------------------------ | -------------------------------------- | --------------------------------------------------------------------------------------------------------------- |
| `getHbarTransfers()`     | Map\<AccountId, Hbar>                  | Returns the HBAR transfers                                                                                      |
| `getTokenTransfers()`    | Map\<TokenId, Map\<AccountId, long>>   | Returns the token transfers                                                                                     |
| `getTokenNftTransfers()` | Map\<TokenId, List\<TokenNftTransfer>> | Returns the NFT transfers                                                                                       |
| `getHighVolume()`        | boolean                                | Returns whether this transaction uses [high-volume throttles](/learn/core-concepts/high-volume-entity-creation) |

<CodeGroup>
  ```java Java theme={null}
  // Create a transaction 
  CryptoTransferTransaction transaction = new CryptoTransferTransaction()
      .addSender(OPERATOR_ID, new Hbar(1))
      .addRecipient(newAccountId, new Hbar(1));

  //Get transfers
  List<Transfer> transfers = transaction.getTransfers();

  //v2.0.0
  ```

  ```javascript JavaScript theme={null}
  // Create a transaction 
  const transaction = new CryptoTransferTransaction()
      .addSender(OPERATOR_ID, new Hbar(1))
      .addRecipient(newAccountId, new Hbar(1));

  //Get transfers
  const transfers = transaction.getTransfers();

  //v2.0.0
  ```

  ```go Go theme={null}
  // Create a transaction 
  transaction := hedera.NewTransferTransaction().
  		AddHbarTransfer(client.GetOperatorAccountID(), hedera.NewHbar(-1)).
  		AddHbarTransfer(hedera.AccountID{Account: 3}, hedera.NewHbar(1))
  //Get transfers
  transfers := transaction.GetTransfers()

  //v2.0.0
  ```
</CodeGroup>
