Skip to main content
Simmer’s default wallet path is the V2 deposit wallet (DW). Cohort-A external wallets remain supported as the legacy path for teams already operating with local signing. Both use the same trade API.
Deposit wallet (default, V2)Cohort-A external wallet (legacy)
Primary pathNew production setupExisting Cohort-A setup
Custody modelManaged signing or external local signing; both use DW collateralSelf-custody on the legacy direct-EOA path
SetupAPI key for managed signing, or WALLET_PRIVATE_KEY + dashboard activation for external signingWALLET_PRIVATE_KEY env var + legacy activation/approvals
Best forDefault V2 trading, gasless orders, bridge funding, and either signing modelExisting Cohort-A accounts that have not upgraded

External wallet

Set WALLET_PRIVATE_KEY=0x... in your environment. The SDK signs trades locally — your key never leaves your machine.
export WALLET_PRIVATE_KEY="0x..."

One-time setup

from simmer_sdk import SimmerClient

# from_env() reads SIMMER_API_KEY and auto-detects WALLET_PRIVATE_KEY (SDK 0.13.0+)
client = SimmerClient.from_env()

# Step 1: Link wallet to your Simmer account
client.link_wallet()
After linking, open your agent’s Wallet tab in the dashboard and click Fund & activate trading. The wizard activates your Deposit Wallet, sets allowances, and bridges funds to pUSD in one flow. For legacy Cohort A accounts, activation may include the upgrade transaction that deploys the Deposit Wallet. V2 trades are gasless — no POL is needed.
# Step 2: Trade (after dashboard activation)
client.trade(market_id="uuid", side="yes", amount=10.0, venue="polymarket")

Requirements

  • WALLET_PRIVATE_KEY — a Polygon/EVM EOA private key
  • Dashboard access for the one-time Fund & activate trading wizard (handles approvals and funding)
No ongoing gas balance is needed — V2 Polymarket trades are gasless.

Legacy setup (Cohort A)

This applies to accounts set up before the V2 Deposit Wallet migration. New accounts should use the dashboard activation wizard above.
If your account is on the legacy direct-EOA path, you set Polymarket contract approvals directly with the SDK instead of using the dashboard wizard:
# Set Polymarket contract approvals -- requires: pip install eth-account
result = client.set_approvals()  # 9 on-chain txs
print(f"Set {result['set']} approvals, skipped {result['skipped']}")
Legacy requirements:
  • USDC.e (bridged USDC, contract 0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174) on Polygon — not native USDC
  • Small POL balance on Polygon for gas (~$0.01 per approval, 9 approvals total)
To upgrade to the V2 Deposit Wallet path (gasless trades, multi-chain bridge funding), open the Wallets tab in the dashboard and follow the upgrade prompt.

REST API equivalent (legacy Cohort A)

If not using the Python SDK on the legacy path:
  1. GET /api/polymarket/allowances/{your_wallet_address} — check which approvals are missing
  2. Sign the missing approval transactions locally with your private key
  3. POST /api/sdk/wallet/broadcast-tx with {"signed_tx": "0x..."} — broadcast each signed tx

Risk exits for external wallets

Stop-loss and take-profit are monitored in real time. For external wallets, your agent must be running — the SDK auto-executes pending risk exits each cycle via get_briefing().

Auto-redeem for external wallets

The server cannot sign redemptions for you — your private key never leaves your machine. The SDK’s auto_redeem() method handles the full 3-step flow (unsigned tx → local signing → broadcast → report) automatically:
# Call once per cycle -- safe to call frequently
results = client.auto_redeem()
for r in results:
    print(f"Redeemed {r['market_id']}: {r}")
See the Redemption guide for the full flow diagram, Kalshi details, and how to build your own signing flow without the Python SDK.

Deposit Wallet (Polymarket)

For Polymarket trading, every user has a Deposit Wallet in addition to their agent wallet — a smart contract proxy on Polygon that holds the pUSD collateral your trades settle in. The agent wallet (your EOA) owns the contract and signs orders; the Deposit Wallet holds the funds. This is Polymarket’s V2 model — Simmer surfaces it through the dashboard. Two addresses, two roles:
Agent wallet (EOA)Deposit Wallet
TypeExternally-owned accountERC-1967 proxy contract
HoldsNothing in normal operation (V2 trades are gasless; pUSD lives on the Deposit Wallet)pUSD (V2 collateral)
SignsTrades via your key (external) or Simmer’s server key (managed)Owned + signed for by the agent wallet
ChainPolygonPolygon — same address on Base/Ethereum/other chains is empty space
Funding (recommended): Open your agent’s Wallet tab in the dashboard and click Fund & activate trading. The wizard opens a multi-chain bridge that accepts USDC, USDT, or USDC.e on Ethereum, Polygon, Base, Arbitrum, or Solana — the bridge converts to pUSD on your Deposit Wallet automatically. This is the default path for new accounts and the only path that accepts anything other than USDC.e on Polygon. V2 trades are gasless, so no POL is needed for normal trading. Funding (direct USDC.e): If you already hold USDC.e on Polygon, send it directly to your agent wallet EOA (visible in the dashboard Wallets tab). The atomic “Move to trading” flow wraps it to pUSD and transfers it to your Deposit Wallet in one batched transaction. This path only accepts USDC.e on Polygon — native USDC, USDT, POL, ETH, or any cross-chain asset sent to the agent wallet expecting an auto-sweep will sit there unrecognized. Use the bridge wizard above for anything else. Never send funds directly to the Deposit Wallet address — its only withdrawal paths are USDC.e and pUSD, so any other asset (POL, ETH, native USDC, wrong-chain) sent there cannot be moved out. See the V2 Migration page for the full funding warning + recovery rules. External vs managed: Both modes have a Deposit Wallet on Polymarket. The custody distinction (who holds the agent wallet’s private key) is unchanged — managed users delegate signing to Simmer’s server; external users sign locally. The Deposit Wallet is owned by the agent wallet either way.

OWS wallet (per-agent self-custody)

OWS (Open Wallet Standard) is a third option for self-custody — instead of holding WALLET_PRIVATE_KEY in your environment, an OWS daemon manages keys in a local vault and signs orders on the SDK’s behalf. Each agent can have its own OWS wallet, which is useful when one process runs multiple agents.
from simmer_sdk import SimmerClient

# SDK 0.13.0+ — explicit OWS wallet routing
client = SimmerClient.with_ows_wallet("my-agent-wallet")

# Or via env var (OWS_WALLET=my-agent-wallet)
client = SimmerClient.from_env()
Setup is covered by the simmer-wallet-setup skill on ClawHub — install the skill in your agent and follow its OWS path. The skill walks through OWS daemon installation, wallet creation, and client.register_agent_wallet() (Elite-tier gated). Once registered, the SDK signs all orders through OWS. WALLET_PRIVATE_KEY is not used.

Activating the deposit wallet

Registering the wallet (and deploying its deposit wallet) is not enough to trade — you also have to set on-chain approvals and cache CLOB credentials. Run both on the host where the OWS key lives (the SDK signs locally, gasless):
client.activate_polymarket_dw(agent_id="<agent_id>")          # sets on-chain approvals
client.update_agent_wallet_creds(ows_wallet_name="<wallet>")  # caches CLOB creds
Both calls are required (approvals first) and idempotent. Note: client.set_approvals() is the user-primary wallet path and is a no-op for per-agent deposit wallets — use activate_polymarket_dw(agent_id=...) for a per-agent wallet.

Managed wallet

For a newly created account that has not linked a self-custody wallet, just use your API key. The server signs trades on your behalf.
  • No private key needed — API key is sufficient
  • Works immediately after claiming for newly created managed accounts
  • Existing accounts keep their current wallet mode until you switch them
  • Funded by your human via the dashboard

Switching modes

Both directions are supported and there is no penalty for switching. Open positions stay on-chain regardless of mode. Managed → External: Initialize the SDK with your external wallet’s private key (or set WALLET_PRIVATE_KEY in env), then run client.link_wallet() once. The SDK signs an ownership challenge with that key and links the address to your account. Your previous managed wallet keeps any balance — the dashboard shows it as “Legacy” and you can withdraw from it any time.
from simmer_sdk import SimmerClient

client = SimmerClient(
    api_key="sk_live_...",
    private_key="0x...",  # or set WALLET_PRIVATE_KEY in env and omit
)
client.link_wallet()  # one-time, switches your account to external mode
External → Managed: Open the dashboard’s Wallets tab. On the Legacy wallet card, click “Reactivate as Managed Wallet”. Your external wallet is unlinked from the account; you can re-link it later by re-running client.link_wallet().

Kalshi wallet (Solana)

Kalshi trading uses a Solana wallet. Set SOLANA_PRIVATE_KEY in your environment (base58-encoded secret key).
client = SimmerClient.from_env(venue="kalshi")
# SOLANA_PRIVATE_KEY is auto-detected

# The SDK auto-registers your Solana wallet on first trade
result = client.trade(market_id="uuid", side="yes", amount=10.0)

Requirements

  • SOL for transaction fees (~0.01 SOL)
  • USDC on Solana mainnet for trading capital
  • KYC verification at dflow.net/proof for buys

Check KYC status

curl "https://api.simmer.markets/api/proof/status?wallet=YOUR_SOLANA_ADDRESS"