Skip to main content
Developer-controlled wallets can send tokens to any address on the same blockchain. After completing this tutorial, you’ll have sent USDC from one developer-controlled wallet to
another. The examples use Arc Testnet, but you can send tokens on any supported blockchain.
Circle offers Gas Station if you want to sponsor gas instead of funding the sender wallet directly. See Send a Gasless Transaction.

Prerequisites

Before you begin, ensure you have:

Step 1. Set up your project

Reuse the dev-controlled-projects folder you created in the Create a dev-controlled wallet quickstart.

1.1. Prepare your project

Add the transfer run command:

1.2. Set environment variables

Add your API key and entity secret to .env:
.env
  • CIRCLE_API_KEY is your Circle Developer API key.
  • CIRCLE_ENTITY_SECRET is your registered entity secret.
Open .env in your editor rather than writing values with shell commands, and add .env to your .gitignore. This prevents credentials from leaking into your shell history or version control.

Step 2. Send USDC between wallets

Write a script that sends USDC from the source wallet, polls for completion, then checks the recipient balance.

2.1. Create the script

Create a send-tokens.ts (or send_tokens.py) file and add the following code. The script calls createTransaction() to initiate the transfer, then polls getTransaction() until the transaction reaches a terminal state: COMPLETE, FAILED, CANCELLED, or DENIED.
If you’re calling the API directly instead of using the SDK, use Create Transfer Transaction, Get Transaction, and List Wallet Balance. Be sure to replace the entity secret ciphertext and idempotency key in your request. If you’re using the SDKs, this is handled automatically for you.

2.2. Run the script

Run the script from your project directory:
The output looks similar to:
You can also monitor the transfer through webhook notifications or by polling Get Transaction.

Next steps

  • Build payment workflows with Arc App Kit: Use the Circle Wallets adapter to add token transfers, swaps, bridging, and chain-agnostic unified balances to your app without building each integration yourself.