AGENT_OKRW_TRANSFER_LIMIT_POLICY
에이전트 지갑의 트랜잭션당 OKRW 전송 상한을 강제합니다. 상한 값은 에이전트의 온체인 TransferLimit 메타데이터에서 읽으며, 에이전트가 직접 발신자인 경우뿐 아니라 전역 범위에서 에이전트가 시작 주체(principal)일 때에도 적용됩니다.
에이전트 지갑이 시작한 단일 OKRW 전송에 상한을 강제하며, 상한 값은 ERC-8004 IdentityRegistry의 온체인 메타데이터 getMetadata(agentId, "TransferLimit")에서 읽습니다. 정책 struct 자체에는 설정 가능한 필드가 없으며, 상한은 에이전트 소유자가 메타데이터 슬롯에 기록한 값입니다. 평가기는 에이전트가 직접 msg.sender인 경우와, 전역 범위 정책에서 PCL 프록시 훅이 전달한 시작 주체(principal)가 에이전트인 경우 모두 전송을 에이전트에게 귀속시킵니다. 따라서 컨트랙트가 에이전트 principal의 자금을 인출하는 흐름도 동일한 상한에 걸립니다. 귀속된 값이 설정된 TransferLimit을 초과하면 트랜잭션은 ExceededAgentTransferLimit(maxLimit, value)로 revert됩니다.
파라미터 struct
이 템플릿에는 사용자가 설정할 파라미터가 없습니다. Solidity가 빈 struct를 허용하지 않으므로
AgentOkrwTransferLimitPolicy는 체인이 무시하는 reserved 필드 하나만 갖습니다. 0을 인코딩하고 넘어갑니다.import { AgentOkrwTransferLimitPolicy, PolicySet } from "@maroo-chain/contracts/precompiles/pcl/IPcl.sol";
AgentOkrwTransferLimitPolicy memory p = AgentOkrwTransferLimitPolicy({ reserved: 0 });
PolicySet memory ps = PolicySet({
templateId: "AGENT_OKRW_TRANSFER_LIMIT_POLICY",
policy: abi.encode(p),
selector: ""
}); 상한 값의 출처
상한은 PolicySet에 저장되지 않고,
0x8004000000000000000000000000000000000001 주소의 ERC-8004 IdentityRegistry preinstall에 에이전트별로 저장됩니다. "TransferLimit" 키로 조회되는 숫자 문자열이며, 값은 aokrw 단위(소수점 18자리 base 단위, 1,000만 OKRW = 10000000000000000000000000 aokrw)로 표현된 OKRW 금액입니다. 에이전트 소유자가 IdentityRegistry의 메타데이터 setter로 기록합니다. 메타데이터 슬롯이 없거나 유효하지 않으면 평가기는 평문 문자열 "invalid agent transfer limit metadata"(또는 "invalid agent transfer limit metadata: <사유>")로 revert됩니다. 타입 지정 오류가 아니므로 문자열로 디코드해야 합니다.전송이 귀속되는 주체
평가기는 실행 후(after-execution) 단계에서 트랜잭션이 생성한 각 OKRW 전송을 검사하며, 다음 두 경우에 전송을 에이전트에게 귀속시킵니다.
컨트랙트 범위 평가에서는 직접 발신자 귀속만 적용됩니다. 컨트랙트 범위 정책은 이 템플릿에 대해 principal 재귀속을 수행하지 않습니다.
- 직접 발신자: 에이전트 지갑이 직접 OKRW를 내보내는 함수를 호출한 경우입니다(전형적인 MAWS 흐름).
- 전역 범위 시작 주체(principal): 컨트랙트가 출금 전송을 수행하지만, PCL 프록시 훅이 시작 주체(규제 경로에 진입한 지갑)를 함께 전달한 경우입니다. 그 principal이 에이전트라면 전역 범위 평가는 여전히 전송을 에이전트에게 귀속시킵니다.
컨트랙트 범위 평가에서는 직접 발신자 귀속만 적용됩니다. 컨트랙트 범위 정책은 이 템플릿에 대해 principal 재귀속을 수행하지 않습니다.
실패 동작
귀속된 값이
TransferLimit을 초과하면 트랜잭션은 타입 지정 커스텀 오류 ExceededAgentTransferLimit(uint256 maxLimit, uint256 value)로 revert됩니다. 클라이언트에서 디코드하여 초과 금액과 설정된 상한을 함께 표시할 수 있습니다.import { decodeErrorResult } from "viem";
import { pclAbi } from "./abis";
try {
await wallet.writeContract({ /* 에이전트가 시작한 1,000만 OKRW 전송 */ });
} catch (err: any) {
if (err?.data) {
const decoded = decodeErrorResult({ abi: pclAbi, data: err.data });
if (decoded.errorName === "ExceededAgentTransferLimit") {
const [maxLimit, value] = decoded.args as [bigint, bigint];
console.error(`에이전트 전송 상한 초과: max=${maxLimit} value=${value}`);
}
}
} 다른 상한과의 조합
이 템플릿은 에이전트 메타데이터만 읽으며 attestation, denylist, 주기 윈도는 평가하지 않습니다. 완전한 컴플라이언스 표면을 구성하려면 동일한
PolicyConfig.policies 배열에 다른 템플릿을 함께 넣습니다. 예를 들어 제재 대상 상대방을 차단하는 DENYLIST_POLICY를 추가하고, 미인증 전송에 24시간 기준 1,000만 OKRW 규제 보고 임계값을 강제하는 OKRW_EAS_PERIODIC_VOLUME_LIMIT_POLICY를 계층화할 수 있습니다. 각 PolicySet은 독립적으로 평가되므로, 에이전트가 시작한 1,000만 OKRW 전송 하나가 에이전트 메타데이터 상한과 별개의 주기 거래량 상한 중 먼저 발동하는 쪽에 의해 거절될 수 있습니다.