IPcl.policyTemplate
policyTemplate(
string calldata templateId
) external view returns (PolicyTemplate memory) 등록된 PCL 정책 템플릿의 디스크립터를 반환합니다. 반환되는 PolicyTemplate struct는 templateId, name, description 세 필드만 담는 메타데이터 전용 구조이며, 기계가 읽을 수 있는 파라미터 스키마는 포함하지 않습니다. 각 템플릿의 파라미터 형태는 IPcl.sol의 템플릿별 struct(DenylistPolicy, EasPolicy 등)에서 확인합니다. 요청한 templateId가 현재 네트워크에 등록되어 있지 않으면 PolicyTemplateNotFound로 revert됩니다.
파라미터
| 이름 | 타입 | 필수 | 설명 |
|---|---|---|---|
templateId | string | ✓ | 기계가 읽는 템플릿 ID입니다. 예를 들어 "DENYLIST_POLICY"나 "EAS_POLICY"와 같이 대소문자를 구분하며, 등록된 템플릿과 정확히 일치해야 합니다. |
반환값
타입:
PolicyTemplate 세 필드를 가진 struct를 반환합니다. string templateId는 성공 시 입력을 그대로 되돌려주고, string name은 사람이 읽는 라벨이며, string description은 템플릿의 평가 규칙을 짧게 서술한 설명입니다.
에러
| 코드 | 이름 | 설명 |
|---|---|---|
PolicyTemplateNotFound | PolicyTemplateNotFound | templateId에 해당하는 템플릿이 등록되어 있지 않을 때 revert됩니다. PolicyTemplateNotFound(string templateId) 형태로 인코딩되어, 어떤 id 조회가 실패했는지 클라이언트가 표시할 수 있습니다. |
예제
viem으로 템플릿 디스크립터 읽기
반환 튜플은 정확히 세 필드입니다. 이전에 paramSchema byte 문자열을 읽던 호출자는 그 접근을 제거해야 합니다. 해당 필드는 더 이상 존재하지 않습니다.
import { createPublicClient, http } from "viem";
const PCL = "0x1000000000000000000000000000000000000005" as const;
const pclAbi = [{
type: "function", name: "policyTemplate", stateMutability: "view",
inputs: [{ name: "templateId", type: "string" }],
outputs: [{
type: "tuple", components: [
{ name: "templateId", type: "string" },
{ name: "name", type: "string" },
{ name: "description", type: "string" },
],
}],
}] as const;
const publicClient = createPublicClient({ transport: http("https://rpc-testnet.maroo.io") });
const tpl = await publicClient.readContract({
address: PCL,
abi: pclAbi,
functionName: "policyTemplate",
args: ["EAS_POLICY"],
});
console.log(tpl.templateId, tpl.name, tpl.description); 미등록 템플릿 처리
해당 템플릿으로 PolicySet을 빌드하기 전에 PolicyTemplateNotFound를 예비 확인 용도로 사용합니다. 네트워크에 등록되어 있지 않다면 changeContractPolicies도 같은 방식으로 실패합니다.
import { createPublicClient, http, decodeErrorResult } from "viem";
const PCL = "0x1000000000000000000000000000000000000005" as const;
const pclAbi = [
{ type: "function", name: "policyTemplate", stateMutability: "view",
inputs: [{ name: "templateId", type: "string" }],
outputs: [{
type: "tuple", components: [
{ name: "templateId", type: "string" },
{ name: "name", type: "string" },
{ name: "description", type: "string" },
],
}] },
{ type: "error", name: "PolicyTemplateNotFound",
inputs: [{ name: "templateId", type: "string" }] },
] as const;
const publicClient = createPublicClient({ transport: http("https://rpc-testnet.maroo.io") });
try {
await publicClient.readContract({
address: PCL,
abi: pclAbi,
functionName: "policyTemplate",
args: ["NOT_A_REAL_TEMPLATE"],
});
} catch (err: any) {
if (err?.data) {
const decoded = decodeErrorResult({ abi: pclAbi, data: err.data });
if (decoded.errorName === "PolicyTemplateNotFound") {
console.warn("template not registered:", decoded.args[0]);
}
}
}