Skip to main content
Before you can start market making, you need to complete these one-time setup steps — deposit USDC.e to Polygon, deploy a wallet, approve tokens for trading, and generate API credentials.
1

Deposit USDC.e

Market makers need USDC.e on Polygon to fund their trading operations.
MethodBest ForDocumentation
Bridge APIAutomated deposits from other chainsBridge Deposit
Direct Polygon transferAlready have USDC.e on PolygonN/A
Cross-chain bridgeLarge deposits from EthereumSupported Assets

Using the Bridge API

// Get deposit addresses for your Polymarket wallet
const deposit = await fetch("https://bridge.polymarket.com/deposit", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({
    address: "YOUR_POLYMARKET_WALLET_ADDRESS",
  }),
});

// Returns deposit addresses for EVM, SVM, and BTC networks
const addresses = await deposit.json();
// Send USDC to the appropriate address for your source chain
2

Deploy a Wallet

EOA

Standard Ethereum wallet. You pay for all onchain transactions (approvals, splits, merges, trade execution).

Safe Wallet

Gnosis Safe-based wallet deployed via Polymarket’s relayer. Benefits:
  • Gasless transactions — Polymarket pays gas fees for onchain operations
  • Contract wallet — Enables advanced features like batched transactions
Deploy a Safe wallet using the Relayer Client:
import { RelayClient, RelayerTxType } from "@polymarket/builder-relayer-client";

const client = new RelayClient(
  "https://relayer-v2.polymarket.com/",
  137, // Polygon mainnet
  signer,
  builderConfig,
  RelayerTxType.SAFE,
);

// Deploy the Safe wallet
const response = await client.deploy();
const result = await response.wait();
console.log("Safe Address:", result?.proxyAddress);
See Gasless Transactions for full Relayer Client setup including local and remote signing configurations.
3

Approve Tokens

Before trading, you must approve the exchange contracts to spend your tokens.

Required Approvals

TokenSpenderPurpose
USDC.eCTF ContractSplit USDC.e into outcome tokens
CTF (outcome tokens)CTF ExchangeTrade outcome tokens
CTF (outcome tokens)Neg Risk CTF ExchangeTrade neg-risk market tokens

Contract Addresses

const ADDRESSES = {
  USDCe: "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174",
  CTF: "0x4D97DCd97eC945f40cF65F87097ACe5EA0476045",
  CTF_EXCHANGE: "0x4bFb41d5B3570DeFd03C39a9A4D8dE6Bd8B8982E",
  NEG_RISK_CTF_EXCHANGE: "0xC5d563A36AE78145C45a50134d48A1215220f80a",
  NEG_RISK_ADAPTER: "0xd91E80cF2E7be2e162c6513ceD06f1dD0dA35296",
};

Approve via Relayer Client

import { ethers } from "ethers";
import { Interface } from "ethers/lib/utils";

const erc20Interface = new Interface([
  "function approve(address spender, uint256 amount) returns (bool)",
]);

// Approve USDCe for CTF contract
const approveTx = {
  to: ADDRESSES.USDCe,
  data: erc20Interface.encodeFunctionData("approve", [
    ADDRESSES.CTF,
    ethers.constants.MaxUint256,
  ]),
  value: "0",
};

const response = await client.execute([approveTx], "Approve USDCe for CTF");
await response.wait();
4

Generate API Credentials

To place orders and access authenticated endpoints, you need L2 API credentials derived from your wallet.
import { ClobClient } from "@polymarket/clob-client";

const client = new ClobClient("https://clob.polymarket.com", 137, signer);

// Derive API credentials from your wallet
const credentials = await client.createOrDeriveApiKey();
console.log("API Key:", credentials.key);
console.log("Secret:", credentials.secret);
console.log("Passphrase:", credentials.passphrase);
Once you have credentials, initialize the client for authenticated operations:
const tradingClient = new ClobClient(
  "https://clob.polymarket.com",
  137,
  wallet,
  credentials,
);
See Authentication for full details on signature types and REST API headers.

Next Steps