IPcl.globalPeriodicVolume

globalPeriodicVolume(address user, string asset, uint64 resetPeriodSeconds, bool resolveAgentOwners) external view returns (PeriodicVolume memory)

전역 설정에 등록된 PERIODIC_VOLUME_POLICY 중 지정한 assetresetPeriodSeconds에 해당하는 정책에 대해, user의 현재 누적 거래량 카운터를 읽습니다. 현재 누적 금액, 정책 상한, 기간 길이, 현재 윈도가 종료되는 unix 타임스탬프를 반환합니다. 트랜잭션 제출 전 전역 주기 상한에 걸릴지 미리 확인하는 데 사용합니다.

파라미터

이름 타입 필수 설명
user address 누적 거래량을 조회할 주소입니다. 일반적으로 곧 제출할 트랜잭션의 msg.sender입니다.
asset string 정책의 키가 되는 denom 문자열입니다. OKRW의 경우 base denom인 "aokrw"를 사용합니다.
resetPeriodSeconds uint64 조회할 PERIODIC_VOLUME_POLICY 상한을 식별하는 리셋 주기 길이입니다(예: 24시간은 86400, 30일은 2592000). 대상 정책에 설정된 resetPeriodSeconds와 정확히 일치해야 합니다.
resolveAgentOwners bool true이고 user가 에이전트 지갑이면, 에이전트 주소가 아니라 에이전트의 소유자(owner)들을 기준으로 누적 카운터를 집계합니다. false이면 user 주소 자체만 조회합니다.

반환값

타입: PeriodicVolume

구조체 { uint256 amount, uint256 maxAmount, uint64 resetPeriodSeconds, uint64 resetAt }입니다. amount는 현재 윈도 내 누적 금액이고, maxAmount는 정책 상한, resetAt은 윈도가 리셋되는 unix 타임스탬프입니다.

예제

전송 전 일일 OKRW 거래량 미리보기

user의 24시간 전역 OKRW 거래량 카운터를 읽습니다. user가 EOA이므로 resolveAgentOwners = false를 사용합니다. 실제 전송 상한(10,000,000 OKRW = 1e7 × 10^18 aokrw)과 잔여 한도를 비교합니다.

import { createPublicClient, http, parseAbi } from "viem";

const PCL = "0x1000000000000000000000000000000000000005";
const pclAbi = parseAbi([
  "function globalPeriodicVolume(address user, string asset, uint64 resetPeriodSeconds, bool resolveAgentOwners) view returns ((uint256 amount, uint256 maxAmount, uint64 resetPeriodSeconds, uint64 resetAt))",
]);

const client = createPublicClient({ transport: http("https://rpc-testnet.maroo.io") });

const user = "0x1111111111111111111111111111111111111111"; // replace before production
const v = await client.readContract({
  address: PCL,
  abi: pclAbi,
  functionName: "globalPeriodicVolume",
  args: [user, "aokrw", 86_400n, false],
});

const headroom = v.maxAmount - v.amount; // in aokrw
console.log(`used ${v.amount} / ${v.maxAmount} aokrw, resets at ${v.resetAt}`);
if (headroom < 10_000_000n * 10n ** 18n) {
  // < 10,000,000 OKRW headroom — this transfer will trip the cap
}

에이전트 지갑 카운터를 owner 기준으로 집계

resolveAgentOwners = true를 전달하면 정책 평가기가 에이전트 지갑을 집계하는 방식과 동일하게 동작합니다. 카운터가 에이전트 주소가 아니라 에이전트의 소유자(owner)들 기준으로 집계됩니다. 에이전트가 제어하는 전송을 미리 확인할 때 사용합니다.

const agentWallet = "0x2222222222222222222222222222222222222222"; // replace before production

const v = await client.readContract({
  address: PCL,
  abi: pclAbi,
  functionName: "globalPeriodicVolume",
  args: [agentWallet, "aokrw", 86_400n, true],
});

// v.amount now reflects the aggregated 24h volume across the agent's owner(s),
// which is what a PERIODIC_VOLUME_POLICY configured with agent-owner resolution
// evaluates at enforcement time.
console.log(v);
ESC
검색어를 입력하세요