| Primary |
|---|
전체 요약
CNS를 한 장으로 이해하기
CNS는 Creditcoin의 .ctc 이름을 지갑 주소, dApp 표시명, 수신 주소, NFT marketplace 자산으로 연결하는 네임서비스다. 한 주소는 여러 이름을 가질 수 있고, primary name은 주소당 하나만 가진다.
1서비스 역할
2현재 구성
1.0.1은 테스트넷 릴리즈 준비 기준선이다. 1.0.0은 2026-05-26 MVP 기준선으로 보존하고, 이 문서 이후의 신규 제품 작업은 긴급 수정이 아니라면 1.1.0으로 추적한다.CNS / Creditcoin Name Service를 쓰고, 온체인 ERC-721 collection은 CTC Name Service / CNS를 쓴다.cns-experience.html 단일 HTML MVP가 현재 제품 source of truth다. 최종 배포를 React로 선택할 경우 1.1.0 이후 새로 포팅한다.CreditcoinNameService, UUPS 프록시, ERC-721 호환 이름 NFTapps/api, resolver/pricing/names/metadata 엔드포인트packages/sdk, universal/profile/resolve/records/reverse/names/pricing 래퍼apps/indexer는 현재 스캐폴드 단계다. API 응답 구조는 이미 인덱서 전환을 고려해 설계되어 있다.docs/ 보안, 출시, API, 워크플로 메모와 이 living spec3프로젝트를 팀별로 이해하기
제품 신뢰감을 만드는 visual system, 상태 문구, NFT 이미지, 모바일/반응형 품질 기준을 책임진다.
Source:cns-experience.html, brand assets사용자가 이름을 검색, 등록, 연장, records 수정, primary 설정을 하는 실제 제품 화면을 책임진다.
Source:cns-experience.htmlresolver API, metadata prepare, Pinata upload, future indexer/cache/admin API를 책임진다.
Source:apps/api, apps/indexerUUPS ERC-721 name contract, registration, renewal, records, primary, metadata, lock, deploy/upgrade를 책임진다.
Source:contracts4전체 플로우맵
CNS 시스템 토폴로지
제품 화면, API, 지갑, 컨트랙트, resolver/indexer, explorer/admin이 어떻게 이어지는지 선으로 보는 전체 구조다.
등록부터 표시까지 시퀀스
이름 등록이 어떤 순서로 움직이고, 성공 후 My names와 Blockscout 표시가 어디서 갱신되는지 보여준다.
5핵심 플로우
6현재 테스트넷 상태
| 항목 | 값 | 메모 |
|---|---|---|
| 체인 | Creditcoin Testnet 102031 | 메인넷은 102030 |
| 프록시 | 0xFED8E4097f6314EB80D1D40EF2Da34F2181cc419 | UUPS 프록시 |
| 최신 구현체 | 0xCB955d455552bd511Dd03f1205f798322CC6BD76 | canonical tokenURI + metadataURIOf + metadata repair 정책 + records/metadata lock 포함 |
| Explorer | https://creditcoin-testnet.blockscout.com/ | ERC-721 metadata 표시 확인 기록 있음. gateway 이미지는 운영 중 spot-check 지속 |
| 총 발행량 | 22 CNS | 2026-05-27 preflight 기준. gateway 이미지는 계속 spot-check 필요 |
| 기록된 실제 e2e | auditmpmfoytc.ctc | register, records, primary, renew, canonical tokenURI/metadataURIOf 확인 기록 |
| API 개발 서버 | http://127.0.0.1:4000 | 로컬 테스트용 |
| HTML 앱 | http://127.0.0.1:8765 | 단일 HTML MVP |
완성도 점검
이 페이지는 CNS를 출시 가능한 서비스로 만들기 위한 전체 점검표다. 제품, 컨트랙트, API, metadata, admin, 운영, 보안을 같은 기준으로 본다. “데모가 된다”가 아니라 “사용자와 운영자가 실수 없이 쓸 수 있다”가 완료 기준이다.
1현재 완성도 한눈에 보기
검색, 검토, 등록, 성공 모달, My names, records, renew, primary 흐름은 MVP 기준 완성. 모바일/긴 이름/지갑 미연결 상태까지 계속 점검 필요.
UUPS, ERC-721, records, primary, reserved, metadataURI가 구현되어 있다. 메인넷 전 외부 감사는 필수.
resolve/records/reverse/names/pricing/metadata prepare가 있다. 트래픽 증가 전 요청 제한, 캐시, 모니터링을 강화해야 한다.
테스트넷 연결형 admin MVP가 분리된 포트로 구현됨. 메인넷 전에는 multisig owner, 감사 로그 저장, 권한 정책을 강화해야 한다.
2진행 / 중단 기준
| 영역 | 진행 조건 | 중단 조건 | 담당 |
|---|---|---|---|
| 컨트랙트 | 테스트 통과, preflight 통과, 구현체 검증, owner 확인 | storage layout report 미보관, owner 개인키 분실 위험, 외부 cache mismatch | SC |
| 지갑 | MetaMask/WalletConnect 연결, chain add/switch, register/renew/records/primary tx 통과 | 다른 chain에서 tx 가능, primary가 서명 없이 바뀜 | FE |
| 메타데이터 | register 전 IPFS JSON 준비, mint 후 Blockscout/wallet 이미지 표시 | image가 text/plain으로 열림, JSON image 필드 누락, Pinata key 노출 | BE |
| API | resolve/records/reverse/names/pricing 정상, CORS/body limit, metadata prepare auth/rate limit 확인 | 운영 CORS 오설정, ADMIN_API_KEY 브라우저 노출, 공개 resolver rate limit 미설정 | BE |
| Admin | read-only 조회와 reserve/short claim/metadata 요청 생성 가능 | 브라우저 admin은 직접 실행 불가, persistent audit log 없음 | Ops |
| 보안 | 외부 감사, multisig, rollback, abuse policy를 출시 gate로 관리 | mainnet owner가 EOA, upgrade runbook 없음, abuse policy 미확정 | Security |
3역할별로 해야 할 일
4P0 체크리스트
source.mode를 둔다.5구현 상태 매트릭스
| 영역 | 현재 구현 | 이 문서 기준 | 메인넷 전 남은 일 |
|---|---|---|---|
| 제품 앱 | 구현됨 | cns-experience.html에서 register/review/success/names/records/renew/primary/wallet UX 제공 | HTML 배포 정책 확정. React 선택 시 1.1.0 이후 production app 신규 포팅 |
| 지갑 | 구현됨 | MetaMask + WalletConnect, Creditcoin Testnet add/switch, wrong-chain guard | mainnet chain config, production WalletConnect metadata 확정 |
| 컨트랙트 | 구현됨 | UUPS ERC-721, registration, renewal, primary, records, reserve, short claim, canonical tokenURI, metadataURIOf | 외부 감사, mainnet multisig owner, Sourcify/Blockscout verification |
| 레코드 | 구현됨 | Address, Avatar, Profile URL, Contenthash, Bio, X, GitHub, Discord, Telegram, Email | 외부 지갑/거래소에 공개할 record semantics 문서화 |
| Resolver API | MVP 구현됨 | resolve/records/reverse/names/pricing/metadata prepare. 응답은 indexer-ready | monitoring, production CORS review, cache/indexer |
| Metadata/IPFS | MVP 구현됨 | 등록 전 SVG/JSON 준비, Pinata upload, tx에는 metadataURI 포함 | secondary pinning, gateway fallback, abuse image policy |
| Admin 앱 | MVP 구현됨 | cns-admin.html / http://127.0.0.1:8766에서 dashboard, names/reserve, metadata, reports, indexer, team requests 확인. 지갑 연결과 직접 tx 실행은 없다. | server-side admin API, persistent audit log, SSO/role policy |
| 악용 신고 | UI 구현됨 | read-only review queue와 evidence 확인, reserve 후보 요청 문구 생성 중심 | public report intake, DB 저장, reviewer workflow |
| 인덱서 | 스캐폴드 | 이벤트와 API shape는 준비됨. MVP는 onchain read-through | Postgres/Redis worker, backfill/retry, lag alert |
| 문서/인수인계 | 구현됨 | 이 living spec + docs 폴더로 제품/개발/운영 기준 정리 | mainnet 결정값 반영, external audit 결과 추가 |
6개발자가 바로 볼 파일맵
docs/external-docs.md외부 공유용 문서 인덱스. 일반 유저와 외부 개발자 문서를 분리해 안내한다.
docs/user-guide-ko.md일반 사용자용 공개 가이드. 등록, 지갑 연결, primary, records, 연장, 안전 수칙.
docs/external-developer-guide.md지갑/거래소/dApp/백엔드 통합 가이드. API, SDK, onchain fallback, 체크리스트.
cns-experience.html현재 실제 MVP 앱. Register, wallet, review, names, records, renew, success modal의 기준 화면.
contracts/contracts/CreditcoinNameService.sol컨트랙트 source of truth. 가격, owner 권한, records, primary, metadataURI, events.
apps/api/src/routes/resolver.tsresolve/records/reverse/names/pricing API. 외부 지갑/거래소/dApp 통합의 시작점.
apps/api/src/routes/metadata.tsNFT image/JSON 준비, Pinata 업로드, wallet signature/server-side admin key 정책.
packages/shared/src/index.tsname validation, pricing, deployment config, shared type/policy.
packages/sdk/src/index.ts외부 개발자용 SDK wrapper. API shape가 바뀌면 여기부터 점검.
docs/security-policy.md보안 정책과 남은 위험. 메인넷 전 체크 문서.
cns-living-spec.html지금 보고 있는 전체 지도. 제품/운영/개발 인수인계 기준.
7출시 전 60분 점검 절차
npm run typecheck,npm run build,npm run contracts:test실행.- 테스트넷에서 새 이름 1개 등록: 검색 → review → metadata prepare → wallet tx → success modal.
- Blockscout에서 tokenURI JSON, NFT image, attributes, owner가 제대로 보이는지 확인.
- My names에서 방금 등록한 이름이 보이는지 확인하고 records 저장, primary 변경, renew modal 테스트.
- API에서
/v1/resolve/:name,/v1/reverse/:address,/v1/names/:address확인. - Admin 기준 reserve/short claim 요청 문구와 owner/multisig 실행 runbook 확인.
- secrets 점검:
.env, private key, Pinata JWT, admin key가 repo/HTML/browser에 노출되지 않는지 확인. - rollback plan 확인: 이전 implementation 주소, owner 권한, upgrade script, preflight command 준비.
제품 프로토타입
이 영역은 별도 목업이 아니라 실제 cns-experience.html 앱 HTML에 문서 미리보기용 preview-safe override만 적용해 임베드한 화면이다. 제품 화면 기준은 항상 실제 앱 하나로 맞춘다.
1항상 열 수 있는 제품 프로토타입
2Spec calculator
아래는 실제 앱이 아니라, 문서 안에서 가격/만료일/API 응답 구조를 빠르게 확인하는 보조 계산기다. 실제 UX 판단은 위 CNS 앱 프로토타입을 기준으로 한다.
3Resolver API simulator
프론트는 지금 onchain 조회를 쓰더라도 아래 응답 형태만 바라보면 된다. 나중에 인덱서를 붙여도 source.mode만 바뀌고 앱 구조는 그대로 유지된다.
4Admin console summary
5프로토타입 구분
| 항목 | 문서 내 프로토타입 | 실제 제품 |
|---|---|---|
| Product prototype | 실제 cns-experience.html 앱을 preview-safe override만 적용해 문서 안에 임베드 | 최상위 탭에서 mockWallet 없이 열면 지갑까지 실제 테스트 가능 |
| Spec calculator | 문서용 계산기. 가격/만료/API shape 확인 | UX 판단 기준 아님 |
| Admin console | 문서 내 요약 + 별도 테스트넷 admin app | http://127.0.0.1:8766/dashboard에서 확인 |
| Wallet | 문서 프로토타입은 tx를 보내지 않음 | MetaMask/WalletConnect는 top-level app에서 확인 |
제품 UX
첫 화면은 landing page가 아니라 바로 이름을 등록하는 앱이다. 불필요한 설명을 줄이고, 검색 → review → wallet → success → My names로 이어지는 흐름을 유지한다.
1화면 구조
| Route | 목적 | 상태 |
|---|---|---|
/ | Register tab. 이름 검색 및 등록 시작. | 필수 |
/:name.ctc/register | 이전 공유 링크 호환용. 실제 앱은 첫 화면을 /로 정규화한다. | 호환 |
/:name.ctc/register/review | Review registration modal deep-link. | 필수 |
/connect-wallet | Register 흐름의 wallet connect modal. | 필수 |
/:name.ctc/register/connect-wallet | 이름이 포함된 wallet connect deep-link 호환 경로. | 호환 |
/:name.ctc/register/registered | 등록 성공 modal deep-link. | 완료 UX |
/names | My names. owned names, records, renew, primary 관리. | 필수 |
/names/connect-wallet | Names 관리 중 지갑 연결 modal. | 관리 UX |
/names/:name.ctc/records | Edit records modal deep-link. | 관리 UX |
/names/:name.ctc/renew | Renew modal deep-link. | 관리 UX |
/names/:name.ctc/renewed | 연장 성공 modal deep-link. | 완료 UX |
2등록 UX
cns-experience.html이 source of truth다. 이 문서에는 별도 그림 목업을 두지 않고, 구현이 지켜야 하는 규칙만 남긴다.| 상황 | 실제 앱 규칙 | 확인 위치 |
|---|---|---|
| 첫 등록 화면 | 검색 input과 등록 CTA 중심. 기간/fee/primary 선택은 첫 화면에 노출하지 않는다. | cns-experience.html register view |
| Review modal | Review registration, lowercase name preview, duration, fee, primary, CTA를 확인한다. | /:name.ctc/register/review |
| 지갑 미연결 | review까지 진입 가능하고, 하단 CTA는 Connect wallet이 된다. | mock wallet 없이 top-level 앱 |
| 등록 성공 | success modal은 View on explorer, View all names 중심으로 끝낸다. | testnet e2e / mock smoke |
- 이 등록 review modal은
cns-experience.html/ 사용자 앱에만 적용한다.cns-admin.html에는 등록, 지갑 연결, tx 실행 CTA를 두지 않는다. - 대문자로 입력해도 input에서는 허용하고, preview/review에서는 lowercase로 표시한다.
- 기간과 fee 확인은 review modal에서 한다. Register 첫 화면은 검색과 CTA만 보여준다.
- 지갑 미연결 상태에서 review까지 올 수 있고, 하단 CTA는
Connect wallet이 된다. - 등록 성공 후 success modal은
View on explorer,View all names중심으로 간결하게 유지한다.
3My names UX
| Column | 내용 | 주의 |
|---|---|---|
| Name | default avatar + name. Avatar record가 있으면 실제 avatar 표시. | 긴 이름은 한 줄 truncate |
| Records | Avatar set / Profile / No avatar / No profile | 상태만 빠르게 보이게 |
| Expiry | 현재 만료일 | 연장 modal에서 현재/연장 후 날짜 모두 표시 |
| Primary | Primary 또는 Make primary | Make primary는 반드시 지갑 tx/서명 필요 |
| Action | Records, Renew | Renew는 register 화면이 아니라 names에서 modal |
4지갑 UX
- 지원 지갑: MetaMask, WalletConnect.
- 연결 시 Creditcoin Testnet이 없으면
wallet_addEthereumChain, 다른 네트워크면wallet_switchEthereumChain. - 지갑 버튼 클릭 시 바로 아래 inline disconnect 영역을 보여준다. 별도 복잡한 account modal은 MVP에서 피한다.
- 운영 빌드에서는
contract,wcProjectIdURL override를 허용하지 않는다. Metadata/API base는 로컬에서는http://127.0.0.1:4000, 운영에서는 동일 origin을 사용한다.
네임 정책
이름 정책은 UX, 가격, 보안, abuse 대응이 모두 엮인다. 지금 정책은 1-3자는 전체 오픈이 아니라 지정된 label과 claimant address 조합만 claim, 4자는 비싸게, 5자 이상은 낮은 가격으로 대중 등록한다.
1Label validation
1234.ctc2가격 정책
| Length | Annual price | Open registration | 정책 이유 |
|---|---|---|---|
| 1 char | 50,000 CTC / yr | No, label-specific assigned claim only | 희소성/브랜드/스쿼팅 방지 |
| 2 chars | 10,000 CTC / yr | No, label-specific assigned claim only | 초기 chaos 방지 |
| 3 chars | 2,500 CTC / yr | No, label-specific assigned claim only | 거래소/프로젝트 claim 대응 |
| 4 chars | 500 CTC / yr | Yes | 짧은 이름 premium |
| 5+ chars | 50 CTC / yr | Yes | 일반 유저 등록 가격 |
31-3자 claim 플로우
setShortNameClaim(label, claimant)는 특정 label 하나와 특정 claimant address 하나의 조합만 연다.abc.ctc처럼 특정 label과 받을 wallet address를 제출한다.setShortNameClaim("abc", claimant)를 실행한다. 다른 1-3자 label은 계속 잠겨 있다.register 또는 registerWithMetadata를 직접 실행한다.| 예시 | 결과 |
|---|---|
setShortNameClaim("abc", 0xClaimant) | 0xClaimant만 abc.ctc 등록 가능 |
0xClaimant가 def.ctc 등록 시도 | 실패. 같은 주소라도 다른 1-3자 label 권한은 없음 |
0xOther가 abc.ctc 등록 시도 | 실패. 같은 label이라도 지정 claimant가 아니면 불가 |
4Reserved / abuse policy
- UI local reserve hints:
creditcoin,ctc,admin,support,wallet,exchange,validator. 온체인 reserved는 자동 세팅이 아니라 owner/multisig가setReserved로 실행해야 한다. - 1-3자는 일반 등록 불가.
setShortNameClaim(label, claimant)로 승인된 label + claimant address 조합만 등록 가능. - 브랜드/거래소/피싱 유사명은 admin reserve list와 abuse report workflow로 관리.
- 메인넷 전에는 reserved 후보 목록과 실제 온체인 적용 절차를 법무/보안/BD 관점에서 확정해야 한다.
스마트컨트랙
CreditcoinNameService는 upgradeable UUPS contract이며 ERC-721 name NFT, resolver records, primary name, reserved/short claim, metadata URI를 한 컨트랙트에서 관리한다.
1Public user functions
| Function | Caller | 결과 |
|---|---|---|
register(label, years, setPrimary) | any user | 이름 NFT mint, address record 설정, optional primary |
registerWithMetadata(label, years, setPrimary, metadataURI) | app user | IPFS JSON URI를 metadataURIOf에 저장하며 tokenURI는 canonical 유지 |
renew(label, years) | active name owner | 만료일 연장 |
renewWithMetadata(label, years, metadataURI) | active name owner | 연장 + 새 metadata URI |
setMetadataURI(label, metadataURI) | active name owner or contract owner | 기존 name의 저장된 IPFS JSON URI 교체. 브라우저 admin에서는 직접 실행하지 않고 요청만 만든다. |
setAddress(label, target) | active name owner | address record만 단독 업데이트. 제품 앱은 보통 setRecords를 사용한다. |
setRecords(label, target, RecordsInput) | active name owner | Address, Avatar, Profile URL, Contenthash, Bio, X, GitHub, Discord, Telegram, Email 업데이트 |
setRecordsLocked(label, locked) | active name owner | records 변경을 owner가 직접 잠그거나 해제한다. 피싱/실수 방지용 soft lock. |
setMetadataLocked(label, locked) | active name owner | metadata URI 변경을 owner가 직접 잠그거나 해제한다. Blockscout 이미지/프로필 안정화용. |
setPrimary(label) | active name owner | 주소의 primary name 설정. forward record가 caller여야 함. |
2Read functions
| Function | 사용처 | 메모 |
|---|---|---|
available(label) | 검색 UI | short/reserved는 false |
price(label, years) | fee 계산 | 컨트랙트 source of truth |
resolve(label) | name → address | 만료 시 address(0) |
resolveRecords(label) | API/profile | address/avatar/profile/contenthash/bio/social records |
primaryOf(address) | reverse lookup | 만료 또는 forward mismatch면 empty |
ownerOf(tokenId) / balanceOf(address) | API/admin/explorer | ERC-721 ownership source of truth |
labelOf(tokenId) | API/admin/indexer | tokenId에서 원래 label 복원 |
tokenURI(tokenId) | wallet/explorer/marketplace | 항상 canonical onchain JSON/SVG |
metadataURIOf(tokenId) | debug/indexer | 저장된 IPFS JSON URI |
tokenImageURI(tokenId) | metadata preview/debug | canonical onchain SVG image data URI |
lockStatus(label) | API/wallet/admin | records/metadata soft lock 상태 조회 |
expiresAt, addressRecord, avatarRecord, profileRecord, contenthashRecord, bioRecord, xRecord, githubRecord, discordRecord, telegramRecord, emailRecord, recordsLocked, metadataLocked, reserved, shortNameClaimant, primaryName, owner, pendingOwner, totalSupply는 Solidity public getter로 노출된다.3ERC-721 compatibility
| Function | 사용처 | 메모 |
|---|---|---|
approve, setApprovalForAll | wallet/marketplace | NFT 승인 표준. 만료된 name은 approval 불가. |
getApproved, isApprovedForAll | wallet/marketplace/indexer | ERC-721 approval 상태 조회. |
transferFrom, safeTransferFrom | wallet/marketplace | transfer 시 address record를 새 owner로 동기화하고 이전 owner primary를 정리한다. |
supportsInterface | explorer/marketplace | ERC-165, ERC-721, ERC-721 metadata interface를 반환. |
4Admin functions
| Function | 권한 | 운영 처리 방식 |
|---|---|---|
setReserved(label, bool) | owner | Admin은 상태 확인과 요청 생성만 한다. 실행은 owner/multisig runbook. |
setShortNameClaim(label, claimant) | owner | Admin은 claimant/evidence 검수와 요청 생성만 한다. |
withdraw(to) | owner | Admin은 체크리스트와 요청만 만든다. 실행은 multisig 권장. |
transferOwnership(nextOwner) | owner | Admin은 readiness 확인만 한다. 메인넷은 multisig 필수. |
acceptOwnership() | pending owner | 별도 owner/multisig 실행 절차에서 처리. |
cancelOwnershipTransfer() | owner | 잘못 시작된 ownership transfer를 별도 runbook에서 취소. |
upgradeToAndCall(newImplementation, data) | owner via UUPS | Admin은 preflight 증거와 요청 문구만 만든다. 실제 실행은 Hardhat upgradeProxy 스크립트나 multisig runbook에서 처리한다. |
5Events for indexer
RecordsChanged는 전체 record snapshot을 emit하고, 인덱서는 필요하면 같은 블록에서 resolveRecords를 다시 읽어 최종 상태를 검증할 수 있다. 나중에 DB 기반 API로 바꿔도 프론트가 깨지지 않도록 API 응답 shape는 이미 고정되어 있다.Resolver API / SDK
외부 지갑, 거래소, dApp은 직접 온체인 ABI를 몰라도 API로 이름을 빠르게 조회할 수 있어야 한다. MVP는 RPC 기반이지만 response shape는 인덱서 전환을 염두에 두고 설계되어 있다.
1Endpoints
| Endpoint | 용도 | Source |
|---|---|---|
GET /health | API 상태 | config |
GET /v1/resolve/:name | name → address/records | resolveRecords |
GET /v1/records/:name | /v1/resolve/:name와 같은 shape의 records alias | resolveRecords |
GET /v1/universal/:name | 지갑/거래소용 canonical resolver shape | resolveRecords + lockStatus |
GET /v1/profile/:name | 프로필 화면용 canonical resolver shape | resolveRecords + lockStatus |
GET /v1/reverse/:address | address → primary name | primaryOf |
GET /v1/names/:address | 내 이름 목록 | Transfer logs + ownerOf + resolveRecords |
GET /v1/pricing/:label?years=1 | 가격 계산 | shared pricing policy |
GET /v1/metadata/health | metadata upload/auth 상태 | config |
POST /v1/metadata/prepare | IPFS SVG/JSON 업로드 | Pinata + wallet signature/server admin key |
2Response contract
owner는 CNS NFT owner이고, address/records.address는 송금과 프로필 resolve에 쓰는 forward address record다. /v1/records/:name, /v1/universal/:name, /v1/profile/:name 모두 같은 NameResolution shape를 반환한다.source.mode는 나중에 indexed로 바뀔 수 있지만 클라이언트 shape는 유지한다.
3SDK
| 대상 | 추천 방식 | 이유 |
|---|---|---|
| 지갑 | SDK 우선, API fallback | 송금 화면에서 name.ctc → address를 빠르게 resolve |
| 거래소 | Server-side API | 입금 주소 검증, rate limit, cache, audit log 관리가 쉬움 |
| dApp | SDK 또는 REST API | profile display, primary name, avatar/social records 표시 |
| 인덱서/분석 | REST API + 이벤트 | 나중에 source.mode=indexed로 전환해도 shape 유지 |
Package status
@cns/sdk는 의도한 public package 이름이다. 현재 repo에서는 private workspace 패키지이므로 외부 npm install은 배포 후 사용 경로로 보고, 외부 배포 전에는 npm scope, version, changelog, license, README를 확정해야 한다.
Basic usage
REST fallback
Records available to integrators
| Field | Meaning | Display guidance |
|---|---|---|
address | 송금/수신 대상 주소 | 가장 중요한 필드. primary display보다 우선 검증 |
avatar | IPFS/HTTPS avatar URI | 이미지 실패 시 default CNS avatar 표시 |
profile | 외부 프로필 URL | 새 탭으로 열고 phishing warning 적용 가능 |
contenthash | IPFS/IPNS/BZZ/hex content pointer | 웹사이트/컨텐츠 연결용 advanced field |
bio | 짧은 공개 소개 | 최대 280자 기준, HTML escape 필수 |
x/github/discord/telegram/email | 소셜/연락처 records | 링크 생성 전 allowlist와 escaping 적용 |
Error handling
status: "active"이고address가 있을 때만 송금 주소로 사용한다.status: "expired"또는address: null이면 resolve 실패로 처리한다.source.complete === false이면 지갑 UI에 “data may be incomplete” 경고를 둘 수 있다.- 소셜/프로필/아바타는 사용자 입력값이다. 공식 계정 인증으로 해석하면 안 된다.
4운영 주의
/v1/names/:address는 현재 onchain log scan이라 이름/트래픽이 많아지면 느려진다.- 초기 MVP는 괜찮지만, 공개 트래픽이 붙으면 indexer + Redis cache가 필요하다.
- CORS는
API_ALLOWED_ORIGINS로 운영 도메인만 허용한다. - API body size와 RPC timeout은 env로 제한한다.
NFT Metadata
등록 전 review 단계에서 NFT 이미지와 JSON metadata를 준비하고, 등록 tx에는 metadata URI를 포함한다. mint 완료 직후 wallet/explorer/marketplace는 canonical tokenURI를 읽고, 운영 도구는 metadataURIOf를 별도로 확인할 수 있어야 한다.
1Metadata flow
2Metadata JSON
imageURI/metadataURI의 ipfs:// 값과 imageGatewayURL/metadataGatewayURL의 HTTP gateway URL을 함께 반환한다. JSON의 image/image_url와 contract에는 ipfs:// URI를 저장하고, gateway URL은 explorer smoke/debug 확인용으로만 사용한다.3NFT image style
Clean White 기반. 연한 blue background, 중앙 Resolver Ring logo, 하단 name 표시.
전체 label 최대 63자. NFT 카드에서는 1233242...ctc처럼 truncate하고, metadata name에는 full name 저장.
4Auth / abuse guard
PINATA_JWT와ADMIN_API_KEY는 backend-only. 브라우저에 노출 금지.- 사용자 브라우저의 metadata prepare는 등록 지갑 signature가 필요하다.
- 브라우저 admin 요청은 지갑 서명 없이 evidence만 생성하고, 실제 처리는 서버 측 admin API 또는 담당 팀의 별도 절차에서 진행한다.
- 서명 TTL 기본값은
600초. - 메타데이터 prepare rate limit 기본값은 분당
20회. - 로컬/운영 모두 metadata prepare 실행에는 wallet signature 또는 server-side admin key가 필요하다.
Indexer 준비
초기 1,000명 정도의 MVP에서는 인덱서 없이도 운영 가능하다. 하지만 names list, 최근 등록, 인기 이름, 알림, abuse dashboard가 붙으면 인덱서가 필요하다.
1언제 필요한가
| 기능 | 인덱서 없이 | 인덱서 있음 |
|---|---|---|
| name → address | 가능 | 더 빠름 |
| 내 이름 목록 | 가능하지만 느려질 수 있음 | 빠르고 안정적 |
| 최근 등록/인기 이름 | 불편 | 자연스럽게 가능 |
| 만료 임박 알림 | 수동/브라우저 중심 | 스케줄러 가능 |
| abuse dashboard | 별도 저장소 필요 | DB에서 관리 가능 |
2권장 DB schema
3중간에 붙이는 난이도
어렵지 않다. 현재 컨트랙트 이벤트가 충분하고 API response shape도 미리 맞춰져 있다. 나중에 source.mode만 onchain에서 indexed로 바꾸면 된다.
Admin 사이트
Admin은 일반 유저 앱이 아니라 CNS 운영자가 컨트랙트 상태, reserved/short claim, metadata, abuse, indexer 상태를 확인하는 내부 운영 콘솔이다. 브라우저 admin은 지갑 연결 없이 read-only 조회, evidence 정리, 팀별 요청 생성만 담당한다.
1Admin app prototype
cns-admin.html이며, 로컬에서는 http://127.0.0.1:8766/dashboard로 확인한다. 현재 구현은 지갑 연결 없는 read-only 운영 콘솔이다. 이름 조회, reserve/short-claim 상태 확인, metadata inspect, abuse report review, indexer readiness, 팀별 요청 생성까지 포함한다.CNS Operations Dashboard
Read-only admin status for CNS testnet operations. This admin site does not connect wallets or submit contract transactions.
| Check | Status | Details |
|---|---|---|
| RPC | Online | Latest Creditcoin Testnet block loaded from configured RPC. |
| Contract | Loaded | 0xFED8E4097f6314EB80D1D40EF2Da34F2181cc419 |
| Implementation | Detected | 0xCB955d455552bd511Dd03f1205f798322CC6BD76 |
| Metadata API | Check | Health endpoint is checked through the admin proxy. |
RPC, owner, total supply, balance, and implementation status loaded.
NameRegistered logs discovered from block 4,810,000.
Evidence copied for the responsible smart contract, backend, or operations team.
Names / Reserve
Registered names, owners, expiry, resolver records, reserve status, short-name claims, and metadata state are checked without wallet connection.
| Name | Status | Owner | Expiry | Records | Metadata |
|---|---|---|---|---|---|
| auditmpmfoytc.ctc | Active | 0xDFD1...080B | 2028-05-25 | records set | IPFS |
| 12423.ctc | Primary | 0xDFD1...080B | 2027-05-26 | address | No stored URI |
| 1234.ctc | Active | 0xDFD1...080B | open | resolver check | Check |
Metadata operations
NFT 이미지/JSON/IPFS gateway 상태를 확인하고, 실패한 metadata는 backend 요청으로 넘긴다.
| Name | Token URI | Image | Gateway | Action |
|---|---|---|---|---|
| 12412323.ctc | canonical | SVG ready | metadataURIOf 200 | Generate repair request |
| 1234.ctc | canonical | SVG ready | metadataURIOf 200 | Open JSON |
| oldname.ctc | canonical | No stored URI | check | Generate backend request |
Abuse reports
피싱, 사칭, 악성 profile/avatar/bio/social 링크를 검토하고 reserve 후보 또는 지원 대응으로 연결한다.
| Report | Risk | Evidence | Decision |
|---|---|---|---|
| credltcoin.ctc RPT-0018 · security@creditcoin.org | high | Profile URL points to fake support form | Reserve candidate |
| airdrop-ctc.ctc RPT-0019 · 0xdfd1...080b | medium | Avatar and Profile URL advertise token claim | Pending review |
| support-creditcoin.ctc RPT-0021 · community moderator | high | Bio claims official support; Telegram unofficial | Escalate |
/reports 화면은 read-only review queue다. 실제 제재나 reserve 실행은 하지 않고, 증거를 정리해 담당 팀 요청으로 넘긴다. DB 저장과 public report intake는 다음 단계다.Indexer health
초기에는 선택 사항이지만, 운영 콘솔은 나중에 인덱서 전환을 기준으로 설계한다.
Team Requests
Read-only checks and copy-ready handoff notes for the smart contract, backend, or operations team.
| Checklist | Evidence | Status |
|---|---|---|
| RPC | Latest Creditcoin Testnet block is reachable. | Pass |
| Total supply | 22 minted names from current contract state. | Pass |
| Registration logs | NameRegistered logs scanned from block 4,810,000. | Pass |
| API / Metadata health | Health endpoint result and gateway evidence. | Check |
2Admin routes
| 현재 로컬 경로 | 향후 운영 경로 | 화면 | 주요 작업 | 권한 |
|---|---|---|---|---|
http://127.0.0.1:8766/dashboard | /admin | Dashboard | RPC, owner, totalSupply, implementation, API 상태 확인 | read admin |
http://127.0.0.1:8766/names | /admin/names | Names / Reserve | 이름/owner/reserved/short claim 조회, 요청 문구 생성 | read admin |
http://127.0.0.1:8766/metadata | /admin/metadata | Metadata | tokenURI 확인, image preview, gateway check, repair 요청 생성 | read admin |
http://127.0.0.1:8766/reports | /admin/reports | Abuse Reports | 신고 검토, evidence 확인, 요청 문구 생성 | read admin |
http://127.0.0.1:8766/indexer | /admin/indexer | Indexer Health | log coverage 확인, backfill/retry 요청 문구 생성 | read admin |
http://127.0.0.1:8766/requests | /admin/requests | Team Requests | 담당 팀 요청 문구 생성, 운영 evidence 정리 | read admin |
3Admin API contract
cns-admin.html은 테스트넷 MVP라 RPC 직접 조회와 요청 문구 생성 중심이다. 지갑 연결이나 직접 tx 실행은 없다. 아래 Admin API는 메인넷 운영 전에 붙일 서버 계약이며, admin audit log와 role policy를 위해 필요하다.GET /admin/healthproxy, implementation, owner, API, Pinata, indexer 상태.
GET /admin/names?query=name, reserved, claimant, owner, expiry, metadata 상태 검색.
POST /admin/reserve/requestreserve/unreserve 요청과 evidence를 감사 로그에 저장.
POST /admin/short-claim/requestshort claim 요청과 claimant/evidence를 저장.
POST /admin/metadata/repair-requestmetadata repair 요청을 backend queue에 저장. 브라우저는 Pinata upload를 실행하지 않는다.
GET /admin/reportsabuse queue, evidence, decision status 조회.
POST /admin/indexer/backfill-requestfromBlock/toBlock 범위 backfill 요청 생성.
POST /admin/requests담당 팀, 요청 유형, evidence, decision log를 저장. 브라우저 admin은 직접 실행하지 않는다.
4Audit log schema
Admin의 핵심은 “누가, 언제, 왜, 무엇을 바꾸려 요청했고, 어떤 증거로 외부 실행까지 이어졌는지”를 남기는 것이다. 브라우저 admin은 실행자가 아니라 요청과 감사 기록의 시작점이다.
5Admin build phases
| Phase | 꼭 들어갈 것 | 아직 빼도 되는 것 |
|---|---|---|
| Testnet alpha | Dashboard, reserve/short claim request generator, metadata check | full abuse workflow, analytics |
| Public testnet | abuse report queue, audit log, indexer health, gateway check | 자동 제재, 복잡한 role system |
| Mainnet candidate | server-side admin API, SSO/role policy, audit log export, alerting | 브라우저 지갑 연결, 개인키 기반 실행 |
| Scale | role-based access, on-call runbook, saved views, report intake API | 수동 spreadsheet 운영 |
Admin 필요 기능
MVP 자체는 script로 운영할 수 있지만, 메인넷 공개 운영에서는 admin page가 있는 편이 안전하다. 단, 브라우저 admin은 지갑 연결이나 컨트랙트 직접 변경 없이 read-only 조회, evidence 정리, 요청 생성, audit log 중심으로 만든다.
1Admin page가 필요한가?
| Admin module | Phase | 내용 |
|---|---|---|
| Reserve List | P0 / Phase 1 | 예약 이름 조회와 추가/해제 요청 생성. 실제 setReserved 실행은 브라우저 밖 별도 절차. |
| Short Name Claims | P0 / Phase 1 | 1-3자 label + claimant address 조합 검수와 요청 생성. 실제 setShortNameClaim 실행은 브라우저 밖 별도 절차. |
| Contract Health | P0 / Phase 1 | proxy, implementation, owner, pendingOwner, totalSupply, interface 검증. |
| Metadata Ops | P1 / Phase 2 | 특정 token metadata 상태 확인, image/JSON/gateway 검수, backend repair 요청 생성. |
| Abuse Reports | P1 / Phase 2 | 피싱/사칭 신고 목록, 조치 상태, reserve 후보 관리. |
| Indexer Health | P1 / Phase 2 | latest indexed block, lag, failed event retry. |
| Team Request Log | P2 / Phase 3 | reserve, short claim, metadata repair, API/RPC/indexer 이슈를 evidence와 함께 담당 팀 요청으로 남긴다. |
2Admin IA 제안
3Admin security rules
- Admin page는 일반 앱과 route/domain을 분리하는 것이 좋다. 예:
admin.cns.creditcoin.org. - 브라우저 admin은 지갑 연결과 직접 쓰기 실행을 하지 않는다. 변경은 요청으로 만들고 담당 팀의 별도 절차에서 처리한다.
- 모든 admin request는 before snapshot, requested after, evidence, approval 상태, 외부 실행 tx hash를 저장한다.
ADMIN_API_KEY는 서버 간 호출 전용이다. 브라우저 admin에도 직접 넣지 않는 것이 좋다.- 실제 reserve/short claim tx는 온체인 권한이 필요하므로 admin 요청에는 근거, 승인 상태, 외부 실행 tx hash를 남긴다.
보안 / 권한
네임서비스의 핵심 보안 목표는 타인이 내 이름, records, primary, metadata를 빼앗거나 조작하지 못하게 하는 것이다.
1컨트랙트 보안 모델
| 위험 | 방어 |
|---|---|
| 타인이 records 변경 | _requireActiveNameOwner로 active owner만 가능 |
| 승인받은 operator가 resolver 조작 | ERC-721 approval은 transfer용. records/primary/metadata 권한 아님 |
| 남의 이름 primary 설정 | name owner + forward record가 caller여야 함 |
| 만료 이름 stale records | 재등록 시 avatar/profile/contenthash/bio/social records/approval/metadata 정리 |
| metadata spoof | tokenURI는 저장된 IPFS URI를 반환하지 않고 컨트랙트 canonical JSON/SVG만 반환 |
| unsafe receiver | safe transfer receiver check 실패 시 상태 rollback |
2API 보안 모델
- Metadata upload는 사용자 wallet signature 또는 서버 측 admin token이 필요하다.
- 서명 메시지에는 name, owner, years, primary, base expiry, chain id, issuedAt 포함.
- Pinata JWT는 서버에만 보관.
- CORS allowlist, request body limit, metadata rate limit 적용.
- 운영/로컬 모두 metadata prepare 실행에는 wallet signature 또는 server-side admin key가 필요하다.
3남은 보안 체크
- 메인넷 전 external smart contract audit.
- Owner를 개인 EOA가 아니라 multisig로 이전.
- Upgrade runbook과 rollback plan 문서화.
- Admin/API 운영 로그와 alerting 추가.
배포 / 운영
테스트넷은 빠르게 반복하고, 메인넷은 guardrail을 걸어 실수로 배포/업그레이드하지 못하게 구성한다.
1Local / Testnet commands
2Environment variables
| Env | 용도 | 공유 가능? |
|---|---|---|
CREDITCOIN_RPC_URL | API/contract RPC | 가능 |
CNS_REGISTRY_ADDRESS | proxy address | 가능 |
CNS_START_BLOCK | event scan 시작 block | 가능 |
CNS_PROXY_ADDRESS, CNS_UPGRADE_CONTRACT | contract script override. 기본은 deployment JSON 사용 | 가능 |
CNS_ADMIN_API_BASE, CNS_METADATA_API_BASE | admin proxy/API metadata endpoint override | 가능 |
API_ALLOWED_ORIGINS | CORS allowlist | 가능 |
DEPLOYER_PRIVATE_KEY | 배포/업그레이드 signer | 절대 공유 금지 |
PINATA_JWT | IPFS upload credential | 절대 공유 금지 |
ADMIN_API_KEY, CNS_METADATA_ADMIN_API_KEY | server-side admin key | 절대 공유 금지 |
DATABASE_URL, REDIS_URL | 인덱서/캐시 | 환경별 분리 |
3Mainnet guardrails
- 메인넷 deploy는
CNS_MAINNET_DEPLOY_ACK=deploy-cns-mainnet없으면 실패. - 메인넷 owner multisig 없으면 deploy 실패.
- 메인넷 upgrade는
CNS_MAINNET_UPGRADE_ACK=upgrade-cns-mainnet필요. - Deploy 후 multisig가
acceptOwnership()호출해야 운영 계속 가능. - Preflight는 proxy code, implementation code, owner, ERC-721 interface, name/symbol/tld, static register를 확인한다.
4운영 아키텍처
| 계층 | 출시 MVP | 확장 단계 |
|---|---|---|
| 프론트엔드 | 단일 HTML MVP | 최종 배포를 React로 선택할 경우 신규 포팅 + analytics + error tracking |
| API | RPC read-through + metadata upload | DB read-through + Redis cache + queue |
| 메타데이터 | Pinata IPFS | Pinata + secondary pinning provider |
| Admin | script + 최소 대시보드 | 전체 admin console + audit log |
| 모니터링 | health endpoint + 수동 Blockscout 확인 | RPC 지연, IPFS gateway, API p95, 실패 tx 알림 |
5릴리즈 체크리스트
| 단계 | 완료 기준 | 실패 시 중단 조건 |
|---|---|---|
| 코드 동결 | contract, API, web, docs 버전 태그 | 추적되지 않은 비밀값, 실패한 테스트 |
| 컨트랙트 preflight | proxy/implementation/owner/interface/name/symbol/tld 확인 | owner가 개인 EOA 또는 implementation mismatch |
| 메타데이터 스모크 테스트 | 새 등록 NFT가 Blockscout에서 이미지/JSON 표시 | tokenURI가 empty거나 gateway에서 text/plain SVG만 노출 |
| 지갑 스모크 테스트 | MetaMask chain add/switch/register/renew/records/primary 통과 | 잘못된 chain에서 tx 가능 |
| API 스모크 테스트 | health/metadata health/resolve/records/reverse/names/pricing 조회 정상. metadata prepare는 wallet signature 또는 server-side admin key가 필요한 인증 경로 | production CORS 검수, 모니터링, 캐시 미흡 |
| Rollback 계획 | 이전 implementation 주소와 upgrade 절차 문서화 | rollback owner 권한 불명확 |
6장애 대응 runbook
| 증상 | 먼저 볼 곳 | 대응 |
|---|---|---|
| 이름 등록은 됐는데 NFT 이미지가 안 보임 | tokenURI, IPFS gateway, metadata JSON image field | metadata 재업로드 후 새 metadataURI로 renew/update 정책 검토 |
| My names가 느림 | API log, RPC latency, Transfer log scan range | 캐시 추가, start block 조정, indexer 우선순위 상향 |
| 사용자가 다른 네트워크에서 tx 시도 | wallet chain id, frontend network guard | add/switch chain 요청 재시도, 잘못된 chain이면 CTA disabled |
| 피싱 이름 신고 | abuse queue, owner, records, 만료일 | 법적/정책 검토 후 reserve list 또는 안내 페이지 처리 |
| 업그레이드 후 read 함수 실패 | preflight, storage layout, ABI version | 즉시 write 중단, previous implementation rollback 검토 |
개발자 인수인계
새 개발자나 Design/FE/BE/SC 팀이 CNS를 맡으면 아래 순서로 보면 된다. 이 탭은 프로젝트 소개, 팀별 책임, 팀 간 계약, 완료 기준을 한 번에 보는 공유용 시작점이다.
1프로젝트 소개
CNS는 Creditcoin의 .ctc 이름 서비스다. 사용자는 사람이 읽을 수 있는 이름을 등록하고, 그 이름을 지갑 주소와 public profile records에 연결하며, 한 주소의 대표 표시명으로 primary name을 설정할 수 있다. 각 이름은 ERC-721 NFT이고, explorer/marketplace 표시를 위해 IPFS JSON/SVG metadata를 가진다.
긴 주소 대신 name.ctc로 송금/표시/프로필 연결을 한다.
contract, resolver API, SDK, admin, metadata pipeline을 통해 지갑/거래소/dApp이 CNS를 붙일 수 있다.
Testnet MVP와 팀 공유는 가능하다. Mainnet production은 audit, multisig, monitoring, admin audit log가 gate다.
2팀별 책임 범위
| 팀 | 주요 책임 | 핵심 파일 | 완료 증거 |
|---|---|---|---|
| FE | Register, Review, Success modal, My names, Records, Renew, wallet/network UX, responsive/error state | cns-experience.html, embedded app in cns-living-spec.html | 브라우저 QA, HTML script parse, 실제 testnet tx 흐름, 모바일/긴 이름/실패 상태 확인 |
| Design | Visual system, product copy tone, modal/table/mobile polish, NFT image style, sensitive state copy | cns-experience.html, cns-living-spec.html, cns-icon.svg, cns-og.svg, site.webmanifest | Design QA notes, UI tokens/spec, responsive review, NFT image/display approval |
| BE | Resolver API, Universal/Profile aliases, metadata prepare, Pinata, rate limit, future indexer/cache/admin API | apps/api, apps/indexer, packages/shared, packages/sdk | API smoke 200, typecheck/build/lint, response schema 유지, metadata health/upload auth 확인 |
| SC | Registration, renewal, records, primary, metadataURI, records/metadata lock, UUPS deploy/upgrade, events | contracts/contracts/CreditcoinNameService.sol, contracts/test, contracts/scripts | 32 tests, compile, solhint, preflight/verify, storage layout compatibility, testnet tx hash |
| Ops/Security | Secrets, deployment runbook, multisig, audit, monitoring, abuse process, production release gates | docs/security-policy.md, docs/launch-readiness-ko.md, docs/release-readiness-audit-2026-05-27.md | 외부 감사, multisig owner, runtime audit clean, monitoring/alerting, incident owner 확정 |
3팀 간 계약
| 연결 | 계약 | 깨지면 생기는 문제 | 보호 방법 |
|---|---|---|---|
| FE ↔ BE | NameResolution shape, error code, loading/empty/error 상태, metadata prepare request/response | 화면은 뜨지만 잘못된 주소/만료/이미지/lock 상태를 보여줄 수 있음 | SDK/shared type 사용, API smoke, response snapshot 문서화 |
| Design ↔ FE | UI tokens, spacing, responsive breakpoints, modal/table states, copy tone, NFT image/display rules | 구현은 되지만 화면이 불안정하거나 브랜드/상태 문구가 팀마다 달라질 수 있음 | Design QA, shared token/spec notes, mobile screenshots, sensitive state copy review |
| FE ↔ SC | ABI function params, tx value, chain id, explorer link, tokenId derivation, modal success state | 지갑 tx 실패, 잘못된 explorer 이동, 성공 후 이름 목록 불일치 | preflight/e2e, ABI 변경 시 FE checklist, success modal QA |
| BE ↔ SC | events, startBlock, resolveRecords, primaryOf, lockStatus, metadataURIOf | 인덱서/API가 stale data를 반환하거나 lock/primary를 놓침 | event list 고정, deployment JSON, resolver API smoke, indexer replay test |
| 팀 ↔ Ops | env vars, secrets, deploy order, rollback, monitoring, admin request workflow | 비밀값 노출, wrong network deploy, 장애 시 owner 불명확 | .env.example만 공유, runbook, multisig, audit log |
4릴레이 흐름
한눈에 보는 CNS 릴레이
사용자 입력이 어떤 팀과 시스템을 거쳐 온체인 상태, API 응답, 화면/운영 확인으로 이어지는지 보여준다.
이름, 기간, primary 여부, records, NFT 이미지 선택을 받고 review modal에서 금액과 만료일을 확인시킨다.
필요 시 wallet signature 또는 admin key를 검증하고 SVG/JSON을 IPFS에 업로드한다.
MetaMask 또는 WalletConnect가 Creditcoin network와 tx value를 확인하고 사용자가 직접 전송한다.
register, renew, setRecords, setPrimary, setMetadata, lock 상태를 저장하고 event를 발생시킨다.
RPC 또는 indexer/cache가 contract state와 logs를 읽어 NameResolution 응답으로 정규화한다.
Success modal, My names, Records, explorer link를 갱신하고 admin은 health/metadata/abuse/request를 확인한다.
제품/데이터 릴레이
resolveRecords, primaryOf, lockStatus, logs를 읽어 NameResolution shape로 반환한다. 나중에는 indexer/cache로 대체 가능하다.업무 릴레이
| 단계 | 담당 | 입력 | 출력 |
|---|---|---|---|
| 요구사항 접수 | Owner / PM | 사용자 문제, 출시 요구, 파트너 요청 | 목표, 우선순위, 영향 팀 |
| 인터페이스 확인 | FE + BE + SC | 변경할 UX/API/ABI/event | 변경 계약, 깨지면 안 되는 필드, 테스트 범위 |
| 팀별 구현 | 각 팀 | 팀별 task와 source file | 코드, 문서, migration/runbook 필요 여부 |
| 통합 검증 | 변경 주도 팀 + 소비 팀 | PR 또는 작업물 | typecheck, build, contract tests, API smoke, browser QA |
| 릴리즈 증거 정리 | Release owner / Ops | 명령 결과, tx hash, API sample, screenshot | release readiness audit, changelog, handoff note |
문제 발생 시 릴레이
| 문제 | 첫 확인 | 다음 릴레이 | 완료 기준 |
|---|---|---|---|
| 화면/모달/문구 문제 | FE | API 값 문제면 BE, tx/ABI 문제면 SC | 브라우저 재현과 수정 확인 |
| resolver/API 응답 문제 | BE | 온체인 값 문제면 SC, 표시 문제면 FE | API smoke와 response sample 통과 |
| tx revert/owner/metadata 문제 | SC | FE에 사용자 문구, BE에 indexer/API 영향 공유 | test/preflight/tx hash로 증명 |
| 비밀값/배포/운영 문제 | Ops/Security | 영향 받는 모든 팀 | key rotation, rollback, incident note, 재검증 |
5최종 기준 맵
6장애 / 버그 판단 루트
resolveRecords, primaryOf, lockStatus 온체인 read와 API response sample을 비교한다. API가 맞으면 FE 표시 문제다.7릴리즈 / 업그레이드 맵
8읽는 순서
README.md에서 실행 방법과 배포 흐름 확인.docs/team-handoff-share-pack-2026-05-28-ko.md에서 Slack 공유 문구, 팀별 첫 작업, GitHub 업로드 플랜 확인.docs/cns-spec-ko.md에서 CNS 자체가 제공해야 하는 P0/P1/P2 제품/프로토콜 스펙 확인.docs/release-readiness-audit-2026-05-27.md에서 현재 릴리즈 판정과 증거 확인.cns-experience.html에서 현재 제품 UX 확인.contracts/contracts/CreditcoinNameService.sol에서 source of truth 확인.apps/api/src/routes/resolver.ts와apps/api/src/routes/metadata.ts에서 API 흐름 확인.packages/shared/src/index.ts에서 pricing/type contract 확인.docs/security-policy.md와docs/launch-readiness-ko.md로 운영 체크.
9CNS 기능 스펙
docs/cns-spec-ko.md다. 이 표는 팀 업무 목록이 아니라 CNS가 제품/프로토콜로 제공해야 하는 기능 범위 요약이다.| Phase | 실제 기능 스펙 | 완료 기준 |
|---|---|---|
| P0 / Phase 1 | name 생성, availability/price, review modal, wallet tx, success modal, My names, records, primary, renew, explorer link, NFT metadata, resolver API, SDK/shared types, read-only admin. | CNS가 테스트넷에서 실제 네임 서비스로 동작한다. 사용자는 등록부터 관리까지 실행할 수 있고 API/contract/docs가 같은 스펙을 말한다. |
| P1 / Phase 2 | production API, indexer DB/Redis, FE/Design QA, OpenAPI, metadata gateway fallback, external audit, multisig owner, admin auth/audit log, monitoring/runbook. | CNS가 public beta/mainnet 후보로 운영될 수 있다. 보안, 운영, API 안정성, admin 증거 흐름이 갖춰진다. |
| P2 / Phase 3 | contenthash routing, partner samples, subnames/delegated managers, renewal reminders, bulk/team flows, marketplace automation, analytics, public docs, governance. | CNS가 파트너/고급 사용자/운영팀을 위한 확장 네임 서비스로 커진다. |
10현재 통과한 검증
| Command | 결과 | 의미 |
|---|---|---|
npm run typecheck | 통과 | TS type check 통과 |
npm run lint | 통과 | 현재 lint는 TS noEmit 기반 |
npm run build | 통과 | api/indexer/sdk/shared build 통과 |
npm run contracts:test | 32 passing | 컨트랙트 보안/기능 회귀 테스트 통과 |
npx solhint 'contracts/contracts/**/*.sol' | 통과 | Solidity lint/security style 체크 통과 |
slither contracts ... | 0 findings | 배포 대상 컨트랙트 기준 정적 분석 통과 |
npm audit --omit=dev --workspaces --audit-level=moderate | 0 vulnerabilities | 운영 dependency 기준 audit 통과 |
| API smoke | 통과 | health, pricing, resolve, records, universal, profile, reverse, names, metadata health |
| 브라우저 스모크 테스트 | 통과 | cns-experience.html, cns-admin.html, living spec 핵심 탭 로드 |
| 기록된 실제 e2e | 확인 기록 | auditmpmfoytc.ctc tokenURI/IPFS JSON/Blockscout image 표시 기록. gateway 표시는 계속 spot-check |
11팀별 첫 작업
| 팀 | 첫 1주 작업 | 산출물 |
|---|---|---|
| FE | HTML MVP 기준으로 UX QA matrix 만들기. 최종 배포가 HTML인지 React인지 결정되면 route/state/component mapping 정리. | FE QA checklist, route map, component/task breakdown |
| Design | 현재 HTML MVP 기준으로 제품 UI audit, 토큰/간격/모달/테이블/모바일/NFT 이미지 기준 확정. | Design QA notes, UI token/spec, responsive screenshots, NFT image/display approval |
| BE | API schema freeze, indexer/DB/Redis 설계, metadata/admin/abuse 운영 API 범위 확정. | OpenAPI 또는 response examples, DB schema draft, ops endpoint list |
| SC | 외부 audit package 준비, mainnet multisig/treasury/runbook 요구사항 정리, upgrade rollback rehearsal. | Audit packet, deploy/upgrade runbook, mainnet gate checklist |
| Ops/Security | secrets policy, monitoring, incident owner, abuse report process, production hosting 결정을 모은다. | Ops runbook, security checklist, owner matrix |
12공유 전 주의
.env를 공유하지 말 것. 공유 대상은 .env.example과 이 문서, 코드, README다.- 공유 전
main/dev기준, branch protection, review rule을 정하고 현재 baseline commit을 고정한다. - 테스트넷 배포 주소는 문서에 있어도 되지만 private key, Pinata JWT, admin key는 제외한다.
- 메인넷 전에는 external audit, multisig owner, admin runbook, abuse policy를 확정한다.
- 인덱서는 launch 후 추가 가능하지만 API shape를 깨지 말아야 한다.
13CNS 다음 기능 스펙
| Phase | 기능/스펙 | 담당 |
|---|---|---|
| P1 / Phase 2 | Admin API, persistent audit log, role/SSO policy | 백엔드 + 운영 |
| P1 / Phase 2 | Mainnet multisig owner, treasury, withdraw 정책 | 운영 / 보안 / SC |
| P1 / Phase 2 | External smart contract audit와 upgrade rollback runbook | SC / 보안 |
| P1 / Phase 2 | Indexer DB/Redis schema, backfill, API monitoring, rate limit, gateway fallback | 백엔드/운영 |
| P2 / Phase 3 | contenthash routing, partner samples, renewal reminders, marketplace automation | FE / BE / SC |
| P2 / Phase 3 | React production app 전환이 선택될 경우 route/state/component 포팅 | 프론트엔드 |
CNS At A Glance
CNS is the Creditcoin `.ctc` naming service. It maps human-readable names to wallet addresses, public profile records, reverse primary names, and ERC-721 name NFTs with IPFS metadata.
1What CNS Does
2Team Map
Owns product trust, visual system, state copy, NFT image direction, and mobile/responsive quality standards.
cns-experience.html, brand assetsOwns the user-facing app: search, register, review, success, names, records, renew, wallet, and responsive states.
cns-experience.htmlOwns resolver APIs, metadata prepare, Pinata upload, SDK response contracts, admin API, and future indexer/cache.
apps/api, apps/indexerOwns the UUPS ERC-721 registry, registration, renewal, records, primary names, metadata URI, locks, and upgrades.
contracts3End-To-End Flow Map
CNS System Topology
A true flow diagram showing how the product UI, API, wallet, contract, resolver/indexer, explorer, and admin layer connect.
Registration-To-Display Sequence
The end-to-end sequence from name input through metadata preparation, wallet transaction, contract state, My names refresh, and Blockscout display.
4Current Testnet State
| Item | Value | Notes |
|---|---|---|
| Chain | Creditcoin Testnet 102031 | Mainnet is 102030. |
| Proxy | 0xFED8E4097f6314EB80D1D40EF2Da34F2181cc419 | UUPS proxy. |
| Implementation | 0xCB955d455552bd511Dd03f1205f798322CC6BD76 | Includes canonical tokenURI, metadataURIOf storage, metadata repair, and records/metadata lock support. |
| Start block | 4810000 | Used by UI/API log scans. |
| Total supply at audit | 22 | 2026-05-27 preflight value. Keep gateway image checks as ongoing spot-checks. |
Launch Readiness
This page is the handoff checklist for developers and reviewers. The testnet MVP works; mainnet still needs audit, multisig ownership, monitoring, and operations hardening.
1Go / No-Go Summary
| Area | Status | Evidence | Mainnet gap |
|---|---|---|---|
| Contract | Ready for testnet | Compile, 32 tests, preflight pass. | External audit and multisig owner. |
| API | Working MVP | health, metadata health, pricing, resolve, records, reverse, names pass. | Cache, monitoring, indexer-backed names. |
| Frontend HTML | Working MVP | Local browser smoke with mock wallet and no console errors. | Production hosting choice and final wallet metadata. |
| Metadata/IPFS | Verified record | Recorded e2e name generated IPFS JSON/SVG and Blockscout image; gateway display remains an ongoing spot-check. | Secondary pinning and gateway fallback policy. |
| Admin | Testnet MVP | Admin HTML exists; walletless request workflow documented. | Server-side audit log, role policy, SSO/multisig. |
Product Prototype
This section embeds the actual cns-experience.html app with preview-safe overrides instead of using a separate mock. The real product UI is the single source of truth.
1Product Prototype
Product UX
The first screen is the actual naming tool, not a marketing landing page. The key path is search → review → metadata prepare → wallet transaction → success → My names.
1Primary User Flows
| Flow | Expected behavior | Verified by |
|---|---|---|
| Register | Search name, price it, prepare metadata, send registerWithMetadata. | Real testnet e2e. |
| Renew | Prepare refreshed metadata and call renewWithMetadata. | Real testnet e2e. |
| Records | Save address, avatar, profile, contenthash, bio, and socials. | Real testnet e2e. |
| Primary | Set reverse primary only when the forward address record points to the caller. | Contract tests and e2e. |
| My names | Load owned tokens through API/log scan and show primary first. | Registration log scan matched 22 current names. |
Name Policy
Labels are lowercase letters, numbers, and internal hyphens. One to three character names are not open-registration; only a specific label assigned to a specific claimant address can be minted. Four character names are premium; five or more are standard registration.
1Pricing
| Length | Annual price | Open registration |
|---|---|---|
| 1 | 50,000 CTC | No, label-specific assigned claim only |
| 2 | 10,000 CTC | No, label-specific assigned claim only |
| 3 | 2,500 CTC | No, label-specific assigned claim only |
| 4 | 500 CTC | Yes |
| 5+ | 50 CTC | Yes |
21-3 Character Claim Flow
setShortNameClaim(label, claimant) opens exactly one label for exactly one claimant address.abc.ctc and the receiving wallet address.setShortNameClaim("abc", claimant). Other 1-3 character labels remain locked.register or registerWithMetadata from their own wallet.Smart Contract
CreditcoinNameService is a UUPS upgradeable ERC-721 name service contract. It owns registration, renewal, primary names, records, reserved names, short-name claims, and token metadata URI storage.
1Contract Surface
| Category | Functions | Notes |
|---|---|---|
| User | register, registerWithMetadata, renew, renewWithMetadata, setMetadataURI, setAddress, setRecords, setRecordsLocked, setMetadataLocked, setPrimary | Used by the product app and compatible clients. setMetadataURI is also callable by the contract owner for approved repair flows unless metadata is locked by the name owner. |
| Read | available, price, resolve, resolveRecords, lockStatus, primaryOf, ownerOf, labelOf, tokenURI, metadataURIOf, tokenImageURI | Used by UI, API, SDK, explorers, and the read-only admin. |
| Owner / governance | setReserved, setShortNameClaim, withdraw, transferOwnership, acceptOwnership, cancelOwnershipTransfer, upgrade authorization | Mainnet privileged execution should be multisig-governed. The browser admin only prepares requests. |
Resolver API / SDK
The API lets wallets, exchanges, and apps resolve CNS names without embedding contract ABI logic. The MVP reads onchain data directly; the response shape is ready for an indexed backend later.
1Endpoints
NFT Metadata
Metadata is prepared before the wallet transaction. The backend creates the selected Clean White SVG, uploads SVG and JSON to IPFS, and the contract stores the JSON ipfs:// URI separately as metadataURIOf while tokenURI remains canonical onchain JSON/SVG.
1Verified Flow
- API creates the name SVG and uploads it to IPFS.
- API creates JSON metadata with
imageandimage_url. - App sends
registerWithMetadataorrenewWithMetadata. - Blockscout reads canonical tokenURI, while admin/indexer tools can inspect stored metadataURIOf.
auditmpmfoytc.ctc had IPFS metadata, matching SVG design paths, and a Blockscout gateway image. Treat gateway rendering as an ongoing spot-check.Indexer Plan
The MVP can run with onchain read-through. As name count and traffic grow, `/v1/names` should move to a Postgres/Redis-backed indexer while preserving the same API response shape.
1Why It Matters
Resolve/reverse calls are simple. Owner name lists, recent registrations, expiry alerts, abuse queues, and analytics become much easier with an indexer.
source.mode, source.complete, and the existing resolver response shape.Admin Site
The admin surface is internal. It helps operators inspect contract health, reserved names, short claims, metadata, abuse reports, indexer state, and handoff requests without executing writes in the browser.
1Admin Boundary
The browser admin stays walletless and read-only. Changes are captured as requests with evidence and audit logs, then handled through the responsible team's process outside the browser. Pinata JWT, private keys, and admin API keys must never live in browser code.
Admin Function Spec
Mainnet admin work should be deliberate, logged, and role-controlled. The admin site itself should not connect a wallet or execute contract writes; it prepares requests and evidence for the responsible team.
1Admin Actions
| Action | Request / execution path | Mainnet requirement |
|---|---|---|
| Reserve a label | POST /admin/reserve/request → external setReserved | Multisig review and audit log. |
| Assign short-name claim | POST /admin/short-claim/request → external setShortNameClaim | Policy approval and evidence. |
| Repair metadata | POST /admin/metadata/repair-request → backend/operator execution | Verify image/JSON before any write. |
| Operational request | POST /admin/requests → responsible team workflow | Evidence, approval status, and audit log before any external change. |
Security / Permissions
The main risks are owner-key control, upgradeability, metadata secrets, phishing/impersonation names, and public resolver trust. Mainnet requires stronger operational controls than testnet.
1Hard Rules
- Never commit `.env`, private keys, Pinata JWT, or admin keys.
- Do not use an EOA owner for mainnet launch.
- Run compile, tests, preflight, and e2e before any upgrade handoff.
- Keep metadata prepare authenticated by wallet signature or server-side admin key.
Deployment / Operations
The shared deployment file is the source of truth for frontend and scripts. Testnet is deployed and verified. Mainnet deploy and upgrade scripts are intentionally guarded.
1Core Commands
Developer Handoff
Start here before sharing the repository with design, frontend, backend, or smart-contract engineers. This section explains what CNS is, who owns what, which interfaces must stay stable, and what evidence proves work is done.
1Project Introduction
CNS is the Creditcoin .ctc name service. Users register readable names, connect them to wallet addresses and public profile records, choose one primary name per address, and receive an ERC-721 name NFT with IPFS metadata for explorer and marketplace display.
Use name.ctc instead of a long address for display, receiving, and profile context.
Wallets, exchanges, apps, and admin tooling can integrate through the contract, resolver API, SDK, and metadata pipeline.
Testnet MVP handoff is ready. Mainnet production still requires audit, multisig ownership, monitoring, and admin audit logs.
2Team Ownership
| Team | Owns | Key files | Done evidence |
|---|---|---|---|
| Frontend | Register, Review, Success modal, My names, Records, Renew, wallet/network UX, responsive/error states | cns-experience.html, embedded preview in cns-living-spec.html | Browser QA, script parse, testnet tx flow, mobile/long-name/error checks |
| Design | Visual system, product copy tone, modal/table/mobile polish, NFT image style, sensitive state copy | cns-experience.html, cns-living-spec.html, cns-icon.svg, cns-og.svg, site.webmanifest | Design QA notes, UI tokens/spec, responsive review, NFT image/display approval |
| Backend | Resolver API, Universal/Profile aliases, metadata prepare, Pinata, rate limit, future indexer/cache/admin API | apps/api, apps/indexer, packages/shared, packages/sdk | API smoke 200, typecheck/build/lint, stable response schema, metadata health/auth checks |
| Smart Contract | Registration, renewal, records, primary, metadataURI, records/metadata lock, UUPS deploy/upgrade, events | contracts/contracts/CreditcoinNameService.sol, contracts/test, contracts/scripts | 32 tests, compile, solhint, preflight/verify, storage compatibility, testnet tx hash |
| Ops / Security | Secrets, deployment runbook, multisig, audit, monitoring, abuse process, production gates | docs/security-policy.md, docs/launch-readiness-ko.md, release audit document | External audit, multisig owner, runtime audit clean, monitoring/alerting, incident owner |
3Integration Contracts
| Boundary | Contract | Failure mode | Guardrail |
|---|---|---|---|
| FE ↔ BE | NameResolution, error codes, loading/empty/error states, metadata prepare request/response | UI shows stale or wrong address, expiry, image, or lock state | Shared types, SDK, API smoke, response examples |
| Design ↔ FE | UI tokens, spacing, responsive breakpoints, modal/table states, copy tone, NFT image/display rules | The app works but visual polish, brand trust, or state copy diverges by team | Design QA, shared token/spec notes, mobile screenshots, sensitive-state copy review |
| FE ↔ SC | ABI params, tx value, chain id, explorer URL, tokenId, success modal state | Wallet tx fails or success flow opens the wrong page/name | Preflight/e2e, ABI checklist, success modal QA |
| BE ↔ SC | Events, startBlock, resolveRecords, primaryOf, lockStatus, metadataURIOf | Indexer/API misses lock, primary, metadata, or ownership changes | Event list, deployment JSON, resolver smoke, indexer replay test |
| Teams ↔ Ops | Env vars, secrets, deploy order, rollback, monitoring, admin requests | Secret leak, wrong network deploy, unclear incident owner | Share .env.example only, runbooks, multisig, audit logs |
4Relay Flow
CNS Relay At A Glance
Shows how user input moves through teams and systems into onchain state, API responses, product screens, and operations evidence.
Collect name, duration, primary choice, records, and NFT image selection, then confirm fee and expiry in the review modal.
When needed, verify wallet signature or admin key, generate SVG/JSON, and upload metadata to IPFS.
MetaMask or WalletConnect confirms Creditcoin network and tx value, then the user submits the transaction directly.
Handles register, renew, setRecords, setPrimary, setMetadata, and lock state, then emits events.
RPC or indexer/cache reads contract state and logs, then normalizes the result into NameResolution responses.
Update success modal, My names, Records, and explorer links. Admin checks health, metadata, abuse, and requests.
Product / data relay
resolveRecords, primaryOf, lockStatus, and logs, then returns the stable NameResolution shape. An indexer/cache can replace direct RPC later.Work relay
| Step | Owner | Input | Output |
|---|---|---|---|
| Requirement intake | Owner / PM | User issue, release need, partner request | Goal, priority, affected teams |
| Interface check | FE + BE + SC | UX/API/ABI/event change | Change contract, stable fields, test scope |
| Team implementation | Each team | Team task and source files | Code, docs, migration/runbook need |
| Integration verification | Owning team + consuming teams | PR or working artifact | typecheck, build, contract tests, API smoke, browser QA |
| Release evidence | Release owner / Ops | Command output, tx hash, API sample, screenshot | release audit, changelog, handoff note |
Issue relay
| Issue | First owner | Next relay | Done evidence |
|---|---|---|---|
| Screen, modal, or copy issue | FE | BE if the value is wrong, SC if tx/ABI is wrong | Browser repro and fix verification |
| Resolver/API response issue | BE | SC if onchain state is wrong, FE if display is wrong | API smoke and response sample pass |
| Transaction revert, owner, or metadata issue | SC | FE gets user copy, BE gets indexer/API impact | test, preflight, or tx hash proof |
| Secrets, deployment, or operations issue | Ops / Security | All affected teams | key rotation, rollback, incident note, re-verification |
5Source of Truth Map
6Failure / Bug Route
resolveRecords, primaryOf, lockStatus reads with the API response sample. If API is right, FE display is next.7Release / Upgrade Map
8Read Order
README.mdfor setup, scripts, env, and deployment flow.docs/team-handoff-share-pack-2026-05-28-ko.mdfor Slack copy, team actions, and GitHub upload plan.docs/cns-spec-ko.mdfor the P0/P1/P2 CNS feature specs.docs/release-readiness-audit-2026-05-27.mdfor the current readiness verdict and evidence.cns-living-spec.htmlfor product/system context in Korean or English.cns-experience.htmlfor the current HTML MVP app.contracts/contracts/CreditcoinNameService.solfor the source of truth.apps/api/src/routes/resolver.tsandapps/api/src/routes/metadata.tsfor API behavior.packages/shared/deployments/cns-102031.jsonfor testnet address/start block.
9CNS Feature Specs
docs/cns-spec-ko.md is the detailed source for what CNS itself must support.| Phase | Feature Specs | Gate |
|---|---|---|
| P0 / Phase 1 | Name creation, availability/price, review modal, wallet tx, success modal, My names, records, primary, renew, explorer links, NFT metadata, resolver API, SDK/shared types, read-only admin. | Users can register and manage names on testnet, and API/contract/docs match. |
| P1 / Phase 2 | Production API, indexer DB/Redis, FE/Design QA, OpenAPI, metadata gateway fallback, external audit, multisig owner, admin auth/audit log, monitoring/runbooks. | Ready to become a public beta or mainnet candidate. |
| P2 / Phase 3 | Contenthash routing, partner samples, subnames/delegated managers, renewal reminders, bulk/team flows, marketplace automation, analytics, public docs, governance. | Expansion features are stable for partners, advanced users, and operators. |
10Latest Evidence
| Check | Result |
|---|---|
npm run typecheck | Pass |
npm run lint | Pass |
npm run build | Pass |
npm run contracts:test | 32 passing |
npx solhint 'contracts/contracts/**/*.sol' | Pass |
slither contracts ... | 0 findings for deploy-target contracts |
npm audit --omit=dev --workspaces --audit-level=moderate | 0 vulnerabilities |
preflight:testnet | Pass on implementation 0xCB95...BD76, totalSupply 22 |
| API smoke | health, metadata, pricing, resolve, records, universal, profile, reverse, names pass |
| Blockscout | Gateway image display is an ongoing spot-check, not a static release gate. |
| Recorded real e2e | auditmpmfoytc.ctc registered, records set, primary set, renewed, canonical tokenURI and metadataURIOf checked |
11First Work By Team
| Team | First week | Output |
|---|---|---|
| Frontend | Create QA matrix from the HTML MVP. If React is selected, map routes, state, and components from the current product source of truth. | FE QA checklist, route map, task breakdown |
| Design | Audit the current HTML MVP and finalize product UI tokens, spacing, modal/table/mobile behavior, and NFT image standards. | Design QA notes, UI token/spec, responsive screenshots, NFT image/display approval |
| Backend | Freeze API schema, design indexer/DB/Redis, define metadata/admin/abuse API scope. | Response examples or OpenAPI draft, DB schema, ops endpoint list |
| Smart Contract | Prepare external audit packet, mainnet multisig/treasury requirements, and upgrade rollback rehearsal. | Audit packet, deploy/upgrade runbook, mainnet gate checklist |
| Ops / Security | Collect secrets policy, monitoring, incident owner, abuse report process, hosting decisions. | Ops runbook, security checklist, owner matrix |
12Remaining Risks
- Mainnet requires external smart contract audit.
- Mainnet owner should be a multisig, not an individual EOA.
- Admin writes need persistent audit logs and role policy before production.
- The indexer is still a scaffold; API can run without it, but high-traffic name lists need DB/cache.
- Do not share `.env`; share `.env.example` only.