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]);
    }
  }
}
ESC
검색어를 입력하세요