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