IPcl.registerContractPolicies
registerContractPolicies(ContractPolicyConfig calldata policy) 특정 스마트 컨트랙트에 대한 새로운 규제 준수 정책 세트를 등록합니다. 이 함수는 초기 정책 구성을 설정합니다. 대상 컨트랙트에 이미 정책이 등록된 경우 이 호출은 실패합니다. 기존 구성을 업데이트하려면 changeContractPolicies를 사용하십시오. 호출자는 policy 구조체에 정의된 컨트랙트의 지정된 관리자이거나 컨트랙트 자체여야 합니다.
파라미터
| 이름 | 타입 | 필수 | 설명 |
|---|---|---|---|
policy | ContractPolicyConfig | ✓ | 대상 컨트랙트 주소, 향후 변경을 위한 관리자 주소, 그리고 적용할 UnitPolicy 구조체 배열을 포함하는 구조체입니다. |
반환값
타입:
void 이 함수는 값을 반환하지 않습니다.
에러
| 코드 | 이름 | 설명 |
|---|---|---|
Unauthorized | Unauthorized | `msg.sender`가 `policy.admin` 필드에 지정된 관리자가 아닐 경우 되돌립니다. |
PolicyAlreadyRegistered | PolicyAlreadyRegistered | 대상 `policy._contract` 주소에 대한 정책 구성이 이미 존재하는 경우 되돌립니다. |
UnknownPolicyType | UnknownPolicyType | `UnitPolicy` 중 하나가 네트워크에 등록되지 않은 `templateId`를 사용하는 경우 되돌립니다. |
예제
거부 목록 정책 등록
이 예제는 관리자 컨트랙트가 토큰 컨트랙트에 간단한 거부 목록 정책을 설정하는 것을 보여줍니다. 관리자 컨트랙트 자체가 향후 변경을 위한 정책 관리자로 지정됩니다.
import { IPcl, PCL_CONTRACT, UnitPolicy, ContractPolicyConfig } from "./IPcl.sol";
contract MyTokenAdmin {
address public myTokenAddress;
constructor(address token) {
myTokenAddress = token;
}
function setInitialDenylist(address[] calldata denylisted) external {
// ABI-encode the address array for the 'parameters' field
bytes memory params = abi.encode(denylisted);
// Create a reference to the 'DENYLIST' policy template
UnitPolicy[] memory policies = new UnitPolicy[](1);
policies[0] = UnitPolicy({
templateId: "DENYLIST",
parameters: params,
paramNames: new string[](1), // Optional for on-chain use
selector: bytes4(0) // Apply to all functions
});
// Create the full configuration
ContractPolicyConfig memory config = ContractPolicyConfig({
_contract: myTokenAddress,
admin: address(this), // This contract is the admin
policies: policies
});
// Call the PCL precompile to register the policy
PCL_CONTRACT.registerContractPolicies(config);
}
}