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

# Send tokens

> Here's exactly how you can send tokens from your Portal wallet to another address.

## Fund your Wallet

Now that you have a wallet, the next step is to get test tokens for it. You can fund your wallet using **`portal.receiveTestnetAsset`**. If you are looking for a greater variety of test tokens, we recommend exploring our [faucets page](../../../resources/testnet-faucets).

<Note>
  The `chainId` will need to be a [CAIP-2](https://github.com/ChainAgnostic/CAIPs/blob/main/CAIPs/caip-2.md) compliant Chain ID. For more info on Chain ID formatting, see [this doc](../../../resources/chain-id-formatting).
</Note>

```swift theme={null}
let chainId = "eip155:10143" // Monad Testnet

let params = FundParams(
  amount: "0.01", // You will receive 0.01 MON
  token: "NATIVE" // Token, use "NATIVE" for the chain's native token
)

// Fund your Portal wallet
let response = portal.receiveTestnetAsset(chainId, params)

print("✅ Transaction hash: \(response.data.txHash)")
```

## Sending Tokens from your Wallet

Portal provides two ways to send transactions:

1. **`portal.sendAsset()`** - A simple method for sending tokens from your Portal wallet.
2. **`portal.provider.request()`** - Direct access to the underlying web3 provider for custom transactions. (You can learn more about this method [here](./sign-a-transaction).)

For most use cases, we recommend using **`portal.sendAsset()`** as shown in the examples below.

### Submitting an EVM Transaction

```swift theme={null}
let chainId = "eip155:10143" // Monad Testnet

let params = SendAssetParams(
  to: "0xDestinationAddress", // The recipient address
  amount: "0.0001", // Sends 0.0001 MON
  token: "NATIVE", // Token, use "NATIVE" for the chain's native token
  signatureApprovalMemo: "test" // Optional signature approval memo to use for the request
)

// Send the tokens
let txHash = try await portal.sendAsset(chainId, params)

print("✅ Transaction hash: \(txHash)")
```

<Warning>
  If your Portal client is using [Account Abstraction](../../../resources/account-abstraction), then **`txHash`** is actually a **User Operation hash**. You can manually look up the user operation hash [here](https://jiffyscan.xyz/?network=sepolia).
</Warning>

### Submitting a Solana Transaction

<Note>
  You will need **`SOL`** to submit a Solana transaction, which is not currently supported by **`portal.receiveTestnetAsset`**. You can find a faucet to get test **`SOL`** tokens [here](../../../resources/testnet-faucets).
</Note>

```swift theme={null}
let chainId = "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1" // Solana Devnet

let params = SendAssetParams(
  to: "0xDestinationAddress", // The recipient address
  amount: "0.0001", // Sends 0.0001 SOL
  token: "NATIVE", // Token, use "NATIVE" for the chain's native token
  signatureApprovalMemo: "test" // Optional signature approval memo to use for the request
)

// Send the tokens
let response = try await portal.sendAsset(chainId, params)

print("✅ Transaction hash: \(response.result)")
```

You just sent your first token from your Portal wallet, that's awesome! 🎉

## Advanced: Controlling Gas Sponsorship

If your client is using [Account Abstraction](../../../resources/account-abstraction), you can control whether Portal sponsors the gas fees for each transaction using the `sponsorGas` parameter in `SendAssetParams`.

### Example: User Pays Gas

```swift theme={null}
let chainId = "eip155:11155111" // Ethereum Sepolia

let params = SendAssetParams(
  to: "0xDestinationAddress",
  amount: "0.0001",
  token: "NATIVE",
  sponsorGas: false // Portal client pays transaction fees
)

// Send the tokens
let txHash = try await portal.sendAsset(chainId, params)

print("✅ Transaction hash: \(txHash)")
```

By setting `sponsorGas: false`, the Portal client will pay for the transaction fees instead of having them sponsored. This is useful for testing or when you want users to pay for specific operations.

<Note>
  Omitting `sponsorGas` or setting it to `true` produces the same behavior - both will sponsor gas if your environment is configured for AA on that chain. Only `sponsorGas: false` changes the default behavior to disable sponsorship.
</Note>

Learn more about gas sponsorship control in the [Account Abstraction guide](../../../resources/account-abstraction#controlling-gas-sponsorship-per-transaction).

You may have a more advanced use case than simply sending tokens from your Portal wallet. Next, we will dive into how to build your own transaction and also how to sign it (without submitting it).
