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의 현재 누적 거래량 카운터를 읽습니다. asset과 resetPeriodSeconds로 조회 범위를 좁히며, 필요하다면 함수 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],
});