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

# Send USDC

> Send USDC from an active OMS Wallet session on Polygon PoS.

Send USDC by submitting an ERC-20 `transfer` contract call from an authenticated non-custodial wallet.

<Note>
  Start with the quickstart for your SDK first: [TypeScript](/wallets/sdk/typescript/quickstart), [React Native](/wallets/sdk/react-native/quickstart), [Swift](/wallets/sdk/swift/quickstart), or [Kotlin](/wallets/sdk/kotlin/quickstart).

  Kotlin snippets call `suspend` SDK APIs; run them from a coroutine.
</Note>

The examples assume the SDK has an active wallet session. USDC uses 6 decimals, so `1.00` USDC is the raw base-unit value `1000000`.

The snippets use native USDC on Polygon PoS mainnet at `0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359`. To test on Polygon Amoy, switch the network value and use a test ERC-20 contract with 6 decimals.

<Warning>
  These examples submit a mainnet transaction. The wallet needs enough USDC for the transfer and, when the preparation response is not sponsored, enough balance in one of the returned fee tokens. See [Gas Sponsorship](/wallets/gas-sponsorship).
</Warning>

<Tabs>
  <Tab title="TypeScript">
    ```typescript theme={null}
    import { FeeOptionSelector, Networks } from '@polygonlabs/oms-wallet'
    import { parseUnits, type Abi, type Address } from 'viem'

    const usdcContract = '0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359' as Address
    const recipient = '0x1111111111111111111111111111111111111111' as Address
    const amount = parseUnits('1.00', 6)

    const usdcAbi = [
      {
        name: 'transfer',
        type: 'function',
        stateMutability: 'nonpayable',
        inputs: [
          { name: 'to', type: 'address' },
          { name: 'amount', type: 'uint256' },
        ],
        outputs: [{ type: 'bool' }],
      },
    ] as const satisfies Abi

    const tx = await omsWallet.wallet.sendTransaction({
      network: Networks.polygon,
      to: usdcContract,
      abi: usdcAbi,
      functionName: 'transfer',
      args: [recipient, amount],
      selectFeeOption: FeeOptionSelector.firstAvailable,
    })

    console.log('USDC transaction:', tx.txnHash ?? tx.txnId)
    ```
  </Tab>

  <Tab title="React Native">
    ```typescript theme={null}
    import {
      FeeOptionSelectors,
      Networks,
      parseUnits,
    } from '@polygonlabs/oms-wallet-react-native'

    const amount = parseUnits('1.00', 6)

    const tx = await omsWallet.wallet.callContract({
      network: Networks.polygon,
      contractAddress: '0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359',
      method: 'transfer(address,uint256)',
      args: [
        { type: 'address', value: '0x1111111111111111111111111111111111111111' },
        { type: 'uint256', value: amount },
      ],
      selectFeeOption: FeeOptionSelectors.firstAvailable,
    })

    console.log('USDC transaction:', tx.txnHash ?? tx.txnId)
    ```
  </Tab>

  <Tab title="Swift">
    ```swift theme={null}
    let amount = try parseUnits(value: "1.00", decimals: 6)

    let tx = try await omsWallet.wallet.callContract(
        network: .polygon,
        contract: "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",
        method: "transfer(address,uint256)",
        args: [
            AbiArg(type: "address", value: .string("0x1111111111111111111111111111111111111111")),
            AbiArg(type: "uint256", value: .string(amount))
        ],
        selectFeeOption: .firstAvailable
    )

    print("USDC transaction:", tx.txnHash ?? tx.txnId)
    ```
  </Tab>

  <Tab title="Kotlin">
    ```kotlin theme={null}
    import technology.polygon.omswallet.Network
    import technology.polygon.omswallet.models.AbiArg
    import technology.polygon.omswallet.models.FeeOptionSelector
    import technology.polygon.omswallet.utils.parseUnits
    import kotlinx.serialization.json.JsonPrimitive

    val amount = parseUnits("1.00", 6)

    val tx = omsWallet.wallet.callContract(
        network = Network.POLYGON,
        contract = "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",
        method = "transfer(address,uint256)",
        args = listOf(
            AbiArg(type = "address", value = JsonPrimitive("0x1111111111111111111111111111111111111111")),
            AbiArg(type = "uint256", value = JsonPrimitive(amount.toString())),
        ),
        selectFeeOption = FeeOptionSelector.firstAvailable,
    )

    println("USDC transaction id: ${tx.txnId}")
    println("USDC transaction hash: ${tx.txnHash}")
    ```
  </Tab>
</Tabs>

The SDK uses the same transaction lifecycle for this contract call as for a native transfer. Check `status` and `statusResolution` rather than treating the presence of `txnId` as success. Preserve `txnId` and query transaction status before retrying when polling times out or the outcome is uncertain.
