106 lines
2.9 KiB
Solidity
106 lines
2.9 KiB
Solidity
/*
|
|
|
|
Copyright 2021 DODO ZOO.
|
|
SPDX-License-Identifier: Apache-2.0
|
|
|
|
*/
|
|
|
|
pragma solidity 0.6.9;
|
|
|
|
import {IERC721} from "../intf/IERC721.sol";
|
|
import {IERC1155} from "../intf/IERC1155.sol";
|
|
import {InitializableOwnable} from "../lib/InitializableOwnable.sol";
|
|
|
|
/**
|
|
* @title DODONFTApprove
|
|
* @author DODO Breeder
|
|
*
|
|
* @notice Handle NFT authorizations in DODO platform
|
|
*/
|
|
contract DODONFTApprove is InitializableOwnable {
|
|
|
|
// ============ Storage ============
|
|
uint256 private constant _TIMELOCK_DURATION_ = 3 days;
|
|
mapping (address => bool) public _IS_ALLOWED_PROXY_;
|
|
uint256 public _TIMELOCK_;
|
|
address public _PENDING_ADD_DODO_PROXY_;
|
|
|
|
// ============ Events ============
|
|
event AddDODOProxy(address dodoProxy);
|
|
event RemoveDODOProxy(address oldProxy);
|
|
|
|
// ============ Modifiers ============
|
|
modifier notLocked() {
|
|
require(
|
|
_TIMELOCK_ <= block.timestamp,
|
|
"AddProxy is timelocked"
|
|
);
|
|
_;
|
|
}
|
|
|
|
function init(address owner, address[] memory proxies) external {
|
|
initOwner(owner);
|
|
for(uint i = 0; i < proxies.length; i++)
|
|
_IS_ALLOWED_PROXY_[proxies[i]] = true;
|
|
}
|
|
|
|
function unlockAddProxy(address newDodoProxy) external onlyOwner {
|
|
_TIMELOCK_ = block.timestamp + _TIMELOCK_DURATION_;
|
|
_PENDING_ADD_DODO_PROXY_ = newDodoProxy;
|
|
}
|
|
|
|
function lockAddProxy() public onlyOwner {
|
|
_PENDING_ADD_DODO_PROXY_ = address(0);
|
|
_TIMELOCK_ = 0;
|
|
}
|
|
|
|
|
|
function addDODOProxy() external onlyOwner notLocked() {
|
|
_IS_ALLOWED_PROXY_[_PENDING_ADD_DODO_PROXY_] = true;
|
|
lockAddProxy();
|
|
emit AddDODOProxy(_PENDING_ADD_DODO_PROXY_);
|
|
}
|
|
|
|
function removeDODOProxy (address oldDodoProxy) external onlyOwner {
|
|
_IS_ALLOWED_PROXY_[oldDodoProxy] = false;
|
|
emit RemoveDODOProxy(oldDodoProxy);
|
|
}
|
|
|
|
|
|
function claimERC721(
|
|
address nftContract,
|
|
address who,
|
|
address dest,
|
|
uint256 tokenId
|
|
) external {
|
|
require(_IS_ALLOWED_PROXY_[msg.sender], "DODONFTApprove:Access restricted");
|
|
IERC721(nftContract).safeTransferFrom(who, dest, tokenId);
|
|
}
|
|
|
|
function claimERC1155(
|
|
address nftContract,
|
|
address who,
|
|
address dest,
|
|
uint256 tokenId,
|
|
uint256 amount
|
|
) external {
|
|
require(_IS_ALLOWED_PROXY_[msg.sender], "DODONFTApprove:Access restricted");
|
|
IERC1155(nftContract).safeTransferFrom(who, dest, tokenId, amount, "");
|
|
}
|
|
|
|
function claimERC1155Batch(
|
|
address nftContract,
|
|
address who,
|
|
address dest,
|
|
uint256[] memory tokenIds,
|
|
uint256[] memory amounts
|
|
) external {
|
|
require(_IS_ALLOWED_PROXY_[msg.sender], "DODONFTApprove:Access restricted");
|
|
IERC1155(nftContract).safeBatchTransferFrom(who, dest, tokenIds, amounts, "");
|
|
}
|
|
|
|
function isAllowedProxy(address _proxy) external view returns (bool) {
|
|
return _IS_ALLOWED_PROXY_[_proxy];
|
|
}
|
|
}
|