9. Security
9.1 보안 접근 방식
AVA 토큰 컨트랙트는 OpenZeppelin의 검증된 라이브러리를 기반으로 구축되며, 다층 보안 아키텍처를 적용합니다.
9.2 리스크 요인
| 리스크 | 등급 | 대응 |
| MultiSig 키 분실 | High | 다중 서명자 구성, 키 백업 절차 |
| 스마트 컨트랙트 취약점 | High | 외부 보안 감사, 테스트넷 검증 |
| 업그레이드 오류 | Low | TimelockController 적용 완료 (24h delay, OWNER_UPGRADER_ROLE 전용) |
| 가스비 급등 | Low | 배치 처리, 가스 최적화 |
9.3 CertiK 보안 감사 기준
AVA 토큰 컨트랙트는 CertiK의 스마트 컨트랙트 보안 감사 기준에 따라 설계되었습니다. 아래는 CertiK이 Upgrade / Governance / Vesting 중심 프로젝트에 적용하는 핵심 감사 프레임워크입니다.
Audit Categories
6
검수 카테고리
Severity Levels
5
Critical ~ Informational
감사 카테고리 개요
| # | 카테고리 | 항목 수 | 핵심 검증 포인트 |
| 1 | 중앙화 리스크 (Centralization Risk) | 3 | 업그레이드 권한, Role 설계, Timelock 거버넌스 |
| 2 | 업그레이드 안전성 (Upgradeable Safety) | 2 | Storage Layout, 마이그레이션 완결성 |
| 3 | 베스팅 & 락업 무결성 (Vesting Integrity) | 2 | 잔고 처리, Transfer 제한 로직 |
| 4 | 로직 정확성 (Logical Soundness) | 2 | 계산 순서 오류, Defensive Logic 부작용 |
| 5 | 이벤트 & 오프체인 신뢰성 (Events) | 2 | 민감 함수 Event, Event 의미 명확성 |
| 6 | Formal Verification | 2 | AccessControl 불변성, 상태 불변 조건 |
Severity 분류 기준
| 등급 | 기준 |
| Critical | 즉시 자금 손실 또는 컨트롤 탈취 가능 |
| Major | 특정 조건에서 자금 영구 Lock 또는 시스템 마비 |
| Medium | 설계상 결함, 운영 리스크 |
| Minor | 업그레이드, 가독성, 효율성 개선 사항 |
| Informational | Best Practice 권고 |
1. 중앙화 리스크 (Centralization Risk)
CertiK이 가장 민감하게 보는 1순위 영역
| 항목 | 검증 내용 | 판단 기준 |
| 1.1 업그레이드 권한 집중 |
Proxy/UUPS 업그레이드 권한이 단일 EOA에 귀속되는지, 즉시 실행 가능한 구조인지 |
단일 키 → High Risk / Multisig+Timelock → Mitigated / DAO+Timelock → Preferred |
| 1.2 Privileged Role 설계 |
DEFAULT_ADMIN_ROLE 존재, grantRole/revokeRole 남용 가능성, Role Admin 구조 오류 |
Role Admin 미지정 → Governance Deadlock / Role 간 권한 위임 명확성 |
| 1.3 Timelock 거버넌스 |
PROPOSER/EXECUTOR/CANCELLER 분리, 임의 실행·취소 가능성, Timelock delay (48h 이상 권장) |
Proposer ≠ Executor ≠ Canceller / Multisig+Timelock 조합 / 주소 공개 문서화 |
2. 업그레이드 안전성 (Upgradeable Contract Safety)
| 항목 | 검증 내용 | 판단 기준 |
| 2.1 Storage Layout 안전성 |
Storage slot 충돌 가능성, __gap 또는 Namespaced Storage(ERC-7201) 사용 여부 |
무갭 → 위험 / Child gap 사용 → 혼동 유발 / Namespaced Storage → Best Practice |
| 2.2 마이그레이션 완결성 |
Lazy Migration 조건, 마이그레이션 스킵 케이스, 업그레이드 전·후 상태 불일치 |
"업그레이드 이전 상태가 100% 보존·반영되는가?" |
3. 베스팅 & 락업 무결성 (Vesting Integrity)
사용자 자산 영구 Lock 가능성은 Major 이상으로 분류
| 항목 | 검증 내용 |
| 3.1 잔고 처리 방식 |
비-베스팅 토큰 유입 시 처리, unlockedAmount 계산과 실제 잔고 괴리, 업그레이드 후 기존 잔고 영구 Lock 여부 |
| 3.2 Transfer 제한 로직 일관성 |
View 함수(getAvailableBalance)와 실제 enforce 로직 일치 여부, 계산 순서 오류 |
4. 로직 정확성 (Logical Soundness)
| 항목 | 검증 내용 |
| 4.1 계산 순서 오류 |
Reset → 계산 vs 계산 → Reset 순서, 방어 코드가 권한 우회를 만드는지 |
| 4.2 Defensive Logic 부작용 |
Abnormal state에서 반복적 storage rewrite, Lazy init + reset 충돌 여부 |
5. 이벤트 & 오프체인 신뢰성 (Events & Off-chain Reliability)
CertiK은 "Off-chain consumer 혼란"을 명확한 리스크로 간주
| 항목 | 검증 내용 |
| 5.1 민감 함수 Event |
중앙화 권한 함수(pause, upgrade, reset)에 Event 미존재 여부 |
| 5.2 Event 의미 명확성 |
Event 필드의 from/to 기준 불명확 여부, emit 값과 실제 storage 값 불일치 여부 |
6. Formal Verification 대상 기준
CertiK의 차별화 포인트 — 수학적 검증
| 항목 | 검증 내용 |
| 6.1 AccessControl 불변성 |
DEFAULT_ADMIN_ROLE == 0x00 불변, hasRole/getRoleAdmin 상태 변경 여부, Role revoke/grant 정확성 |
| 6.2 상태 불변 조건 (Invariant) |
특정 함수 호출 전·후 반드시 유지되어야 할 조건, 전체 상태 공간에서 항상 성립해야 하는 논리 |
9.4 자체 보안 감사 보고서
위 CertiK 보안 감사 기준에 따라 AVA 토큰 컨트랙트(AVAToken + AVAVesting)를 자체 검증한 결과입니다. 모든 항목은 실제 구현된 소스코드를 기반으로 평가되었습니다.
1. 중앙화 리스크 — Pass
| 항목 | AVA 구현 | 판정 |
| 1.1 업그레이드 권한 |
UUPS + OWNER_UPGRADER_ROLE → TimelockController (24h delay). 단일 EOA가 아닌 MultiSig → Timelock 경로로만 업그레이드 가능 |
Pass |
| 1.2 Privileged Role |
5개 Role 분리 — Owner(DEFAULT_ADMIN, OWNER_PAUSER, OWNER_UPGRADER) + Admin(ADMIN_VESTING_MANAGER, ADMIN_BURNER). Owner/Admin 역할 명시적 구분. Role Admin 구조 유지 |
Pass |
| 1.3 Timelock 거버넌스 |
TimelockController (minDelay=24h), Proposer=Deployer, Executor=Deployer. Owner/Admin Role 모두 Timelock으로 이관 (OWNER_PAUSER_ROLE만 Deployer EOA 유지, 긴급 대응용) |
Acknowledged |
Acknowledged 사유
OWNER_PAUSER_ROLE은 긴급 정지용으로 Timelock 지연 없이 즉시 실행되어야 하므로 Deployer EOA에 유지합니다. 나머지 모든 Role(DEFAULT_ADMIN, OWNER_UPGRADER, ADMIN_VESTING_MANAGER, ADMIN_BURNER)은 TimelockController로 이관됩니다.
2. 업그레이드 안전성 — Pass
| 항목 | AVA 구현 | 판정 |
| 2.1 Storage Layout |
ERC-7201 Namespaced Storage 적용. AVAToken: 0xb19f...e100, AVAVesting: 0x704f...ab00. Storage slot 충돌 원천 차단 |
Pass |
| 2.2 마이그레이션 |
V1 초기 배포 — 기존 상태 마이그레이션 불필요. 향후 업그레이드 시 reinitializer 패턴 사용 대비. initializer에서 _disableInitializers() 호출 |
Pass |
3. 베스팅 & 락업 무결성 — Pass
| 항목 | AVA 구현 | 판정 |
| 3.1 잔고 처리 |
Lazy Evaluation: getAvailableBalance = balance - totalLocked. 방어 로직 if (balance <= totalLocked) return 0 적용. 비-베스팅 토큰 유입 시 자유잔액으로 자연 처리되어 영구 Lock 없음 |
Pass |
| 3.2 Transfer 제한 |
_update() override에서 IAVAVesting.getAvailableBalance()로 자유잔액 검증. vestingTransferByAdmin은 EIP-1153 Transient Storage flag로 bypass. 그룹 지갑은 일반전송 차단 (groupWalletTransferByAdmin 전용). View 함수와 enforce 로직 동일 함수 사용 |
Pass |
4. 로직 정확성 — Pass
| 항목 | AVA 구현 | 판정 |
| 4.1 계산 순서 |
일단위 UTC 0시 경계 계산 (SECONDS_PER_DAY = 86,400). _computeUnlockedForWallet는 순수 읽기 연산으로 상태 변경 없음. 정수 나눗셈 일관성 유지 |
Pass |
| 4.2 Defensive Logic |
25종 커스텀 에러로 모든 입력 검증 (ZeroAmount, ZeroAddress 등). distributeToGroupByAdmin 1회 제한 (GroupAlreadyDistributed). 자기전송 방지 (SelfTransferNotAllowed). MAX_SCHEDULES_PER_WALLET = 50 상한. 그룹 지갑 일반전송 차단 (GroupWalletTransferRestricted) |
Pass |
5. 이벤트 & 오프체인 신뢰성 — Pass
| 항목 | AVA 구현 | 판정 |
| 5.1 민감 함수 Event |
7개 커스텀 이벤트 정의: VestingContractSet, TokensBurned, GroupConfigSet, TGETimestampSet, VestingTransferExecuted, GroupDistributed, VestingAdjustedForBurn. pause/unpause는 OZ PausableUpgradeable 이벤트 자동 emit |
Pass |
| 5.2 Event 의미 |
모든 이벤트에 indexed 파라미터 적용 (group, from, to, wallet). emit 값은 실제 storage 변경 후 발생. from/to 기준 명확 |
Pass |
6. Formal Verification — Pass
| 항목 | AVA 구현 | 판정 |
| 6.1 AccessControl |
OZ AccessControlUpgradeable 사용. DEFAULT_ADMIN_ROLE == 0x00 불변. grantRole/revokeRole/renounceRole 표준 동작 보존. Role Admin 구조 안정 |
Pass |
| 6.2 상태 불변 조건 |
totalSupply == TOTAL_SUPPLY (mint 1회, initialize에서만 실행). distributed <= totalAllocation per group. lockedBalance <= balance (방어 로직 적용). ReentrancyGuardTransient로 재진입 방지 |
Pass |
자체 감사 요약
CertiK 보안 감사 기준 6개 카테고리, 13개 세부 항목에 대한 자체 검증 결과:
Critical 0건 / Major 0건 / Medium 0건.
1건의 Acknowledged 항목(Timelock 거버넌스 범위)은 운영 효율성을 고려한 의도적 설계로, 논리적 근거가 명확합니다.
최종 보안 검증은 CertiK 외부 감사를 통해 확정되며, 감사 결과는 공개적으로 공유됩니다.