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도 실패합니다. 이때 오류는 PolicyNotRegistered(templateId)이며, 정책 유형이 아예 아닌 id라면 UnknownPolicyType(templateId)입니다.

import { BaseError, ContractFunctionRevertedError, createPublicClient, http, decodeErrorResult } from "viem";
import { iPclAbi } from "@maroo-chain/contracts/abi/precompiles/pcl/IPcl";

const PCL = "0x1000000000000000000000000000000000000005" as const;
const publicClient = createPublicClient({ transport: http("https://rpc-testnet.maroo.io") });

try {
  await publicClient.readContract({
    address: PCL,
    abi: iPclAbi,
    functionName: "policyTemplate",
    args: ["NOT_A_REAL_TEMPLATE"],
  });
} catch (err) {
  // viem keeps the revert data on the ContractFunctionRevertedError in the cause chain, not on err.
  const revert = err instanceof BaseError ? err.walk((e) => e instanceof ContractFunctionRevertedError) : null;
  if (revert instanceof ContractFunctionRevertedError && revert.raw) {
    // iPclAbi lists every IPcl error, the IPrecompile ones it inherits included
    const decoded = decodeErrorResult({ abi: iPclAbi, data: revert.raw });
    if (decoded.errorName === "PolicyTemplateNotFound") {
      console.warn("template not registered:", decoded.args[0]);
    } else {
      throw err; // a different revert: not the case this example handles
    }
  } else {
    throw err; // not a revert (a network error, a wrong ABI): let it surface
  }
}
ESC
검색어를 입력하세요