IPcl.contractPolicies

contractPolicies(address contractAddress) external view returns (ContractPolicyConfig memory)

view 호출입니다. contractAddress에 대해 현재 활성화된 컨트랙트 범위 ContractPolicyConfig(즉, admin과 전체 PolicySet[])를 반환합니다. 해당 주소에 등록된 컨트랙트 범위 설정이 없다면 revert하지 않고 zero 값 struct(_contract = address(0), admin = address(0), 빈 policies 배열)를 반환합니다. 이때도 체인 전역 GlobalPolicyConfig는 그 컨트랙트에 계속 적용됩니다. 규제 경로(runOnPcl / PCL 프록시 훅)를 통해 대상 컨트랙트가 강제하는 정확한 규칙을 확인할 때 사용합니다.

파라미터

이름 타입 필수 설명
contractAddress address 정책 설정을 조회할 컨트랙트의 EVM 주소입니다.

반환값

타입: ContractPolicyConfig

_contract(address), admin(address), policies(PolicySet[]) 필드를 가진 ContractPolicyConfig struct를 반환합니다. 대상에 등록된 설정이 없다면 모든 필드가 zero 값입니다. _contract = address(0), admin = address(0), policies.length == 0이 됩니다.

예제

viem으로 컨트랙트 정책 설정 조회

등록되지 않은 컨트랙트에 대해 zero 값 struct를 반환하므로 try/catch로 감싸는 대신 admin == address(0)policies.length == 0으로 분기합니다.

import { createPublicClient, http } from "viem";
import { pclAbi } from "@maroo-chain/contracts/abis";

const PCL = "0x1000000000000000000000000000000000000005";

const client = createPublicClient({
  transport: http("https://rpc-testnet.maroo.io"),
});

// Replace before production — this is a testnet example target.
const target = "0x1111111111111111111111111111111111111111";

const cfg = await client.readContract({
  address: PCL,
  abi: pclAbi,
  functionName: "contractPolicies",
  args: [target],
});

if (cfg.admin === "0x0000000000000000000000000000000000000000" && cfg.policies.length === 0) {
  console.log("No contract-scoped policies registered — only global policies apply.");
} else {
  console.log("Admin:", cfg.admin);
  console.log("Policy count:", cfg.policies.length);
  for (const p of cfg.policies) {
    console.log(" -", p.templateId, "selector=", p.selector);
  }
}

Solidity에서 조회

프리컴파일은 등록되지 않은 대상에 대해 revert하지 않으므로, 필드 값 확인만으로 "컨트랙트 범위 설정 없음"과 실제 등록을 구분할 수 있습니다.

// SPDX-License-Identifier: Apache-2.0
pragma solidity ^0.8.22;

import { IPcl, ContractPolicyConfig, PCL_CONTRACT } from "@maroo-chain/contracts/precompiles/pcl/IPcl.sol";

contract PolicyInspector {
    function hasContractPolicies(address target) external view returns (bool) {
        ContractPolicyConfig memory cfg = PCL_CONTRACT.contractPolicies(target);
        // Zero-valued struct signals "no config registered"; only global policies apply.
        return cfg.admin != address(0) || cfg.policies.length > 0;
    }
}

cast로 셸에서 조회

등록되지 않은 대상이면 revert 대신 (0x0…0, 0x0…0, []) 튜플이 반환됩니다.

# Replace before production — testnet target address.
TARGET=0x1111111111111111111111111111111111111111
cast call 0x1000000000000000000000000000000000000005 \
  "contractPolicies(address)((address,address,(string,bytes,bytes)[]))" \
  $TARGET \
  --rpc-url https://rpc-testnet.maroo.io
ESC
검색어를 입력하세요