github.com/codingfuture/orig-energi3@v0.8.4/energi/contracts/src/GovernedContract.sol (about) 1 // Copyright 2019 The Energi Core Authors 2 // This file is part of Energi Core. 3 // 4 // Energi Core is free software: you can redistribute it and/or modify 5 // it under the terms of the GNU General Public License as published by 6 // the Free Software Foundation, either version 3 of the License, or 7 // (at your option) any later version. 8 // 9 // Energi Core is distributed in the hope that it will be useful, 10 // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 // GNU General Public License for more details. 13 // 14 // You should have received a copy of the GNU General Public License 15 // along with Energi Core. If not, see <http://www.gnu.org/licenses/>. 16 17 // Energi Governance system is the fundamental part of Energi Core. 18 19 // NOTE: It's not allowed to change the compiler due to byte-to-byte 20 // match requirement. 21 pragma solidity 0.5.16; 22 //pragma experimental SMTChecker; 23 24 import { IGovernedContract } from "./IGovernedContract.sol"; 25 26 /** 27 * Genesis version of GovernedContract common base. 28 * 29 * Base Consensus interface for upgradable contracts. 30 * Unlike common approach, the implementation is NOT expected to be 31 * called through delegatecall() to minimize risks of shared storage. 32 * 33 * NOTE: it MUST NOT change after blockchain launch! 34 */ 35 contract GovernedContract is IGovernedContract { 36 address public proxy; 37 38 constructor(address _proxy) public { 39 proxy = _proxy; 40 } 41 42 modifier requireProxy { 43 require(msg.sender == proxy, "Not proxy"); 44 _; 45 } 46 47 function migrate(IGovernedContract _oldImpl) external requireProxy { 48 _migrate(_oldImpl); 49 } 50 51 function destroy(IGovernedContract _newImpl) external requireProxy { 52 _destroy(_newImpl); 53 selfdestruct(address(_newImpl)); 54 } 55 56 // solium-disable-next-line no-empty-blocks 57 function _migrate(IGovernedContract) internal {} 58 59 // solium-disable-next-line no-empty-blocks 60 function _destroy(IGovernedContract) internal {} 61 62 function _callerAddress() 63 internal view 64 returns (address payable) 65 { 66 if (msg.sender == proxy) { 67 // This is guarantee of the GovernedProxy 68 // solium-disable-next-line security/no-tx-origin 69 return tx.origin; 70 } else { 71 return msg.sender; 72 } 73 } 74 } 75 76