Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.arc.io/llms.txt

Use this file to discover all available pages before exploring further.

The App Kit SDK signs transactions through an adapter that wraps a signer your backend already trusts. Wallet providers are managed services that hold your keys and sign on your backend’s behalf. For how to initialize an adapter, see Adapter setups.
Circle Wallets: Dev-Controlled (SCA), Circle Wallets: Modular, and Privy server wallets can’t sign their own Unified Balance spends. For those, assign a delegate EOA to sign on their behalf. See Unified Balance delegate deposit and spend.
Each tab covers one wallet provider. Pick the provider you want to use.
Circle Wallets: Dev-Controlled (EOA) is a standard EVM account managed by Circle’s MPC service. Each transaction goes onchain as a normal signed transaction.

Prerequisites

Circle Wallets: Dev-Controlled (EOA) require:

Credentials

The Circle Wallets adapter requires these credentials from the Circle Console:
.env
CIRCLE_API_KEY=YOUR_TEST_API_KEY:...:...
CIRCLE_ENTITY_SECRET=YOUR_64_CHAR_ENTITY_SECRET
CIRCLE_WALLET_SET_ID=         # filled in by the provisioning step on first run
CIRCLE_EOA_WALLET_ADDRESS=

Initialization

The Circle Wallets adapter provisions wallet sets and wallets in code. The construction below creates a wallet set and an EOA wallet (skipping when the IDs are already set), then wires the adapter:
TypeScript
import { AppKit } from "@circle-fin/app-kit";
import { createCircleWalletsAdapter } from "@circle-fin/adapter-circle-wallets";
import { initiateDeveloperControlledWalletsClient } from "@circle-fin/developer-controlled-wallets";

// One-time wallet provisioning. Run this script once with the IDs blank;
// copy the printed values into .env, then re-run for normal operation.
const circleClient = initiateDeveloperControlledWalletsClient({
  apiKey: process.env.CIRCLE_API_KEY!,
  entitySecret: process.env.CIRCLE_ENTITY_SECRET!,
});

if (!process.env.CIRCLE_WALLET_SET_ID) {
  const ws = await circleClient.createWalletSet({ name: "app-kit-wallets" });
  console.log("CIRCLE_WALLET_SET_ID=" + ws.data!.walletSet!.id);
  process.exit(0);
}

if (!process.env.CIRCLE_EOA_WALLET_ADDRESS) {
  const wallets = await circleClient.createWallets({
    walletSetId: process.env.CIRCLE_WALLET_SET_ID!,
    blockchains: ["ARC-TESTNET" as any], // one chain at a time; repeat for cross-chain
    accountType: "EOA",
    count: 1,
  });
  console.log(
    "CIRCLE_EOA_WALLET_ADDRESS=" + wallets.data!.wallets![0]!.address,
  );
  process.exit(0);
}

// The Circle Wallets adapter signs every chain via Circle's API. Use it across
// send, bridge, swap, and unified balance operations.
const kit = new AppKit();
const adapter = createCircleWalletsAdapter({
  apiKey: process.env.CIRCLE_API_KEY!,
  entitySecret: process.env.CIRCLE_ENTITY_SECRET!,
});

What to know

Behavior specific to Circle Wallets: Dev-Controlled (EOA):
  • Each Circle Wallet exists on a single chain. For cross-chain flows, provision one wallet per source chain (their onchain addresses will differ).
  • For Unified Balance spend, the App Kit SDK requires a distinct adapter instance per source. The adapter is stateless, so call createCircleWalletsAdapter again.
  • Bridges from Arc Testnet must exceed the CCTPv2 max fee (around 1.4 USDC), or the burn step reverts with "Max fee must be less than amount".