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