PERIODIC_VOLUME_POLICY

component compliance

리셋 주기(24h, 30d 등)에 걸쳐 denom별 누적 트랜잭션 금액 한도를 적용합니다.

설정된 리셋 주기에 걸쳐 발신자별 denom별 누적 트랜잭션 금액을 추적하고, 누적 합계가 한도를 넘는 트랜잭션을 거절합니다. 각 트랜잭션을 독립적으로 검사하는 VOLUME_POLICY와는 구별됩니다. 일/월 전송 상한 및 Travel Rule 스타일 임계값에 사용합니다.

Solidity struct + ABI

IPcl.sol에서:
struct UnitPeriodicVolumePolicy {
    uint256 maxAmount;           // 리셋 주기당 최대 총 금액
    uint64  resetPeriodSeconds;  // 주기 길이 (초, 예: 24h은 86400)
}

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

PolicySet.policy용 인코딩:
UnitPeriodicVolumePolicy[] memory limits = new UnitPeriodicVolumePolicy[](1);
limits[0] = UnitPeriodicVolumePolicy({
    maxAmount: 1_000_000 ether,   // 주기당 1,000,000 OKRW (aokrw 단위)
    resetPeriodSeconds: 86_400    // 24h
});
string[] memory toks = new string[](1);
toks[0] = "aokrw";

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

정책 평가 방식

전송되는 각 토큰에 대해 PCL은 (스코프, 발신자, denom)별 PeriodicVolume 누적자를 유지합니다.
struct PeriodicVolume {
    uint256 amount;              // 현재 주기 누적 금액
    uint256 maxAmount;           // 정책 한도
    uint64  resetPeriodSeconds;  // 주기 길이 (초)
    uint64  resetAt;             // 현재 주기가 끝나는 unix timestamp
}
흐름은 다음과 같습니다.
1. block.timestamp >= resetAt이면 amount = 0으로 리셋하고 resetAt을 진행합니다.
2. amount + value > maxAmount이면 거절됩니다(ExceededPeriodicVolume).
3. 그 외에는 입장이 허용되고 valueamount에 누적합니다.

누적자는 발신자별로 관리되며, 여러 수신자에게 보내더라도 카운터가 분리되지 않습니다. globalPeriodicVolume(user, asset) 또는 contractPeriodicVolume(contract, user, selector, asset)로 누적자를 조회합니다.

거절 시 발생하는 ReasonCode

ExceededPeriodicVolume(uint256 maxLimit, uint256 value, uint256 resetAt) — 지갑 UX는 "일/월 한도 도달; <resetAt>에 초기화" 표시. resetAt 필드는 unix timestamp이므로 사용자 로케일로 렌더.

주요 활용 사례

  • Travel Rule 스타일 임계값을 적용합니다(예: 미인증 사용자에 maxAmount: 1,000,000 OKRW per 24h).
  • 사기 방지 / 속도 한도로 사용합니다(예: 핫 지갑을 30d당 10 M OKRW로 상한 적용해 침해를 더 빨리 포착합니다).
  • EAS_POLICY와 결합합니다. EAS 조건부 변형 OKRW_EAS_PERIODIC_VOLUME_LIMIT_POLICY는 인증 vs 미인증 사용자에게 다른 한도를 적용할 수 있어, 더 일반적인 프로덕션 설정입니다.
소스: maroo
ESC
검색어를 입력하세요