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

# Transfer SOL and Tokens

Most app flows start with a wallet handle, then prepare one movement at a time.

## Start from a wallet handle

Attach to an existing wallet with the config address, wallet address, and the
authority that should sign on the client:

<CodeGroup dropdown>
  ```typescript TypeScript theme={null}
  const wallet = swig.wallets.use({
    swigConfigAddress,
    walletAddress,
    requesterAuthority: {
      ed25519: {
        publicKey: userPublicKey,
      },
    },
  });
  ```

  ```python Python theme={null}
  wallet = swig.wallets.use(
      swig_config_address,
      requester_authority={
          "ed25519": {
              "publicKey": user_public_key,
          },
      },
  )
  ```
</CodeGroup>

The same handle shape works for `secp256k1` and `secp256r1` authorities too.

If you already have an IDP session, the same model works through
`swig.wallets.fromIdpSession(session)`.

## SOL transfer

<CodeGroup dropdown>
  ```typescript TypeScript theme={null}
  const preparedTransfer = await wallet.transfer.sol({
    feePayer,
    destination,
    amount: 1_000_000n,
  });
  ```

  ```python Python theme={null}
  prepared_transfer = await wallet.transfer.sol(
      fee_payer=fee_payer,
      destination=destination,
      amount=1_000_000,
  )
  ```
</CodeGroup>

## Token transfer

Token transfers are owner-based. The backend derives the token program, source
ATA, destination ATA, and any destination ATA creation it needs.

<CodeGroup dropdown>
  ```typescript TypeScript theme={null}
  const preparedTokenTransfer = await wallet.transfer.token({
    feePayer,
    mint,
    destinationOwner,
    amount: 10_000n,
  });
  ```

  ```python Python theme={null}
  prepared_token_transfer = await wallet.transfer.token(
      fee_payer=fee_payer,
      mint=mint,
      destination_owner=destination_owner,
      amount=10_000,
  )
  ```
</CodeGroup>

## How to read the result

Prepared results are intentionally split:

| TypeScript / Python                                             | Meaning                                                     |
| --------------------------------------------------------------- | ----------------------------------------------------------- |
| `transactions`                                                  | ordered transactions to submit                              |
| `clientAuthorityTransactions` / `client_authority_transactions` | transactions that still need client authority               |
| `feePayerOnlyTransactions` / `fee_payer_only_transactions`      | transactions that only need fee payer or sponsor submission |
| `signatureRequests` / `signature_requests`                      | per-transaction signature metadata                          |

## Submission

Use [Client Signing](/developer-sdk/client-signing) for the signing step, then
use [Sponsor & Submit](/developer-sdk/sponsor-and-submit) or your own send path
to finish submission.
