Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- OmnipotentReserveBond
- Optimization enabled
- true
- Compiler version
- v0.8.26+commit.8a97fa7a
- Optimization runs
- 200
- EVM Version
- paris
- Verified at
- 2025-08-18T08:39:00.808060Z
Constructor Arguments
0x0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000174f6d6e69706f74656e74205265736572766520426f6e6400000000000000000000000000000000000000000000000000000000000000000000000000000000034f52420000000000000000000000000000000000000000000000000000000000
Arg [0] (string) : Omnipotent Reserve Bond
Arg [1] (string) : ORB
contracts/src/OmnipotentReserveBond.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.26;
import {Context} from "../lib/openzeppelin-contracts/contracts/utils/Context.sol";
import {Ownable} from "../lib/openzeppelin-contracts/contracts/access/Ownable.sol";
import {IERC721} from "../lib/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol";
import {IERC721Metadata} from "../lib/openzeppelin-contracts/contracts/token/ERC721/extensions/IERC721Metadata.sol";
import {IERC165} from "../lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol";
import {IERC721Receiver} from "../lib/openzeppelin-contracts/contracts/token/ERC721/IERC721Receiver.sol";
interface IPositionMetadataRenderer {
function tokenURI(uint256 tokenId) external view returns (string memory);
}
interface IERC4906 {
/// @dev This event emits when the metadata of a token is changed.
event MetadataUpdate(uint256 _tokenId);
/// @dev This event emits when the metadata of a range of tokens is changed.
event BatchMetadataUpdate(uint256 _fromTokenId, uint256 _toTokenId);
}
/**
* @title OmnipotentReserveBond
* @notice Minimal ERC721 used to represent encapsulated positions; a designated
* minter (the UnityEncapsulator contract) can mint/burn tokens.
*/
contract OmnipotentReserveBond is Ownable, IERC721, IERC721Metadata, IERC4906 {
uint256 private _totalSupply;
address public minter; // UnityEncapsulator
string private _name;
string private _symbol;
string private _baseURI;
address public metadataRenderer;
mapping(uint256 => address) private _owners;
mapping(address => uint256) private _balances;
mapping(uint256 => address) private _tokenApprovals;
mapping(address => mapping(address => bool)) private _operatorApprovals;
error NotMinter();
event MetadataRendererSet(address indexed renderer);
event BaseURISet(string newBaseURI);
event MinterUpdated(address indexed newMinter);
constructor(string memory name_, string memory symbol_) Ownable(_msgSender()) {
_name = name_;
_symbol = symbol_;
}
modifier onlyMinter() {
if (_msgSender() != minter) revert NotMinter();
_;
}
function setMinter(address _minter) external onlyOwner {
minter = _minter;
emit MinterUpdated(_minter);
}
function mint(address to, uint256 tokenId) external onlyMinter {
_mint(to, tokenId);
}
function burnByMinter(uint256 tokenId) external onlyMinter {
_burn(tokenId);
}
/* ================= ERC721 Minimal ================= */
function supportsInterface(bytes4 interfaceId) public pure override returns (bool) {
return interfaceId == type(IERC165).interfaceId ||
interfaceId == type(IERC721).interfaceId ||
interfaceId == type(IERC721Metadata).interfaceId ||
interfaceId == type(IERC4906).interfaceId;
}
function name() external view override returns (string memory) { return _name; }
function symbol() external view override returns (string memory) { return _symbol; }
function totalSupply() external view returns (uint256) { return _totalSupply; }
function tokenURI(uint256 tokenId) external view override returns (string memory) {
address owner = _owners[tokenId];
require(owner != address(0), "nonexistent");
if (metadataRenderer != address(0)) {
return IPositionMetadataRenderer(metadataRenderer).tokenURI(tokenId);
}
if (bytes(_baseURI).length == 0) return "";
return string(abi.encodePacked(_baseURI, _toString(tokenId), ".json"));
}
function balanceOf(address owner) public view override returns (uint256) { return _balances[owner]; }
function ownerOf(uint256 tokenId) public view override returns (address) {
address owner = _owners[tokenId];
require(owner != address(0), "nonexistent");
return owner;
}
function approve(address to, uint256 tokenId) public override {
address owner = ownerOf(tokenId);
require(to != owner, "approve to owner");
require(_msgSender() == owner || isApprovedForAll(owner, _msgSender()), "not approved");
_approve(to, tokenId);
}
function getApproved(uint256 tokenId) public view override returns (address) { return _tokenApprovals[tokenId]; }
function setApprovalForAll(address operator, bool approved) public override {
_operatorApprovals[_msgSender()][operator] = approved;
emit ApprovalForAll(_msgSender(), operator, approved);
}
function isApprovedForAll(address owner, address operator) public view override returns (bool) {
return _operatorApprovals[owner][operator];
}
function transferFrom(address from, address to, uint256 tokenId) public override {
require(_isApprovedOrOwner(_msgSender(), tokenId), "not approved");
_transfer(from, to, tokenId);
}
function safeTransferFrom(address from, address to, uint256 tokenId) external override {
safeTransferFrom(from, to, tokenId, "");
}
function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public override {
require(_isApprovedOrOwner(_msgSender(), tokenId), "not approved");
_safeTransfer(from, to, tokenId, data);
}
function _mint(address to, uint256 tokenId) internal {
require(to != address(0), "mint zero");
require(_owners[tokenId] == address(0), "exists");
_balances[to] += 1;
_owners[tokenId] = to;
_totalSupply += 1;
emit Transfer(address(0), to, tokenId);
}
function _burn(uint256 tokenId) internal {
address owner = ownerOf(tokenId);
_approve(address(0), tokenId);
_balances[owner] -= 1;
delete _owners[tokenId];
_totalSupply -= 1;
emit Transfer(owner, address(0), tokenId);
}
function _transfer(address from, address to, uint256 tokenId) internal {
require(ownerOf(tokenId) == from, "not owner");
require(to != address(0), "zero");
_approve(address(0), tokenId);
_balances[from] -= 1;
_balances[to] += 1;
_owners[tokenId] = to;
emit Transfer(from, to, tokenId);
}
function _safeTransfer(address from, address to, uint256 tokenId, bytes memory data) internal {
_transfer(from, to, tokenId);
require(_checkOnERC721Received(from, to, tokenId, data), "unsafe receiver");
}
function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory data) private returns (bool) {
if (to.code.length == 0) return true; // EOA
try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {
return retval == IERC721Receiver.onERC721Received.selector;
} catch (bytes memory) {
return false;
}
}
function _approve(address to, uint256 tokenId) internal {
_tokenApprovals[tokenId] = to;
emit Approval(ownerOf(tokenId), to, tokenId);
}
function _isApprovedOrOwner(address spender, uint256 tokenId) internal view returns (bool) {
address owner = ownerOf(tokenId);
return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
}
function baseURI() external view returns (string memory) {
return _baseURI;
}
function _toString(uint256 v) private pure returns (string memory) {
if (v == 0) return "0";
uint256 len; uint256 tmp = v;
while (tmp != 0) { len++; tmp /= 10; }
bytes memory buf = new bytes(len);
while (v != 0) {
len--;
buf[len] = bytes1(uint8(48 + v % 10));
v /= 10;
}
return string(buf);
}
function setBaseURI(string calldata newBase) external onlyOwner {
_baseURI = newBase;
emit BaseURISet(newBase);
}
function setMetadataRenderer(address renderer) external onlyOwner {
metadataRenderer = renderer;
emit MetadataRendererSet(renderer);
}
/**
* @notice Emit EIP-4906 MetadataUpdate for a single token so marketplaces re-fetch off-chain JSON/SVG.
* @dev Callable by owner (could be extended to anyone if desired – gas is minimal).
*/
function refreshMetadata(uint256 tokenId) external onlyOwner {
require(_owners[tokenId] != address(0), "nonexistent");
emit MetadataUpdate(tokenId);
}
/**
* @notice Batch refresh (inclusive range) – use sparingly.
*/
function refreshMetadataRange(uint256 fromTokenId, uint256 toTokenId) external onlyOwner {
require(toTokenId >= fromTokenId, "range");
emit BatchMetadataUpdate(fromTokenId, toTokenId);
}
}
contracts/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/extensions/IERC721Metadata.sol)
pragma solidity ^0.8.20;
import {IERC721} from "../IERC721.sol";
/**
* @title ERC-721 Non-Fungible Token Standard, optional metadata extension
* @dev See https://eips.ethereum.org/EIPS/eip-721
*/
interface IERC721Metadata is IERC721 {
/**
* @dev Returns the token collection name.
*/
function name() external view returns (string memory);
/**
* @dev Returns the token collection symbol.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
*/
function tokenURI(uint256 tokenId) external view returns (string memory);
}
contracts/lib/openzeppelin-contracts/contracts/token/ERC721/IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC721/IERC721Receiver.sol)
pragma solidity >=0.5.0;
/**
* @title ERC-721 token receiver interface
* @dev Interface for any contract that wants to support safeTransfers
* from ERC-721 asset contracts.
*/
interface IERC721Receiver {
/**
* @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
* by `operator` from `from`, this function is called.
*
* It must return its Solidity selector to confirm the token transfer.
* If any other value is returned or the interface is not implemented by the recipient, the transfer will be
* reverted.
*
* The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
*/
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
}
contracts/lib/openzeppelin-contracts/contracts/access/Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)
pragma solidity ^0.8.20;
import {Context} from "../utils/Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* The initial owner is set to the address provided by the deployer. This can
* later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
/**
* @dev The caller account is not authorized to perform an operation.
*/
error OwnableUnauthorizedAccount(address account);
/**
* @dev The owner is not a valid owner account. (eg. `address(0)`)
*/
error OwnableInvalidOwner(address owner);
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the address provided by the deployer as the initial owner.
*/
constructor(address initialOwner) {
if (initialOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(initialOwner);
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
if (owner() != _msgSender()) {
revert OwnableUnauthorizedAccount(_msgSender());
}
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
if (newOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
contracts/lib/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/IERC721.sol)
pragma solidity ^0.8.20;
import {IERC165} from "../../utils/introspection/IERC165.sol";
/**
* @dev Required interface of an ERC721 compliant contract.
*/
interface IERC721 is IERC165 {
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
*/
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/**
* @dev Returns the number of tokens in ``owner``'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon
* a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must have been allowed to move this token by either {approve} or
* {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon
* a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(address from, address to, uint256 tokenId) external;
/**
* @dev Transfers `tokenId` token from `from` to `to`.
*
* WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
* or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
* understand this adds an external call which potentially creates a reentrancy vulnerability.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 tokenId) external;
/**
* @dev Gives permission to `to` to transfer `tokenId` token to another account.
* The approval is cleared when the token is transferred.
*
* Only a single account can be approved at a time, so approving the zero address clears previous approvals.
*
* Requirements:
*
* - The caller must own the token or be an approved operator.
* - `tokenId` must exist.
*
* Emits an {Approval} event.
*/
function approve(address to, uint256 tokenId) external;
/**
* @dev Approve or remove `operator` as an operator for the caller.
* Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
*
* Requirements:
*
* - The `operator` cannot be the address zero.
*
* Emits an {ApprovalForAll} event.
*/
function setApprovalForAll(address operator, bool approved) external;
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}
*/
function isApprovedForAll(address owner, address operator) external view returns (bool);
}
contracts/lib/openzeppelin-contracts/contracts/utils/Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)
pragma solidity ^0.8.20;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}
contracts/lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol)
pragma solidity ^0.8.20;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
Compiler Settings
{"viaIR":true,"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"],"":["ast"]}},"optimizer":{"runs":200,"enabled":true},"libraries":{},"evmVersion":"paris"}
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"string","name":"name_","internalType":"string"},{"type":"string","name":"symbol_","internalType":"string"}]},{"type":"error","name":"NotMinter","inputs":[]},{"type":"error","name":"OwnableInvalidOwner","inputs":[{"type":"address","name":"owner","internalType":"address"}]},{"type":"error","name":"OwnableUnauthorizedAccount","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"approved","internalType":"address","indexed":true},{"type":"uint256","name":"tokenId","internalType":"uint256","indexed":true}],"anonymous":false},{"type":"event","name":"ApprovalForAll","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"operator","internalType":"address","indexed":true},{"type":"bool","name":"approved","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"BaseURISet","inputs":[{"type":"string","name":"newBaseURI","internalType":"string","indexed":false}],"anonymous":false},{"type":"event","name":"BatchMetadataUpdate","inputs":[{"type":"uint256","name":"_fromTokenId","internalType":"uint256","indexed":false},{"type":"uint256","name":"_toTokenId","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"MetadataRendererSet","inputs":[{"type":"address","name":"renderer","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"MetadataUpdate","inputs":[{"type":"uint256","name":"_tokenId","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"MinterUpdated","inputs":[{"type":"address","name":"newMinter","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"tokenId","internalType":"uint256","indexed":true}],"anonymous":false},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"approve","inputs":[{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"owner","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"baseURI","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"burnByMinter","inputs":[{"type":"uint256","name":"tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getApproved","inputs":[{"type":"uint256","name":"tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isApprovedForAll","inputs":[{"type":"address","name":"owner","internalType":"address"},{"type":"address","name":"operator","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"metadataRenderer","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"mint","inputs":[{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"minter","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"ownerOf","inputs":[{"type":"uint256","name":"tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"refreshMetadata","inputs":[{"type":"uint256","name":"tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"refreshMetadataRange","inputs":[{"type":"uint256","name":"fromTokenId","internalType":"uint256"},{"type":"uint256","name":"toTokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"safeTransferFrom","inputs":[{"type":"address","name":"from","internalType":"address"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"safeTransferFrom","inputs":[{"type":"address","name":"from","internalType":"address"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"tokenId","internalType":"uint256"},{"type":"bytes","name":"data","internalType":"bytes"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setApprovalForAll","inputs":[{"type":"address","name":"operator","internalType":"address"},{"type":"bool","name":"approved","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setBaseURI","inputs":[{"type":"string","name":"newBase","internalType":"string"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMetadataRenderer","inputs":[{"type":"address","name":"renderer","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMinter","inputs":[{"type":"address","name":"_minter","internalType":"address"}]},{"type":"function","stateMutability":"pure","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"supportsInterface","inputs":[{"type":"bytes4","name":"interfaceId","internalType":"bytes4"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"tokenURI","inputs":[{"type":"uint256","name":"tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferFrom","inputs":[{"type":"address","name":"from","internalType":"address"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]}]
Contract Creation Code
0x60806040523461038557611b50803803806100198161038a565b9283398101906040818303126103855780516001600160401b03811161038557826100459183016103af565b60208201519092906001600160401b0381116103855761006592016103af565b331561036f5760008054336001600160a01b0319821681178355916001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a381516001600160401b03811161027a57600354600181811c91168015610365575b602082101461025a57601f8111610300575b50602092601f821160011461029b5792819293600092610290575b50508160011b916000199060031b1c1916176003555b80516001600160401b03811161027a57600454600181811c91168015610270575b602082101461025a57601f81116101f5575b50602091601f821160011461019157918192600092610186575b50508160011b916000199060031b1c1916176004555b604051611735908161041b8239f35b015190503880610161565b601f198216926004600052806000209160005b8581106101dd575083600195106101c4575b505050811b01600455610177565b015160001960f88460031b161c191690553880806101b6565b919260206001819286850151815501940192016101a4565b60046000527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b601f830160051c81019160208410610250575b601f0160051c01905b8181106102445750610147565b60008155600101610237565b909150819061022e565b634e487b7160e01b600052602260045260246000fd5b90607f1690610135565b634e487b7160e01b600052604160045260246000fd5b0151905038806100fe565b601f198216936003600052806000209160005b8681106102e857508360019596106102cf575b505050811b01600355610114565b015160001960f88460031b161c191690553880806102c1565b919260206001819286850151815501940192016102ae565b60036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b601f830160051c8101916020841061035b575b601f0160051c01905b81811061034f57506100e3565b60008155600101610342565b9091508190610339565b90607f16906100d1565b631e4fbdf760e01b600052600060045260246000fd5b600080fd5b6040519190601f01601f191682016001600160401b0381118382101761027a57604052565b81601f82011215610385578051906001600160401b03821161027a576103de601f8301601f191660200161038a565b92828452602083830101116103855760005b82811061040557505060206000918301015290565b806020809284010151828287010152016103f056fe608080604052600436101561001357600080fd5b60003560e01c90816301ffc9a714610e575750806306fdde0314610dae5780630754617214610d85578063081812fc14610d51578063095ea7b314610c3e57806318160ddd14610c2057806323b872dd14610bf757806340c10f1914610ac257806342842e0e14610a985780634d15e869146109b957806355f804b3146107b75780636352211e146107875780636c0360eb146106f057806370319970146106c757806370a082311461068d578063715018a6146106345780638da5cb5b1461060b57806395d89b411461053d57806396f817b4146104b8578063a22cb4651461042b578063b88d4fde146103a0578063c87b56dd14610369578063d95ba42f146102ff578063e985e9c5146102a4578063f2fde38b1461021b578063fca3b5aa146101b45763fd4fe8a81461014857600080fd5b346101af5760203660031901126101af57610161610f1a565b6101696114d5565b600680546001600160a01b0319166001600160a01b039290921691821790557faa56f403bb636768e9e1fec12c1968db814767675df6bc4a8c2488fc094c6a03600080a2005b600080fd5b346101af5760203660031901126101af576101cd610f1a565b6101d56114d5565b600280546001600160a01b0319166001600160a01b039290921691821790557fad0f299ec81a386c98df0ac27dae11dd020ed1b56963c53a7292e7a3a314539a600080a2005b346101af5760203660031901126101af57610234610f1a565b61023c6114d5565b6001600160a01b0316801561028e57600080546001600160a01b03198116831782556001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a3005b631e4fbdf760e01b600052600060045260246000fd5b346101af5760403660031901126101af576102bd610f1a565b6102c5610f30565b9060018060a01b0316600052600a60205260406000209060018060a01b0316600052602052602060ff604060002054166040519015158152f35b346101af5760203660031901126101af577ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7602060043561033e6114d5565b6000818152600783526040902054610360906001600160a01b03161515611049565b604051908152a1005b346101af5760203660031901126101af5761039c61038860043561110b565b604051918291602083526020830190610ef5565b0390f35b346101af5760803660031901126101af576103b9610f1a565b6103c1610f30565b6064359167ffffffffffffffff83116101af57366023840112156101af578260040135916103ee83610fb8565b926103fc6040519485610f80565b80845236602482870101116101af57602081600092602461042998018388013785010152604435916110a9565b005b346101af5760403660031901126101af57610444610f1a565b602435908115158092036101af5733600052600a602052604060002060018060a01b038216600052602052604060002060ff1981541660ff841617905560405191825260018060a01b0316907f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a3005b346101af5760403660031901126101af576004356024356104d76114d5565b818110610510577f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c9160409182519182526020820152a1005b60405162461bcd60e51b815260206004820152600560248201526472616e676560d81b6044820152606490fd5b346101af5760003660031901126101af57604051600060045461055f81610fd4565b80845290600181169081156105e75750600114610587575b61039c8361038881850382610f80565b91905060046000527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b916000905b8082106105cd57509091508101602001610388610577565b9192600181602092548385880101520191019092916105b5565b60ff191660208086019190915291151560051b840190910191506103889050610577565b346101af5760003660031901126101af576000546040516001600160a01b039091168152602090f35b346101af5760003660031901126101af5761064d6114d5565b600080546001600160a01b0319811682556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346101af5760203660031901126101af576001600160a01b036106ae610f1a565b1660005260086020526020604060002054604051908152f35b346101af5760003660031901126101af576006546040516001600160a01b039091168152602090f35b346101af5760003660031901126101af57604051600060055461071281610fd4565b80845290600181169081156105e757506001146107395761039c8361038881850382610f80565b91905060056000526000805160206116e0833981519152916000905b80821061076d57509091508101602001610388610577565b919260018160209254838588010152019101909291610755565b346101af5760203660031901126101af5760206107a5600435611083565b6040516001600160a01b039091168152f35b346101af5760203660031901126101af5760043567ffffffffffffffff81116101af57366023820112156101af5780600401359067ffffffffffffffff82116101af5736602483830101116101af5761080e6114d5565b60009061081c600554610fd4565b601f811161094e575b508192601f81116001146108b3576024918160409285967ff9c7803e94e0d3c02900d8a90893a6d5e90dd04d32a4cfe825520f82bf9f32f696916108a6575b508160011b906000198360031b1c1916176005555b8083519485936020855282602086015201848401378181018301869052601f01601f19168101030190a180f35b8591508301013587610864565b600583526000805160206116e0833981519152601f198216845b818110610933575091602493917ff9c7803e94e0d3c02900d8a90893a6d5e90dd04d32a4cfe825520f82bf9f32f695968260409510610917575b5050600181811b01600555610879565b8301850135600019600384901b60f8161c191690558680610907565b848701602401358355602096870196600190930192016108cd565b60058352601f840160051c6000805160206116e08339815191520190602085106109a3575b601f0160051c6000805160206116e083398151915201905b8181106109985750610825565b83815560010161098b565b6000805160206116e08339815191529150610973565b346101af5760203660031901126101af57600254600435906001600160a01b03163303610a87576109e981611083565b6109f2826112f5565b6001600160a01b031660008181526008602052604090208054600019810191908211610a715755600082815260076020526040902080546001600160a01b0319169055600154600019810191908211610a71576000916001557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a4005b634e487b7160e01b600052601160045260246000fd5b633e34a41b60e21b60005260046000fd5b346101af57610429610aa936610f46565b9060405192610ab9602085610f80565b600084526110a9565b346101af5760403660031901126101af57610adb610f1a565b60025460243591906001600160a01b03163303610a87576001600160a01b03168015610bc6576000828152600760205260409020546001600160a01b0316610b9857806000526008602052604060002080549060018201809211610a7157558160005260076020526040600020816bffffffffffffffffffffffff60a01b82541617905560015460018101809111610a715760015560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4005b60405162461bcd60e51b815260206004820152600660248201526565786973747360d01b6044820152606490fd5b60405162461bcd60e51b81526020600482015260096024820152686d696e74207a65726f60b81b6044820152606490fd5b346101af57610429610c0836610f46565b91610c1b610c168433611349565b61100e565b6113c3565b346101af5760003660031901126101af576020600154604051908152f35b346101af5760403660031901126101af57610c57610f1a565b602435906001600160a01b03610c6c83611083565b6001600160a01b039092169116818114610d19578033148015610ceb575b610c94915061100e565b600082815260096020526040902080546001600160a01b031916821790556001600160a01b03610cc383611083565b167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a4005b50600052600a602052604060002060018060a01b033316600052602052610c9460ff60406000205416610c8a565b60405162461bcd60e51b815260206004820152601060248201526f30b8383937bb32903a379037bbb732b960811b6044820152606490fd5b346101af5760203660031901126101af576004356000526009602052602060018060a01b0360406000205416604051908152f35b346101af5760003660031901126101af576002546040516001600160a01b039091168152602090f35b346101af5760003660031901126101af576040516000600354610dd081610fd4565b80845290600181169081156105e75750600114610df75761039c8361038881850382610f80565b91905060036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b916000905b808210610e3d57509091508101602001610388610577565b919260018160209254838588010152019101909291610e25565b346101af5760203660031901126101af576004359063ffffffff60e01b82168092036101af576020916301ffc9a760e01b8114908115610ec1575b8115610eb0575b8115610ea7575b5015158152f35b90501583610ea0565b635b5e139f60e01b81149150610e99565b6380ac58cd60e01b81149150610e92565b60005b838110610ee55750506000910152565b8181015183820152602001610ed5565b90602091610f0e81518092818552858086019101610ed2565b601f01601f1916010190565b600435906001600160a01b03821682036101af57565b602435906001600160a01b03821682036101af57565b60609060031901126101af576004356001600160a01b03811681036101af57906024356001600160a01b03811681036101af579060443590565b90601f8019910116810190811067ffffffffffffffff821117610fa257604052565b634e487b7160e01b600052604160045260246000fd5b67ffffffffffffffff8111610fa257601f01601f191660200190565b90600182811c92168015611004575b6020831014610fee57565b634e487b7160e01b600052602260045260246000fd5b91607f1691610fe3565b1561101557565b60405162461bcd60e51b815260206004820152600c60248201526b1b9bdd08185c1c1c9bdd995960a21b6044820152606490fd5b1561105057565b60405162461bcd60e51b815260206004820152600b60248201526a1b9bdb995e1a5cdd195b9d60aa1b6044820152606490fd5b6000908152600760205260409020546001600160a01b03166110a6811515611049565b90565b906110cd9392916110bd610c168433611349565b6110c88383836113c3565b6115dd565b156110d457565b60405162461bcd60e51b815260206004820152600f60248201526e3ab739b0b332903932b1b2b4bb32b960891b6044820152606490fd5b60008181526007602052604090205461112e906001600160a01b03161515611049565b6006546001600160a01b03168061123957506005549061114d82610fd4565b156112225761115b906114fe565b604051809260009061116c81610fd4565b906001811690811561120257506001146111b6575b509060208261119b856005956110a6975194859201610ed2565b0164173539b7b760d91b815203601a19810184520182610f80565b905060056000526000805160206116e08339815191526000905b8282106111e65750508101602090810190611181565b60209192935080600191548385890101520191018492916111d0565b60ff19166020808601919091528215159092028401820192506111819050565b5050604051611232602082610f80565b6000815290565b9060009060246040518094819363c87b56dd60e01b835260048301525afa9081156112e957600091611269575090565b903d8082843e6112798184610f80565b8201916020818403126112e15780519067ffffffffffffffff82116112e5570182601f820112156112e1578051916112b083610fb8565b936112be6040519586610f80565b838552602084840101116112de5750906110a69160208085019101610ed2565b80fd5b5080fd5b8280fd5b6040513d6000823e3d90fd5b600081815260096020526040812080546001600160a01b03191690556001600160a01b0361132283611083565b167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258280a4565b6001600160a01b0361135a83611083565b6001600160a01b0390921691168181149283156113a1575b50821561137e57505090565b909150600052600a60205260406000209060005260205260ff6040600020541690565b6000908152600960205260409020546001600160a01b03168214925038611372565b906113cd83611083565b6001600160a01b0392831692168290036114a4576001600160a01b0316908115611479576113fa836112f5565b80600052600860205260406000208054906000198201918211610a715755816000526008602052604060002080549060018201809211610a715755600083815260076020526040812080546001600160a01b031916841790557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9080a4565b606460405162461bcd60e51b81526020600482015260046024820152637a65726f60e01b6044820152fd5b60405162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b6044820152606490fd5b6000546001600160a01b031633036114e957565b63118cdaa760e01b6000523360045260246000fd5b80156115bd57600081805b6115a5575061151781610fb8565b906115256040519283610f80565b808252601f1961153482610fb8565b013660208401375b80831561159e578015610a71576000190192600a81066030019182603011610a7157835185101561158857600a9260f81b6001600160f81b03191660001a908401601f0153049161153c565b634e487b7160e01b600052603260045260246000fd5b5050905090565b906000198114610a71576001600a9101910480611509565b506040516115cc604082610f80565b60018152600360fc1b602082015290565b919290803b156116d65761162d93600060209460405196879586948593630a85bd0160e11b855233600486015260018060a01b031660248501526044840152608060648401526084830190610ef5565b03926001600160a01b03165af18091600091611693575b509061167d57503d15611678573d61165b81610fb8565b906116696040519283610f80565b8152600060203d92013e600090565b600090565b6001600160e01b031916630a85bd0160e11b1490565b6020813d6020116116ce575b816116ac60209383610f80565b810103126112e15751906001600160e01b0319821682036112de575038611644565b3d915061169f565b5050505060019056fe036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0a2646970667358221220086aa88da664eab9bb77bc3a38dea053906c471c65bd33a604e30a5b5f4f979b64736f6c634300081a00330000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000174f6d6e69706f74656e74205265736572766520426f6e6400000000000000000000000000000000000000000000000000000000000000000000000000000000034f52420000000000000000000000000000000000000000000000000000000000
Deployed ByteCode
0x608080604052600436101561001357600080fd5b60003560e01c90816301ffc9a714610e575750806306fdde0314610dae5780630754617214610d85578063081812fc14610d51578063095ea7b314610c3e57806318160ddd14610c2057806323b872dd14610bf757806340c10f1914610ac257806342842e0e14610a985780634d15e869146109b957806355f804b3146107b75780636352211e146107875780636c0360eb146106f057806370319970146106c757806370a082311461068d578063715018a6146106345780638da5cb5b1461060b57806395d89b411461053d57806396f817b4146104b8578063a22cb4651461042b578063b88d4fde146103a0578063c87b56dd14610369578063d95ba42f146102ff578063e985e9c5146102a4578063f2fde38b1461021b578063fca3b5aa146101b45763fd4fe8a81461014857600080fd5b346101af5760203660031901126101af57610161610f1a565b6101696114d5565b600680546001600160a01b0319166001600160a01b039290921691821790557faa56f403bb636768e9e1fec12c1968db814767675df6bc4a8c2488fc094c6a03600080a2005b600080fd5b346101af5760203660031901126101af576101cd610f1a565b6101d56114d5565b600280546001600160a01b0319166001600160a01b039290921691821790557fad0f299ec81a386c98df0ac27dae11dd020ed1b56963c53a7292e7a3a314539a600080a2005b346101af5760203660031901126101af57610234610f1a565b61023c6114d5565b6001600160a01b0316801561028e57600080546001600160a01b03198116831782556001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a3005b631e4fbdf760e01b600052600060045260246000fd5b346101af5760403660031901126101af576102bd610f1a565b6102c5610f30565b9060018060a01b0316600052600a60205260406000209060018060a01b0316600052602052602060ff604060002054166040519015158152f35b346101af5760203660031901126101af577ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7602060043561033e6114d5565b6000818152600783526040902054610360906001600160a01b03161515611049565b604051908152a1005b346101af5760203660031901126101af5761039c61038860043561110b565b604051918291602083526020830190610ef5565b0390f35b346101af5760803660031901126101af576103b9610f1a565b6103c1610f30565b6064359167ffffffffffffffff83116101af57366023840112156101af578260040135916103ee83610fb8565b926103fc6040519485610f80565b80845236602482870101116101af57602081600092602461042998018388013785010152604435916110a9565b005b346101af5760403660031901126101af57610444610f1a565b602435908115158092036101af5733600052600a602052604060002060018060a01b038216600052602052604060002060ff1981541660ff841617905560405191825260018060a01b0316907f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a3005b346101af5760403660031901126101af576004356024356104d76114d5565b818110610510577f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c9160409182519182526020820152a1005b60405162461bcd60e51b815260206004820152600560248201526472616e676560d81b6044820152606490fd5b346101af5760003660031901126101af57604051600060045461055f81610fd4565b80845290600181169081156105e75750600114610587575b61039c8361038881850382610f80565b91905060046000527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b916000905b8082106105cd57509091508101602001610388610577565b9192600181602092548385880101520191019092916105b5565b60ff191660208086019190915291151560051b840190910191506103889050610577565b346101af5760003660031901126101af576000546040516001600160a01b039091168152602090f35b346101af5760003660031901126101af5761064d6114d5565b600080546001600160a01b0319811682556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346101af5760203660031901126101af576001600160a01b036106ae610f1a565b1660005260086020526020604060002054604051908152f35b346101af5760003660031901126101af576006546040516001600160a01b039091168152602090f35b346101af5760003660031901126101af57604051600060055461071281610fd4565b80845290600181169081156105e757506001146107395761039c8361038881850382610f80565b91905060056000526000805160206116e0833981519152916000905b80821061076d57509091508101602001610388610577565b919260018160209254838588010152019101909291610755565b346101af5760203660031901126101af5760206107a5600435611083565b6040516001600160a01b039091168152f35b346101af5760203660031901126101af5760043567ffffffffffffffff81116101af57366023820112156101af5780600401359067ffffffffffffffff82116101af5736602483830101116101af5761080e6114d5565b60009061081c600554610fd4565b601f811161094e575b508192601f81116001146108b3576024918160409285967ff9c7803e94e0d3c02900d8a90893a6d5e90dd04d32a4cfe825520f82bf9f32f696916108a6575b508160011b906000198360031b1c1916176005555b8083519485936020855282602086015201848401378181018301869052601f01601f19168101030190a180f35b8591508301013587610864565b600583526000805160206116e0833981519152601f198216845b818110610933575091602493917ff9c7803e94e0d3c02900d8a90893a6d5e90dd04d32a4cfe825520f82bf9f32f695968260409510610917575b5050600181811b01600555610879565b8301850135600019600384901b60f8161c191690558680610907565b848701602401358355602096870196600190930192016108cd565b60058352601f840160051c6000805160206116e08339815191520190602085106109a3575b601f0160051c6000805160206116e083398151915201905b8181106109985750610825565b83815560010161098b565b6000805160206116e08339815191529150610973565b346101af5760203660031901126101af57600254600435906001600160a01b03163303610a87576109e981611083565b6109f2826112f5565b6001600160a01b031660008181526008602052604090208054600019810191908211610a715755600082815260076020526040902080546001600160a01b0319169055600154600019810191908211610a71576000916001557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8280a4005b634e487b7160e01b600052601160045260246000fd5b633e34a41b60e21b60005260046000fd5b346101af57610429610aa936610f46565b9060405192610ab9602085610f80565b600084526110a9565b346101af5760403660031901126101af57610adb610f1a565b60025460243591906001600160a01b03163303610a87576001600160a01b03168015610bc6576000828152600760205260409020546001600160a01b0316610b9857806000526008602052604060002080549060018201809211610a7157558160005260076020526040600020816bffffffffffffffffffffffff60a01b82541617905560015460018101809111610a715760015560007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4005b60405162461bcd60e51b815260206004820152600660248201526565786973747360d01b6044820152606490fd5b60405162461bcd60e51b81526020600482015260096024820152686d696e74207a65726f60b81b6044820152606490fd5b346101af57610429610c0836610f46565b91610c1b610c168433611349565b61100e565b6113c3565b346101af5760003660031901126101af576020600154604051908152f35b346101af5760403660031901126101af57610c57610f1a565b602435906001600160a01b03610c6c83611083565b6001600160a01b039092169116818114610d19578033148015610ceb575b610c94915061100e565b600082815260096020526040902080546001600160a01b031916821790556001600160a01b03610cc383611083565b167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a4005b50600052600a602052604060002060018060a01b033316600052602052610c9460ff60406000205416610c8a565b60405162461bcd60e51b815260206004820152601060248201526f30b8383937bb32903a379037bbb732b960811b6044820152606490fd5b346101af5760203660031901126101af576004356000526009602052602060018060a01b0360406000205416604051908152f35b346101af5760003660031901126101af576002546040516001600160a01b039091168152602090f35b346101af5760003660031901126101af576040516000600354610dd081610fd4565b80845290600181169081156105e75750600114610df75761039c8361038881850382610f80565b91905060036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b916000905b808210610e3d57509091508101602001610388610577565b919260018160209254838588010152019101909291610e25565b346101af5760203660031901126101af576004359063ffffffff60e01b82168092036101af576020916301ffc9a760e01b8114908115610ec1575b8115610eb0575b8115610ea7575b5015158152f35b90501583610ea0565b635b5e139f60e01b81149150610e99565b6380ac58cd60e01b81149150610e92565b60005b838110610ee55750506000910152565b8181015183820152602001610ed5565b90602091610f0e81518092818552858086019101610ed2565b601f01601f1916010190565b600435906001600160a01b03821682036101af57565b602435906001600160a01b03821682036101af57565b60609060031901126101af576004356001600160a01b03811681036101af57906024356001600160a01b03811681036101af579060443590565b90601f8019910116810190811067ffffffffffffffff821117610fa257604052565b634e487b7160e01b600052604160045260246000fd5b67ffffffffffffffff8111610fa257601f01601f191660200190565b90600182811c92168015611004575b6020831014610fee57565b634e487b7160e01b600052602260045260246000fd5b91607f1691610fe3565b1561101557565b60405162461bcd60e51b815260206004820152600c60248201526b1b9bdd08185c1c1c9bdd995960a21b6044820152606490fd5b1561105057565b60405162461bcd60e51b815260206004820152600b60248201526a1b9bdb995e1a5cdd195b9d60aa1b6044820152606490fd5b6000908152600760205260409020546001600160a01b03166110a6811515611049565b90565b906110cd9392916110bd610c168433611349565b6110c88383836113c3565b6115dd565b156110d457565b60405162461bcd60e51b815260206004820152600f60248201526e3ab739b0b332903932b1b2b4bb32b960891b6044820152606490fd5b60008181526007602052604090205461112e906001600160a01b03161515611049565b6006546001600160a01b03168061123957506005549061114d82610fd4565b156112225761115b906114fe565b604051809260009061116c81610fd4565b906001811690811561120257506001146111b6575b509060208261119b856005956110a6975194859201610ed2565b0164173539b7b760d91b815203601a19810184520182610f80565b905060056000526000805160206116e08339815191526000905b8282106111e65750508101602090810190611181565b60209192935080600191548385890101520191018492916111d0565b60ff19166020808601919091528215159092028401820192506111819050565b5050604051611232602082610f80565b6000815290565b9060009060246040518094819363c87b56dd60e01b835260048301525afa9081156112e957600091611269575090565b903d8082843e6112798184610f80565b8201916020818403126112e15780519067ffffffffffffffff82116112e5570182601f820112156112e1578051916112b083610fb8565b936112be6040519586610f80565b838552602084840101116112de5750906110a69160208085019101610ed2565b80fd5b5080fd5b8280fd5b6040513d6000823e3d90fd5b600081815260096020526040812080546001600160a01b03191690556001600160a01b0361132283611083565b167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258280a4565b6001600160a01b0361135a83611083565b6001600160a01b0390921691168181149283156113a1575b50821561137e57505090565b909150600052600a60205260406000209060005260205260ff6040600020541690565b6000908152600960205260409020546001600160a01b03168214925038611372565b906113cd83611083565b6001600160a01b0392831692168290036114a4576001600160a01b0316908115611479576113fa836112f5565b80600052600860205260406000208054906000198201918211610a715755816000526008602052604060002080549060018201809211610a715755600083815260076020526040812080546001600160a01b031916841790557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9080a4565b606460405162461bcd60e51b81526020600482015260046024820152637a65726f60e01b6044820152fd5b60405162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b6044820152606490fd5b6000546001600160a01b031633036114e957565b63118cdaa760e01b6000523360045260246000fd5b80156115bd57600081805b6115a5575061151781610fb8565b906115256040519283610f80565b808252601f1961153482610fb8565b013660208401375b80831561159e578015610a71576000190192600a81066030019182603011610a7157835185101561158857600a9260f81b6001600160f81b03191660001a908401601f0153049161153c565b634e487b7160e01b600052603260045260246000fd5b5050905090565b906000198114610a71576001600a9101910480611509565b506040516115cc604082610f80565b60018152600360fc1b602082015290565b919290803b156116d65761162d93600060209460405196879586948593630a85bd0160e11b855233600486015260018060a01b031660248501526044840152608060648401526084830190610ef5565b03926001600160a01b03165af18091600091611693575b509061167d57503d15611678573d61165b81610fb8565b906116696040519283610f80565b8152600060203d92013e600090565b600090565b6001600160e01b031916630a85bd0160e11b1490565b6020813d6020116116ce575b816116ac60209383610f80565b810103126112e15751906001600160e01b0319821682036112de575038611644565b3d915061169f565b5050505060019056fe036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0a2646970667358221220086aa88da664eab9bb77bc3a38dea053906c471c65bd33a604e30a5b5f4f979b64736f6c634300081a0033