PCL 정책 시행
PCL이 모든 트랜잭션에 대해 활성 정책을 평가하는 방식을 설명합니다. 글로벌 규칙은 AnteHandler에서, 컨트랙트 범위 규칙은 규제 EVM 경로에서 시행됩니다.
모든 마루 트랜잭션은 상태 변경 작업이 실행되기 전 PCL로 필터링됩니다. 글로벌 정책 (정책 관리자가 설정한 GlobalPolicyConfig)은 모든 트랜잭션에 평가됩니다. 컨트랙트 범위 정책 (컨트랙트 admin이 등록한 ContractPolicyConfig)은 호출이 규제 경로로 그 컨트랙트를 대상으로 할 때만 적용됩니다. 정책이 하나라도 실패하면 전체 트랜잭션이 구조화된 PCL ReasonCode와 함께 거절되며, 어떤 컴플라이언스 검사도 우회할 수 없습니다.
두 가지 시행 지점
PCL은 트랜잭션마다 두 지점에서 동작합니다.
1. AnteHandler — 글로벌 정책, 모든 tx. 상태 작업 이전에 GlobalPolicyConfig의 PolicySet들을 트랜잭션의 발신자/대상/값에 대해 평가합니다. validator가 수락하는 트랜잭션은 어느 것도 이를 우회할 수 없습니다.
2. 규제 EVM 호출 경로 — 컨트랙트 범위 정책. 호출자가
두 경로 모두 같은 평가 로직과 템플릿 구현을 사용하며, 파라미터 스코프만 다릅니다.
1. AnteHandler — 글로벌 정책, 모든 tx. 상태 작업 이전에 GlobalPolicyConfig의 PolicySet들을 트랜잭션의 발신자/대상/값에 대해 평가합니다. validator가 수락하는 트랜잭션은 어느 것도 이를 우회할 수 없습니다.
2. 규제 EVM 호출 경로 — 컨트랙트 범위 정책. 호출자가
IPcl.runOnPcl(contractAddress, data, value) (또는 체인이 그곳으로 연결한 경로)로 라우팅할 때, PCL이 contractAddress에 등록된 ContractPolicyConfig를 추가로 평가합니다. 일반 EVM 호출은 컨트랙트 범위 정책을 발동하지 않으며, 의도적으로 규제 경로만 발동합니다.두 경로 모두 같은 평가 로직과 템플릿 구현을 사용하며, 파라미터 스코프만 다릅니다.
평가의 모습
어느 경로든 동일한 루프를 따릅니다. 해당 스코프의 활성 PolicySet들을 읽은 뒤, 각 PolicySet에 대해
templateId로 디스패치하여 일치하는 평가자에게 전달합니다(DENYLIST_POLICY → 주소 목록 검사, EAS_POLICY → attestation 조회, VOLUME_POLICY → 토큰별 금액 검사 등). 첫 실패에서 단락하고 ABI 인코딩된 ReasonCode(예: InDenylist(sender) 또는 EasAttestationRequired(sender))를 반환합니다. 전체 목록은 pcl-reason-codes, 템플릿별 동작은 pcl-policy-templates 페이지에서 확인할 수 있습니다.런타임에 잔여 quota 읽기
주기 기반 템플릿(
PERIODIC_VOLUME_POLICY, OKRW_EAS_PERIODIC_VOLUME_LIMIT_POLICY)은 (스코프, 발신자)별로 PeriodicVolume 레코드에 누적합니다. dApp은 트랜잭션 없이 현재 누적 값을 조회할 수 있으며, "리셋까지 X OKRW 남음" 표시에 유용합니다.IPcl pcl = IPcl(0x1000000000000000000000000000000000000005);
PeriodicVolume memory pv = pcl.globalPeriodicVolume(user, "aokrw");
// pv.amount, pv.maxAmount, pv.resetAt 컨트랙트 범위 누적자에 대응하는 읽기도 있습니다(
contractPeriodicVolume, globalOkrwEasPeriodicVolume, contractOkrwEasPeriodicVolume).사전 시뮬레이션
지갑은 사용자가 서명하기 전에 PCL이 트랜잭션을 통과시킬지 미리 확인할 수 있습니다. 동일한
from, 대상, calldata, value로 IPcl.runOnPcl에 EVM 정적 호출을 보내면, 성공 시 PCL이 트랜잭션을 통과시키며, revert 시에는 인코딩된 ReasonCode와 함께 거절됩니다. 통합 패턴은 simulating-pcl-checks 페이지에서 확인할 수 있습니다.오류 처리
PCL은 일반적인 "트랜잭션 실패"를 반환하지 않습니다. 각 실패는 구조화된 ReasonCode(
InDenylist, EasAttestationRequired, VolumeAboveMaxLimit, ExceededPeriodicVolume 등) 중 하나를 동반합니다. 지갑과 프론트엔드는 IPcl ABI에 대해 revert 페이로드를 디코드하고 코드별 UX를 표시해야 합니다(예: EAS 계열 코드는 "KYC 완료" 안내, volume 코드는 "전송 분할" 안내). 모든 오류를 불투명하게 처리하면 구조화된 인터페이스의 의미가 사라집니다.