36장 중 36장
요약
2026년 4월 28일 Polymarket는 Polygon의 결제 담보를 USDC.e(브리지된 USDC 토큰, 계약 0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174)에서 네이티브 USDC와 1:1로 상환 가능한 Polymarket 발행 스테이블코인인 pUSD로 이전했습니다. 웹 앱 트레이더는 아무것도 할 필요가 없었으며 - 스냅샷 블록에서 잔액과 포지션이 자동 전환되었습니다. API와 봇 운영자는 업데이트해야 합니다: 모든 CLOB 주문 서명 안의 담보 자산 주소가 변경되었고, 기존 USDC.e 기준으로 서명된 주문은 취소되었으며, py-clob-client 0.40 이상이 필요합니다. 이 가이드는 봇이 전환 과정 중과 이후에도 계속 실행되도록 필요한 정확한 코드, 계약, 승인 변경 사항을 안내합니다.
1부: 세 개의 스테이블코인, 하나의 Polygon
이전 마이그레이션 전, Polymarket의 Polygon 상에는 세 가지 USD 스테이블코인이 존재했습니다. 그 차이를 아는 것이 Polymarket이 왜 거래 장소를 바꿨는지 이해하는 첫걸음입니다.
| 토큰 | 발행자 | Polygon 상의 계약 | 준비금 유형 |
|---|---|---|---|
| USDC.e | Polygon PoS bridge | 0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174 | Ethereum 메인넷에서 브리지됨 |
| USDC (native) | Circle | 0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359 | 네이티브, Polygon에 직접 발행 |
| pUSD | Polymarket Treasury | See docs.polymarket.com/pusd | 네이티브 USDC로 1:1 담보, 월별 증명 |
Polymarket은 출시 당시인 2020년에 Polygon에서 지배적인 USDC 변형이었기 때문에 원래 USDC.e를 선택했습니다. 이후 Circle은 Polygon에 네이티브 USDC를 직접 발행했고, 브리지 버전이 결국 단계적으로 폐지될 것임을 시사했습니다. 모든 시장의 결제를 계속 USDC.e로 처리하면, Polymarket은 브리지의 갑작스러운 종료라는 장기 꼬리 위험에 노출되었습니다. Polymarket이 통제하는 스테이블코인으로 마이그레이션하면 이 문제를 해결할 수 있고, 동일한 계산 단위를 공유하는 향후 제품 기능(예: 무기한 선물 증거금, 금고 예치, 크로스체인 영수증)도 가능해집니다.
2부: pUSD란 무엇인가(그리고 무엇이 아닌가)
pUSD는 Polygon(체인 ID 137)에서 6자리 소수점을 가진 표준 ERC-20 토큰으로, USDC와 같은 정밀도를 가집니다. pUSD는 Polymarket Treasury 계약만이 발행할 수 있으며, 언제든지 수수료 없이 네이티브 USDC로 1:1 상환할 수 있습니다(네트워크 가스비는 여전히 적용됨). pUSD를 뒷받침하는 준비금은 분리된 계정에 보관되며, 제3자 확인서와 함께 매월 보고됩니다.
pUSD는 알고리즘 스테이블코인이 아니며, 암호화폐로 과담보화되지도 않고, 이자 수익도 발생하지 않습니다. Polymarket 외부에서 pUSD를 보유한다면, 이를 네이티브 USDC에 대한 Polymarket 발행 IOU로 생각하는 것이 좋습니다 - 플랫폼 내부에서는 유용하지만, 필요 시 상환 가능하며, 외부 지갑에 장기 보유한다고 해서 얻는 이점은 없습니다.
docs.polymarket.com/pusd-audit에 게시됩니다. 큰 금액을 장기 보유하기 전에 두 가지 모두 확인하세요.3부: 웹 앱 트레이더가 본 것
polymarket.com을 통해서만 거래한다면, 마이그레이션은 보이지 않았습니다. 2026년 4월 28일 스냅샷 블록에서:
- Polymarket 프록시 지갑에 보유된 모든 USDC.e 잔액은 1:1 비율로 pUSD로 원자적으로 변환되었습니다.
- 열린 포지션은 동일한 달러 가치, 동일한 결과 오즈, 동일한 만료 시점을 유지했습니다. 조건부 토큰 ID는 변경되지 않았습니다.
- USDC.e로 표시된 대기 중인 주문은 스냅샷 시점에 취소되었습니다. 마이그레이션 이후의 새 주문은 자동으로 pUSD를 기준으로 서명됩니다.
- 외부 지갑으로의 출금은 USDC.e 전송에서 네이티브 USDC 전송으로 바뀌었습니다(또는 요청 시 원시 pUSD - 대부분의 사용자는 이를 필요로 하지 않습니다).
서명, 트랜잭션 또는 설정 변경은 필요하지 않았습니다. 중요했던 대기 중인 지정가 주문은 마이그레이션 후 수동으로 다시 넣어야 합니다. 취소는 일회성 이벤트였습니다.
4부: API 및 봇 운영자 - 중요한 변경 사항
이 부분은 아무 조치도 하지 않으면 봇이 깨지는 부분입니다.
0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174)였습니다. 마이그레이션 이후에는 pUSD입니다. 이전 주소로 서명된 주문은 CLOB에서 서명 검증에 실패하며 "invalid 메이커 (maker) asset" 또는 "signature mismatch" 오류를 반환합니다.py-clob-client 업그레이드
Polymarket은 전환 2주 전에 pUSD를 완전히 지원하는 py-clob-client 0.40.0을 공개했습니다. 0.34.x 라인은 마이그레이션 다음 날 종료되었습니다.
# pUSD를 인식하는 릴리스로 올리기
pip install --upgrade "py-clob-client>=0.40.0"
# 연결된 담보 자산 확인
python -c "from py_clob_client.constants import POLYGON; \
print('pUSD address:', POLYGON.get('collateral'))"
새 SDK는 시작 시 체인 설정에서 담보 주소를 가져오므로, 하드코딩할 필요가 전혀 없습니다. 포크했거나 더 오래된 버전을 고정해 사용 중이라면, 가장 안전한 방법은 lockfile을 삭제하고 최신 constants 모듈로 다시 설치한 뒤 테스트 스위트를 다시 실행하는 것입니다.
승인 허용량 다시 설정
Polymarket 프록시 지갑은 사용자 거래 계정 → CTF Exchange 계약에 대해 pUSD 토큰의 ERC-20 허용량이 필요합니다. USDC.e에 대한 기존 허용량은 아직 체인에 남아 있지만 완전히 쓸모가 없습니다. CLOB는 이를 사용하지 않습니다. 새로운 pUSD 허용량이 없으면 모든 주문이 "INSUFFICIENT_ALLOWANCE"를 반환합니다.
from py_clob_client.client import ClobClient
client = ClobClient(
host="https://clob.polymarket.com",
chain_id=137,
key=os.environ["POLY_PRIVATE_KEY"],
funder=os.environ["POLY_FUNDER"],
signature_type=1, # Magic-link 계정용 POLY_PROXY
)
client.set_api_creds(client.create_or_derive_api_creds())
# 한 번만: CTF Exchange 계약에 대해 pUSD 승인
# (헬퍼는 py-clob-client 0.40에 추가됨)
client.update_balance_allowance(asset_type="COLLATERAL")
API 자격 증명 새로 고침
기존 API 키는 계속 작동하지만, 4월 1일 이전에 자격 증명을 생성했다면 예방 차원에서 교체해야 합니다. 이제 L1 ECDSA 서명은 새 담보 주소를 포함하는 도메인에 바인딩되기 때문입니다. 가장 간단한 방법은 다음과 같습니다:
creds = client.create_or_derive_api_creds() # 멱등적으로 다시 생성
client.set_api_creds(creds)
# .env에 저장
print(creds.api_key, creds.api_secret, creds.api_passphrase)
파트 5: 마이그레이션 후 봇 검증하기
실제 자금으로 어떤 사이징 로직도 돌리기 전에 이 최소 스모크 테스트를 실행하세요:
# 1. 프록시 지갑의 pUSD 잔고 확인
from py_clob_client.client import ClobClient
client = ClobClient(...) # 위와 동일
balance = client.get_balance_allowance(params={"asset_type": "COLLATERAL"})
print("pUSD 잔고(원시):", balance["balance"])
print("거래소에 대한 허용량:", balance["allowance"])
# 2. 호가에 크게 벗어난 위치에 1달러 지정가 주문 제출
from py_clob_client.clob_types import OrderArgs
order = client.create_order(OrderArgs(
token_id=test_token_id,
price=0.05, # 시장과는 전혀 가깝지 않음
size=20, # $0.05 기준 $1 명목가치
side="BUY",
))
resp = client.post_order(order)
print(resp)
# 3. 취소하고 확인
client.cancel(order_id=resp["orderID"])
이 세 호출이 모두 성공하면 연결은 정상입니다. SDK가 pUSD 기준으로 서명했고, 허용량이 인식되며, 주문 원장이 일관적입니다. 천천히 다시 규모를 키우세요.
6부: 일반적인 오류와 수정
| 오류 또는 증상 | 원인 | 수정 |
|---|---|---|
signature verification failed | USDC.e EIP-712 도메인에 대해 서명된 주문 | py-clob-client를 0.40+로 업그레이드하고 constants 모듈을 다시 불러오세요 |
모든 주문에서 INSUFFICIENT_ALLOWANCE | 프록시에서 CTF Exchange로의 pUSD 허용량이 없음 | update_balance_allowance(asset_type="COLLATERAL")를 한 번 실행하세요 |
invalid maker asset | 하드코딩된 USDC.e 주소가 아직 설정에 남아 있음 | 하드코딩된 담보 주소를 모두 SDK 상수로 교체하세요 |
| 지갑에 USDC.e 잔액이 0보다 크게 표시됨 after migration | 제3자 전송에서 남은 "먼지" 토큰 | Circle의 CCTP에서 USDC.e를 네이티브 USDC로 다시 브리지하거나 그대로 두세요 |
| WebSocket 재연결 시 빈 호가창이 생성됨 | 이전 구독이 스냅샷 이전의 오래된 시장 상태를 사용함 | 로컬 캐시를 삭제하고 REST 호가창을 다시 가져온 다음 다시 구독하세요 |
| 외부 지갑으로 출금 시 USDC 대신 pUSD가 표시됨 | 출금 모달에서 "USDC" 대신 "pUSD"를 선택함 | "USDC"를 선택하세요 - 브리지가 pUSD → 네이티브 USDC를 1:1로 변환합니다 |
Part 7: 조건부 토큰, 주문 ID, 그리고 변하지 않은 다른 것들
리팩터 범위를 명확히 하기 위해, 마이그레이션 전반에서 안정적으로 유지되는 식별자 목록은 다음과 같습니다:
- Conditional Token 계약(CTF): 주소가 동일합니다. YES / NO ERC-1155 포지션은 그대로 유지됩니다.
- condition_id 및 question_id: 시장 파라미터로부터 결정적으로 생성되며, 담보 교체의 영향을 받지 않습니다.
- token_id(결과): condition_id + 결과 인덱스로부터 파생되며, 변경되지 않습니다.
- Polymarket 프록시 지갑 주소: 동일한 주소이며, 동일한 Gnosis Safe 스타일 코드입니다.
- API key, API secret, API passphrase: 여전히 유효합니다(회전을 권장하지만 필수는 아닙니다).
- WebSocket 스키마: 동일합니다. 새
asset필드는 체결 이벤트에서 "USDC.e" 대신 "pUSD"로 표시됩니다. - Gamma 및 Data API: 인증이 필요 없고, 변경되지 않았습니다. 이들은 담보 토큰을 직접 참조한 적이 없습니다.
8부: 세금 및 장부 기록상의 영향
대부분의 관할권에서 USDC.e를 pUSD로 자동 전환하는 것은 USD에 연동된 스테이블코인의 1:1 동종 교환이며 과세 대상 이벤트를 발생시키지 않습니다. 원가 기준과 보유 기간은 그대로 승계됩니다.
다만 장부 기록상 두 가지는 주의할 만합니다:
- 원장 스키마를 업데이트하세요. USDC.e 계약으로 Polygon 거래를 필터링하는 세금 도구, SQLite 원장, 또는 회계사 내보내기 파일은 마이그레이션 이후의 모든 거래를 조용히 놓치게 됩니다. pUSD 계약 주소를 별칭으로 추가하세요.
- 스냅샷 전환을 주석으로 남기세요. 대부분의 제도에서 과세 대상은 아니지만, 기록에는 전환 내역을 명확히 남기세요: 금액, 블록, 타임스탬프, 그리고 이것이 1:1 스테이블코인 마이그레이션이라는 메모를 포함하세요. 나중에 관할권에서 이를 문의하면 깔끔한 감사 추적 기록이 필요합니다.
이스라엘 트레이더는 ITA 관련 보고를 위해 세금 가이드를 참고해야 합니다. 마이그레이션 자체는 표준 처리 방식에 변화를 주지 않지만, 계약 주소 변경은 자동 보고 도구에서 중요합니다.
파트 9: 전환을 직접 겪은 운영자들의 프로 팁
- requirements.txt에서 py-clob-client를
>=0.40,<0.50로 고정하세요. 0.40 라인은 pUSD 주문에 올바르게 서명하는 최소 버전이며, 상한을 고정하면 향후의 호환성 깨짐을 막을 수 있습니다. - 낮은 거래량 시간대에 허용 한도를 다시 승인하세요.
update_balance_allowance호출은 Polygon 트랜잭션 한 번입니다. 빠른 시장 변동 중에 수행하면 가스비 급등을 자초하는 셈입니다. - 4월 28일 전에 USDC.e 잔액을 스냅샷으로 남기세요. 전환이 자동이더라도, 검증 가능한 사전 스냅샷 잔액이 어떤 정산 문제든 이의 제기하는 가장 깔끔한 방법입니다.
- 스냅샷 전에 대기 중인 주문을 직접 취소하세요. 어차피 거래소에서 취소했겠지만, 직접 처리하면 "시스템 취소" 항목 대신 깔끔한 원장 기록이 남습니다.
- 오래된 대시보드를 주의하세요. 제3자 Polymarket 대시보드(PolymarketAnalytics, Polynance 등)는 pUSD 이벤트를 다시 파싱하는 데 2-3일이 걸렸습니다. 봇의 로컬 DB가 며칠 동안은 공개 대시보드보다 앞설 수 있습니다.
- USDC.e 자잘한 잔액은 본인 일정에 맞춰 브리지하세요. 대부분의 계정에는 과거 수수료 리베이트나 피어 간 전송에서 남은 몇 센트의 USDC.e가 있습니다. Circle의 CCTP나 표준 Polygon Portal 브리지를 사용하면 됩니다 - 급할 필요는 없습니다.
- 블록 익스플로러 알림에 예전 USDC.e 주소를 계속 넣어 두세요. 전환 후에라도 프록시에서 USDC.e가 빠져나가는 일이 있다면, 즉시 확인할 만한 경고 신호입니다.
다음은?
- Polymarket API 가이드 - pUSD에 맞춰 업데이트된 전체 API 가이드
- 입금 가이드 - 앱 내에서 USDC를 입금하고 pUSD를 받는 방법
- 출금 가이드 - pUSD를 외부 지갑으로 네이티브 USDC로 출금하는 방법
- 도구 & 리소스 - 이제 pUSD에 맞춰 업데이트된 서드파티 대시보드
- 용어집 - 여기에서 사용된 모든 용어의 쉬운 영어 정의
핵심 요점
Polymarket pUSD 마이그레이션은 이미 Polymarket 봇을 운영 중인 모든 운영자에게 저위험의 일회성 리팩터입니다. py-clob-client를 0.40+로 올리고, pUSD 허용을 다시 승인하고, 1달러 스모크 테스트를 실행한 뒤, 재개하면 됩니다. 그 아래의 인프라(CTF, 조건 ID, 토큰 ID, API 키)는 변경되지 않았으므로, 영향 범위는 작고 롤백도 깔끔합니다.











