IPcl.contractPeriodicVolume

contractPeriodicVolume(address contractAddress, address user, bytes selector, string asset, uint64 resetPeriodSeconds, bool resolveAgentOwners) external view returns (PeriodicVolume memory)

특정 contractAddress에 부착된 PERIODIC_VOLUME_POLICY에 대해 user의 현재 누적 거래량 카운터를 읽습니다. assetresetPeriodSeconds로 조회 범위를 좁히며, 필요하다면 함수 selector로도 좁힐 수 있습니다. selector 없이 등록된 PolicySet(컨트랙트의 모든 호출에 적용되는 정책)을 조회하려면 빈 바이트("0x")를 전달합니다.

파라미터

이름 타입 필수 설명
contractAddress address ContractPolicyConfig가 등록된 컨트랙트 주소입니다.
user address 이 컨트랙트에 대한 누적 거래량을 조회할 주소입니다.
selector bytes PolicySet 조회 범위를 좁힐 4바이트 함수 selector입니다. selector가 비어 있는 상태로 등록된 PolicySet(모든 호출에 적용)을 조회하려면 빈 바이트("0x")를 전달합니다.
asset string 정책의 키가 되는 denom 문자열입니다. OKRW의 경우 "aokrw"를 사용합니다.
resetPeriodSeconds uint64 이 컨트랙트에서 조회할 PERIODIC_VOLUME_POLICY 상한을 식별하는 리셋 주기 길이입니다.
resolveAgentOwners bool true이고 user가 에이전트 지갑이면, 에이전트 주소가 아니라 에이전트의 소유자(owner)들을 기준으로 카운터를 집계합니다.

반환값

타입: PeriodicVolume

구조체 { uint256 amount, uint256 maxAmount, uint64 resetPeriodSeconds, uint64 resetAt }이며 현재 카운터, 정책 상한, 기간 길이, 윈도 리셋 타임스탬프를 포함합니다.

예제

컨트랙트별 일일 OKRW 상한 확인

user의 24시간 OKRW 거래량 카운터를 tokenAddress 범위에서 조회합니다. selector 지정 없이 등록된 PolicySet에 매치됩니다. 이 범위의 전형적인 상한은 일 10,000,000 OKRW 수준입니다.

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

const PCL = "0x1000000000000000000000000000000000000005";
const pclAbi = parseAbi([
  "function contractPeriodicVolume(address contractAddress, address user, bytes selector, 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 tokenAddress = "0x3333333333333333333333333333333333333333"; // replace before production
const user         = "0x4444444444444444444444444444444444444444";

const v = await client.readContract({
  address: PCL,
  abi: pclAbi,
  functionName: "contractPeriodicVolume",
  args: [tokenAddress, user, toHex("", { size: 0 }), "aokrw", 86_400n, false],
});

// e.g. maxAmount = 10_000_000 * 10^18 aokrw (10,000,000 OKRW daily cap)
console.log(`${v.amount} / ${v.maxAmount} aokrw used, resets at ${v.resetAt}`);

함수 selector로 범위 좁히기

같은 컨트랙트에 함수별로 서로 다른 PERIODIC_VOLUME_POLICY PolicySet이 부착되어 있을 때, 대상 함수의 4바이트 selector를 전달해 알맞은 카운터를 조회합니다.

import { encodeFunctionData, toFunctionSelector } from "viem";

// e.g. ERC20.transfer(address,uint256)
const sel = toFunctionSelector("transfer(address,uint256)");

const v = await client.readContract({
  address: PCL,
  abi: pclAbi,
  functionName: "contractPeriodicVolume",
  args: [tokenAddress, user, sel, "aokrw", 86_400n, false],
});
ESC
검색어를 입력하세요