IPcl.changeContractPolicies
changeContractPolicies(ContractPolicyConfig calldata policy) 스마트 컨트랙트에 대한 기존 규제 준수 정책 세트를 업데이트합니다. 이 함수는 이전 정책 구성을 제공된 새 구성으로 완전히 대체합니다. 단일 정책을 추가하거나 제거하려면 기존 구성을 읽고 UnitPolicy 배열을 수정한 다음 전체 새 구성을 제출해야 합니다. 호출자는 대상 컨트랙트에 대해 현재 등록된 관리자여야 합니다.
파라미터
| 이름 | 타입 | 필수 | 설명 |
|---|---|---|---|
policy | ContractPolicyConfig | ✓ | 대상 컨트랙트 주소와 새로운 UnitPolicy 세트를 포함하는 구조체입니다. 구조체의 admin 필드를 사용하여 관리자 권한을 새 주소로 이전할 수 있습니다. |
반환값
타입:
void 이 함수는 값을 반환하지 않습니다.
에러
| 코드 | 이름 | 설명 |
|---|---|---|
Unauthorized | Unauthorized | `msg.sender`가 컨트랙트의 현재 정책 관리자가 아닌 경우 되돌립니다. |
PolicyNotRegistered | PolicyNotRegistered | 대상 컨트랙트에 현재 등록된 정책이 없는 경우 되돌립니다. |
예제
거래량 한도 정책 추가
이 예제는 정책 업데이트를 위한 '읽기-수정-쓰기' 패턴을 보여줍니다. 먼저 현재 정책을 가져온 다음, 새로운 `VOLUME_ABOVE_MAX_LIMIT` 정책을 추가하고, 결합된 목록을 교체용으로 제출합니다.
import { IPcl, PCL_CONTRACT, UnitPolicy, ContractPolicyConfig } from "./IPcl.sol";
contract MyTokenAdmin {
address public myTokenAddress;
function addVolumeLimit(uint256 maxLimit) external {
// 1. Get the current policy configuration
ContractPolicyConfig memory currentConfig = PCL_CONTRACT.contractPolicies(myTokenAddress);
// 2. Create the new policy to add
bytes memory params = abi.encode(maxLimit);
UnitPolicy memory volumeLimitPolicy = UnitPolicy({
templateId: "VOLUME_ABOVE_MAX_LIMIT",
parameters: params,
paramNames: new string[](0),
selector: bytes4(0)
});
// 3. Create a new array and combine old and new policies
UnitPolicy[] memory newPolicies = new UnitPolicy[](currentConfig.policies.length + 1);
for (uint i = 0; i < currentConfig.policies.length; i++) {
newPolicies[i] = currentConfig.policies[i];
}
newPolicies[currentConfig.policies.length] = volumeLimitPolicy;
// 4. Create the new full configuration
ContractPolicyConfig memory newConfig = ContractPolicyConfig({
_contract: myTokenAddress,
admin: address(this), // Keep the same admin
policies: newPolicies
});
// 5. Call the precompile to update
PCL_CONTRACT.changeContractPolicies(newConfig);
}
}