전체 요약

Tests passing Version 1.0.1

CNS를 한 장으로 이해하기

CNS는 Creditcoin의 .ctc 이름을 지갑 주소, dApp 표시명, 수신 주소, NFT marketplace 자산으로 연결하는 네임서비스다. 한 주소는 여러 이름을 가질 수 있고, primary name은 주소당 하나만 가진다.

v1.0.1 기준 MVP 작동 UUPS 업그레이드 가능 ERC-721 이름 NFT IPFS 메타데이터 MVP에서는 인덱서 선택
1서비스 역할
등록
.ctc
이름을 검색하고 기간/primary를 정해 등록
정방향 조회
name → 0x
지갑/거래소/dApp이 사람이 읽는 이름을 주소로 변환
역방향 조회
0x → name
주소의 대표 표시명을 primary name으로 노출
MVP의 본질은 “주소 대신 이름으로 송금/수신”이다. Avatar, Profile URL, Contenthash, Bio, social records, NFT 이미지는 신뢰감과 외부 연동을 보강하는 레이어다.
2현재 구성
버전
1.0.1은 테스트넷 릴리즈 준비 기준선이다. 1.0.0은 2026-05-26 MVP 기준선으로 보존하고, 이 문서 이후의 신규 제품 작업은 긴급 수정이 아니라면 1.1.0으로 추적한다.
이름 표기
제품/UX는 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 호환 이름 NFT
API
apps/api, resolver/pricing/names/metadata 엔드포인트
SDK
packages/sdk, universal/profile/resolve/records/reverse/names/pricing 래퍼
인덱서
apps/indexer는 현재 스캐폴드 단계다. API 응답 구조는 이미 인덱서 전환을 고려해 설계되어 있다.
문서
docs/ 보안, 출시, API, 워크플로 메모와 이 living spec
3프로젝트를 팀별로 이해하기
Design

제품 신뢰감을 만드는 visual system, 상태 문구, NFT 이미지, 모바일/반응형 품질 기준을 책임진다.

Source: cns-experience.html, brand assets
FE

사용자가 이름을 검색, 등록, 연장, records 수정, primary 설정을 하는 실제 제품 화면을 책임진다.

Source: cns-experience.html
BE

resolver API, metadata prepare, Pinata upload, future indexer/cache/admin API를 책임진다.

Source: apps/api, apps/indexer
SC

UUPS ERC-721 name contract, registration, renewal, records, primary, metadata, lock, deploy/upgrade를 책임진다.

Source: contracts
팀이 나뉘어도 제품의 기준은 하나다. Design은 사용자 신뢰와 상태 표현 기준을 잡고, FE는 BE API와 SC ABI를 소비하고, BE는 SC event/read를 canonical source로 삼으며, SC는 FE/BE가 깨지지 않도록 ABI, event, storage layout, response expectations를 안정적으로 유지한다.
4전체 플로우맵

CNS 시스템 토폴로지

제품 화면, API, 지갑, 컨트랙트, resolver/indexer, explorer/admin이 어떻게 이어지는지 선으로 보는 전체 구조다.

Flow diagram
PRODUCT BACKEND ONCHAIN / READ MODEL OPS 사용자 / FE App search · review · records success · My names Resolver / Metadata API pricing · availability metadata prepare · IPFS Wallet MetaMask / WalletConnect user-signed tx only CNS Contract owner · expiry · records primary · tokenURI · locks source of truth Resolver / Indexer contract reads · events names · reverse · profile IPFS / Gateway SVG · JSON image delivery Blockscout / Wallet NFT image · token page marketplace cache Admin / Ops evidence · requests release checks 1 price/status 3 open tx 2 metadata SVG/JSON 4 signed tx 5 reads/events 6 API refreshes UI 7 tokenURI image 8 ops evidence

등록부터 표시까지 시퀀스

이름 등록이 어떤 순서로 움직이고, 성공 후 My names와 Blockscout 표시가 어디서 갱신되는지 보여준다.

Sequence flow
User FE App API Wallet Contract Resolver Explorer 1 label, years, primary 선택 2 price/status + metadata prepare 3 fee, expiry, metadataURI 4 review modal opens wallet tx 5 registerWithMetadata / renew 6 events + state reads 7 My names / reverse / profile refresh 8 tokenURI, NFT image, tx evidence 성공 기준: UI, tx hash, API sample, explorer/tokenURI가 모두 일치
5핵심 플로우
검색사용자가 이름 입력. UI는 소문자 정규화, 예약/짧은 이름/온체인 등록 가능 여부 확인.
검토기간, primary 여부, 금액, 만료일 확인. 지갑 미연결이면 지갑 연결.
메타데이터등록 전 SVG/JSON 메타데이터를 IPFS에 업로드하고 metadata URI 준비.
트랜잭션MetaMask 또는 WalletConnect에서 Creditcoin 네트워크로 등록/연장 tx 전송.
관리My names에서 records, renew, make primary, NFT marketplace 표시 관리.
6현재 테스트넷 상태
항목메모
체인Creditcoin Testnet 102031메인넷은 102030
프록시0xFED8E4097f6314EB80D1D40EF2Da34F2181cc419UUPS 프록시
최신 구현체0xCB955d455552bd511Dd03f1205f798322CC6BD76canonical tokenURI + metadataURIOf + metadata repair 정책 + records/metadata lock 포함
Explorerhttps://creditcoin-testnet.blockscout.com/ERC-721 metadata 표시 확인 기록 있음. gateway 이미지는 운영 중 spot-check 지속
총 발행량22 CNS2026-05-27 preflight 기준. gateway 이미지는 계속 spot-check 필요
기록된 실제 e2eauditmpmfoytc.ctcregister, 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현재 완성도 한눈에 보기
A제품 UX

검색, 검토, 등록, 성공 모달, My names, records, renew, primary 흐름은 MVP 기준 완성. 모바일/긴 이름/지갑 미연결 상태까지 계속 점검 필요.

A스마트컨트랙

UUPS, ERC-721, records, primary, reserved, metadataURI가 구현되어 있다. 메인넷 전 외부 감사는 필수.

B+Resolver API

resolve/records/reverse/names/pricing/metadata prepare가 있다. 트래픽 증가 전 요청 제한, 캐시, 모니터링을 강화해야 한다.

B+Admin / Ops

테스트넷 연결형 admin MVP가 분리된 포트로 구현됨. 메인넷 전에는 multisig owner, 감사 로그 저장, 권한 정책을 강화해야 한다.

테스트넷 MVP 기준으로는 꽤 탄탄하다. 메인넷 출시 기준으로는 외부 감사, multisig owner, admin API/audit log, 모니터링, abuse policy가 남아 있다.
2진행 / 중단 기준
영역진행 조건중단 조건담당
컨트랙트테스트 통과, preflight 통과, 구현체 검증, owner 확인storage layout report 미보관, owner 개인키 분실 위험, 외부 cache mismatchSC
지갑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
APIresolve/records/reverse/names/pricing 정상, CORS/body limit, metadata prepare auth/rate limit 확인운영 CORS 오설정, ADMIN_API_KEY 브라우저 노출, 공개 resolver rate limit 미설정BE
Adminread-only 조회와 reserve/short claim/metadata 요청 생성 가능브라우저 admin은 직접 실행 불가, persistent audit log 없음Ops
보안외부 감사, multisig, rollback, abuse policy를 출시 gate로 관리mainnet owner가 EOA, upgrade runbook 없음, abuse policy 미확정Security
3역할별로 해야 할 일
역할
오늘 확인
테스트넷 완료
메인넷 전
운영 중
프론트엔드
앱 흐름등록, 검토 모달, 반응형 화면, 빈 상태/로딩/오류 상태 확인.
지갑 스모크 테스트MetaMask/WalletConnect 연결, 네트워크 전환, 트랜잭션 상태 확인.
프로덕션 마감React 전환 여부, 오류 추적, 라우트 정리.
UX 지표이탈 지점, 실패한 트랜잭션, 검색 오류를 추적.
백엔드
API 응답 형태resolver 응답이 인덱서 전환에 대비된 구조인지 확인.
메타데이터Pinata 업로드, 서명 인증, 게이트웨이 표시 확인.
운영 안정화요청 제한, CORS, 로그, 모니터링, admin API 점검.
확장 준비인덱서, Redis, DB 마이그레이션, 알림 체계 준비.
스마트컨트랙트
테스트소유권, 레코드, primary, 만료, 메타데이터, 업그레이드 검증.
배포검증, 사전 점검, e2e, 테스트넷 업그레이드 확인.
감사외부 감사, multisig owner, rollback 계획 확정.
거버넌스업그레이드 제안, 예약 이름 정책 트랜잭션 관리.
운영
런북비밀값, env, 배포 단계, 장애 담당자 정리.
관리자 기능예약 이름, 짧은 이름 클레임, 메타데이터 복구, 신고 큐 운영.
메인넷 보호장치SSO/multisig, 감사 로그, 모니터링 적용.
지원갱신 안내, 피싱 신고, explorer 표시 문제 대응.
4P0 체크리스트
컨트랙트 기준등록 가능 여부, 가격, 만료, owner, primary는 컨트랙트 기준으로 판단한다.
준비됨
Canonical tokenURI 정책tokenURI는 onchain canonical JSON이고, 등록 전 준비한 metadata JSON은 metadataURIOf로 분리한다.
준비됨
API 응답 구조나중에 onchain 조회를 indexer DB로 바꿔도 프론트가 깨지지 않게 source.mode를 둔다.
준비됨
Admin 최소 기능dashboard, names/reserve, metadata, reports, indexer, team requests 화면은 read-only 조회와 요청 생성 중심으로 구현되어 있다.
준비됨
!
Multisig owner메인넷 owner는 개인 EOA가 아니라 multisig여야 한다.
메인넷 전
!
외부 감사네임서비스는 자산권과 resolver 신뢰가 걸려 있으므로 외부 감사를 거쳐야 한다.
메인넷 전
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 guardmainnet 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 APIMVP 구현됨resolve/records/reverse/names/pricing/metadata prepare. 응답은 indexer-readymonitoring, production CORS review, cache/indexer
Metadata/IPFSMVP 구현됨등록 전 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-throughPostgres/Redis worker, backfill/retry, lag alert
문서/인수인계구현됨이 living spec + docs 폴더로 제품/개발/운영 기준 정리mainnet 결정값 반영, external audit 결과 추가
결론: 테스트넷 MVP는 구현되어 있다. 메인넷 공개 출시 기준으로는 감사, multisig, 운영 DB/indexer, admin 감사 로그, production hosting이 남아 있다.
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.ts

resolve/records/reverse/names/pricing API. 외부 지갑/거래소/dApp 통합의 시작점.

apps/api/src/routes/metadata.ts

NFT image/JSON 준비, Pinata 업로드, wallet signature/server-side admin key 정책.

packages/shared/src/index.ts

name 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분 점검 절차
  1. npm run typecheck, npm run build, npm run contracts:test 실행.
  2. 테스트넷에서 새 이름 1개 등록: 검색 → review → metadata prepare → wallet tx → success modal.
  3. Blockscout에서 tokenURI JSON, NFT image, attributes, owner가 제대로 보이는지 확인.
  4. My names에서 방금 등록한 이름이 보이는지 확인하고 records 저장, primary 변경, renew modal 테스트.
  5. API에서 /v1/resolve/:name, /v1/reverse/:address, /v1/names/:address 확인.
  6. Admin 기준 reserve/short claim 요청 문구와 owner/multisig 실행 runbook 확인.
  7. secrets 점검: .env, private key, Pinata JWT, admin key가 repo/HTML/browser에 노출되지 않는지 확인.
  8. rollback plan 확인: 이전 implementation 주소, owner 권한, upgrade script, preflight command 준비.

제품 프로토타입

이 영역은 별도 목업이 아니라 실제 cns-experience.html 앱 HTML에 문서 미리보기용 preview-safe override만 적용해 임베드한 화면이다. 제품 화면 기준은 항상 실제 앱 하나로 맞춘다.

실제 앱 임베드Mock wallet 지원인덱서 전환 가능 구조Admin 요약
1항상 열 수 있는 제품 프로토타입
실제 앱 HTML을 preview-safe 모드로 내장 서버 없이도 living spec 파일 안에서 렌더링
문서 미리보기와 실제 앱이 갈라지지 않도록 한 화면만 source of truth로 쓴다. 문서 안 임베드는 항상 preview-safe mock wallet을 켜지만, 테스트넷 실거래 검증은 새 탭에서 mockWallet 없이 열어 진행한다.
2Spec calculator

아래는 실제 앱이 아니라, 문서 안에서 가격/만료일/API 응답 구조를 빠르게 확인하는 보조 계산기다. 실제 UX 판단은 위 CNS 앱 프로토타입을 기준으로 한다.

.ctc
Available /creditname.ctc/register/review
Set as primary
Registration fee 50 CTC
Expires 2027-05-25
creditname.ctc
Ready. 1. Search name 2. Review registration 3. Prepare IPFS metadata 4. Confirm wallet transaction 5. Show registered state
3Resolver API simulator

프론트는 지금 onchain 조회를 쓰더라도 아래 응답 형태만 바라보면 된다. 나중에 인덱서를 붙여도 source.mode만 바뀌고 앱 구조는 그대로 유지된다.

4Admin console summary
Reserve List브랜드/피싱/운영 이름의 예약 상태를 조회하고 담당 팀 요청을 만든다.
Short Claims1-3자 label + claimant address 조합을 확인하고 스마트컨트랙트팀 요청으로 넘긴다.
Metadata Opscanonical tokenURI, stored IPFS URI, gateway image 상태를 확인하고 backend repair 요청을 만든다.
Indexer Healthlatest block, lag, failed logs, retry queue를 본다.
Abuse Queue피싱/사칭 신고를 접수하고 reserve 후보로 넘긴다.
Team Requestsreserve, metadata, API/RPC, indexer 요청을 evidence와 함께 만든다.
Admin은 일반 앱에 섞지 않는다. 브라우저 admin은 지갑 연결과 직접 쓰기 실행 없이 read-only 조회, evidence 정리, 팀별 요청 생성만 담당한다.
5프로토타입 구분
항목문서 내 프로토타입실제 제품
Product prototype실제 cns-experience.html 앱을 preview-safe override만 적용해 문서 안에 임베드최상위 탭에서 mockWallet 없이 열면 지갑까지 실제 테스트 가능
Spec calculator문서용 계산기. 가격/만료/API shape 확인UX 판단 기준 아님
Admin console문서 내 요약 + 별도 테스트넷 admin apphttp://127.0.0.1:8766/dashboard에서 확인
Wallet문서 프로토타입은 tx를 보내지 않음MetaMask/WalletConnect는 top-level app에서 확인

제품 UX

첫 화면은 landing page가 아니라 바로 이름을 등록하는 앱이다. 불필요한 설명을 줄이고, 검색 → review → wallet → success → My names로 이어지는 흐름을 유지한다.

App-firstMetaMaskWalletConnectResponsive
1화면 구조
Route목적상태
/Register tab. 이름 검색 및 등록 시작.필수
/:name.ctc/register이전 공유 링크 호환용. 실제 앱은 첫 화면을 /로 정규화한다.호환
/:name.ctc/register/reviewReview registration modal deep-link.필수
/connect-walletRegister 흐름의 wallet connect modal.필수
/:name.ctc/register/connect-wallet이름이 포함된 wallet connect deep-link 호환 경로.호환
/:name.ctc/register/registered등록 성공 modal deep-link.완료 UX
/namesMy names. owned names, records, renew, primary 관리.필수
/names/connect-walletNames 관리 중 지갑 연결 modal.관리 UX
/names/:name.ctc/recordsEdit records modal deep-link.관리 UX
/names/:name.ctc/renewRenew modal deep-link.관리 UX
/names/:name.ctc/renewed연장 성공 modal deep-link.완료 UX
2등록 UX
이 섹션은 일반 사용자용 CNS 앱 기준이다. Admin 사이트는 이 등록 UX를 복제하지 않고, 지갑 연결 없이 read-only 조회/검수/요청 생성만 제공한다.
등록 화면의 실제 UI는 cns-experience.html이 source of truth다. 이 문서에는 별도 그림 목업을 두지 않고, 구현이 지켜야 하는 규칙만 남긴다.
상황실제 앱 규칙확인 위치
첫 등록 화면검색 input과 등록 CTA 중심. 기간/fee/primary 선택은 첫 화면에 노출하지 않는다.cns-experience.html register view
Review modalReview 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내용주의
Namedefault avatar + name. Avatar record가 있으면 실제 avatar 표시.긴 이름은 한 줄 truncate
RecordsAvatar set / Profile / No avatar / No profile상태만 빠르게 보이게
Expiry현재 만료일연장 modal에서 현재/연장 후 날짜 모두 표시
PrimaryPrimary 또는 Make primaryMake primary는 반드시 지갑 tx/서명 필요
ActionRecords, RenewRenew는 register 화면이 아니라 names에서 modal
4지갑 UX
  • 지원 지갑: MetaMask, WalletConnect.
  • 연결 시 Creditcoin Testnet이 없으면 wallet_addEthereumChain, 다른 네트워크면 wallet_switchEthereumChain.
  • 지갑 버튼 클릭 시 바로 아래 inline disconnect 영역을 보여준다. 별도 복잡한 account modal은 MVP에서 피한다.
  • 운영 빌드에서는 contract, wcProjectId URL override를 허용하지 않는다. Metadata/API base는 로컬에서는 http://127.0.0.1:4000, 운영에서는 동일 origin을 사용한다.

네임 정책

이름 정책은 UX, 가격, 보안, abuse 대응이 모두 엮인다. 지금 정책은 1-3자는 전체 오픈이 아니라 지정된 label과 claimant address 조합만 claim, 4자는 비싸게, 5자 이상은 낮은 가격으로 대중 등록한다.

1-63 chars1-3 restrictedmax 100 years
1Label validation
허용 문자
lowercase letters, numbers, hyphen
최대 길이
63 characters
숫자만
가능. 예: 1234.ctc
대문자 입력
프론트에서 입력은 허용하되 등록 전 lowercase normalize.
Hyphen
중간 hyphen 가능. 시작/끝 hyphen은 invalid.
2가격 정책
LengthAnnual priceOpen registration정책 이유
1 char50,000 CTC / yrNo, label-specific assigned claim only희소성/브랜드/스쿼팅 방지
2 chars10,000 CTC / yrNo, label-specific assigned claim only초기 chaos 방지
3 chars2,500 CTC / yrNo, label-specific assigned claim only거래소/프로젝트 claim 대응
4 chars500 CTC / yrYes짧은 이름 premium
5+ chars50 CTC / yrYes일반 유저 등록 가격
UI에서는 CTC만 보여준다. 달러 환산은 가격 변동 때문에 MVP에서 빼는 것이 낫다.
31-3자 claim 플로우
핵심: 1-3자는 전체 allowlist가 아니다. setShortNameClaim(label, claimant)는 특정 label 하나와 특정 claimant address 하나의 조합만 연다.
1. Label 신청요청자는 abc.ctc처럼 특정 label과 받을 wallet address를 제출한다.
2. 정책 검수Ops/BD/Security가 브랜드 권한, 피싱 위험, reserved 충돌, evidence를 확인한다.
3. 권한 부여owner/multisig가 setShortNameClaim("abc", claimant)를 실행한다. 다른 1-3자 label은 계속 잠겨 있다.
4. 직접 mint권한 받은 claimant가 자기 지갑으로 register 또는 registerWithMetadata를 직접 실행한다.
5. 운영 기록승인 evidence, 실행 tx hash, claimant, 만료일, records/metadata 상태를 admin/runbook에 남긴다.
예시결과
setShortNameClaim("abc", 0xClaimant)0xClaimantabc.ctc 등록 가능
0xClaimantdef.ctc 등록 시도실패. 같은 주소라도 다른 1-3자 label 권한은 없음
0xOtherabc.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를 한 컨트랙트에서 관리한다.

UUPSERC-72132 tests passingowner-only admin
1Public user functions
FunctionCaller결과
register(label, years, setPrimary)any user이름 NFT mint, address record 설정, optional primary
registerWithMetadata(label, years, setPrimary, metadataURI)app userIPFS 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 owneraddress record만 단독 업데이트. 제품 앱은 보통 setRecords를 사용한다.
setRecords(label, target, RecordsInput)active name ownerAddress, Avatar, Profile URL, Contenthash, Bio, X, GitHub, Discord, Telegram, Email 업데이트
setRecordsLocked(label, locked)active name ownerrecords 변경을 owner가 직접 잠그거나 해제한다. 피싱/실수 방지용 soft lock.
setMetadataLocked(label, locked)active name ownermetadata URI 변경을 owner가 직접 잠그거나 해제한다. Blockscout 이미지/프로필 안정화용.
setPrimary(label)active name owner주소의 primary name 설정. forward record가 caller여야 함.
2Read functions
Function사용처메모
available(label)검색 UIshort/reserved는 false
price(label, years)fee 계산컨트랙트 source of truth
resolve(label)name → address만료 시 address(0)
resolveRecords(label)API/profileaddress/avatar/profile/contenthash/bio/social records
primaryOf(address)reverse lookup만료 또는 forward mismatch면 empty
ownerOf(tokenId) / balanceOf(address)API/admin/explorerERC-721 ownership source of truth
labelOf(tokenId)API/admin/indexertokenId에서 원래 label 복원
tokenURI(tokenId)wallet/explorer/marketplace항상 canonical onchain JSON/SVG
metadataURIOf(tokenId)debug/indexer저장된 IPFS JSON URI
tokenImageURI(tokenId)metadata preview/debugcanonical onchain SVG image data URI
lockStatus(label)API/wallet/adminrecords/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, setApprovalForAllwallet/marketplaceNFT 승인 표준. 만료된 name은 approval 불가.
getApproved, isApprovedForAllwallet/marketplace/indexerERC-721 approval 상태 조회.
transferFrom, safeTransferFromwallet/marketplacetransfer 시 address record를 새 owner로 동기화하고 이전 owner primary를 정리한다.
supportsInterfaceexplorer/marketplaceERC-165, ERC-721, ERC-721 metadata interface를 반환.
4Admin functions
Function권한운영 처리 방식
setReserved(label, bool)ownerAdmin은 상태 확인과 요청 생성만 한다. 실행은 owner/multisig runbook.
setShortNameClaim(label, claimant)ownerAdmin은 claimant/evidence 검수와 요청 생성만 한다.
withdraw(to)ownerAdmin은 체크리스트와 요청만 만든다. 실행은 multisig 권장.
transferOwnership(nextOwner)ownerAdmin은 readiness 확인만 한다. 메인넷은 multisig 필수.
acceptOwnership()pending owner별도 owner/multisig 실행 절차에서 처리.
cancelOwnershipTransfer()owner잘못 시작된 ownership transfer를 별도 runbook에서 취소.
upgradeToAndCall(newImplementation, data)owner via UUPSAdmin은 preflight 증거와 요청 문구만 만든다. 실제 실행은 Hardhat upgradeProxy 스크립트나 multisig runbook에서 처리한다.
5Events for indexer
Transfer Approval / ApprovalForAll NameRegistered(label, labelHash, owner, expiresAt, price) NameRenewed(label, labelHash, expiresAt, price) AddressChanged(label, labelHash, target) RecordsChanged(label, labelHash, target, avatar, profile, contenthash, bio, x, github, discord, telegram, email) MetadataURISet(label, labelHash, metadataURI) RecordsLockSet(label, labelHash, locked) MetadataLockSet(label, labelHash, locked) PrimarySet(owner, name) Reserved(label, reserved) ShortNameClaimSet(label, labelHash, claimant) OwnershipTransferStarted / OwnershipTransferred / OwnershipTransferCanceled Initialized(version) / Upgraded(implementation)
현재 이벤트는 인덱서에 충분하다. RecordsChanged는 전체 record snapshot을 emit하고, 인덱서는 필요하면 같은 블록에서 resolveRecords를 다시 읽어 최종 상태를 검증할 수 있다. 나중에 DB 기반 API로 바꿔도 프론트가 깨지지 않도록 API 응답 shape는 이미 고정되어 있다.

Resolver API / SDK

외부 지갑, 거래소, dApp은 직접 온체인 ABI를 몰라도 API로 이름을 빠르게 조회할 수 있어야 한다. MVP는 RPC 기반이지만 response shape는 인덱서 전환을 염두에 두고 설계되어 있다.

Fastifyonchain modeSDK readyDB later
1Endpoints
Endpoint용도Source
GET /healthAPI 상태config
GET /v1/resolve/:namename → address/recordsresolveRecords
GET /v1/records/:name/v1/resolve/:name와 같은 shape의 records aliasresolveRecords
GET /v1/universal/:name지갑/거래소용 canonical resolver shaperesolveRecords + lockStatus
GET /v1/profile/:name프로필 화면용 canonical resolver shaperesolveRecords + lockStatus
GET /v1/reverse/:addressaddress → primary nameprimaryOf
GET /v1/names/:address내 이름 목록Transfer logs + ownerOf + resolveRecords
GET /v1/pricing/:label?years=1가격 계산shared pricing policy
GET /v1/metadata/healthmetadata upload/auth 상태config
POST /v1/metadata/prepareIPFS 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를 반환한다.
{ "name": "auditmpmfoytc.ctc", "label": "auditmpmfoytc", "tld": ".ctc", "address": "0xdfd16ac9964de4e7504edc85c9f997c893ba080b", "owner": "0xdfd16ac9964de4e7504edc85c9f997c893ba080b", "tokenId": "48190408067767218296754514134333628954345295087491748119787069310066465925584", "expiry": "2028-05-25T09:30:00.000Z", "expiresAt": 1842859800, "status": "active", "records": { "address": "0xdfd16ac9964de4e7504edc85c9f997c893ba080b", "avatar": "ipfs://e2e-avatar", "profile": "https://e2e.cns.example/profile", "contenthash": "ipfs://e2e-content", "bio": "E2E CNS profile", "x": "creditcoin", "github": "gluwa", "discord": "creditcoin", "telegram": "creditcoin", "email": "e2e@example.com" }, "locks": { "records": false, "metadata": false }, "resolver": { "standard": "CNS Universal Resolver", "version": "1.0.0", "endpoints": { "universal": "/v1/universal/auditmpmfoytc.ctc", "resolve": "/v1/resolve/auditmpmfoytc.ctc", "records": "/v1/records/auditmpmfoytc.ctc" } }, "source": { "chainId": 102031, "blockNumber": 4850075, "indexedAt": "2026-05-26T20:31:36.279Z", "mode": "onchain", "complete": true } }

source.mode는 나중에 indexed로 바뀔 수 있지만 클라이언트 shape는 유지한다.

3SDK
푸터의 Docs 링크는 이 섹션으로 연결한다. 외부 지갑, 거래소, dApp 개발자는 여기서 API endpoint, response shape, SDK 사용법, 운영 주의사항을 한 번에 확인한다.
대상추천 방식이유
지갑SDK 우선, API fallback송금 화면에서 name.ctc → address를 빠르게 resolve
거래소Server-side API입금 주소 검증, rate limit, cache, audit log 관리가 쉬움
dAppSDK 또는 REST APIprofile display, primary name, avatar/social records 표시
인덱서/분석REST API + 이벤트나중에 source.mode=indexed로 전환해도 shape 유지

Package status

npm install @cns/sdk

@cns/sdk는 의도한 public package 이름이다. 현재 repo에서는 private workspace 패키지이므로 외부 npm install은 배포 후 사용 경로로 보고, 외부 배포 전에는 npm scope, version, changelog, license, README를 확정해야 한다.

Basic usage

import { CnsClient } from "@cns/sdk"; const cns = new CnsClient({ apiBaseUrl: "https://api.cns.creditcoin.org" }); const resolved = await cns.resolve("auditmpmfoytc.ctc"); const universal = await cns.universal("auditmpmfoytc.ctc"); console.log(resolved.address); console.log(resolved.records?.avatar); const primary = await cns.lookupAddress("0xdfd16ac9964de4e7504edc85c9f997c893ba080b"); console.log(primary.name); const names = await cns.names("0xdfd16ac9964de4e7504edc85c9f997c893ba080b"); console.log(names.items.map((item) => item.name));

REST fallback

GET https://api.cns.creditcoin.org/v1/resolve/auditmpmfoytc.ctc GET https://api.cns.creditcoin.org/v1/universal/auditmpmfoytc.ctc GET https://api.cns.creditcoin.org/v1/profile/auditmpmfoytc.ctc GET https://api.cns.creditcoin.org/v1/reverse/0xdfd16ac9964de4e7504edc85c9f997c893ba080b GET https://api.cns.creditcoin.org/v1/names/0xdfd16ac9964de4e7504edc85c9f997c893ba080b GET https://api.cns.creditcoin.org/v1/pricing/creditname?years=2

Records available to integrators

FieldMeaningDisplay guidance
address송금/수신 대상 주소가장 중요한 필드. primary display보다 우선 검증
avatarIPFS/HTTPS avatar URI이미지 실패 시 default CNS avatar 표시
profile외부 프로필 URL새 탭으로 열고 phishing warning 적용 가능
contenthashIPFS/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를 별도로 확인할 수 있어야 한다.

PinataSVGIPFS JSONBlockscout compatible
1Metadata flow
Reviewname, years, primary, owner 확정
Sign운영 환경에서 wallet이 metadata request 서명
Upload SVG서버가 CNS NFT 이미지 생성 후 Pinata 업로드
Upload JSONimage URI 포함 metadata JSON 업로드
MintregisterWithMetadata(..., metadataURI) tx
2Metadata JSON
{ "name": "creditname.ctc", "description": "creditname.ctc", "image": "ipfs://baf...", "image_url": "ipfs://baf...", "external_url": "https://cns.creditcoin.org/name/creditname.ctc", "background_color": "eef4ff", "attributes": [ { "trait_type": "TLD", "value": ".ctc" }, { "trait_type": "Collection", "value": "CTC Name Service" }, { "trait_type": "Network", "value": "Creditcoin" }, { "trait_type": "Length", "value": 10 }, { "trait_type": "Registration Years", "value": 1 }, { "display_type": "date", "trait_type": "Expiration", "value": 1811171148 }, { "trait_type": "Primary", "value": "Yes" }, { "trait_type": "Registrant", "value": "0x..." } ] }
Metadata prepare 응답은 imageURI/metadataURIipfs:// 값과 imageGatewayURL/metadataGatewayURL의 HTTP gateway URL을 함께 반환한다. JSON의 image/image_url와 contract에는 ipfs:// URI를 저장하고, gateway URL은 explorer smoke/debug 확인용으로만 사용한다.
3NFT image style
Selected style

Clean White 기반. 연한 blue background, 중앙 Resolver Ring logo, 하단 name 표시.

Long name display

전체 label 최대 63자. NFT 카드에서는 1233242...ctc처럼 truncate하고, metadata name에는 full name 저장.

Canonical image는 서버가 생성한 SVG를 IPFS에 올리는 정책이다. JSON metadata에는 full name과 image URI를 저장하고, 화면용 SVG에는 긴 이름을 축약해서 표시한다.
4Auth / abuse guard
  • PINATA_JWTADMIN_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가 붙으면 인덱서가 필요하다.

Not mandatory at launchPostgres laterRedis cache later
1언제 필요한가
기능인덱서 없이인덱서 있음
name → address가능더 빠름
내 이름 목록가능하지만 느려질 수 있음빠르고 안정적
최근 등록/인기 이름불편자연스럽게 가능
만료 임박 알림수동/브라우저 중심스케줄러 가능
abuse dashboard별도 저장소 필요DB에서 관리 가능
2권장 DB schema
names - label_hash primary key - label - name - token_id - owner - address_record - avatar - profile - contenthash - bio - x - github - discord - telegram - email - expires_at - metadata_uri - primary_owner nullable - status - updated_block - updated_tx events - block_number - tx_hash - log_index - event_name - label_hash - payload_json sync_state - chain_id - contract_address - latest_indexed_block
3중간에 붙이는 난이도

어렵지 않다. 현재 컨트랙트 이벤트가 충분하고 API response shape도 미리 맞춰져 있다. 나중에 source.modeonchain에서 indexed로 바꾸면 된다.

중요한 것은 지금부터 이벤트를 빠짐없이 emit하고, API 클라이언트가 DB 구현 여부에 의존하지 않게 하는 것이다. 이 조건은 현재 충족한다.

Admin 사이트

Admin은 일반 유저 앱이 아니라 CNS 운영자가 컨트랙트 상태, reserved/short claim, metadata, abuse, indexer 상태를 확인하는 내부 운영 콘솔이다. 브라우저 admin은 지갑 연결 없이 read-only 조회, evidence 정리, 팀별 요청 생성만 담당한다.

내부 전용Read-only감사 로그 우선브라우저 비밀값 금지
1Admin app prototype
실제 테스트넷 admin app은 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.

RPC blockRPC live
Total supply22
Contract balance0 CTC
Owner0xDFD1...080B
Implementation0xCB95...BD76
CheckStatusDetails
RPCOnlineLatest Creditcoin Testnet block loaded from configured RPC.
ContractLoaded0xFED8E4097f6314EB80D1D40EF2Da34F2181cc419
ImplementationDetected0xCB955d455552bd511Dd03f1205f798322CC6BD76
Metadata APICheckHealth endpoint is checked through the admin proxy.
Dashboard refreshed
RPC, owner, total supply, balance, and implementation status loaded.
Registration logs loaded
NameRegistered logs discovered from block 4,810,000.
Read-only request generated
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.

Discovered22
Active22
Expired0
Lookupowner + records
NameStatusOwnerExpiryRecordsMetadata
auditmpmfoytc.ctcActive0xDFD1...080B2028-05-25records setIPFS
12423.ctcPrimary0xDFD1...080B2027-05-26addressNo stored URI
1234.ctcActive0xDFD1...080Bopenresolver checkCheck
Reserve/short-claim은 이 화면에서 실행하지 않는다. lookup과 minted-name scan 결과를 evidence로 묶어 담당 팀 요청을 만든다.

Metadata operations

NFT 이미지/JSON/IPFS gateway 상태를 확인하고, 실패한 metadata는 backend 요청으로 넘긴다.

NameToken URIImageGatewayAction
12412323.ctccanonicalSVG readymetadataURIOf 200Generate repair request
1234.ctccanonicalSVG readymetadataURIOf 200Open JSON
oldname.ctccanonicalNo stored URIcheckGenerate backend request
Admin browser는 Pinata JWT를 직접 들고 있으면 안 된다. read-only admin은 upload를 실행하지 않고 backend/API 담당자에게 repair request를 생성한다.

Abuse reports

피싱, 사칭, 악성 profile/avatar/bio/social 링크를 검토하고 reserve 후보 또는 지원 대응으로 연결한다.

Open4
High risk2
Reserve candidates2
Resolved1
ReportRiskEvidenceDecision
credltcoin.ctc
RPT-0018 · security@creditcoin.org
highProfile URL points to fake support formReserve candidate
airdrop-ctc.ctc
RPT-0019 · 0xdfd1...080b
mediumAvatar and Profile URL advertise token claimPending review
support-creditcoin.ctc
RPT-0021 · community moderator
highBio claims official support; Telegram unofficialEscalate
현재 /reports 화면은 read-only review queue다. 실제 제재나 reserve 실행은 하지 않고, 증거를 정리해 담당 팀 요청으로 넘긴다. DB 저장과 public report intake는 다음 단계다.

Indexer health

초기에는 선택 사항이지만, 운영 콘솔은 나중에 인덱서 전환을 기준으로 설계한다.

Latest chain blockRPC live
Start block4,810,000
Registration logs22
ModeOnchain
sync_state chain_id: 102031 contract_address: 0xFED8E4097f6314EB80D1D40EF2Da34F2181cc419 start_block: 4810000 registration_logs: 22 mode: onchain -> indexed ready

Team Requests

Read-only checks and copy-ready handoff notes for the smart contract, backend, or operations team.

ChecklistEvidenceStatus
RPCLatest Creditcoin Testnet block is reachable.Pass
Total supply22 minted names from current contract state.Pass
Registration logsNameRegistered logs scanned from block 4,810,000.Pass
API / Metadata healthHealth endpoint result and gateway evidence.Check
이 화면은 증거와 요청 문구만 만든다. 브라우저 admin에서는 지갑 연결, contract write, metadata upload, 비밀키 작업을 실행하지 않는다.
2Admin routes
현재 로컬 경로향후 운영 경로화면주요 작업권한
http://127.0.0.1:8766/dashboard/adminDashboardRPC, owner, totalSupply, implementation, API 상태 확인read admin
http://127.0.0.1:8766/names/admin/namesNames / Reserve이름/owner/reserved/short claim 조회, 요청 문구 생성read admin
http://127.0.0.1:8766/metadata/admin/metadataMetadatatokenURI 확인, image preview, gateway check, repair 요청 생성read admin
http://127.0.0.1:8766/reports/admin/reportsAbuse Reports신고 검토, evidence 확인, 요청 문구 생성read admin
http://127.0.0.1:8766/indexer/admin/indexerIndexer Healthlog coverage 확인, backfill/retry 요청 문구 생성read admin
http://127.0.0.1:8766/requests/admin/requestsTeam Requests담당 팀 요청 문구 생성, 운영 evidence 정리read admin
3Admin API contract
현재 cns-admin.html은 테스트넷 MVP라 RPC 직접 조회와 요청 문구 생성 중심이다. 지갑 연결이나 직접 tx 실행은 없다. 아래 Admin API는 메인넷 운영 전에 붙일 서버 계약이며, admin audit log와 role policy를 위해 필요하다.
GET /admin/health

proxy, implementation, owner, API, Pinata, indexer 상태.

GET /admin/names?query=

name, reserved, claimant, owner, expiry, metadata 상태 검색.

POST /admin/reserve/request

reserve/unreserve 요청과 evidence를 감사 로그에 저장.

POST /admin/short-claim/request

short claim 요청과 claimant/evidence를 저장.

POST /admin/metadata/repair-request

metadata repair 요청을 backend queue에 저장. 브라우저는 Pinata upload를 실행하지 않는다.

GET /admin/reports

abuse queue, evidence, decision status 조회.

POST /admin/indexer/backfill-request

fromBlock/toBlock 범위 backfill 요청 생성.

POST /admin/requests

담당 팀, 요청 유형, evidence, decision log를 저장. 브라우저 admin은 직접 실행하지 않는다.

Admin API는 일반 Resolver API와 분리한다. 최소한 path, auth, rate limit, log retention, CORS allowlist를 다르게 잡는다.
4Audit log schema
admin_audit_logs - id uuid primary key - actor_id - actor_role - action - target_type - target_value - before_snapshot_json - requested_after_json - request_body_json - request_status: draft | requested | approved | executed_external | rejected | failed - execution_tx_hash nullable - external_runbook_ref nullable - reason - evidence_hash - user_agent_hash - created_at - executed_at nullable

Admin의 핵심은 “누가, 언제, 왜, 무엇을 바꾸려 요청했고, 어떤 증거로 외부 실행까지 이어졌는지”를 남기는 것이다. 브라우저 admin은 실행자가 아니라 요청과 감사 기록의 시작점이다.

5Admin build phases
Phase꼭 들어갈 것아직 빼도 되는 것
Testnet alphaDashboard, reserve/short claim request generator, metadata checkfull abuse workflow, analytics
Public testnetabuse report queue, audit log, indexer health, gateway check자동 제재, 복잡한 role system
Mainnet candidateserver-side admin API, SSO/role policy, audit log export, alerting브라우저 지갑 연결, 개인키 기반 실행
Scalerole-based access, on-call runbook, saved views, report intake API수동 spreadsheet 운영

Admin 필요 기능

MVP 자체는 script로 운영할 수 있지만, 메인넷 공개 운영에서는 admin page가 있는 편이 안전하다. 단, 브라우저 admin은 지갑 연결이나 컨트랙트 직접 변경 없이 read-only 조회, evidence 정리, 요청 생성, audit log 중심으로 만든다.

Internal toolRead-only browserAudit log required
1Admin page가 필요한가?
결론: 메인넷 전에는 필요하다. 하지만 첫 버전은 “운영자가 실수하지 않게 하는 대시보드 + 요청 생성기” 수준이면 충분하다.
Admin modulePhase내용
Reserve ListP0 / Phase 1예약 이름 조회와 추가/해제 요청 생성. 실제 setReserved 실행은 브라우저 밖 별도 절차.
Short Name ClaimsP0 / Phase 11-3자 label + claimant address 조합 검수와 요청 생성. 실제 setShortNameClaim 실행은 브라우저 밖 별도 절차.
Contract HealthP0 / Phase 1proxy, implementation, owner, pendingOwner, totalSupply, interface 검증.
Metadata OpsP1 / Phase 2특정 token metadata 상태 확인, image/JSON/gateway 검수, backend repair 요청 생성.
Abuse ReportsP1 / Phase 2피싱/사칭 신고 목록, 조치 상태, reserve 후보 관리.
Indexer HealthP1 / Phase 2latest indexed block, lag, failed event retry.
Team Request LogP2 / Phase 3reserve, short claim, metadata repair, API/RPC/indexer 이슈를 evidence와 함께 담당 팀 요청으로 남긴다.
2Admin IA 제안
Dashboardnetwork, owner, implementation, API/indexer 상태
Namesreserved, short claims, lookup, abuse flags
MetadatatokenURI, image preview, gateway/API health
Reportsphishing/abuse queue, action history
Requestsreserve, metadata, API/RPC, indexer request drafts
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를 빼앗거나 조작하지 못하게 하는 것이다.

Owner-gated recordsPrimary forward checkApproval constrained
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 spooftokenURI는 저장된 IPFS URI를 반환하지 않고 컨트랙트 canonical JSON/SVG만 반환
unsafe receiversafe 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남은 보안 체크
32
contract tests
0
runtime audit vulns
P1
multisig before mainnet
P1
external audit
  • 메인넷 전 external smart contract audit.
  • Owner를 개인 EOA가 아니라 multisig로 이전.
  • Upgrade runbook과 rollback plan 문서화.
  • Admin/API 운영 로그와 alerting 추가.

배포 / 운영

테스트넷은 빠르게 반복하고, 메인넷은 guardrail을 걸어 실수로 배포/업그레이드하지 못하게 구성한다.

HardhatBlockscout verifyMainnet guarded
1Local / Testnet commands
npm install npm run build npm run typecheck npm run contracts:test python3 dev-server.py npm run dev:api npm run contracts:deploy:testnet npm run contracts:upgrade:testnet npm run contracts:verify:testnet npm run contracts:preflight:testnet npm run contracts:e2e:testnet
2Environment variables
Env용도공유 가능?
CREDITCOIN_RPC_URLAPI/contract RPC가능
CNS_REGISTRY_ADDRESSproxy address가능
CNS_START_BLOCKevent scan 시작 block가능
CNS_PROXY_ADDRESS, CNS_UPGRADE_CONTRACTcontract script override. 기본은 deployment JSON 사용가능
CNS_ADMIN_API_BASE, CNS_METADATA_API_BASEadmin proxy/API metadata endpoint override가능
API_ALLOWED_ORIGINSCORS allowlist가능
DEPLOYER_PRIVATE_KEY배포/업그레이드 signer절대 공유 금지
PINATA_JWTIPFS upload credential절대 공유 금지
ADMIN_API_KEY, CNS_METADATA_ADMIN_API_KEYserver-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운영 아키텍처
웹 앱검색, 검토, 지갑 tx, My names UX
Resolver APIresolve, reverse, names, pricing, metadata prepare
Creditcoin RPC컨트랙트 read/write 기준
IPFS Pinningmetadata JSON과 NFT image 보관
인덱서출시 후 트래픽/분석/알림 담당
계층출시 MVP확장 단계
프론트엔드단일 HTML MVP최종 배포를 React로 선택할 경우 신규 포팅 + analytics + error tracking
APIRPC read-through + metadata uploadDB read-through + Redis cache + queue
메타데이터Pinata IPFSPinata + secondary pinning provider
Adminscript + 최소 대시보드전체 admin console + audit log
모니터링health endpoint + 수동 Blockscout 확인RPC 지연, IPFS gateway, API p95, 실패 tx 알림
5릴리즈 체크리스트
단계완료 기준실패 시 중단 조건
코드 동결contract, API, web, docs 버전 태그추적되지 않은 비밀값, 실패한 테스트
컨트랙트 preflightproxy/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 fieldmetadata 재업로드 후 새 metadataURI로 renew/update 정책 검토
My names가 느림API log, RPC latency, Transfer log scan range캐시 추가, start block 조정, indexer 우선순위 상향
사용자가 다른 네트워크에서 tx 시도wallet chain id, frontend network guardadd/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를 맡으면 아래 순서로 보면 된다. 이 탭은 프로젝트 소개, 팀별 책임, 팀 간 계약, 완료 기준을 한 번에 보는 공유용 시작점이다.

공유 준비됨Design / FE / BE / SC 분리 가능비밀값 없음문서 우선
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다.

한 줄 요약: Design은 제품 톤/상태/에셋, FE는 사용 흐름, BE는 조회/메타데이터/운영 API, SC는 온체인 source of truth를 책임진다.
2팀별 책임 범위
주요 책임핵심 파일완료 증거
FERegister, Review, Success modal, My names, Records, Renew, wallet/network UX, responsive/error statecns-experience.html, embedded app in cns-living-spec.html브라우저 QA, HTML script parse, 실제 testnet tx 흐름, 모바일/긴 이름/실패 상태 확인
DesignVisual system, product copy tone, modal/table/mobile polish, NFT image style, sensitive state copycns-experience.html, cns-living-spec.html, cns-icon.svg, cns-og.svg, site.webmanifestDesign QA notes, UI tokens/spec, responsive review, NFT image/display approval
BEResolver API, Universal/Profile aliases, metadata prepare, Pinata, rate limit, future indexer/cache/admin APIapps/api, apps/indexer, packages/shared, packages/sdkAPI smoke 200, typecheck/build/lint, response schema 유지, metadata health/upload auth 확인
SCRegistration, renewal, records, primary, metadataURI, records/metadata lock, UUPS deploy/upgrade, eventscontracts/contracts/CreditcoinNameService.sol, contracts/test, contracts/scripts32 tests, compile, solhint, preflight/verify, storage layout compatibility, testnet tx hash
Ops/SecuritySecrets, deployment runbook, multisig, audit, monitoring, abuse process, production release gatesdocs/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 ↔ BENameResolution shape, error code, loading/empty/error 상태, metadata prepare request/response화면은 뜨지만 잘못된 주소/만료/이미지/lock 상태를 보여줄 수 있음SDK/shared type 사용, API smoke, response snapshot 문서화
Design ↔ FEUI 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 ↔ SCABI function params, tx value, chain id, explorer link, tokenId derivation, modal success state지갑 tx 실패, 잘못된 explorer 이동, 성공 후 이름 목록 불일치preflight/e2e, ABI 변경 시 FE checklist, success modal QA
BE ↔ SCevents, startBlock, resolveRecords, primaryOf, lockStatus, metadataURIOf인덱서/API가 stale data를 반환하거나 lock/primary를 놓침event list 고정, deployment JSON, resolver API smoke, indexer replay test
팀 ↔ Opsenv vars, secrets, deploy order, rollback, monitoring, admin request workflow비밀값 노출, wrong network deploy, 장애 시 owner 불명확.env.example만 공유, runbook, multisig, audit log
중요한 원칙: 각 팀은 자기 코드만 보지 말고, 자기 output을 다른 팀이 어떻게 소비하는지까지 완료 기준에 포함한다.
4릴레이 흐름
여기서 말하는 릴레이는 팀 간 업무와 증거 전달 방식이다. 현재 CNS MVP에는 gasless transaction relayer가 없다. 사용자의 온체인 등록/연장/records 변경은 사용자가 지갑에서 직접 서명하고 전송한다.

한눈에 보는 CNS 릴레이

사용자 입력이 어떤 팀과 시스템을 거쳐 온체인 상태, API 응답, 화면/운영 확인으로 이어지는지 보여준다.

No gasless tx relayer
1 Frontend 사용자 입력 수집

이름, 기간, primary 여부, records, NFT 이미지 선택을 받고 review modal에서 금액과 만료일을 확인시킨다.

산출물: 등록 의도, metadata 옵션, ABI params
2 Backend Metadata 준비

필요 시 wallet signature 또는 admin key를 검증하고 SVG/JSON을 IPFS에 업로드한다.

산출물: tokenURI / metadataURI, gateway smoke 대상
3 Wallet 사용자 서명

MetaMask 또는 WalletConnect가 Creditcoin network와 tx value를 확인하고 사용자가 직접 전송한다.

산출물: tx hash, pending / success / fail 상태
4 Smart Contract 온체인 확정

register, renew, setRecords, setPrimary, setMetadata, lock 상태를 저장하고 event를 발생시킨다.

산출물: owner, expiry, records, primary, lock, events
5 Resolver / Indexer 읽기 모델 갱신

RPC 또는 indexer/cache가 contract state와 logs를 읽어 NameResolution 응답으로 정규화한다.

산출물: resolve, reverse, universal, profile API
6 FE / Ops 화면과 운영 확인

Success modal, My names, Records, explorer link를 갱신하고 admin은 health/metadata/abuse/request를 확인한다.

산출물: 사용자 확인, release evidence, incident note
Tx 전 메타데이터 릴레이Metadata API는 tx 전에만 보조한다. 이미지/JSON URI를 만들 뿐, 사용자 등록 tx를 대신 보내지 않는다.
Tx 후 화면 릴레이tx 성공 후 FE는 새로 등록된 name row로 이동하거나 highlight하고 explorer deep link를 유지한다.
문제 발생 릴레이화면 문제는 FE, API 값 문제는 BE, revert/owner/event 문제는 SC, secrets/deploy 문제는 Ops가 첫 담당이다.
핵심: 서버는 metadata 준비와 조회를 돕지만, 사용자 tx를 대신 보내는 relayer는 아니다. 온체인 최종 상태는 Smart Contract가 기준이고, API와 화면은 그 상태를 소비한다.

제품/데이터 릴레이

1. FE사용자가 이름, 기간, primary, records를 입력한다. FE는 review modal에서 금액/만료일/tx 내용을 사용자에게 확인시킨다.
2. BE등록/연장 전 metadata prepare가 필요하면 wallet signature 또는 admin key를 검증하고 SVG/JSON을 IPFS에 올려 metadata URI를 반환한다.
3. WalletMetaMask/WalletConnect가 Creditcoin network를 확인하고 사용자가 tx를 서명한다. 이 단계는 서버가 대신 보내지 않는다.
4. SC컨트랙트가 register/renew/setRecords/setPrimary/setMetadata/lock tx를 처리하고 event와 read state를 만든다.
5. BE/APIresolver API가 resolveRecords, primaryOf, lockStatus, logs를 읽어 NameResolution shape로 반환한다. 나중에는 indexer/cache로 대체 가능하다.
6. FE/OpsFE는 success modal, My names, explorer link를 갱신한다. Ops/Admin은 health, metadata, abuse, requests를 점검한다.

업무 릴레이

단계담당입력출력
요구사항 접수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, screenshotrelease readiness audit, changelog, handoff note

문제 발생 시 릴레이

문제첫 확인다음 릴레이완료 기준
화면/모달/문구 문제FEAPI 값 문제면 BE, tx/ABI 문제면 SC브라우저 재현과 수정 확인
resolver/API 응답 문제BE온체인 값 문제면 SC, 표시 문제면 FEAPI smoke와 response sample 통과
tx revert/owner/metadata 문제SCFE에 사용자 문구, BE에 indexer/API 영향 공유test/preflight/tx hash로 증명
비밀값/배포/운영 문제Ops/Security영향 받는 모든 팀key rotation, rollback, incident note, 재검증
5최종 기준 맵
스마트컨트랙트최종 기준owner, expiry, primary, records, metadataURI, records/metadata lock, ERC-721 token ownership.
IPFS / GatewayNFT 표시 기준metadata JSON과 image URI. Blockscout/wallet 표시는 gateway와 cache 영향을 받는다.
Resolver API / Indexer읽기 모델contract state/logs를 읽어 resolve, reverse, universal, profile, names 응답으로 정규화한다.
Frontend / Wallet사용자 상태입력값, modal state, tx pending/success/fail, highlighted row, explorer deep link를 관리한다.
원칙: 값이 다르면 먼저 Smart Contract를 본다. Contract 값이 맞으면 API/indexer/cache를 보고, API가 맞으면 FE state/rendering을 본다.
6장애 / 버그 판단 루트
1
NFT 이미지가 안 뜸metadataURIOf/tokenURI → IPFS JSON image 필드 → gateway content-type/cache → Blockscout refresh 순서로 본다. 첫 담당은 BE, contract URI 값이 틀리면 SC로 넘긴다.
2
tx 실패 / revertFE ABI params, tx value, chain id, wallet network를 먼저 보고, revert reason 또는 owner/expiry/policy 문제면 SC가 확인한다.
3
My names 목록이 이상함owner address, token ownership, startBlock/log scan, API names response, FE filter/highlight 순서로 본다. 다른 사람 이름이 보이면 즉시 BE/API filter를 확인한다.
4
resolver 값이 안 맞음resolveRecords, primaryOf, lockStatus 온체인 read와 API response sample을 비교한다. API가 맞으면 FE 표시 문제다.
팀 간 핑퐁을 줄이려면 “재현 URL, tx hash, API sample, expected/actual, 담당 추정” 5개를 같이 넘긴다.
7릴리즈 / 업그레이드 맵
1. SC 변경storage layout, ABI, events, tests, preflight, verify, upgrade tx hash를 남긴다.
2. BE 반영deployment JSON, ABI/types, resolver response, indexer startBlock/event list, metadata policy를 맞춘다.
3. FE smokeregister, review, success modal, My names, records, renew, explorer link를 실제 흐름으로 확인한다.
4. Ops evidenceenv, secrets, monitoring, rollback, admin request, incident owner, audit log 요구를 정리한다.
5. 공유 패킷team handoff share pack, CHANGELOG, release audit, tx hash, API sample, screenshots, known risks를 공유한다.
업그레이드는 contract deploy에서 끝나지 않는다. FE/BE/Ops가 같은 주소, 같은 ABI, 같은 증거를 보고 있을 때 완료다.
8읽는 순서
  1. README.md에서 실행 방법과 배포 흐름 확인.
  2. docs/team-handoff-share-pack-2026-05-28-ko.md에서 Slack 공유 문구, 팀별 첫 작업, GitHub 업로드 플랜 확인.
  3. docs/cns-spec-ko.md에서 CNS 자체가 제공해야 하는 P0/P1/P2 제품/프로토콜 스펙 확인.
  4. docs/release-readiness-audit-2026-05-27.md에서 현재 릴리즈 판정과 증거 확인.
  5. cns-experience.html에서 현재 제품 UX 확인.
  6. contracts/contracts/CreditcoinNameService.sol에서 source of truth 확인.
  7. apps/api/src/routes/resolver.tsapps/api/src/routes/metadata.ts에서 API 흐름 확인.
  8. packages/shared/src/index.ts에서 pricing/type contract 확인.
  9. docs/security-policy.mddocs/launch-readiness-ko.md로 운영 체크.
9CNS 기능 스펙
상세 기준은 docs/cns-spec-ko.md다. 이 표는 팀 업무 목록이 아니라 CNS가 제품/프로토콜로 제공해야 하는 기능 범위 요약이다.
Phase실제 기능 스펙완료 기준
P0 / Phase 1name 생성, 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 2production 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 3contenthash 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:test32 passing컨트랙트 보안/기능 회귀 테스트 통과
npx solhint 'contracts/contracts/**/*.sol'통과Solidity lint/security style 체크 통과
slither contracts ...0 findings배포 대상 컨트랙트 기준 정적 분석 통과
npm audit --omit=dev --workspaces --audit-level=moderate0 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주 작업산출물
FEHTML 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
BEAPI 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/Securitysecrets 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 2Admin API, persistent audit log, role/SSO policy백엔드 + 운영
P1 / Phase 2Mainnet multisig owner, treasury, withdraw 정책운영 / 보안 / SC
P1 / Phase 2External smart contract audit와 upgrade rollback runbookSC / 보안
P1 / Phase 2Indexer DB/Redis schema, backfill, API monitoring, rate limit, gateway fallback백엔드/운영
P2 / Phase 3contenthash routing, partner samples, renewal reminders, marketplace automationFE / BE / SC
P2 / Phase 3React 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.

Share-ready baselineCreditcoin TestnetERC-721Resolver APIIPFS metadata
1What CNS Does
Register
.ctc
Search, price, choose duration, set primary, and register a name.
Resolve
name → 0x
Wallets, exchanges, and apps resolve `.ctc` names to addresses.
Reverse
0x → name
Each address can expose one forward-confirmed primary name.
The MVP is not just a UI preview. It includes a UUPS ERC-721 contract, metadata-backed registration, resolver API, SDK package, admin surface, and testnet verification flow.
2Team Map
Design

Owns product trust, visual system, state copy, NFT image direction, and mobile/responsive quality standards.

cns-experience.html, brand assets
Frontend

Owns the user-facing app: search, register, review, success, names, records, renew, wallet, and responsive states.

cns-experience.html
Backend

Owns resolver APIs, metadata prepare, Pinata upload, SDK response contracts, admin API, and future indexer/cache.

apps/api, apps/indexer
Smart Contract

Owns the UUPS ERC-721 registry, registration, renewal, records, primary names, metadata URI, locks, and upgrades.

contracts
The split works only if product and interface contracts stay stable: Design owns trust and state expression, FE consumes BE and SC, BE reads SC as source of truth, and SC preserves ABI/events/storage expectations.
3End-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.

Flow diagram
PRODUCT BACKEND ONCHAIN / READ MODEL OPS User / FE App search · review · records success · My names Resolver / Metadata API pricing · availability metadata prepare · IPFS Wallet MetaMask / WalletConnect user-signed tx only CNS Contract owner · expiry · records primary · tokenURI · locks source of truth Resolver / Indexer contract reads · events names · reverse · profile IPFS / Gateway SVG · JSON image delivery Blockscout / Wallet NFT image · token page marketplace cache Admin / Ops evidence · requests release checks 1 price/status 3 open tx 2 metadata SVG/JSON 4 signed tx 5 reads/events 6 API refreshes UI 7 tokenURI image 8 ops evidence

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.

Sequence flow
User FE App API Wallet Contract Resolver Explorer 1 label, years, primary 2 price/status + metadata prepare 3 fee, expiry, metadataURI 4 review modal opens wallet tx 5 registerWithMetadata / renew 6 events + state reads 7 My names / reverse / profile refresh 8 tokenURI, NFT image, tx evidence Done means UI, tx hash, API sample, explorer/tokenURI all agree
4Current Testnet State
ItemValueNotes
ChainCreditcoin Testnet 102031Mainnet is 102030.
Proxy0xFED8E4097f6314EB80D1D40EF2Da34F2181cc419UUPS proxy.
Implementation0xCB955d455552bd511Dd03f1205f798322CC6BD76Includes canonical tokenURI, metadataURIOf storage, metadata repair, and records/metadata lock support.
Start block4810000Used by UI/API log scans.
Total supply at audit222026-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.

Testnet MVP readyMainnet gatedCompletion evidence included
1Go / No-Go Summary
AreaStatusEvidenceMainnet gap
ContractReady for testnetCompile, 32 tests, preflight pass.External audit and multisig owner.
APIWorking MVPhealth, metadata health, pricing, resolve, records, reverse, names pass.Cache, monitoring, indexer-backed names.
Frontend HTMLWorking MVPLocal browser smoke with mock wallet and no console errors.Production hosting choice and final wallet metadata.
Metadata/IPFSVerified recordRecorded e2e name generated IPFS JSON/SVG and Blockscout image; gateway display remains an ongoing spot-check.Secondary pinning and gateway fallback policy.
AdminTestnet MVPAdmin 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.

Actual app embedMock wallet availableNo fake UI fork
1Product Prototype
Actual CNS app Open actual app
Actual app HTML embedded in this document Renders inside the living spec without a server
Use one real app screen as the source of truth. The embedded preview forces a preview-safe mock wallet, while real wallet and transaction testing must open the app top-level without mockWallet.

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.

MetaMaskWalletConnectMock wallet smoke
1Primary User Flows
FlowExpected behaviorVerified by
RegisterSearch name, price it, prepare metadata, send registerWithMetadata.Real testnet e2e.
RenewPrepare refreshed metadata and call renewWithMetadata.Real testnet e2e.
RecordsSave address, avatar, profile, contenthash, bio, and socials.Real testnet e2e.
PrimarySet reverse primary only when the forward address record points to the caller.Contract tests and e2e.
My namesLoad 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.

1-63 chars1-3 restricted100 years max
1Pricing
LengthAnnual priceOpen registration
150,000 CTCNo, label-specific assigned claim only
210,000 CTCNo, label-specific assigned claim only
32,500 CTCNo, label-specific assigned claim only
4500 CTCYes
5+50 CTCYes
21-3 Character Claim Flow
Key point: 1-3 character names are not a broad allowlist. setShortNameClaim(label, claimant) opens exactly one label for exactly one claimant address.
1. Label requestThe requester submits a specific label such as abc.ctc and the receiving wallet address.
2. Policy reviewOps/BD/Security verifies brand rights, phishing risk, reserved conflicts, and evidence.
3. Assign claimOwner/multisig executes setShortNameClaim("abc", claimant). Other 1-3 character labels remain locked.
4. Claimant mintsThe approved claimant directly calls register or registerWithMetadata from their own wallet.
5. Record evidenceAdmin/runbook records approval evidence, tx hash, claimant, expiry, and metadata/records state.

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.

UUPSERC-72132 tests passing
1Contract Surface
CategoryFunctionsNotes
Userregister, registerWithMetadata, renew, renewWithMetadata, setMetadataURI, setAddress, setRecords, setRecordsLocked, setMetadataLocked, setPrimaryUsed 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.
Readavailable, price, resolve, resolveRecords, lockStatus, primaryOf, ownerOf, labelOf, tokenURI, metadataURIOf, tokenImageURIUsed by UI, API, SDK, explorers, and the read-only admin.
Owner / governancesetReserved, setShortNameClaim, withdraw, transferOwnership, acceptOwnership, cancelOwnershipTransfer, upgrade authorizationMainnet 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.

FastifyOnchain modeSDK package
1Endpoints
GET /health GET /v1/metadata/health GET /v1/pricing/:label?years=1 GET /v1/resolve/:name GET /v1/records/:name GET /v1/universal/:name GET /v1/profile/:name GET /v1/reverse/:address GET /v1/names/:address POST /v1/metadata/prepare
Current audit evidence: all listed read endpoints return the same stable resolver shape where appropriate. Universal/profile aliases are intended for wallet and partner integrations.

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.

PinataClean White SVGBlockscout image recorded
1Verified Flow
  1. API creates the name SVG and uploads it to IPFS.
  2. API creates JSON metadata with image and image_url.
  3. App sends registerWithMetadata or renewWithMetadata.
  4. Blockscout reads canonical tokenURI, while admin/indexer tools can inspect stored metadataURIOf.
The recorded e2e name 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.

Scaffold onlyAPI shape stable
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.

Do not break client contracts: keep 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.

Internal onlyNo browser secretsAudit log required before mainnet
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.

ReserveShort claimsMetadata repair
1Admin Actions
ActionRequest / execution pathMainnet requirement
Reserve a labelPOST /admin/reserve/request → external setReservedMultisig review and audit log.
Assign short-name claimPOST /admin/short-claim/request → external setShortNameClaimPolicy approval and evidence.
Repair metadataPOST /admin/metadata/repair-request → backend/operator executionVerify image/JSON before any write.
Operational requestPOST /admin/requests → responsible team workflowEvidence, 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.

External audit before mainnetMultisig ownerSecret hygiene
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.

Testnet proxy deployedMainnet guarded
1Core Commands
python3 dev-server.py npm --workspace @cns/api run dev npm run typecheck npm run build npm --workspace @cns/contracts run compile npm run contracts:test CNS_PREFLIGHT_LABEL=auditmpmfoytc npm --workspace @cns/contracts run preflight:testnet npm --workspace @cns/contracts run e2e:testnet

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.

Team handoffDesign / FE / BE / SC readyNo secretsEvidence-based
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.

User value

Use name.ctc instead of a long address for display, receiving, and profile context.

System value

Wallets, exchanges, apps, and admin tooling can integrate through the contract, resolver API, SDK, and metadata pipeline.

Current verdict

Testnet MVP handoff is ready. Mainnet production still requires audit, multisig ownership, monitoring, and admin audit logs.

2Team Ownership
TeamOwnsKey filesDone evidence
FrontendRegister, Review, Success modal, My names, Records, Renew, wallet/network UX, responsive/error statescns-experience.html, embedded preview in cns-living-spec.htmlBrowser QA, script parse, testnet tx flow, mobile/long-name/error checks
DesignVisual system, product copy tone, modal/table/mobile polish, NFT image style, sensitive state copycns-experience.html, cns-living-spec.html, cns-icon.svg, cns-og.svg, site.webmanifestDesign QA notes, UI tokens/spec, responsive review, NFT image/display approval
BackendResolver API, Universal/Profile aliases, metadata prepare, Pinata, rate limit, future indexer/cache/admin APIapps/api, apps/indexer, packages/shared, packages/sdkAPI smoke 200, typecheck/build/lint, stable response schema, metadata health/auth checks
Smart ContractRegistration, renewal, records, primary, metadataURI, records/metadata lock, UUPS deploy/upgrade, eventscontracts/contracts/CreditcoinNameService.sol, contracts/test, contracts/scripts32 tests, compile, solhint, preflight/verify, storage compatibility, testnet tx hash
Ops / SecuritySecrets, deployment runbook, multisig, audit, monitoring, abuse process, production gatesdocs/security-policy.md, docs/launch-readiness-ko.md, release audit documentExternal audit, multisig owner, runtime audit clean, monitoring/alerting, incident owner
3Integration Contracts
BoundaryContractFailure modeGuardrail
FE ↔ BENameResolution, error codes, loading/empty/error states, metadata prepare request/responseUI shows stale or wrong address, expiry, image, or lock stateShared types, SDK, API smoke, response examples
Design ↔ FEUI tokens, spacing, responsive breakpoints, modal/table states, copy tone, NFT image/display rulesThe app works but visual polish, brand trust, or state copy diverges by teamDesign QA, shared token/spec notes, mobile screenshots, sensitive-state copy review
FE ↔ SCABI params, tx value, chain id, explorer URL, tokenId, success modal stateWallet tx fails or success flow opens the wrong page/namePreflight/e2e, ABI checklist, success modal QA
BE ↔ SCEvents, startBlock, resolveRecords, primaryOf, lockStatus, metadataURIOfIndexer/API misses lock, primary, metadata, or ownership changesEvent list, deployment JSON, resolver smoke, indexer replay test
Teams ↔ OpsEnv vars, secrets, deploy order, rollback, monitoring, admin requestsSecret leak, wrong network deploy, unclear incident ownerShare .env.example only, runbooks, multisig, audit logs
4Relay Flow
Relay here means how work, state, and evidence move between teams. The current CNS MVP does not include a gasless transaction relayer. Users still sign and send registration, renewal, records, primary, metadata, and lock transactions from their own wallet.

CNS Relay At A Glance

Shows how user input moves through teams and systems into onchain state, API responses, product screens, and operations evidence.

No gasless tx relayer
1 Frontend Collect user intent

Collect name, duration, primary choice, records, and NFT image selection, then confirm fee and expiry in the review modal.

Output: registration intent, metadata option, ABI params
2 Backend Prepare metadata

When needed, verify wallet signature or admin key, generate SVG/JSON, and upload metadata to IPFS.

Output: tokenURI / metadataURI, gateway smoke target
3 Wallet User signs

MetaMask or WalletConnect confirms Creditcoin network and tx value, then the user submits the transaction directly.

Output: tx hash, pending / success / fail state
4 Smart Contract Onchain finality

Handles register, renew, setRecords, setPrimary, setMetadata, and lock state, then emits events.

Output: owner, expiry, records, primary, lock, events
5 Resolver / Indexer Update read model

RPC or indexer/cache reads contract state and logs, then normalizes the result into NameResolution responses.

Output: resolve, reverse, universal, profile API
6 FE / Ops Confirm screens and ops

Update success modal, My names, Records, and explorer links. Admin checks health, metadata, abuse, and requests.

Output: user confirmation, release evidence, incident note
Pre-tx side relayMetadata API only supports the transaction before signing. It creates image/JSON URIs, but it does not submit the user's registration transaction.
Post-tx UX relayAfter tx success, FE should navigate to or highlight the new name row and keep the explorer deep link available.
Issue relayScreen issues start with FE, API value issues with BE, revert/owner/event issues with SC, and secrets/deploy issues with Ops.
Key point: the server helps with metadata preparation and reads, but it is not a transaction relayer. The smart contract remains the source of truth, and the API and screens consume that state.

Product / data relay

1. FEThe user enters name, duration, primary choice, and records. FE shows review state with fee, expiry, and transaction intent.
2. BEWhen metadata is needed, the API verifies wallet signature or admin key, uploads SVG/JSON to IPFS, and returns metadata URI.
3. WalletMetaMask or WalletConnect confirms Creditcoin network and the user signs the transaction. The server does not submit the user transaction.
4. SCThe contract handles register, renew, setRecords, setPrimary, setMetadata, and lock transactions, then emits events and read state.
5. BE/APIThe resolver reads resolveRecords, primaryOf, lockStatus, and logs, then returns the stable NameResolution shape. An indexer/cache can replace direct RPC later.
6. FE/OpsFE updates success modal, My names, and explorer links. Ops/Admin checks health, metadata, abuse, and team requests.

Work relay

StepOwnerInputOutput
Requirement intakeOwner / PMUser issue, release need, partner requestGoal, priority, affected teams
Interface checkFE + BE + SCUX/API/ABI/event changeChange contract, stable fields, test scope
Team implementationEach teamTeam task and source filesCode, docs, migration/runbook need
Integration verificationOwning team + consuming teamsPR or working artifacttypecheck, build, contract tests, API smoke, browser QA
Release evidenceRelease owner / OpsCommand output, tx hash, API sample, screenshotrelease audit, changelog, handoff note

Issue relay

IssueFirst ownerNext relayDone evidence
Screen, modal, or copy issueFEBE if the value is wrong, SC if tx/ABI is wrongBrowser repro and fix verification
Resolver/API response issueBESC if onchain state is wrong, FE if display is wrongAPI smoke and response sample pass
Transaction revert, owner, or metadata issueSCFE gets user copy, BE gets indexer/API impacttest, preflight, or tx hash proof
Secrets, deployment, or operations issueOps / SecurityAll affected teamskey rotation, rollback, incident note, re-verification
5Source of Truth Map
Smart ContractFinal sourceowner, expiry, primary, records, metadataURI, records/metadata locks, and ERC-721 token ownership.
IPFS / GatewayNFT display sourceMetadata JSON and image URI. Blockscout and wallets can be affected by gateway and cache behavior.
Resolver API / IndexerRead modelReads contract state/logs and normalizes resolve, reverse, universal, profile, and names responses.
Frontend / WalletUser stateInput values, modal state, tx pending/success/fail, highlighted row, and explorer deep links.
Rule: when values disagree, check the smart contract first. If contract state is correct, check API/indexer/cache; if API is correct, check FE state and rendering.
6Failure / Bug Route
1
NFT image missingCheck metadataURIOf/tokenURI, IPFS JSON image field, gateway content-type/cache, then Blockscout refresh. BE starts; SC takes it if the URI onchain is wrong.
2
Transaction failsCheck FE ABI params, tx value, chain id, and wallet network first. SC owns revert reason, owner, expiry, and policy failures.
3
My names looks wrongCheck owner address, token ownership, startBlock/log scan, API names response, then FE filter/highlight. If other users' names appear, check BE/API filtering immediately.
4
Resolver value mismatchCompare onchain resolveRecords, primaryOf, lockStatus reads with the API response sample. If API is right, FE display is next.
To avoid team ping-pong, pass five things together: repro URL, tx hash, API sample, expected/actual, and suspected owner.
7Release / Upgrade Map
1. SC changeRecord storage layout, ABI, events, tests, preflight, verify, and upgrade tx hash.
2. BE updateUpdate deployment JSON, ABI/types, resolver response, indexer startBlock/event list, and metadata policy.
3. FE smokeVerify register, review, success modal, My names, records, renew, and explorer links in the real flow.
4. Ops evidenceCollect env, secrets, monitoring, rollback, admin requests, incident owner, and audit-log requirements.
5. Share packetShare team handoff pack, changelog, release audit, tx hash, API sample, screenshots, and known risks.
An upgrade does not end at contract deployment. It is done when FE, BE, and Ops are looking at the same address, ABI, and evidence.
8Read Order
  1. README.md for setup, scripts, env, and deployment flow.
  2. docs/team-handoff-share-pack-2026-05-28-ko.md for Slack copy, team actions, and GitHub upload plan.
  3. docs/cns-spec-ko.md for the P0/P1/P2 CNS feature specs.
  4. docs/release-readiness-audit-2026-05-27.md for the current readiness verdict and evidence.
  5. cns-living-spec.html for product/system context in Korean or English.
  6. cns-experience.html for the current HTML MVP app.
  7. contracts/contracts/CreditcoinNameService.sol for the source of truth.
  8. apps/api/src/routes/resolver.ts and apps/api/src/routes/metadata.ts for API behavior.
  9. packages/shared/deployments/cns-102031.json for testnet address/start block.
9CNS Feature Specs
docs/cns-spec-ko.md is the detailed source for what CNS itself must support.
PhaseFeature SpecsGate
P0 / Phase 1Name 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 2Production 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 3Contenthash 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
CheckResult
npm run typecheckPass
npm run lintPass
npm run buildPass
npm run contracts:test32 passing
npx solhint 'contracts/contracts/**/*.sol'Pass
slither contracts ...0 findings for deploy-target contracts
npm audit --omit=dev --workspaces --audit-level=moderate0 vulnerabilities
preflight:testnetPass on implementation 0xCB95...BD76, totalSupply 22
API smokehealth, metadata, pricing, resolve, records, universal, profile, reverse, names pass
BlockscoutGateway image display is an ongoing spot-check, not a static release gate.
Recorded real e2eauditmpmfoytc.ctc registered, records set, primary set, renewed, canonical tokenURI and metadataURIOf checked
11First Work By Team
TeamFirst weekOutput
FrontendCreate 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
DesignAudit 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
BackendFreeze API schema, design indexer/DB/Redis, define metadata/admin/abuse API scope.Response examples or OpenAPI draft, DB schema, ops endpoint list
Smart ContractPrepare external audit packet, mainnet multisig/treasury requirements, and upgrade rollback rehearsal.Audit packet, deploy/upgrade runbook, mainnet gate checklist
Ops / SecurityCollect 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.