IPcl.contractPeriodicList
contractPeriodicList(address contractAddress, address user, bytes selector, string asset, bool resolveAgentOwners, PageRequest pageRequest) external view returns (PeriodicVolume[] statuses, PageResponse pageResponse) contractAddress에 부착된 PERIODIC_VOLUME_POLICY 카운터 중 user에 적용되는 항목 전체를 반환합니다. asset으로 필터링하며, 필요하다면 함수 selector로도 필터링할 수 있습니다. selector 없이 등록된 PolicySet에 매치하려면 빈 바이트("0x")를 전달합니다. 컨트랙트에 설정된 서로 다른 리셋 주기 버킷마다 항목 하나씩 포함됩니다.
파라미터
| 이름 | 타입 | 필수 | 설명 |
|---|---|---|---|
contractAddress | address | ✓ | 조회할 ContractPolicyConfig가 등록된 컨트랙트 주소입니다. |
user | address | ✓ | 카운터를 열거할 주소입니다. |
selector | bytes | ✓ | 조회 범위를 좁힐 4바이트 함수 selector입니다. 빈 바이트("0x")는 selector 지정 없이 등록된 PolicySet에 매치됩니다. |
asset | string | ✓ | denom 필터입니다. OKRW의 경우 "aokrw"를 사용합니다. |
resolveAgentOwners | bool | ✓ | true이고 user가 에이전트 지갑이면 카운터를 에이전트의 소유자(owner)들 기준으로 집계합니다. |
pageRequest | PageRequest | ✓ | 표준 페이지네이션 요청 구조체입니다. |
반환값
타입:
(PeriodicVolume[] statuses, PageResponse pageResponse) 매칭되는 컨트랙트 범위 주기 정책마다 { amount, maxAmount, resetPeriodSeconds, resetAt } 항목을 담은 배열과 페이지네이션 커서를 반환합니다.
예제
사용자에 대한 모든 컨트랙트 범위 OKRW 주기 상한 조회
tokenAddress에서 user에 적용되는 모든 컨트랙트 범위 PERIODIC_VOLUME_POLICY 카운터를 리셋 주기별로 열거합니다. 빈 selector는 모든 호출에 적용되는 PolicySet에 매치됩니다.
import { createPublicClient, http, parseAbi, toHex } from "viem";
const PCL = "0x1000000000000000000000000000000000000005";
const pclAbi = parseAbi([
"function contractPeriodicList(address contractAddress, address user, bytes selector, string asset, bool resolveAgentOwners, (bytes key, uint64 offset, uint64 limit, bool countTotal, bool reverse) pageRequest) view returns ((uint256 amount, uint256 maxAmount, uint64 resetPeriodSeconds, uint64 resetAt)[] statuses, (bytes nextKey, uint64 total) pageResponse)",
]);
const client = createPublicClient({ transport: http("https://rpc-testnet.maroo.io") });
const tokenAddress = "0x6666666666666666666666666666666666666666"; // replace before production
const user = "0x7777777777777777777777777777777777777777";
const [statuses] = await client.readContract({
address: PCL,
abi: pclAbi,
functionName: "contractPeriodicList",
args: [
tokenAddress,
user,
toHex("", { size: 0 }),
"aokrw",
false,
{ key: "0x", offset: 0n, limit: 100n, countTotal: false, reverse: false },
],
});
for (const s of statuses) {
// e.g. per-contract daily cap of 10,000,000 OKRW
console.log(`period=${s.resetPeriodSeconds}s used=${s.amount}/${s.maxAmount}`);
} 특정 함수에 대해 에이전트 지갑 기준 집계
조회 범위를 ERC20 transfer selector로 좁히고, 카운터를 에이전트의 소유자(owner)들 기준으로 집계합니다. 에이전트가 실행하는 전송을 정책 평가기가 집계하는 방식과 동일합니다.
import { toFunctionSelector } from "viem";
const sel = toFunctionSelector("transfer(address,uint256)");
const agentWallet = "0x8888888888888888888888888888888888888888"; // replace before production
const [statuses] = await client.readContract({
address: PCL,
abi: pclAbi,
functionName: "contractPeriodicList",
args: [
tokenAddress,
agentWallet,
sel,
"aokrw",
true, // aggregate under the agent's owner(s)
{ key: "0x", offset: 0n, limit: 100n, countTotal: false, reverse: false },
],
});