IPcl.contractPolicies / removeContractPolicies

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

컨트랙트 범위 정책 바인딩에 대한 두 작업입니다. contractPolicies(address)는 현재 바인딩된 ContractPolicyConfig를 반환하는 view입니다. 바인딩이 없으면 0으로 채운 struct가 반환됩니다. removeContractPolicies(address)는 PCL 래핑 프록시의 PolicySet[]을 비웁니다. 컨트랙트 admin 바인딩 자체는 제거하지 않으므로, admin은 이후 changeContractPolicies로 다시 정책을 붙일 수 있습니다. 보호 장치가 두 가지 있습니다. (1) 현재 컨트랙트 admin만 제거할 수 있습니다. (2) 정책 인지 프리컴파일은 이 방식으로 비울 수 없습니다. 이 집합은 체인 바이너리에 고정되어 있으며, 현재는 0x100000000000000000000000000000000000000b의 Privacy 프리컴파일 하나입니다. 이 경우 CannotEmpty("policy-aware precompile policies")로 revert됩니다. 정책 인지 프리컴파일의 규칙을 완화하려면 대신 changeContractPolicies로 허용형 PolicySet을 설정합니다.

파라미터

이름 타입 필수 설명
contractAddress address ✓ 대상 컨트랙트입니다. view에서는 어떤 주소든 허용됩니다(바인딩이 없으면 0으로 채운 struct가 반환됩니다). 제거에서는 반드시 PCL 래핑 프록시여야 하며, 정책 인지 프리컴파일 주소는 revert됩니다.

반환값

타입: ContractPolicyConfig | void

contractPolicies는 ContractPolicyConfig(즉 _contract, admin, policies)를 반환합니다. removeContractPolicies는 반환값이 없으며, 성공 시 ContractPoliciesRemoved(contractAddress)를 발행합니다.

에러

코드 이름 설명
Unauthorized Unauthorized removeContractPolicies에 적용됩니다. msg.sender가 대상의 현재 컨트랙트 admin이 아닐 때 revert됩니다.
CannotEmpty CannotEmpty removeContractPolicies에 적용됩니다. contractAddress가 정책 인지 프리컴파일(현재는 Privacy 프리컴파일 하나)이면 CannotEmpty("policy-aware precompile policies")로 revert됩니다. 이 대상들은 항상 최소 하나의 활성 PolicySet을 유지해야 합니다.
PclProxyNotRegistered PclProxyNotRegistered removeContractPolicies에 적용됩니다. 대상에 컨트랙트 정책 바인딩은 있지만(예: genesis에서 설정된 경우) PCL 래핑 프록시가 아닐 때 revert됩니다. 바인딩이 없는 대상은 먼저 ContractPolicyNotRegistered로, 정책 인지 프리컴파일은 CannotEmpty로 revert됩니다.
ContractPolicyNotRegistered ContractPolicyNotRegistered removeContractPolicies에 적용되며, 가장 먼저 검사됩니다. 대상에 컨트랙트 정책 바인딩이 없을 때, 즉 deployPclProxy로 배포되지 않았고 정책 인지 프리컴파일도 아닐 때(EOA, 에이전트 지갑, 다른 방식으로 배포된 컨트랙트) revert됩니다. ContractPolicyNotRegistered(address contractAddress) 형태로 인코딩됩니다. contractPolicies는 이런 주소에 대해 revert하지 않고 0으로 채운 struct를 반환합니다.

예제

viem으로 현재 바인딩 읽기

바인딩이 있으면 완전한 ContractPolicyConfig가 반환되고, 없으면 모든 필드가 0으로 채워집니다.

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

const PCL = "0x1000000000000000000000000000000000000005" as const;
// TODO: replace with the real proxy address.
const PROXY = "0x8F3ac2B1d9E74c05A6B18FE27Dc4913e5A0F7b62" as const;

const publicClient = createPublicClient({ transport: http("https://rpc-testnet.maroo.io") });
const cfg = await publicClient.readContract({
  address: PCL,
  abi: pclAbi,
  functionName: "contractPolicies",
  args: [PROXY],
});
console.log(cfg.admin, cfg.policies.length);

정책 인지 프리컴파일의 정책 제거 거부

정책 인지 프리컴파일이 정책 없이 동작하는 상황을 막기 위해 removeContractPolicies는 의도적으로 차단됩니다. 대신 changeContractPolicies로 새 PolicySet(필요하면 허용형)을 제출합니다.

import { BaseError, ContractFunctionRevertedError, createWalletClient, http, decodeErrorResult } from "viem";
import { privateKeyToAccount } from "viem/accounts";

const PCL = "0x1000000000000000000000000000000000000005" as const;
// Privacy precompile — a policy-aware precompile on Maroo.
const PRIVACY = "0x100000000000000000000000000000000000000b" as const;

const wallet = createWalletClient({
  account: privateKeyToAccount(process.env.PRECOMPILE_ADMIN_KEY as `0x${string}`),
  transport: http("https://rpc-testnet.maroo.io"),
});

try {
  await wallet.writeContract({
    address: PCL,
    abi: pclAbi,
    functionName: "removeContractPolicies",
    args: [PRIVACY],
  });
} 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) throw err;
  const decoded = decodeErrorResult({ abi: pclAbi, data: revert.raw });
  // decoded.errorName === "CannotEmpty"
  // decoded.args      === ["policy-aware precompile policies"]
  console.error("cannot clear policies on a policy-aware precompile:", decoded.args[0]);
}
ESC
검색어를 입력하세요