ETH Price: $2,745.55 (+1.02%)

Token

VISOR (VISOR)
 

Overview

Max Total Supply

7,773 VISOR

Holders

6,305

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
grego.eth
Balance
1 VISOR
0x9c57027B1eca93093a6F446422C59C85A5A3Fa52
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.

Contract Source Code Verified (Exact Match)

Contract Name:
VisorFactory

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
Yes with 1000 runs

Other Settings:
default evmVersion
File 1 of 31 : VisorFactory.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: GPL-3.0-only
pragma solidity 0.7.6;
import {ERC721} from "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {IFactory} from "../factory/IFactory.sol";
import {IInstanceRegistry} from "../factory/InstanceRegistry.sol";
import {ProxyFactory} from "../factory/ProxyFactory.sol";
import {IUniversalVault} from "./Visor.sol";
/// @title VisorFactory
contract VisorFactory is Ownable, IFactory, IInstanceRegistry, ERC721 {
bytes32[] public names;
mapping(bytes32=>address) public templates;
bytes32 public activeTemplate;
mapping(address=>address[]) public userIndex;
event TemplateAdded(bytes32 indexed name, address indexed template);
event TemplateActive(bytes32 indexed name, address indexed template);
constructor() ERC721("VISOR", "VISOR") {}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 2 of 31 : ERC721.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
pragma solidity ^0.7.0;
import "../../utils/Context.sol";
import "./IERC721.sol";
import "./IERC721Metadata.sol";
import "./IERC721Enumerable.sol";
import "./IERC721Receiver.sol";
import "../../introspection/ERC165.sol";
import "../../math/SafeMath.sol";
import "../../utils/Address.sol";
import "../../utils/EnumerableSet.sol";
import "../../utils/EnumerableMap.sol";
import "../../utils/Strings.sol";
/**
* @title ERC721 Non-Fungible Token Standard basic implementation
* @dev see https://eips.ethereum.org/EIPS/eip-721
*/
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
using SafeMath for uint256;
using Address for address;
using EnumerableSet for EnumerableSet.UintSet;
using EnumerableMap for EnumerableMap.UintToAddressMap;
using Strings for uint256;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 3 of 31 : Ownable.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
pragma solidity ^0.7.0;
import "../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.
*
* By default, the owner account will be the one that deploys the contract. 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;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor () {
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 4 of 31 : IFactory.sol
1
2
3
4
5
6
7
8
// SPDX-License-Identifier: GPL-3.0-only
pragma solidity 0.7.6;
interface IFactory {
function create(bytes calldata args) external returns (address instance);
function create2(bytes calldata args, bytes32 salt) external returns (address instance);
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 5 of 31 : InstanceRegistry.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: GPL-3.0-only
pragma solidity 0.7.6;
import {EnumerableSet} from "@openzeppelin/contracts/utils/EnumerableSet.sol";
interface IInstanceRegistry {
/* events */
event InstanceAdded(address instance);
event InstanceRemoved(address instance);
/* view functions */
function isInstance(address instance) external view returns (bool validity);
function instanceCount() external view returns (uint256 count);
function instanceAt(uint256 index) external view returns (address instance);
}
/// @title InstanceRegistry
contract InstanceRegistry is IInstanceRegistry {
using EnumerableSet for EnumerableSet.AddressSet;
/* storage */
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 6 of 31 : ProxyFactory.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
pragma solidity 0.7.6;
import {Clones} from "@openzeppelin/contracts/proxy/Clones.sol";
library ProxyFactory {
/* functions */
function _create(address logic, bytes memory data) internal returns (address proxy) {
// deploy clone
proxy = Clones.clone(logic);
// attempt initialization
if (data.length > 0) {
(bool success, bytes memory err) = proxy.call(data);
require(success, string(err));
}
// explicit return
return proxy;
}
function _create2(
address logic,
bytes memory data,
bytes32 salt
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 7 of 31 : Visor.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: GPL-3.0-only
pragma solidity 0.7.6;
pragma abicoder v2;
import {SafeMath} from "@openzeppelin/contracts/math/SafeMath.sol";
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {Initializable} from "@openzeppelin/contracts/proxy/Initializable.sol";
import {EnumerableSet} from "@openzeppelin/contracts/utils/EnumerableSet.sol";
import {Address} from "@openzeppelin/contracts/utils/Address.sol";
import {TransferHelper} from "@uniswap/lib/contracts/libraries/TransferHelper.sol";
import {EIP712} from "./EIP712.sol";
import {ERC1271} from "./ERC1271.sol";
import {OwnableERC721} from "./OwnableERC721.sol";
import {IRageQuit} from "../hypervisor/Hypervisor.sol";
interface IUniversalVault {
/* user events */
event Locked(address delegate, address token, uint256 amount);
event Unlocked(address delegate, address token, uint256 amount);
event RageQuit(address delegate, address token, bool notified, string reason);
/* data types */
struct LockData {
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 8 of 31 : Context.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
/*
* @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 GSN 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 payable) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes memory) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 9 of 31 : IERC721.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
pragma solidity ^0.7.0;
import "../../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);
/**
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 10 of 31 : IERC721Metadata.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
pragma solidity ^0.7.0;
import "./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);
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 11 of 31 : IERC721Enumerable.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
pragma solidity ^0.7.0;
import "./IERC721.sol";
/**
* @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
* @dev See https://eips.ethereum.org/EIPS/eip-721
*/
interface IERC721Enumerable is IERC721 {
/**
* @dev Returns the total amount of tokens stored by the contract.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns a token ID owned by `owner` at a given `index` of its token list.
* Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
*/
function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);
/**
* @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
* Use along with {totalSupply} to enumerate all tokens.
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 12 of 31 : IERC721Receiver.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// SPDX-License-Identifier: MIT
pragma solidity ^0.7.0;
/**
* @title ERC721 token receiver interface
* @dev Interface for any contract that wants to support safeTransfers
* from ERC721 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 `IERC721.onERC721Received.selector`.
*/
function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 13 of 31 : ERC165.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
pragma solidity ^0.7.0;
import "./IERC165.sol";
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts may inherit from this and call {_registerInterface} to declare
* their support of an interface.
*/
abstract contract ERC165 is IERC165 {
/*
* bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7
*/
bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;
/**
* @dev Mapping of interface ids to whether or not it's supported.
*/
mapping(bytes4 => bool) private _supportedInterfaces;
constructor () {
// Derived contracts need only register support for their own interfaces,
// we register support for ERC165 itself here
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 14 of 31 : SafeMath.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
pragma solidity ^0.7.0;
/**
* @dev Wrappers over Solidity's arithmetic operations with added overflow
* checks.
*
* Arithmetic operations in Solidity wrap on overflow. This can easily result
* in bugs, because programmers usually assume that an overflow raises an
* error, which is the standard behavior in high level programming languages.
* `SafeMath` restores this intuition by reverting the transaction when an
* operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
uint256 c = a + b;
if (c < a) return (false, 0);
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 15 of 31 : Address.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
pragma solidity ^0.7.0;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*/
function isContract(address account) internal view returns (bool) {
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 16 of 31 : EnumerableSet.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
pragma solidity ^0.7.0;
/**
* @dev Library for managing
* https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
* types.
*
* Sets have the following properties:
*
* - Elements are added, removed, and checked for existence in constant time
* (O(1)).
* - Elements are enumerated in O(n). No guarantees are made on the ordering.
*
* ```
* contract Example {
* // Add the library methods
* using EnumerableSet for EnumerableSet.AddressSet;
*
* // Declare a set state variable
* EnumerableSet.AddressSet private mySet;
* }
* ```
*
* As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 17 of 31 : EnumerableMap.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
pragma solidity ^0.7.0;
/**
* @dev Library for managing an enumerable variant of Solidity's
* https://solidity.readthedocs.io/en/latest/types.html#mapping-types[`mapping`]
* type.
*
* Maps have the following properties:
*
* - Entries are added, removed, and checked for existence in constant time
* (O(1)).
* - Entries are enumerated in O(n). No guarantees are made on the ordering.
*
* ```
* contract Example {
* // Add the library methods
* using EnumerableMap for EnumerableMap.UintToAddressMap;
*
* // Declare a set state variable
* EnumerableMap.UintToAddressMap private myMap;
* }
* ```
*
* As of v3.0.0, only maps of type `uint256 -> address` (`UintToAddressMap`) are
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 18 of 31 : Strings.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
pragma solidity ^0.7.0;
/**
* @dev String operations.
*/
library Strings {
/**
* @dev Converts a `uint256` to its ASCII `string` representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
// Inspired by OraclizeAPI's implementation - MIT licence
// https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol
if (value == 0) {
return "0";
}
uint256 temp = value;
uint256 digits;
while (temp != 0) {
digits++;
temp /= 10;
}
bytes memory buffer = new bytes(digits);
uint256 index = digits - 1;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 19 of 31 : IERC165.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// SPDX-License-Identifier: MIT
pragma solidity ^0.7.0;
/**
* @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);
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 20 of 31 : Clones.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev https://eips.ethereum.org/EIPS/eip-1167[EIP 1167] is a standard for
* deploying minimal proxy contracts, also known as "clones".
*
* > To simply and cheaply clone contract functionality in an immutable way, this standard specifies
* > a minimal bytecode implementation that delegates all calls to a known, fixed address.
*
* The library includes functions to deploy a proxy using either `create` (traditional deployment) or `create2`
* (salted deterministic deployment). It also includes functions to predict the addresses of clones deployed using the
* deterministic method.
*
* _Available since v3.4._
*/
library Clones {
/**
* @dev Deploys and returns the address of a clone that mimics the behaviour of `master`.
*
* This function uses the create opcode, which should never revert.
*/
function clone(address master) internal returns (address instance) {
// solhint-disable-next-line no-inline-assembly
assembly {
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 21 of 31 : IERC20.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
pragma solidity ^0.7.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 22 of 31 : Initializable.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
// solhint-disable-next-line compiler-version
pragma solidity >=0.4.24 <0.8.0;
import "../utils/Address.sol";
/**
* @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
* behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an
* external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
* function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
*
* TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
* possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}.
*
* CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
* that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
*/
abstract contract Initializable {
/**
* @dev Indicates that the contract has been initialized.
*/
bool private _initialized;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 23 of 31 : TransferHelper.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity >=0.6.0;
// helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false
library TransferHelper {
function safeApprove(
address token,
address to,
uint256 value
) internal {
// bytes4(keccak256(bytes('approve(address,uint256)')));
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
require(
success && (data.length == 0 || abi.decode(data, (bool))),
'TransferHelper::safeApprove: approve failed'
);
}
function safeTransfer(
address token,
address to,
uint256 value
) internal {
// bytes4(keccak256(bytes('transfer(address,uint256)')));
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 24 of 31 : EIP712.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
/* solhint-disable max-line-length */
/**
* @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.
*
* The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,
* thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding
* they need in their contracts using a combination of `abi.encode` and `keccak256`.
*
* This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding
* scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA
* ({_hashTypedDataV4}).
*
* The implementation of the domain separator was designed to be as efficient as possible while still properly updating
* the chain id to protect against replay attacks on an eventual fork of the chain.
*
* NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method
* https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].
*
* _Available since v3.4._
*/
abstract contract EIP712 {
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 25 of 31 : ERC1271.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: GPL-3.0-only
pragma solidity 0.7.6;
import {ECDSA} from "@openzeppelin/contracts/cryptography/ECDSA.sol";
import {Address} from "@openzeppelin/contracts/utils/Address.sol";
interface IERC1271 {
function isValidSignature(bytes32 _messageHash, bytes memory _signature)
external
view
returns (bytes4 magicValue);
}
library SignatureChecker {
function isValidSignature(
address signer,
bytes32 hash,
bytes memory signature
) internal view returns (bool) {
if (Address.isContract(signer)) {
bytes4 selector = IERC1271.isValidSignature.selector;
(bool success, bytes memory returndata) =
signer.staticcall(abi.encodeWithSelector(selector, hash, signature));
return success && abi.decode(returndata, (bytes4)) == selector;
} else {
return ECDSA.recover(hash, signature) == signer;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 26 of 31 : OwnableERC721.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: GPL-3.0-only
pragma solidity 0.7.6;
import {IERC721} from "@openzeppelin/contracts/token/ERC721/IERC721.sol";
/// @title OwnableERC721
/// @notice Use ERC721 ownership for access control
contract OwnableERC721 {
address private _nftAddress;
modifier onlyOwner() {
require(owner() == msg.sender, "OwnableERC721: caller is not the owner");
_;
}
function _setNFT(address nftAddress) internal {
_nftAddress = nftAddress;
}
function nft() public view virtual returns (address nftAddress) {
return _nftAddress;
}
function owner() public view virtual returns (address ownerAddress) {
return IERC721(_nftAddress).ownerOf(uint256(address(this)));
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 27 of 31 : Hypervisor.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: GPL-3.0-only
pragma solidity 0.7.6;
pragma abicoder v2;
import {SafeMath} from "@openzeppelin/contracts/math/SafeMath.sol";
import {EnumerableSet} from "@openzeppelin/contracts/utils/EnumerableSet.sol";
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {TransferHelper} from "@uniswap/lib/contracts/libraries/TransferHelper.sol";
import {IFactory} from "../factory/IFactory.sol";
import {IInstanceRegistry} from "../factory/InstanceRegistry.sol";
import {IUniversalVault} from "../visor/Visor.sol";
import {IRewardPool} from "./RewardPool.sol";
import {Powered} from "./Powered.sol";
interface IRageQuit {
function rageQuit() external;
}
interface IHypervisor is IRageQuit {
/* admin events */
event HypervisorCreated(address rewardPool, address powerSwitch);
event HypervisorFunded(uint256 amount, uint256 duration);
event BonusTokenRegistered(address token);
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 28 of 31 : ECDSA.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: MIT
pragma solidity ^0.7.0;
/**
* @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
*
* These functions can be used to verify that a message was signed by the holder
* of the private keys of a given address.
*/
library ECDSA {
/**
* @dev Returns the address that signed a hashed message (`hash`) with
* `signature`. This address can then be used for verification purposes.
*
* The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
* this function rejects them by requiring the `s` value to be in the lower
* half order, and the `v` value to be either 27 or 28.
*
* IMPORTANT: `hash` _must_ be the result of a hash operation for the
* verification to be secure: it is possible to craft signatures that
* recover to arbitrary addresses for non-hashed data. A safe way to ensure
* this is by receiving a hash of the original message (which may otherwise
* be too long), and then calling {toEthSignedMessageHash} on it.
*/
function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 29 of 31 : RewardPool.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: GPL-3.0-only
pragma solidity 0.7.6;
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {TransferHelper} from "@uniswap/lib/contracts/libraries/TransferHelper.sol";
import {Powered} from "./Powered.sol";
interface IRewardPool {
function sendERC20(
address token,
address to,
uint256 value
) external;
function rescueERC20(address[] calldata tokens, address recipient) external;
}
/// @title Reward Pool
/// @notice Vault for isolated storage of reward tokens
contract RewardPool is IRewardPool, Powered, Ownable {
/* initializer */
constructor(address powerSwitch) {
Powered._setPowerSwitch(powerSwitch);
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 30 of 31 : Powered.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: GPL-3.0-only
pragma solidity 0.7.6;
import {IPowerSwitch} from "./PowerSwitch.sol";
interface IPowered {
function isOnline() external view returns (bool status);
function isOffline() external view returns (bool status);
function isShutdown() external view returns (bool status);
function getPowerSwitch() external view returns (address powerSwitch);
function getPowerController() external view returns (address controller);
}
/// @title Powered
/// @notice Helper for calling external PowerSwitch
contract Powered is IPowered {
/* storage */
address private _powerSwitch;
/* modifiers */
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

File 31 of 31 : PowerSwitch.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// SPDX-License-Identifier: GPL-3.0-only
pragma solidity 0.7.6;
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
interface IPowerSwitch {
/* admin events */
event PowerOn();
event PowerOff();
event EmergencyShutdown();
/* data types */
enum State {Online, Offline, Shutdown}
/* admin functions */
function powerOn() external;
function powerOff() external;
function emergencyShutdown() external;
/* view functions */
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Settings
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
"optimizer": {
"enabled": true,
"runs": 1000
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"abi"
]
}
},
"libraries": {}
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"instance","type":"address"}],"name":"InstanceAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"instance","type":"address"}],"name":"InstanceRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"name","type":"bytes32"},{"indexed":true,"internalType":"address","name":"template","type":"address"}],"name":"TemplateActive","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"name","type":"bytes32"},{"indexed":true,"internalType":"address","name":"template","type":"address"}],"name":"TemplateAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"activeTemplate","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"name","type":"bytes32"},{"internalType":"address","name":"template","type":"address"}],"name":"addTemplate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"create","outputs":[{"internalType":"address","name":"vault","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"create","outputs":[{"internalType":"address","name":"vault","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"salt","type":"bytes32"}],"name":"create2","outputs":[{"internalType":"address","name":"vault","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"bytes32","name":"salt","type":"bytes32"}],"name":"create2","outputs":[{"internalType":"address","name":"vault","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"name","type":"bytes32"}],"name":"createSelected","outputs":[{"internalType":"address","name":"vault","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"name","type":"bytes32"},{"internalType":"bytes32","name":"salt","type":"bytes32"}],"name":"createSelected2","outputs":[{"internalType":"address","name":"vault","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTemplate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getUserVault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"instanceAt","outputs":[{"internalType":"address","name":"instance","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"instanceCount","outputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"instance","type":"address"}],"name":"isInstance","outputs":[{"internalType":"bool","name":"validity","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nameCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"names","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"name","type":"bytes32"}],"name":"setActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"templates","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"userIndex","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"vaultCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b50604051806040016040528060058152602001642b24a9a7a960d91b815250604051806040016040528060058152602001642b24a9a7a960d91b8152506000620000606200012660201b60201c565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350620000bc6301ffc9a760e01b6200012a565b8151620000d1906007906020850190620001b2565b508051620000e7906008906020840190620001b2565b50620000fa6380ac58cd60e01b6200012a565b6200010c635b5e139f60e01b6200012a565b6200011e63780e9d6360e01b6200012a565b50506200025e565b3390565b6001600160e01b031980821614156200018a576040805162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604482015290519081900360640190fd5b6001600160e01b0319166000908152600160208190526040909120805460ff19169091179055565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620001ea576000855562000235565b82601f106200020557805160ff191683800117855562000235565b8280016001018555821562000235579182015b828111156200023557825182559160200191906001019062000218565b506200024392915062000247565b5090565b5b8082111562000243576000815560010162000248565b612cb7806200026e6000396000f3fe608060405234801561001057600080fd5b50600436106102ad5760003560e01c80636c0360eb1161017b578063a22cb465116100d8578063d3239c221161008c578063ec56c71611610071578063ec56c716146108f3578063efc81a8c146108fb578063f2fde38b14610903576102ad565b8063d3239c2214610899578063e985e9c5146108c5576102ad565b8063bd522a4a116100bd578063bd522a4a146107e9578063c87b56dd1461080c578063cf5ba53f14610829576102ad565b8063a22cb465146106f5578063b88d4fde14610723576102ad565b806378ab7b3e1161012f5780638da5cb5b116101145780638da5cb5b146106bf5780639038ff80146106c757806395d89b41146106ed576102ad565b806378ab7b3e146106325780638c0b8db21461064f576102ad565b8063715018a611610160578063715018a6146105f65780637213d2e2146105fe57806373ff93a21461062a576102ad565b80636c0360eb146105c857806370a08231146105d0576102ad565b80631a9f09b5116102295780634622ab03116101dd5780634f6ccce7116101c25780634f6ccce7146105685780636352211e146105855780636b44e6be146105a2576102ad565b80634622ab031461051f5780634a9a7acc1461053c576102ad565b80632f745c591161020e5780632f745c59146104b5578063321c48f2146104e157806342842e0e146104e9576102ad565b80631a9f09b51461046257806323b872dd1461047f576102ad565b80630a631576116102805780630ff39f1a116102655780630ff39f1a1461042357806311d8293e1461043d57806318160ddd1461045a576102ad565b80630a631576146103e95780630c5b55f914610406576102ad565b806301ffc9a7146102b257806306fdde0314610305578063081812fc14610382578063095ea7b3146103bb575b600080fd5b6102f1600480360360208110156102c857600080fd5b50357fffffffff0000000000000000000000000000000000000000000000000000000016610929565b604080519115158252519081900360200190f35b61030d610964565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561034757818101518382015260200161032f565b50505050905090810190601f1680156103745780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61039f6004803603602081101561039857600080fd5b50356109fa565b604080516001600160a01b039092168252519081900360200190f35b6103e7600480360360408110156103d157600080fd5b506001600160a01b038135169060200135610a5c565b005b61039f600480360360208110156103ff57600080fd5b5035610b37565b61039f6004803603602081101561041c57600080fd5b5035610b52565b61042b610c28565b60408051918252519081900360200190f35b61039f6004803603602081101561045357600080fd5b5035610c2e565b61042b610c3f565b6103e76004803603602081101561047857600080fd5b5035610c50565b6103e76004803603606081101561049557600080fd5b506001600160a01b03813581169160208101359091169060400135610d79565b61042b600480360360408110156104cb57600080fd5b506001600160a01b038135169060200135610dd0565b61039f610df9565b6103e7600480360360608110156104ff57600080fd5b506001600160a01b03813581169160208101359091169060400135610e17565b61042b6004803603602081101561053557600080fd5b5035610e32565b61039f6004803603604081101561055257600080fd5b506001600160a01b038135169060200135610e53565b61042b6004803603602081101561057e57600080fd5b5035610e8b565b61039f6004803603602081101561059b57600080fd5b5035610ea1565b6102f1600480360360208110156105b857600080fd5b50356001600160a01b0316610ec9565b61030d610edd565b61042b600480360360208110156105e657600080fd5b50356001600160a01b0316610f3e565b6103e7610fa6565b6103e76004803603604081101561061457600080fd5b50803590602001356001600160a01b0316611064565b61042b611218565b61039f6004803603602081101561064857600080fd5b503561121e565b61039f6004803603604081101561066557600080fd5b81019060208101813564010000000081111561068057600080fd5b82018360208201111561069257600080fd5b803590602001918460018302840111640100000000831117156106b457600080fd5b91935091503561126d565b61039f611280565b61042b600480360360208110156106dd57600080fd5b50356001600160a01b031661128f565b61030d6112aa565b6103e76004803603604081101561070b57600080fd5b506001600160a01b038135169060200135151561130b565b6103e76004803603608081101561073957600080fd5b6001600160a01b0382358116926020810135909116916040820135919081019060808101606082013564010000000081111561077457600080fd5b82018360208201111561078657600080fd5b803590602001918460018302840111640100000000831117156107a857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611410945050505050565b61039f600480360360408110156107ff57600080fd5b508035906020013561146e565b61030d6004803603602081101561082257600080fd5b5035611546565b61039f6004803603602081101561083f57600080fd5b81019060208101813564010000000081111561085a57600080fd5b82018360208201111561086c57600080fd5b8035906020019184600183028401116401000000008311171561088e57600080fd5b5090925090506117c7565b61039f600480360360408110156108af57600080fd5b506001600160a01b0381351690602001356117d1565b6102f1600480360360408110156108db57600080fd5b506001600160a01b0381358116916020013516611811565b61042b61183f565b61039f611849565b6103e76004803603602081101561091957600080fd5b50356001600160a01b0316611920565b7fffffffff00000000000000000000000000000000000000000000000000000000811660009081526001602052604090205460ff165b919050565b60078054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156109f05780601f106109c5576101008083540402835291602001916109f0565b820191906000526020600020905b8154815290600101906020018083116109d357829003601f168201915b5050505050905090565b6000610a0582611a34565b610a405760405162461bcd60e51b815260040180806020018281038252602c815260200180612bac602c913960400191505060405180910390fd5b506000908152600560205260409020546001600160a01b031690565b6000610a6782610ea1565b9050806001600160a01b0316836001600160a01b03161415610aba5760405162461bcd60e51b8152600401808060200182810382526021815260200180612c306021913960400191505060405180910390fd5b806001600160a01b0316610acc611a41565b6001600160a01b03161480610aed5750610aed81610ae8611a41565b611811565b610b285760405162461bcd60e51b8152600401808060200182810382526038815260200180612aff6038913960400191505060405180910390fd5b610b328383611a45565b505050565b600c602052600090815260409020546001600160a01b031681565b6000818152600c60209081526040808320548151600481526024810190925291810180516001600160e01b031663204a7f0760e21b179052610b9d916001600160a01b031690611ab3565b9050610bb233826001600160a01b0316611c05565b336000908152600e6020908152604080832080546001810182559084529282902090920180546001600160a01b0319166001600160a01b038516908117909155825190815291517fee3a98e49d5a27452a99d57c90a7f73d4b2e44de88c6ded02e69c4ed964edd5a9281900390910190a1919050565b600d5481565b6000610c3982610e8b565b92915050565b6000610c4b6003611c23565b905090565b610c58611a41565b6001600160a01b0316610c69611280565b6001600160a01b031614610cc4576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6000818152600c60205260409020546001600160a01b0316610d2d576040805162461bcd60e51b815260206004820152601760248201527f54656d706c61746520646f6573206e6f74206578697374000000000000000000604482015290519081900360640190fd5b600d8190556000818152600c60205260408082205490516001600160a01b039091169183917f15bcab9ffe886e924ddbf2486c3b19875bd3c7e3c980edf93634a250265791fb9190a350565b610d8a610d84611a41565b82611c2e565b610dc55760405162461bcd60e51b8152600401808060200182810382526031815260200180612c516031913960400191505060405180910390fd5b610b32838383611cca565b6001600160a01b0382166000908152600260205260408120610df29083611e16565b9392505050565b600d546000908152600c60205260409020546001600160a01b031690565b610b3283838360405180602001604052806000815250611410565b600b8181548110610e4257600080fd5b600091825260209091200154905081565b600e6020528160005260406000208181548110610e6f57600080fd5b6000918252602090912001546001600160a01b03169150829050565b600080610e99600384611e22565b509392505050565b6000610c3982604051806060016040528060298152602001612b616029913960039190611e3e565b6000610c39826001600160a01b0316611a34565b600a8054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156109f05780601f106109c5576101008083540402835291602001916109f0565b60006001600160a01b038216610f855760405162461bcd60e51b815260040180806020018281038252602a815260200180612b37602a913960400191505060405180910390fd5b6001600160a01b0382166000908152600260205260409020610c3990611c23565b610fae611a41565b6001600160a01b0316610fbf611280565b6001600160a01b03161461101a576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b61106c611a41565b6001600160a01b031661107d611280565b6001600160a01b0316146110d8576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6000828152600c60205260409020546001600160a01b031615611142576040805162461bcd60e51b815260206004820152601760248201527f54656d706c61746520616c726561647920657869737473000000000000000000604482015290519081900360640190fd5b6000828152600c6020526040902080546001600160a01b0319166001600160a01b038316179055600b546111ac57600d8290556040516001600160a01b0382169083907f15bcab9ffe886e924ddbf2486c3b19875bd3c7e3c980edf93634a250265791fb90600090a35b600b805460018101825560009182527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db9018390556040516001600160a01b0383169184917f76a15abe5a3f991b7b1b9e9f9629149df5fe28934e3129cc19882221cd847c5e9190a35050565b600b5490565b600d546000908152600c60209081526040808320548151600481526024810190925291810180516001600160e01b031663204a7f0760e21b179052610b9d916001600160a01b03169084611e4b565b60006112788261121e565b949350505050565b6000546001600160a01b031690565b6001600160a01b03166000908152600e602052604090205490565b60088054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156109f05780601f106109c5576101008083540402835291602001916109f0565b611313611a41565b6001600160a01b0316826001600160a01b03161415611379576040805162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015290519081900360640190fd5b8060066000611386611a41565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff1916921515929092179091556113ca611a41565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405180821515815260200191505060405180910390a35050565b61142161141b611a41565b83611c2e565b61145c5760405162461bcd60e51b8152600401808060200182810382526031815260200180612c516031913960400191505060405180910390fd5b61146884848484611f62565b50505050565b6000828152600c60209081526040808320548151600481526024810190925291810180516001600160e01b031663204a7f0760e21b1790526114ba916001600160a01b03169084611e4b565b90506114cf33826001600160a01b0316611c05565b336000908152600e6020908152604080832080546001810182559084529282902090920180546001600160a01b0319166001600160a01b038516908117909155825190815291517fee3a98e49d5a27452a99d57c90a7f73d4b2e44de88c6ded02e69c4ed964edd5a9281900390910190a192915050565b606061155182611a34565b61158c5760405162461bcd60e51b815260040180806020018281038252602f815260200180612c01602f913960400191505060405180910390fd5b60008281526009602090815260408083208054825160026001831615610100026000190190921691909104601f81018590048502820185019093528281529290919083018282801561161f5780601f106115f45761010080835404028352916020019161161f565b820191906000526020600020905b81548152906001019060200180831161160257829003601f168201915b505050505090506000611630610edd565b90508051600014156116445750905061095f565b8151156117055780826040516020018083805190602001908083835b6020831061167f5780518252601f199092019160209182019101611660565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b602083106116c75780518252601f1990920191602091820191016116a8565b6001836020036101000a038019825116818451168082178552505050505050905001925050506040516020818303038152906040529250505061095f565b8061170f85611fb4565b6040516020018083805190602001908083835b602083106117415780518252601f199092019160209182019101611722565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b602083106117895780518252601f19909201916020918201910161176a565b6001836020036101000a0380198251168184511680821785525050505050509050019250505060405160208183030381529060405292505050919050565b6000610df2611849565b6001600160a01b0382166000908152600e602052604081208054839081106117f557fe5b6000918252602090912001546001600160a01b03169392505050565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b6000610c4b610c3f565b600d546000908152600c60209081526040808320548151600481526024810190925291810180516001600160e01b031663204a7f0760e21b179052611897916001600160a01b031690611ab3565b90506118ac33826001600160a01b0316611c05565b336000908152600e6020908152604080832080546001810182559084529282902090920180546001600160a01b0319166001600160a01b038516908117909155825190815291517fee3a98e49d5a27452a99d57c90a7f73d4b2e44de88c6ded02e69c4ed964edd5a9281900390910190a190565b611928611a41565b6001600160a01b0316611939611280565b6001600160a01b031614611994576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0381166119d95760405162461bcd60e51b8152600401808060200182810382526026815260200180612a896026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000610c396003836120c3565b3390565b600081815260056020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611a7a82610ea1565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611abe836120cf565b825190915015610c3957600080826001600160a01b0316846040518082805190602001908083835b60208310611b055780518252601f199092019160209182019101611ae6565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114611b67576040519150601f19603f3d011682016040523d82523d6000602084013e611b6c565b606091505b5091509150818190611bfc5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611bc1578181015183820152602001611ba9565b50505050905090810190601f168015611bee5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50505092915050565b611c1f82826040518060200160405280600081525061218a565b5050565b6000610c39826121dc565b6000611c3982611a34565b611c745760405162461bcd60e51b815260040180806020018281038252602c815260200180612ad3602c913960400191505060405180910390fd5b6000611c7f83610ea1565b9050806001600160a01b0316846001600160a01b03161480611cba5750836001600160a01b0316611caf846109fa565b6001600160a01b0316145b8061127857506112788185611811565b826001600160a01b0316611cdd82610ea1565b6001600160a01b031614611d225760405162461bcd60e51b8152600401808060200182810382526029815260200180612bd86029913960400191505060405180910390fd5b6001600160a01b038216611d675760405162461bcd60e51b8152600401808060200182810382526024815260200180612aaf6024913960400191505060405180910390fd5b611d72838383610b32565b611d7d600082611a45565b6001600160a01b0383166000908152600260205260409020611d9f90826121e0565b506001600160a01b0382166000908152600260205260409020611dc290826121ec565b50611dcf600382846121f8565b5080826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000610df2838361220e565b6000808080611e318686612272565b9097909650945050505050565b60006112788484846122ed565b6000611e57848361237a565b835190915015610df257600080826001600160a01b0316856040518082805190602001908083835b60208310611e9e5780518252601f199092019160209182019101611e7f565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114611f00576040519150601f19603f3d011682016040523d82523d6000602084013e611f05565b606091505b5091509150818190611f585760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315611bc1578181015183820152602001611ba9565b5050509392505050565b611f6d848484611cca565b611f7984848484612436565b6114685760405162461bcd60e51b8152600401808060200182810382526032815260200180612a576032913960400191505060405180910390fd5b606081611ff5575060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015261095f565b8160005b811561200d57600101600a82049150611ff9565b60008167ffffffffffffffff8111801561202657600080fd5b506040519080825280601f01601f191660200182016040528015612051576020820181803683370190505b50859350905060001982015b83156120ba57600a840660300160f81b8282806001900393508151811061208057fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8404935061205d565b50949350505050565b6000610df283836125b6565b60006040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528260601b60148201527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000060288201526037816000f09150506001600160a01b03811661095f576040805162461bcd60e51b815260206004820152601660248201527f455243313136373a20637265617465206661696c656400000000000000000000604482015290519081900360640190fd5b61219483836125ce565b6121a16000848484612436565b610b325760405162461bcd60e51b8152600401808060200182810382526032815260200180612a576032913960400191505060405180910390fd5b5490565b6000610df283836126fc565b6000610df283836127c2565b600061127884846001600160a01b03851661280c565b815460009082106122505760405162461bcd60e51b8152600401808060200182810382526022815260200180612a356022913960400191505060405180910390fd5b82600001828154811061225f57fe5b9060005260206000200154905092915050565b8154600090819083106122b65760405162461bcd60e51b8152600401808060200182810382526022815260200180612b8a6022913960400191505060405180910390fd5b60008460000184815481106122c757fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b6000828152600184016020526040812054828161234b5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315611bc1578181015183820152602001611ba9565b5084600001600182038154811061235e57fe5b9060005260206000209060020201600101549150509392505050565b60006040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528360601b60148201527f5af43d82803e903d91602b57fd5bf300000000000000000000000000000000006028820152826037826000f59150506001600160a01b038116610c39576040805162461bcd60e51b815260206004820152601760248201527f455243313136373a2063726561746532206661696c6564000000000000000000604482015290519081900360640190fd5b600061244a846001600160a01b03166128a3565b61245657506001611278565b6000612564630a85bd0160e11b61246b611a41565b88878760405160240180856001600160a01b03168152602001846001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156124d25781810151838201526020016124ba565b50505050905090810190601f1680156124ff5780820380516001836020036101000a031916815260200191505b5095505050505050604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050604051806060016040528060328152602001612a57603291396001600160a01b03881691906128a9565b9050600081806020019051602081101561257d57600080fd5b50517fffffffff0000000000000000000000000000000000000000000000000000000016630a85bd0160e11b1492505050949350505050565b60009081526001919091016020526040902054151590565b6001600160a01b038216612629576040805162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015290519081900360640190fd5b61263281611a34565b15612684576040805162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015290519081900360640190fd5b61269060008383610b32565b6001600160a01b03821660009081526002602052604090206126b290826121ec565b506126bf600382846121f8565b5060405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600081815260018301602052604081205480156127b8578354600019808301919081019060009087908390811061272f57fe5b906000526020600020015490508087600001848154811061274c57fe5b60009182526020808320909101929092558281526001898101909252604090209084019055865487908061277c57fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610c39565b6000915050610c39565b60006127ce83836125b6565b61280457508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610c39565b506000610c39565b600082815260018401602052604081205480612871575050604080518082018252838152602080820184815286546001818101895560008981528481209551600290930290950191825591519082015586548684528188019092529290912055610df2565b8285600001600183038154811061288457fe5b9060005260206000209060020201600101819055506000915050610df2565b3b151590565b60606112788484600085856128bd856128a3565b61290e576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b600080866001600160a01b031685876040518082805190602001908083835b6020831061294c5780518252601f19909201916020918201910161292d565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146129ae576040519150601f19603f3d011682016040523d82523d6000602084013e6129b3565b606091505b50915091506129c38282866129ce565b979650505050505050565b606083156129dd575081610df2565b8251156129ed5782518084602001fd5b60405162461bcd60e51b8152602060048201818152845160248401528451859391928392604401919085019080838360008315611bc1578181015183820152602001611ba956fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e64734552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734552433732313a207472616e7366657220746f20746865207a65726f20616464726573734552433732313a206f70657261746f7220717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656420666f7220616c6c4552433732313a2062616c616e636520717565727920666f7220746865207a65726f20616464726573734552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656e456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e64734552433732313a20617070726f76656420717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a207472616e73666572206f6620746f6b656e2074686174206973206e6f74206f776e4552433732314d657461646174613a2055524920717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76616c20746f2063757272656e74206f776e65724552433732313a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564a264697066735822122064da48d1ef911d9d5fbbee822b825dea7021b244e522ee2dd8ddba63814b32e564736f6c63430007060033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102ad5760003560e01c80636c0360eb1161017b578063a22cb465116100d8578063d3239c221161008c578063ec56c71611610071578063ec56c716146108f3578063efc81a8c146108fb578063f2fde38b14610903576102ad565b8063d3239c2214610899578063e985e9c5146108c5576102ad565b8063bd522a4a116100bd578063bd522a4a146107e9578063c87b56dd1461080c578063cf5ba53f14610829576102ad565b8063a22cb465146106f5578063b88d4fde14610723576102ad565b806378ab7b3e1161012f5780638da5cb5b116101145780638da5cb5b146106bf5780639038ff80146106c757806395d89b41146106ed576102ad565b806378ab7b3e146106325780638c0b8db21461064f576102ad565b8063715018a611610160578063715018a6146105f65780637213d2e2146105fe57806373ff93a21461062a576102ad565b80636c0360eb146105c857806370a08231146105d0576102ad565b80631a9f09b5116102295780634622ab03116101dd5780634f6ccce7116101c25780634f6ccce7146105685780636352211e146105855780636b44e6be146105a2576102ad565b80634622ab031461051f5780634a9a7acc1461053c576102ad565b80632f745c591161020e5780632f745c59146104b5578063321c48f2146104e157806342842e0e146104e9576102ad565b80631a9f09b51461046257806323b872dd1461047f576102ad565b80630a631576116102805780630ff39f1a116102655780630ff39f1a1461042357806311d8293e1461043d57806318160ddd1461045a576102ad565b80630a631576146103e95780630c5b55f914610406576102ad565b806301ffc9a7146102b257806306fdde0314610305578063081812fc14610382578063095ea7b3146103bb575b600080fd5b6102f1600480360360208110156102c857600080fd5b50357fffffffff0000000000000000000000000000000000000000000000000000000016610929565b604080519115158252519081900360200190f35b61030d610964565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561034757818101518382015260200161032f565b50505050905090810190601f1680156103745780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61039f6004803603602081101561039857600080fd5b50356109fa565b604080516001600160a01b039092168252519081900360200190f35b6103e7600480360360408110156103d157600080fd5b506001600160a01b038135169060200135610a5c565b005b61039f600480360360208110156103ff57600080fd5b5035610b37565b61039f6004803603602081101561041c57600080fd5b5035610b52565b61042b610c28565b60408051918252519081900360200190f35b61039f6004803603602081101561045357600080fd5b5035610c2e565b61042b610c3f565b6103e76004803603602081101561047857600080fd5b5035610c50565b6103e76004803603606081101561049557600080fd5b506001600160a01b03813581169160208101359091169060400135610d79565b61042b600480360360408110156104cb57600080fd5b506001600160a01b038135169060200135610dd0565b61039f610df9565b6103e7600480360360608110156104ff57600080fd5b506001600160a01b03813581169160208101359091169060400135610e17565b61042b6004803603602081101561053557600080fd5b5035610e32565b61039f6004803603604081101561055257600080fd5b506001600160a01b038135169060200135610e53565b61042b6004803603602081101561057e57600080fd5b5035610e8b565b61039f6004803603602081101561059b57600080fd5b5035610ea1565b6102f1600480360360208110156105b857600080fd5b50356001600160a01b0316610ec9565b61030d610edd565b61042b600480360360208110156105e657600080fd5b50356001600160a01b0316610f3e565b6103e7610fa6565b6103e76004803603604081101561061457600080fd5b50803590602001356001600160a01b0316611064565b61042b611218565b61039f6004803603602081101561064857600080fd5b503561121e565b61039f6004803603604081101561066557600080fd5b81019060208101813564010000000081111561068057600080fd5b82018360208201111561069257600080fd5b803590602001918460018302840111640100000000831117156106b457600080fd5b91935091503561126d565b61039f611280565b61042b600480360360208110156106dd57600080fd5b50356001600160a01b031661128f565b61030d6112aa565b6103e76004803603604081101561070b57600080fd5b506001600160a01b038135169060200135151561130b565b6103e76004803603608081101561073957600080fd5b6001600160a01b0382358116926020810135909116916040820135919081019060808101606082013564010000000081111561077457600080fd5b82018360208201111561078657600080fd5b803590602001918460018302840111640100000000831117156107a857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611410945050505050565b61039f600480360360408110156107ff57600080fd5b508035906020013561146e565b61030d6004803603602081101561082257600080fd5b5035611546565b61039f6004803603602081101561083f57600080fd5b81019060208101813564010000000081111561085a57600080fd5b82018360208201111561086c57600080fd5b8035906020019184600183028401116401000000008311171561088e57600080fd5b5090925090506117c7565b61039f600480360360408110156108af57600080fd5b506001600160a01b0381351690602001356117d1565b6102f1600480360360408110156108db57600080fd5b506001600160a01b0381358116916020013516611811565b61042b61183f565b61039f611849565b6103e76004803603602081101561091957600080fd5b50356001600160a01b0316611920565b7fffffffff00000000000000000000000000000000000000000000000000000000811660009081526001602052604090205460ff165b919050565b60078054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156109f05780601f106109c5576101008083540402835291602001916109f0565b820191906000526020600020905b8154815290600101906020018083116109d357829003601f168201915b5050505050905090565b6000610a0582611a34565b610a405760405162461bcd60e51b815260040180806020018281038252602c815260200180612bac602c913960400191505060405180910390fd5b506000908152600560205260409020546001600160a01b031690565b6000610a6782610ea1565b9050806001600160a01b0316836001600160a01b03161415610aba5760405162461bcd60e51b8152600401808060200182810382526021815260200180612c306021913960400191505060405180910390fd5b806001600160a01b0316610acc611a41565b6001600160a01b03161480610aed5750610aed81610ae8611a41565b611811565b610b285760405162461bcd60e51b8152600401808060200182810382526038815260200180612aff6038913960400191505060405180910390fd5b610b328383611a45565b505050565b600c602052600090815260409020546001600160a01b031681565b6000818152600c60209081526040808320548151600481526024810190925291810180516001600160e01b031663204a7f0760e21b179052610b9d916001600160a01b031690611ab3565b9050610bb233826001600160a01b0316611c05565b336000908152600e6020908152604080832080546001810182559084529282902090920180546001600160a01b0319166001600160a01b038516908117909155825190815291517fee3a98e49d5a27452a99d57c90a7f73d4b2e44de88c6ded02e69c4ed964edd5a9281900390910190a1919050565b600d5481565b6000610c3982610e8b565b92915050565b6000610c4b6003611c23565b905090565b610c58611a41565b6001600160a01b0316610c69611280565b6001600160a01b031614610cc4576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6000818152600c60205260409020546001600160a01b0316610d2d576040805162461bcd60e51b815260206004820152601760248201527f54656d706c61746520646f6573206e6f74206578697374000000000000000000604482015290519081900360640190fd5b600d8190556000818152600c60205260408082205490516001600160a01b039091169183917f15bcab9ffe886e924ddbf2486c3b19875bd3c7e3c980edf93634a250265791fb9190a350565b610d8a610d84611a41565b82611c2e565b610dc55760405162461bcd60e51b8152600401808060200182810382526031815260200180612c516031913960400191505060405180910390fd5b610b32838383611cca565b6001600160a01b0382166000908152600260205260408120610df29083611e16565b9392505050565b600d546000908152600c60205260409020546001600160a01b031690565b610b3283838360405180602001604052806000815250611410565b600b8181548110610e4257600080fd5b600091825260209091200154905081565b600e6020528160005260406000208181548110610e6f57600080fd5b6000918252602090912001546001600160a01b03169150829050565b600080610e99600384611e22565b509392505050565b6000610c3982604051806060016040528060298152602001612b616029913960039190611e3e565b6000610c39826001600160a01b0316611a34565b600a8054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156109f05780601f106109c5576101008083540402835291602001916109f0565b60006001600160a01b038216610f855760405162461bcd60e51b815260040180806020018281038252602a815260200180612b37602a913960400191505060405180910390fd5b6001600160a01b0382166000908152600260205260409020610c3990611c23565b610fae611a41565b6001600160a01b0316610fbf611280565b6001600160a01b03161461101a576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b61106c611a41565b6001600160a01b031661107d611280565b6001600160a01b0316146110d8576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6000828152600c60205260409020546001600160a01b031615611142576040805162461bcd60e51b815260206004820152601760248201527f54656d706c61746520616c726561647920657869737473000000000000000000604482015290519081900360640190fd5b6000828152600c6020526040902080546001600160a01b0319166001600160a01b038316179055600b546111ac57600d8290556040516001600160a01b0382169083907f15bcab9ffe886e924ddbf2486c3b19875bd3c7e3c980edf93634a250265791fb90600090a35b600b805460018101825560009182527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db9018390556040516001600160a01b0383169184917f76a15abe5a3f991b7b1b9e9f9629149df5fe28934e3129cc19882221cd847c5e9190a35050565b600b5490565b600d546000908152600c60209081526040808320548151600481526024810190925291810180516001600160e01b031663204a7f0760e21b179052610b9d916001600160a01b03169084611e4b565b60006112788261121e565b949350505050565b6000546001600160a01b031690565b6001600160a01b03166000908152600e602052604090205490565b60088054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156109f05780601f106109c5576101008083540402835291602001916109f0565b611313611a41565b6001600160a01b0316826001600160a01b03161415611379576040805162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015290519081900360640190fd5b8060066000611386611a41565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff1916921515929092179091556113ca611a41565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405180821515815260200191505060405180910390a35050565b61142161141b611a41565b83611c2e565b61145c5760405162461bcd60e51b8152600401808060200182810382526031815260200180612c516031913960400191505060405180910390fd5b61146884848484611f62565b50505050565b6000828152600c60209081526040808320548151600481526024810190925291810180516001600160e01b031663204a7f0760e21b1790526114ba916001600160a01b03169084611e4b565b90506114cf33826001600160a01b0316611c05565b336000908152600e6020908152604080832080546001810182559084529282902090920180546001600160a01b0319166001600160a01b038516908117909155825190815291517fee3a98e49d5a27452a99d57c90a7f73d4b2e44de88c6ded02e69c4ed964edd5a9281900390910190a192915050565b606061155182611a34565b61158c5760405162461bcd60e51b815260040180806020018281038252602f815260200180612c01602f913960400191505060405180910390fd5b60008281526009602090815260408083208054825160026001831615610100026000190190921691909104601f81018590048502820185019093528281529290919083018282801561161f5780601f106115f45761010080835404028352916020019161161f565b820191906000526020600020905b81548152906001019060200180831161160257829003601f168201915b505050505090506000611630610edd565b90508051600014156116445750905061095f565b8151156117055780826040516020018083805190602001908083835b6020831061167f5780518252601f199092019160209182019101611660565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b602083106116c75780518252601f1990920191602091820191016116a8565b6001836020036101000a038019825116818451168082178552505050505050905001925050506040516020818303038152906040529250505061095f565b8061170f85611fb4565b6040516020018083805190602001908083835b602083106117415780518252601f199092019160209182019101611722565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b602083106117895780518252601f19909201916020918201910161176a565b6001836020036101000a0380198251168184511680821785525050505050509050019250505060405160208183030381529060405292505050919050565b6000610df2611849565b6001600160a01b0382166000908152600e602052604081208054839081106117f557fe5b6000918252602090912001546001600160a01b03169392505050565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b6000610c4b610c3f565b600d546000908152600c60209081526040808320548151600481526024810190925291810180516001600160e01b031663204a7f0760e21b179052611897916001600160a01b031690611ab3565b90506118ac33826001600160a01b0316611c05565b336000908152600e6020908152604080832080546001810182559084529282902090920180546001600160a01b0319166001600160a01b038516908117909155825190815291517fee3a98e49d5a27452a99d57c90a7f73d4b2e44de88c6ded02e69c4ed964edd5a9281900390910190a190565b611928611a41565b6001600160a01b0316611939611280565b6001600160a01b031614611994576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0381166119d95760405162461bcd60e51b8152600401808060200182810382526026815260200180612a896026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000610c396003836120c3565b3390565b600081815260056020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611a7a82610ea1565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611abe836120cf565b825190915015610c3957600080826001600160a01b0316846040518082805190602001908083835b60208310611b055780518252601f199092019160209182019101611ae6565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114611b67576040519150601f19603f3d011682016040523d82523d6000602084013e611b6c565b606091505b5091509150818190611bfc5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611bc1578181015183820152602001611ba9565b50505050905090810190601f168015611bee5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50505092915050565b611c1f82826040518060200160405280600081525061218a565b5050565b6000610c39826121dc565b6000611c3982611a34565b611c745760405162461bcd60e51b815260040180806020018281038252602c815260200180612ad3602c913960400191505060405180910390fd5b6000611c7f83610ea1565b9050806001600160a01b0316846001600160a01b03161480611cba5750836001600160a01b0316611caf846109fa565b6001600160a01b0316145b8061127857506112788185611811565b826001600160a01b0316611cdd82610ea1565b6001600160a01b031614611d225760405162461bcd60e51b8152600401808060200182810382526029815260200180612bd86029913960400191505060405180910390fd5b6001600160a01b038216611d675760405162461bcd60e51b8152600401808060200182810382526024815260200180612aaf6024913960400191505060405180910390fd5b611d72838383610b32565b611d7d600082611a45565b6001600160a01b0383166000908152600260205260409020611d9f90826121e0565b506001600160a01b0382166000908152600260205260409020611dc290826121ec565b50611dcf600382846121f8565b5080826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000610df2838361220e565b6000808080611e318686612272565b9097909650945050505050565b60006112788484846122ed565b6000611e57848361237a565b835190915015610df257600080826001600160a01b0316856040518082805190602001908083835b60208310611e9e5780518252601f199092019160209182019101611e7f565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114611f00576040519150601f19603f3d011682016040523d82523d6000602084013e611f05565b606091505b5091509150818190611f585760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315611bc1578181015183820152602001611ba9565b5050509392505050565b611f6d848484611cca565b611f7984848484612436565b6114685760405162461bcd60e51b8152600401808060200182810382526032815260200180612a576032913960400191505060405180910390fd5b606081611ff5575060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015261095f565b8160005b811561200d57600101600a82049150611ff9565b60008167ffffffffffffffff8111801561202657600080fd5b506040519080825280601f01601f191660200182016040528015612051576020820181803683370190505b50859350905060001982015b83156120ba57600a840660300160f81b8282806001900393508151811061208057fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8404935061205d565b50949350505050565b6000610df283836125b6565b60006040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528260601b60148201527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000060288201526037816000f09150506001600160a01b03811661095f576040805162461bcd60e51b815260206004820152601660248201527f455243313136373a20637265617465206661696c656400000000000000000000604482015290519081900360640190fd5b61219483836125ce565b6121a16000848484612436565b610b325760405162461bcd60e51b8152600401808060200182810382526032815260200180612a576032913960400191505060405180910390fd5b5490565b6000610df283836126fc565b6000610df283836127c2565b600061127884846001600160a01b03851661280c565b815460009082106122505760405162461bcd60e51b8152600401808060200182810382526022815260200180612a356022913960400191505060405180910390fd5b82600001828154811061225f57fe5b9060005260206000200154905092915050565b8154600090819083106122b65760405162461bcd60e51b8152600401808060200182810382526022815260200180612b8a6022913960400191505060405180910390fd5b60008460000184815481106122c757fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b6000828152600184016020526040812054828161234b5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315611bc1578181015183820152602001611ba9565b5084600001600182038154811061235e57fe5b9060005260206000209060020201600101549150509392505050565b60006040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528360601b60148201527f5af43d82803e903d91602b57fd5bf300000000000000000000000000000000006028820152826037826000f59150506001600160a01b038116610c39576040805162461bcd60e51b815260206004820152601760248201527f455243313136373a2063726561746532206661696c6564000000000000000000604482015290519081900360640190fd5b600061244a846001600160a01b03166128a3565b61245657506001611278565b6000612564630a85bd0160e11b61246b611a41565b88878760405160240180856001600160a01b03168152602001846001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156124d25781810151838201526020016124ba565b50505050905090810190601f1680156124ff5780820380516001836020036101000a031916815260200191505b5095505050505050604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050604051806060016040528060328152602001612a57603291396001600160a01b03881691906128a9565b9050600081806020019051602081101561257d57600080fd5b50517fffffffff0000000000000000000000000000000000000000000000000000000016630a85bd0160e11b1492505050949350505050565b60009081526001919091016020526040902054151590565b6001600160a01b038216612629576040805162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015290519081900360640190fd5b61263281611a34565b15612684576040805162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015290519081900360640190fd5b61269060008383610b32565b6001600160a01b03821660009081526002602052604090206126b290826121ec565b506126bf600382846121f8565b5060405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600081815260018301602052604081205480156127b8578354600019808301919081019060009087908390811061272f57fe5b906000526020600020015490508087600001848154811061274c57fe5b60009182526020808320909101929092558281526001898101909252604090209084019055865487908061277c57fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610c39565b6000915050610c39565b60006127ce83836125b6565b61280457508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610c39565b506000610c39565b600082815260018401602052604081205480612871575050604080518082018252838152602080820184815286546001818101895560008981528481209551600290930290950191825591519082015586548684528188019092529290912055610df2565b8285600001600183038154811061288457fe5b9060005260206000209060020201600101819055506000915050610df2565b3b151590565b60606112788484600085856128bd856128a3565b61290e576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b600080866001600160a01b031685876040518082805190602001908083835b6020831061294c5780518252601f19909201916020918201910161292d565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146129ae576040519150601f19603f3d011682016040523d82523d6000602084013e6129b3565b606091505b50915091506129c38282866129ce565b979650505050505050565b606083156129dd575081610df2565b8251156129ed5782518084602001fd5b60405162461bcd60e51b8152602060048201818152845160248401528451859391928392604401919085019080838360008315611bc1578181015183820152602001611ba956fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e64734552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734552433732313a207472616e7366657220746f20746865207a65726f20616464726573734552433732313a206f70657261746f7220717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656420666f7220616c6c4552433732313a2062616c616e636520717565727920666f7220746865207a65726f20616464726573734552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656e456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e64734552433732313a20617070726f76656420717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a207472616e73666572206f6620746f6b656e2074686174206973206e6f74206f776e4552433732314d657461646174613a2055524920717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76616c20746f2063757272656e74206f776e65724552433732313a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564a264697066735822122064da48d1ef911d9d5fbbee822b825dea7021b244e522ee2dd8ddba63814b32e564736f6c63430007060033

Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.