contract SchemeConstraints {

    address[] public contractsWhiteList;
    //descriptionHash can be used to add detalis description of the constraints.
    //e.g it can be ipfs hash of the contractsWhiteList abis +names.
    string public descriptionHash;

   /*
    * @dev isAllowedToCall should be called upon a proposal execution.
    * @param _contractsToCall the contracts to be called
    * @param _callsData - The abi encode data for the calls
    * @param _values value(ETH) to transfer with the calls
    * @param _avatar avatar
    * @return bool value true-allowed false not allowed
    */
    function isAllowedToCall(
        address[] calldata _contractsToCall,
        bytes[] calldata _callsData,
        uint256[] calldata _values,
        Avatar _avatar)
    external returns(bool);

    /*
     * @dev isAllowedToPropose should be called upon a proposal submition.
     * @param _contractsToCall the contracts to be called
     * @param _callsData - The abi encode data for the calls
     * @param _values value(ETH) to transfer with the calls
     * @param _avatar avatar
     * @return bool value true-allowed false not allowed
     */
    function isAllowedToPropose(
        address[] calldata _contractsToCall,
        bytes[] calldata _callsData,
        uint256[] calldata _values,
        Avatar _avatar)
    external returns(bool);

    function getContractsWhiteList() external view returns(address[] memory) {
        return contractsWhiteList;
    }

}
function isAllowedToPropose(
    address[] calldata _contractsToCall,
    bytes[] calldata _callsData,
    uint256[] calldata _values,
    Avatar _avatar)
external returns(bool);

/*
 * @dev isAllowedToPropose should be called upon a proposal submition.
 * @param _contractsToCall the contracts to be called
 * @param _callsData - The abi encode data for the calls
 * @param _values value(ETH) to transfer with the calls
 * @param _avatar avatar
 * @return bool value true-allowed false not allowed
 */