IPcl.changeContractPolicies
changeContractPolicies(ContractPolicyConfig calldata policy) external 스마트 컨트랙트의 기존 컴플라이언스 정책 묶음을 업데이트합니다. 이 호출은 이전 정책 구성을 새 구성으로 완전히 대체합니다. 정책을 추가하거나 제거하려면 기존 구성을 읽어와 PolicySet 배열을 수정한 다음 전체 새 구성을 제출합니다. 호출자는 대상 컨트랙트에 현재 등록된 관리자여야 합니다.
파라미터
| 이름 | 타입 | 필수 | 설명 |
|---|---|---|---|
policy | ContractPolicyConfig | ✓ | 대상 컨트랙트 주소와 새 PolicySet[] 배열을 포함하는 구조체입니다. admin 필드에 새 주소를 지정하면 정책 업데이트와 함께 관리자 권한도 원자적으로 이전됩니다. |
반환값
타입:
void 이 함수는 값을 반환하지 않습니다.
에러
| 코드 | 이름 | 설명 |
|---|---|---|
Unauthorized | Unauthorized | msg.sender가 컨트랙트의 현재 정책 관리자가 아닌 경우 revert됩니다. |
PolicyNotRegistered | PolicyNotRegistered | 대상 컨트랙트에 현재 등록된 정책이 없는 경우 revert됩니다. |
예제
VOLUME_POLICY 추가
정책 업데이트의 '읽기-수정-쓰기' 패턴입니다. 현재 PolicySet[]을 가져와 aokrw 단위로 트랜잭션당 전송 크기를 제한하는 VOLUME_POLICY를 추가한 뒤 합쳐서 제출합니다. changeContractPolicies는 전체 PolicySet 배열을 교체하며, 항목별 추가/제거 호출은 별도로 존재하지 않습니다.
// SPDX-License-Identifier: Apache-2.0
pragma solidity ^0.8.18;
import {
IPcl,
PolicySet,
ContractPolicyConfig,
VolumePolicy,
VolumeUnitPolicy
} from "@maroo-chain/contracts/IPcl.sol";
contract MyTokenAdmin {
IPcl constant PCL = IPcl(0x1000000000000000000000000000000000000005);
address public myTokenAddress;
function addVolumeLimit(uint256 maxLimitAokrw) external {
// 1. Read existing policies (read-modify-write).
ContractPolicyConfig memory cur = PCL.contractPolicies(myTokenAddress);
// 2. Build a VOLUME_POLICY parameter struct: cap each `aokrw` transfer
// at maxLimitAokrw. The min/max are *per-transaction* (no rolling window).
string[] memory tokens = new string[](1);
tokens[0] = "aokrw";
VolumeUnitPolicy[] memory limits = new VolumeUnitPolicy[](1);
limits[0] = VolumeUnitPolicy({ minLimit: 0, maxLimit: maxLimitAokrw });
bytes memory policyBytes = abi.encode(VolumePolicy({ tokens: tokens, limits: limits }));
PolicySet memory volumeLimit = PolicySet({
templateId: "VOLUME_POLICY",
policy: policyBytes,
selector: bytes4(0) // Apply to every function on the contract
});
// 3. Append to the existing PolicySet[].
PolicySet[] memory newPolicies = new PolicySet[](cur.policies.length + 1);
for (uint i = 0; i < cur.policies.length; i++) newPolicies[i] = cur.policies[i];
newPolicies[cur.policies.length] = volumeLimit;
// 4. Submit the full replacement.
PCL.changeContractPolicies(ContractPolicyConfig({
_contract: myTokenAddress,
admin: address(this), // Keep the same admin
policies: newPolicies
}));
}
}