123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- // This program is free software: you can redistribute it and/or modify
- // it under the terms of the GNU General Public License as published by
- // the Free Software Foundation, either version 3 of the License, or
- // (at your option) any later version.
- // This program is distributed in the hope that it will be useful,
- // but WITHOUT ANY WARRANTY; without even the implied warranty of
- // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- // GNU General Public License for more details.
- // You should have received a copy of the GNU General Public License
- // along with this program. If not, see <http://www.gnu.org/licenses/>.
- pragma solidity >=0.4.23;
- interface DSAuthority {
- function canCall(
- address src, address dst, bytes4 sig
- ) external view returns (bool);
- }
- contract DSAuthEvents {
- event LogSetAuthority (address indexed authority);
- event LogSetOwner (address indexed owner);
- }
- contract DSAuth is DSAuthEvents {
- DSAuthority public authority;
- address public owner;
- constructor() public {
- owner = msg.sender;
- emit LogSetOwner(msg.sender);
- }
- function setOwner(address owner_)
- public
- auth
- {
- owner = owner_;
- emit LogSetOwner(owner);
- }
- function setAuthority(DSAuthority authority_)
- public
- auth
- {
- authority = authority_;
- emit LogSetAuthority(address(authority));
- }
- modifier auth {
- require(isAuthorized(msg.sender, msg.sig), "ds-auth-unauthorized");
- _;
- }
- function isAuthorized(address src, bytes4 sig) internal view returns (bool) {
- if (src == address(this)) {
- return true;
- } else if (src == owner) {
- return true;
- } else if (authority == DSAuthority(0)) {
- return false;
- } else {
- return authority.canCall(src, address(this), sig);
- }
- }
- }
|