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의 경우 "atokrw"를 사용합니다. |
resolveAgentOwners | bool | ✓ | true이면 user를 에이전트 지갑으로 보고, 각 항목에 그 에이전트 소유자들의 카운터 중 가장 큰 값(소유자가 없으면 user 자신의 카운터)을 담습니다. 에이전트 지갑의 전송이 소유자들의 카운터에 기록되는 것은 컨트랙트의 상한을 에이전트 소유자를 순회하는 FOR_EACH_POLICY로 감쌌을 때뿐이므로, 일반 PERIODIC_VOLUME_POLICY에서는 false로 지갑을 조회합니다. |
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 }),
"atokrw",
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로 좁히고, 에이전트 소유자들의 카운터를 읽어 항목마다 가장 큰 값을 담습니다. 토큰의 상한을 에이전트 소유자를 순회하는 FOR_EACH_POLICY로 감쌌다면 에이전트가 실행한 전송이 각 소유자 앞으로 기록되므로 실제 집행과 일치합니다. 일반 PERIODIC_VOLUME_POLICY에서는 전송이 지갑 자신의 카운터에 기록되므로 false를 전달합니다.
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,
"atokrw",
true, // the cap is per owner: FOR_EACH_POLICY over agent owners
{ key: "0x", offset: 0n, limit: 100n, countTotal: false, reverse: false },
],
});