> ## 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. Testnet transaction fees are sponsored; mainnet preparation may instead return fee options.
</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.
