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

# Transfer Tokens

Send tokens to any Spark address. Transfers are instant, free, and recipients receive them automatically.

<Frame className="chill">
  <img className="block dark:hidden" src="https://mintcdn.com/lightspark/OQ3nooAPVcDN2i7X/images/issuance/token-transfers-light.png?fit=max&auto=format&n=OQ3nooAPVcDN2i7X&q=85&s=8f5b69fb3cc7cf3202c362b70902d925" alt="Transfer Tokens" width="3840" height="2160" data-path="images/issuance/token-transfers-light.png" />

  <img className="hidden dark:block" src="https://mintcdn.com/lightspark/OQ3nooAPVcDN2i7X/images/issuance/token-transfers.png?fit=max&auto=format&n=OQ3nooAPVcDN2i7X&q=85&s=e39fba3e8c92be0db8c4d2a91c629048" alt="Transfer Tokens" width="3840" height="2160" data-path="images/issuance/token-transfers.png" />
</Frame>

## Send Tokens

```typescript theme={null}
const [tokenIdentifier] = await wallet.getIssuerTokenIdentifiers();
if (!tokenIdentifier) throw new Error("No token identifiers found for this issuer");

await wallet.transferTokens({
  tokenIdentifier,
  tokenAmount: 100_000000n, // 100 tokens (6 decimals)
  receiverSparkAddress: "spark1abc..."
});
```

## Batch Transfer

Send to multiple recipients in a single transaction:

```typescript theme={null}
await wallet.batchTransferTokens([
  { tokenIdentifier, tokenAmount: 1000_000000n, receiverSparkAddress: "spark1alice..." },
  { tokenIdentifier, tokenAmount: 500_000000n, receiverSparkAddress: "spark1bob..." },
  { tokenIdentifier, tokenAmount: 250_000000n, receiverSparkAddress: "spark1carol..." }
]);
```

Batch transfers are atomic. All succeed or none do. Each item in the array must include its own `tokenIdentifier`.

## Token Amounts

All amounts are in base units. If your token has 6 decimals:

| Human | Base Units  |
| :---- | :---------- |
| 1     | 1,000,000   |
| 100   | 100,000,000 |
| 0.5   | 500,000     |

```typescript theme={null}
function toBaseUnits(amount: string, decimals: number): bigint {
  const [whole, fraction = ""] = amount.split(".");
  const fractionPadded = (fraction + "0".repeat(decimals)).slice(0, decimals);
  return BigInt(whole || "0") * 10n ** BigInt(decimals) + BigInt(fractionPadded || "0");
}

await wallet.transferTokens({
  tokenIdentifier,
  tokenAmount: toBaseUnits("50.5", 6),
  receiverSparkAddress: "spark1..."
});
```

## Receiving Tokens

Recipients don't need to do anything. Tokens appear instantly:

```typescript theme={null}
const { tokenBalances } = await wallet.getBalance();

tokenBalances.forEach((data, key) => {
  console.log(data.tokenMetadata.tokenName, ":", data.ownedBalance);
});
```
