IPcl.registerContractPolicies
registerContractPolicies(ContractPolicyConfig calldata policy) external 특정 스마트 컨트랙트에 적용할 새로운 컴플라이언스 정책 세트를 등록합니다. 이 함수는 초기 정책 구성을 설정합니다. 대상 컨트랙트에 이미 정책이 등록된 경우 이 호출은 실패합니다. 기존 구성을 업데이트하려면 changeContractPolicies를 사용합니다. 호출자는 policy 구조체에 지정된 컨트랙트의 관리자이거나 해당 컨트랙트 자체여야 합니다.
파라미터
| 이름 | 타입 | 필수 | 설명 |
|---|---|---|---|
policy | ContractPolicyConfig | ✓ | 대상 컨트랙트 주소(_contract), 향후 변경을 위한 관리자 주소, 적용할 PolicySet 배열을 포함하는 구조체입니다. 각 PolicySet은 { templateId, policy, selector } 형태이며, policy는 템플릿의 파라미터 구조체를 abi.encode한 값입니다. |
반환값
타입:
void 이 함수는 값을 반환하지 않습니다.
에러
| 코드 | 이름 | 설명 |
|---|---|---|
Unauthorized | Unauthorized | msg.sender가 policy.admin 필드에 지정된 관리자가 아닐 경우 revert됩니다. |
PolicyAlreadyRegistered | PolicyAlreadyRegistered | 대상 policy._contract 주소에 대한 정책 구성이 이미 존재하는 경우 revert됩니다. |
UnknownPolicyType | UnknownPolicyType | PolicySet 항목 중 하나가 네트워크에 등록되지 않은 templateId를 사용하는 경우 revert됩니다. |
예제
DENYLIST_POLICY 등록
관리자 컨트랙트가 토큰 컨트랙트에 DENYLIST_POLICY를 부착합니다. 관리자 컨트랙트 자체가 정책 관리자로 지정되므로, 이후 changeContractPolicies / removeContractPolicies는 이 컨트랙트만 호출할 수 있습니다.
// SPDX-License-Identifier: Apache-2.0
pragma solidity ^0.8.18;
import { IPcl, PolicySet, ContractPolicyConfig, DenylistPolicy } from "@maroo-chain/contracts/IPcl.sol";
contract MyTokenAdmin {
IPcl constant PCL = IPcl(0x1000000000000000000000000000000000000005);
address public myTokenAddress;
constructor(address token) {
myTokenAddress = token;
}
function setInitialDenylist(address[] calldata denylisted) external {
// ABI-encode the DenylistPolicy struct into the PolicySet's `policy` bytes.
DenylistPolicy memory dl = DenylistPolicy({ addresses: denylisted });
bytes memory policyBytes = abi.encode(dl);
PolicySet[] memory policies = new PolicySet[](1);
policies[0] = PolicySet({
templateId: "DENYLIST_POLICY",
policy: policyBytes,
selector: bytes4(0) // Apply to all functions on the contract
});
ContractPolicyConfig memory config = ContractPolicyConfig({
_contract: myTokenAddress,
admin: address(this),
policies: policies
});
PCL.registerContractPolicies(config);
}
}