testnet
GitHub EN

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);
    }
}
ESC
검색어를 입력하세요