mirror of
https://github.com/stronk-dev/RandomChad.git
synced 2025-07-05 18:35:10 +02:00
100 lines
3.1 KiB
Solidity
100 lines
3.1 KiB
Solidity
// SPDX-License-Identifier: MIT
|
|
|
|
pragma solidity ^0.8.0;
|
|
|
|
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
|
|
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
|
|
import "@openzeppelin/contracts/access/Ownable.sol";
|
|
import "@openzeppelin/contracts/utils/math/SafeMath.sol";
|
|
import "@openzeppelin/contracts/utils/Strings.sol";
|
|
|
|
import "./common/meta-transactions/ContentMixin.sol";
|
|
import "./common/meta-transactions/NativeMetaTransaction.sol";
|
|
|
|
contract OwnableDelegateProxy {}
|
|
|
|
contract ProxyRegistry {
|
|
mapping(address => OwnableDelegateProxy) public proxies;
|
|
}
|
|
|
|
/**
|
|
* @title ERC721Tradable
|
|
* ERC721Tradable - ERC721 contract that whitelists a trading address, and has minting functionality.
|
|
* @dev I added the _getCurrentTokenId manually, the rest of the contract is verbatim from https://github.com/ProjectOpenSea/opensea-creatures/blob/master/contracts/ERC721Tradable.sol
|
|
*/
|
|
abstract contract ERC721Tradable is ContextMixin, ERC721Enumerable, NativeMetaTransaction, Ownable {
|
|
using SafeMath for uint256;
|
|
|
|
address proxyRegistryAddress;
|
|
uint256 private _currentTokenId = 0;
|
|
|
|
constructor(
|
|
string memory _name,
|
|
string memory _symbol,
|
|
address _proxyRegistryAddress
|
|
) ERC721(_name, _symbol) {
|
|
proxyRegistryAddress = _proxyRegistryAddress;
|
|
_initializeEIP712(_name);
|
|
}
|
|
|
|
/**
|
|
* @dev Mints a token to an address with a tokenURI.
|
|
* @param _to address of the future owner of the token
|
|
*/
|
|
function mintTo(address _to) internal {
|
|
uint256 newTokenId = _getNextTokenId();
|
|
_mint(_to, newTokenId);
|
|
_incrementTokenId();
|
|
}
|
|
|
|
/**
|
|
* @dev calculates the next token ID based on value of _currentTokenId
|
|
* @return uint256 for the next token ID
|
|
*/
|
|
function _getNextTokenId() internal view returns (uint256) {
|
|
return _currentTokenId.add(1);
|
|
}
|
|
|
|
/**
|
|
* @dev increments the value of _currentTokenId
|
|
*/
|
|
function _incrementTokenId() private {
|
|
_currentTokenId++;
|
|
}
|
|
|
|
function baseTokenURI() virtual public pure returns (string memory);
|
|
|
|
function tokenURI(uint256 _tokenId) override public pure returns (string memory) {
|
|
return string(abi.encodePacked(baseTokenURI(), Strings.toString(_tokenId)));
|
|
}
|
|
|
|
/**
|
|
* Override isApprovedForAll to whitelist user's OpenSea proxy accounts to enable gas-less listings.
|
|
*/
|
|
function isApprovedForAll(address owner, address operator)
|
|
override
|
|
public
|
|
view
|
|
returns (bool)
|
|
{
|
|
// Whitelist OpenSea proxy contract for easy trading.
|
|
ProxyRegistry proxyRegistry = ProxyRegistry(proxyRegistryAddress);
|
|
if (address(proxyRegistry.proxies(owner)) == operator) {
|
|
return true;
|
|
}
|
|
|
|
return super.isApprovedForAll(owner, operator);
|
|
}
|
|
|
|
/**
|
|
* This is used instead of msg.sender as transactions won't be sent by the original token owner, but by OpenSea.
|
|
*/
|
|
function _msgSender()
|
|
internal
|
|
override
|
|
view
|
|
returns (address sender)
|
|
{
|
|
return ContextMixin.msgSender();
|
|
}
|
|
} |