VOLUME_POLICY

component compliance

토큰 denom별로 건당 최소·최대 금액 한도를 적용합니다. 더스트 방지와 건당 상한에 사용합니다.

하나 이상의 토큰 denom에 대해 건당 최소·최대 금액 한도를 강제하는 템플릿입니다. 각 트랜잭션은 다른 트랜잭션과 독립적으로 평가되며 롤링 윈도우나 누적 추적은 없습니다. 기간 기반 누적이 필요한 경우 PERIODIC_VOLUME_POLICY 페이지를 참고합니다.

Solidity struct + ABI

IPcl.sol에서:
struct VolumeUnitPolicy {
    uint256 minLimit;   // 0이면 최소 한도 없음
    uint256 maxLimit;   // type(uint256).max면 최대 한도 없음
}

struct VolumePolicy {
    string[] tokens;             // denom 이름, 예: "aokrw"
    VolumeUnitPolicy[] limits;   // 병렬 배열 — limits[i]가 tokens[i]에 적용
}
ABI 튜플 약칭: (string[] tokens, (uint256 minLimit, uint256 maxLimit)[] limits).

PolicySet.policy용 인코딩:
VolumeUnitPolicy[] memory limits = new VolumeUnitPolicy[](1);
limits[0] = VolumeUnitPolicy({
    minLimit: 0,
    maxLimit: 1_000_000 ether    // 건당 1,000,000 OKRW 상한 (10^6 * 10^18 aokrw)
});
string[] memory toks = new string[](1);
toks[0] = "aokrw";

VolumePolicy memory vp = VolumePolicy({ tokens: toks, limits: limits });
bytes memory policyBytes = abi.encode(vp);

정책 평가 방식

트랜잭션에서 전송되는 각 토큰에 대해 PCL이 일치하는 VolumeUnitPolicy를 (병렬 tokens / limits 배열의 인덱스로) 조회하여 금액을 검사합니다. amount < minLimit이면 거절되고, amount > maxLimit이면 거절됩니다. 다중 denom 트랜잭션은 denom별로 평가합니다.

거절 시 발생하는 ReasonCode

  • VolumeBelowMinLimit(uint256 minLimit, uint256 value)minLimit 미달. 지갑 UX 측면에서는 더 높은 금액을 제안하거나 차단합니다.
  • VolumeAboveMaxLimit(uint256 maxLimit, uint256 value)maxLimit 초과. 지갑 UX 측면에서는 분할 전송을 제안하거나 차단합니다.

주요 활용 사례

  • 건당 상한 안전 용도: 키 침해로 인한 피해 제한을 위해 개별 전송당 예: 1,000,000 OKRW 상한을 적용합니다.
  • 더스트 방지: 작은 minLimit로 상태 비대화를 노린 소액 DoS 스타일 전송을 차단합니다.
  • 다중 트랜잭션 일/월 상한은 PERIODIC_VOLUME_POLICY와 결합합니다.
소스: maroo
ESC
검색어를 입력하세요