/* Copyright 2020 DODO ZOO. SPDX-License-Identifier: Apache-2.0 */ pragma solidity 0.6.9; import {IERC20} from "../intf/IERC20.sol"; import {SafeERC20} from "../lib/SafeERC20.sol"; import {InitializableOwnable} from "../lib/InitializableOwnable.sol"; contract DODOApprove is InitializableOwnable { using SafeERC20 for IERC20; // ============ Storage ============ uint256 private constant _TIMELOCK_DURATION_ = 3 days; uint256 public _TIMELOCK_; address public _PENDING_DODO_PROXY_; address public _DODO_PROXY_; // ============ Events ============ event SetDODOProxy(address indexed oldProxy, address indexed newProxy); // ============ Modifiers ============ modifier notLocked() { require( _TIMELOCK_ <= block.timestamp, "SetProxy is timelocked" ); _; } function unlockSetProxy(address newDodoProxy) public onlyOwner { if(newDodoProxy == address(0) || _DODO_PROXY_ == address(0)) _TIMELOCK_ = block.timestamp; else _TIMELOCK_ = block.timestamp + _TIMELOCK_DURATION_; _PENDING_DODO_PROXY_ = newDodoProxy; } function lockSetProxy() public onlyOwner { _PENDING_DODO_PROXY_ = address(0); _TIMELOCK_ = 0; } function setDODOProxy() external onlyOwner notLocked() { emit SetDODOProxy(_DODO_PROXY_, _PENDING_DODO_PROXY_); _DODO_PROXY_ = _PENDING_DODO_PROXY_; lockSetProxy(); } function claimTokens( address token, address who, address dest, uint256 amount ) external { require(msg.sender == _DODO_PROXY_, "DODOApprove:Access restricted"); if (amount > 0) { IERC20(token).safeTransferFrom(who, dest, amount); } } function getDODOProxy() public view returns (address) { return _DODO_PROXY_; } }