contract DFODependantContract {
address public doubleProxy;
uint256 public mySpecificParameter;
//Every configuration parameter must have a initial value in constructor and a setter callable by the DFO only
constructor(address _doubleProxy, uint256 _mySpecificParameterInitialValue) {
doubleProxy = _doubleProxy;
mySpecificParameter = _mySpecificParameterInitialValue;
//All the functions having this modifier can be called only by the DFO microservices and one-time proposals
require(IMVDFunctionalitiesManager(IMVDProxy(IDoubleProxy(_doubleProxy).proxy()).getMVDFunctionalitiesManagerAddress()).isAuthorizedFunctionality(msg.sender), "Unauthorized.");
//E.g. mySpecificParameter can be changed only by proposal
function setMySpecificParameter(uint256 _mySpecificParameter) public byDFO {
mySpecificParameter = _mySpecificParameter;
//For security purposes, it is ALWAYS important to let a DFO vote to change the DoubleProxy
function setDoubleProxy(address newDoubleProxy) public byDFO {
doubleProxy = newDoubleProxy;
function proxy() external view returns (address);
function getMVDFunctionalitiesManagerAddress() external view returns(address);
function getMVDWalletAddress() external view returns (address);
function getStateHolderAddress() external view returns(address);
function submit(string calldata codeName, bytes calldata data) external payable returns(bytes memory returnData);
interface IMVDFunctionalitiesManager {
function getFunctionalityData(string calldata codeName) external view returns(address, uint256, string memory, address, uint256);
function isAuthorizedFunctionality(address functionality) external view returns(bool);
function getUint256(string calldata name) external view returns(uint256);
function getAddress(string calldata name) external view returns(address);
function clear(string calldata varName) external returns(string memory oldDataType, bytes memory oldVal);