Source Code
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 2,331 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Withdraw Bid For... | 24358215 | 29 hrs ago | IN | 0 ETH | 0.00009432 | ||||
| Enter Bid For Pu... | 24343276 | 3 days ago | IN | 30 ETH | 0.00025996 | ||||
| Offer Punk For S... | 24320539 | 6 days ago | IN | 0 ETH | 0.00010807 | ||||
| Offer Punk For S... | 24320533 | 6 days ago | IN | 0 ETH | 0.00027506 | ||||
| Punk No Longer F... | 24320525 | 6 days ago | IN | 0 ETH | 0.00009094 | ||||
| Offer Punk For S... | 24320517 | 6 days ago | IN | 0 ETH | 0.00027154 | ||||
| Offer Punk For S... | 24320511 | 6 days ago | IN | 0 ETH | 0.00029678 | ||||
| Offer Punk For S... | 24320500 | 6 days ago | IN | 0 ETH | 0.0001916 | ||||
| Offer Punk For S... | 24292952 | 10 days ago | IN | 0 ETH | 0.0001021 | ||||
| Offer Punk For S... | 24292942 | 10 days ago | IN | 0 ETH | 0.00020207 | ||||
| Offer Punk For S... | 24216133 | 21 days ago | IN | 0 ETH | 0.00025725 | ||||
| Offer Punk For S... | 24149374 | 30 days ago | IN | 0 ETH | 0.00009862 | ||||
| Offer Punk For S... | 24149365 | 30 days ago | IN | 0 ETH | 0.00013632 | ||||
| Offer Punk For S... | 23630005 | 103 days ago | IN | 0 ETH | 0.00013845 | ||||
| Offer Punk For S... | 23536337 | 116 days ago | IN | 0 ETH | 0.00013994 | ||||
| Punk No Longer F... | 23536283 | 116 days ago | IN | 0 ETH | 0.00006755 | ||||
| Offer Punk For S... | 23443678 | 129 days ago | IN | 0 ETH | 0.0000614 | ||||
| Offer Punk For S... | 23402976 | 134 days ago | IN | 0 ETH | 0.00006071 | ||||
| Offer Punk For S... | 23301932 | 149 days ago | IN | 0 ETH | 0.00001485 | ||||
| Enter Bid For Pu... | 23298522 | 149 days ago | IN | 1 ETH | 0.00014733 | ||||
| Withdraw Bid For... | 23284966 | 151 days ago | IN | 0 ETH | 0.00007201 | ||||
| Enter Bid For Pu... | 23284592 | 151 days ago | IN | 6.25 ETH | 0.00018445 | ||||
| Withdraw Bid For... | 23284588 | 151 days ago | IN | 0 ETH | 0.00007576 | ||||
| Enter Bid For Pu... | 23284017 | 151 days ago | IN | 6.2 ETH | 0.00035898 | ||||
| Offer Punk For S... | 23283464 | 151 days ago | IN | 0 ETH | 0.00040924 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| Transfer | 24358215 | 29 hrs ago | 30 ETH | ||||
| Transfer | 23298530 | 149 days ago | 1 ETH | ||||
| Transfer | 23298530 | 149 days ago | 1 ETH | ||||
| Enter Bid For Pu... | 23298530 | 149 days ago | 1 ETH | ||||
| Transfer | 23284966 | 151 days ago | 6.25 ETH | ||||
| Transfer | 23284588 | 151 days ago | 6.2 ETH | ||||
| Transfer | 23264058 | 154 days ago | 1 ETH | ||||
| Transfer | 23264058 | 154 days ago | 1 ETH | ||||
| Enter Bid For Pu... | 23264058 | 154 days ago | 1 ETH | ||||
| Transfer | 23249851 | 156 days ago | 1 ETH | ||||
| Transfer | 23249851 | 156 days ago | 1 ETH | ||||
| Enter Bid For Pu... | 23249851 | 156 days ago | 1 ETH | ||||
| Transfer | 23249328 | 156 days ago | 1 ETH | ||||
| Transfer | 23249328 | 156 days ago | 1 ETH | ||||
| Enter Bid For Pu... | 23249328 | 156 days ago | 1 ETH | ||||
| Transfer | 23247749 | 156 days ago | 0.001 ETH | ||||
| Transfer | 23247749 | 156 days ago | 0.001 ETH | ||||
| Enter Bid For Pu... | 23247749 | 156 days ago | 0.001 ETH | ||||
| Transfer | 23232208 | 158 days ago | 0.002 ETH | ||||
| Transfer | 23232208 | 158 days ago | 0.002 ETH | ||||
| Enter Bid For Pu... | 23232208 | 158 days ago | 0.002 ETH | ||||
| Transfer | 23227685 | 159 days ago | 0.001 ETH | ||||
| Transfer | 23227685 | 159 days ago | 0.001 ETH | ||||
| Enter Bid For Pu... | 23227685 | 159 days ago | 0.001 ETH | ||||
| Transfer | 23218967 | 160 days ago | 55 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
PunksMarket
Compiler Version
v0.8.11+commit.d7f03943
Optimization Enabled:
Yes with 1000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0 <0.9.0;
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.4.0/contracts/token/ERC721/IERC721.sol";
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.4.0/contracts/access/Ownable.sol";
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.4.0/contracts/security/Pausable.sol";
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.4.0/contracts/security/ReentrancyGuard.sol";
import "./library/AdminControl.sol";
/**
* @title PunksMarket contract
* @author @FrankPoncelet
*
*/
contract PunksMarket is AdminControl, Pausable , ReentrancyGuard{
IERC721 public punksWrapperContract; // instance of the Cryptopunks contract
ICryptoPunk public punkContract; // Instance of cryptopunk smart contract
struct Offer {
bool isForSale;
uint punkIndex;
address seller;
uint256 minValue; // in WEI
address onlySellTo;
}
struct Bid {
bool hasBid;
uint punkIndex;
address bidder;
uint256 value;
}
struct Punk {
bool wrapped;
address owner;
Bid bid;
Offer offer;
}
// keep track of the totale volume processed by this contract.
uint256 public totalVolume;
uint constant public TOTAL_PUNKS = 10000;
// A record of punks that are offered for sale at a specific minimum value, and perhaps to a specific person
mapping (uint => Offer) private punksOfferedForSale;
// A record of the highest punk bid
mapping (uint => Bid) private punkBids;
event PunkOffered(uint indexed punkIndex, uint minValue, address indexed toAddress);
event PunkBidEntered(uint indexed punkIndex, uint value, address indexed fromAddress);
event PunkBidWithdrawn(uint indexed punkIndex, uint value, address indexed fromAddress);
event PunkBought(uint indexed punkIndex, uint value, address indexed fromAddress, address indexed toAddress);
event PunkNoLongerForSale(uint indexed punkIndex);
/*
* Initializes contract with an instance of CryptoPunks Wrapper contract
*/
constructor() {
punksWrapperContract = IERC721(0x282BDD42f4eb70e7A9D9F40c8fEA0825B7f68C5D); // TODO change on deploy main net
punkContract = ICryptoPunk(0x6Ba6f2207e343923BA692e5Cae646Fb0F566DB8D); // TODO change on deploy main net
}
/* Allows the owner of the contract to set a new Cryptopunks WRAPPER contract address */
function setPunksWrapperContract(address newpunksAddress) public onlyOwner {
punksWrapperContract = IERC721(newpunksAddress);
}
/* Allows the owner of a CryptoPunks to stop offering it for sale */
function punkNoLongerForSale(uint punkIndex) public nonReentrant() {
require(punkIndex < 10000,"Token index not valid");
require(punksWrapperContract.ownerOf(punkIndex) == msg.sender,"you are not the owner of this token");
punksOfferedForSale[punkIndex] = Offer(false, punkIndex, msg.sender, 0, address(0x0));
emit PunkNoLongerForSale(punkIndex);
}
/* Allows a CryptoPunk owner to offer it for sale */
function offerPunkForSale(uint punkIndex, uint minSalePriceInWei) public whenNotPaused nonReentrant() {
require(punkIndex < 10000,"Token index not valid");
require(punksWrapperContract.ownerOf(punkIndex) == msg.sender,"you are not the owner of this token");
punksOfferedForSale[punkIndex] = Offer(true, punkIndex, msg.sender, minSalePriceInWei, address(0x0));
emit PunkOffered(punkIndex, minSalePriceInWei, address(0x0));
}
/* Allows a Cryptopunk owner to offer it for sale to a specific address */
function offerPunkForSaleToAddress(uint punkIndex, uint minSalePriceInWei, address toAddress) public whenNotPaused nonReentrant() {
require(punkIndex < 10000,"Token index not valid");
require(punksWrapperContract.ownerOf(punkIndex) == msg.sender,"you are not the owner of this token");
punksOfferedForSale[punkIndex] = Offer(true, punkIndex, msg.sender, minSalePriceInWei, toAddress);
emit PunkOffered(punkIndex, minSalePriceInWei, toAddress);
}
/* Allows users to buy a Cryptopunk offered for sale */
function buyPunk(uint punkIndex) payable public whenNotPaused nonReentrant() {
require(punkIndex < 10000,"Token index not valid");
Offer memory offer = punksOfferedForSale[punkIndex];
require (offer.isForSale,"Punk is not for sale"); // punk not actually for sale
require (offer.onlySellTo == address(0x0) || offer.onlySellTo == msg.sender,"Private sale.") ;
require (msg.value >= offer.minValue,"Not enough ether send"); // Didn't send enough ETH
address seller = offer.seller;
require (seller == punksWrapperContract.ownerOf(punkIndex),'seller no longer owner of punk'); // Seller no longer owner of punk
punksOfferedForSale[punkIndex] = Offer(false, punkIndex, msg.sender, 0, address(0x0));
_withdraw(seller,msg.value);
totalVolume += msg.value;
punksWrapperContract.safeTransferFrom(seller, msg.sender, punkIndex);
emit PunkBought(punkIndex, msg.value, seller, msg.sender);
// Check for the case where there is a bid from the new owner and refund it.
// Any other bid can stay in place.
Bid memory bid = punkBids[punkIndex];
if (bid.bidder == msg.sender) {
// Kill bid and refund value
_withdraw(msg.sender,bid.value);
punkBids[punkIndex] = Bid(false, punkIndex, address(0x0), 0);
}
}
/* Allows users to enter bids for any Cryptopunk */
function enterBidForPunk(uint punkIndex) payable public whenNotPaused nonReentrant() {
require(punkIndex < 10000,"Token index not valid");
require (punksWrapperContract.ownerOf(punkIndex) != msg.sender,"You already own this punk");
require (msg.value > 0,"Cannot enter bid of zero");
Bid memory existing = punkBids[punkIndex];
require (msg.value > existing.value,"your bid is too low");
if (existing.value > 0) {
// Refund the failing bid
_withdraw(existing.bidder,existing.value);
}
punkBids[punkIndex] = Bid(true, punkIndex, msg.sender, msg.value);
emit PunkBidEntered(punkIndex, msg.value, msg.sender);
}
/* Allows Cryptopunk owners to accept bids for their punks */
function acceptBidForPunk(uint punkIndex, uint minPrice) public whenNotPaused nonReentrant() {
require(punkIndex < 10000,"Token index not valid");
require(punksWrapperContract.ownerOf(punkIndex) == msg.sender,'you are not the owner of this token');
address seller = msg.sender;
Bid memory bid = punkBids[punkIndex];
require(bid.hasBid == true,"Punk has no bid");
require (bid.value >= minPrice,"The bid is too low");
address bidder = bid.bidder;
punksOfferedForSale[punkIndex] = Offer(false, punkIndex, bidder, 0, address(0x0));
uint amount = bid.value;
punkBids[punkIndex] = Bid(false, punkIndex, address(0x0), 0);
_withdraw(seller,amount);
totalVolume += amount;
punksWrapperContract.safeTransferFrom(msg.sender, bidder, punkIndex);
emit PunkBought(punkIndex, bid.value, seller, bidder);
}
/* Allows bidders to withdraw their bids */
function withdrawBidForPunk(uint punkIndex) public nonReentrant() {
require(punkIndex < 10000,"token index not valid");
Bid memory bid = punkBids[punkIndex];
require (bid.bidder == msg.sender,"The bidder is not message sender");
emit PunkBidWithdrawn(punkIndex, bid.value, msg.sender);
uint amount = bid.value;
punkBids[punkIndex] = Bid(false, punkIndex, address(0x0), 0);
// Refund the bid money
_withdraw(msg.sender,amount);
}
///////// Website only methods ////////////
function getBid(uint punkIndex) external view returns (Bid memory){
return punkBids[punkIndex];
}
function getOffer(uint punkIndex) external view returns (Offer memory){
return punksOfferedForSale[punkIndex];
}
/**
* Returns offer, bid and owner data for a specific punk.
*/
function getPunksDetails(uint index) external view returns (Punk memory) {
address owner = punkContract.punkIndexToAddress(index);
bool wrapper = false;
if (owner==address(punksWrapperContract)){
owner = punksWrapperContract.ownerOf(index);
wrapper = true;
}
Punk memory punks=Punk(wrapper,owner,punkBids[index],punksOfferedForSale[index]);
return punks;
}
/**
* Returns the id's of all wrapped punks.
*/
function getAllWrappedPunks() external view returns (int[] memory){
int[] memory ids = new int[](TOTAL_PUNKS);
for (uint i=0; i<TOTAL_PUNKS; i++) {
ids[i]= 11111;
}
uint256 j =0;
for (uint256 i=0; i<TOTAL_PUNKS; i++) {
if ( punkContract.punkIndexToAddress(i) == address(punksWrapperContract)) {
ids[j] = int(i);
j++;
}
}
return ids;
}
/**
* Returns the id's of the UNWRAPPED punks for an address
*/
function getPunksForAddress(address user) external view returns(uint256[] memory) {
uint256[] memory punks = new uint256[](punkContract.balanceOf(user));
uint256 j =0;
for (uint256 i=0; i<TOTAL_PUNKS; i++) {
if ( punkContract.punkIndexToAddress(i) == user ) {
punks[j] = i;
j++;
}
}
return punks;
}
/**
* Returns the id's of the WRAPPED punks for an address
*/
function getWrappedPunksForAddress(address user) external view returns(uint256[] memory) {
uint256[] memory punks = new uint256[](punksWrapperContract.balanceOf(user));
uint256 j =0;
for (uint256 i=0; i<TOTAL_PUNKS; i++) {
try punksWrapperContract.ownerOf(i) returns (address owner){
if ( owner == user ) {
punks[j] = i;
j++;
}
} catch {
// ignore
}
}
return punks;
}
////////// safe withdraw method //////////
function _withdraw(address _address, uint256 _amount) private {
(bool success, ) = _address.call{ value: _amount }("");
require(success, "Failed to send Ether");
}
////////// Contract safety, emergency methods////////
/**
* Allow the CONTRACT owner/admin to return a bid.
*/
function returnBid(uint punkIndex) public adminRequired {
Bid memory bid = punkBids[punkIndex];
uint amount = bid.value;
address bidder = bid.bidder;
punkBids[punkIndex] = Bid(false, punkIndex, address(0x0), 0);
emit PunkBidWithdrawn(punkIndex, amount, bidder);
_withdraw(bidder,amount);
}
/**
* Allow the CONTRACT owner/admin to END an offer.
*/
function revokeSale(uint punkIndex) public adminRequired {
require(punkIndex < 10000,"Token index not valid");
punksOfferedForSale[punkIndex] = Offer(false, punkIndex, address(0x0), 0, address(0x0));
emit PunkNoLongerForSale(punkIndex);
}
/////////// pause methods /////////////
function pause() external onlyOwner {
_pause();
}
function unpause() external onlyOwner {
_unpause();
}
///////// contract can recieve Ether if needed//////
fallback() external payable { }
receive() external payable { }
}
interface ICryptoPunk {
function punkIndexToAddress(uint punkIndex) external view returns (address);
function buyPunk(uint punkIndex) external payable;
function transferPunk(address to, uint punkIndex) external;
function balanceOf(address) external view returns (uint);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;
/**
* Based one AdminControl from manifold.xyz, but simplified.
* @author @frankPoncelet
*/
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.4.0/contracts/utils/structs/EnumerableSet.sol";
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.4.0/contracts/access/Ownable.sol";
abstract contract AdminControl is Ownable {
using EnumerableSet for EnumerableSet.AddressSet;
event AdminApproved(address indexed account, address indexed sender);
event AdminRevoked(address indexed account, address indexed sender);
// Track registered admins
EnumerableSet.AddressSet private _admins;
/**
* @dev Only allows approved admins to call the specified function
*/
modifier adminRequired() {
require(owner() == msg.sender || _admins.contains(msg.sender), "AdminControl: Must be owner or admin");
_;
}
/**
* @dev See {IAdminControl-getAdmins}.
*/
function getAdmins() external view returns (address[] memory admins) {
admins = new address[](_admins.length());
for (uint i = 0; i < _admins.length(); i++) {
admins[i] = _admins.at(i);
}
return admins;
}
/**
* @dev See {IAdminControl-approveAdmin}.
*/
function approveAdmin(address admin) external onlyOwner {
if (!_admins.contains(admin)) {
emit AdminApproved(admin, msg.sender);
_admins.add(admin);
}
}
/**
* @dev See {IAdminControl-revokeAdmin}.
*/
function revokeAdmin(address admin) external onlyOwner {
if (_admins.contains(admin)) {
emit AdminRevoked(admin, msg.sender);
_admins.remove(admin);
}
}
/**
* @dev See {IAdminControl-isAdmin}.
*/
function isAdmin(address admin) public view returns (bool) {
return (owner() == admin || _admins.contains(admin));
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (security/ReentrancyGuard.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor() {
_status = _NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and making it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
// On the first call to nonReentrant, _notEntered will be true
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
// Any calls to nonReentrant after this point will fail
_status = _ENTERED;
_;
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = _NOT_ENTERED;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (security/Pausable.sol)
pragma solidity ^0.8.0;
import "../utils/Context.sol";
/**
* @dev Contract module which allows children to implement an emergency stop
* mechanism that can be triggered by an authorized account.
*
* This module is used through inheritance. It will make available the
* modifiers `whenNotPaused` and `whenPaused`, which can be applied to
* the functions of your contract. Note that they will not be pausable by
* simply including this module, only once the modifiers are put in place.
*/
abstract contract Pausable is Context {
/**
* @dev Emitted when the pause is triggered by `account`.
*/
event Paused(address account);
/**
* @dev Emitted when the pause is lifted by `account`.
*/
event Unpaused(address account);
bool private _paused;
/**
* @dev Initializes the contract in unpaused state.
*/
constructor() {
_paused = false;
}
/**
* @dev Returns true if the contract is paused, and false otherwise.
*/
function paused() public view virtual returns (bool) {
return _paused;
}
/**
* @dev Modifier to make a function callable only when the contract is not paused.
*
* Requirements:
*
* - The contract must not be paused.
*/
modifier whenNotPaused() {
require(!paused(), "Pausable: paused");
_;
}
/**
* @dev Modifier to make a function callable only when the contract is paused.
*
* Requirements:
*
* - The contract must be paused.
*/
modifier whenPaused() {
require(paused(), "Pausable: not paused");
_;
}
/**
* @dev Triggers stopped state.
*
* Requirements:
*
* - The contract must not be paused.
*/
function _pause() internal virtual whenNotPaused {
_paused = true;
emit Paused(_msgSender());
}
/**
* @dev Returns to normal state.
*
* Requirements:
*
* - The contract must be paused.
*/
function _unpause() internal virtual whenPaused {
_paused = false;
emit Unpaused(_msgSender());
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.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 () {
address msgSender = _msgSender();
_owner = msgSender;
emit OwnershipTransferred(address(0), msgSender);
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
emit OwnershipTransferred(_owner, address(0));
_owner = 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 {
require(newOwner != address(0), "Ownable: new owner is the zero address");
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "../../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`, 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 be 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: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
*
* 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 Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @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 caller.
*
* Emits an {ApprovalForAll} event.
*/
function setApprovalForAll(address operator, bool _approved) external;
/**
* @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);
/**
* @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;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.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);
}// SPDX-License-Identifier: MIT
pragma solidity ^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 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) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/structs/EnumerableSet.sol)
pragma solidity ^0.8.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`)
* and `uint256` (`UintSet`) are supported.
*/
library EnumerableSet {
// To implement this library for multiple types with as little code
// repetition as possible, we write it in terms of a generic Set type with
// bytes32 values.
// The Set implementation uses private functions, and user-facing
// implementations (such as AddressSet) are just wrappers around the
// underlying Set.
// This means that we can only create new EnumerableSets for types that fit
// in bytes32.
struct Set {
// Storage of set values
bytes32[] _values;
// Position of the value in the `values` array, plus 1 because index 0
// means a value is not in the set.
mapping(bytes32 => uint256) _indexes;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function _add(Set storage set, bytes32 value) private returns (bool) {
if (!_contains(set, value)) {
set._values.push(value);
// The value is stored at length-1, but we add 1 to all indexes
// and use 0 as a sentinel value
set._indexes[value] = set._values.length;
return true;
} else {
return false;
}
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function _remove(Set storage set, bytes32 value) private returns (bool) {
// We read and store the value's index to prevent multiple reads from the same storage slot
uint256 valueIndex = set._indexes[value];
if (valueIndex != 0) {
// Equivalent to contains(set, value)
// To delete an element from the _values array in O(1), we swap the element to delete with the last one in
// the array, and then remove the last element (sometimes called as 'swap and pop').
// This modifies the order of the array, as noted in {at}.
uint256 toDeleteIndex = valueIndex - 1;
uint256 lastIndex = set._values.length - 1;
if (lastIndex != toDeleteIndex) {
bytes32 lastvalue = set._values[lastIndex];
// Move the last value to the index where the value to delete is
set._values[toDeleteIndex] = lastvalue;
// Update the index for the moved value
set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex
}
// Delete the slot where the moved value was stored
set._values.pop();
// Delete the index for the deleted slot
delete set._indexes[value];
return true;
} else {
return false;
}
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function _contains(Set storage set, bytes32 value) private view returns (bool) {
return set._indexes[value] != 0;
}
/**
* @dev Returns the number of values on the set. O(1).
*/
function _length(Set storage set) private view returns (uint256) {
return set._values.length;
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function _at(Set storage set, uint256 index) private view returns (bytes32) {
return set._values[index];
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function _values(Set storage set) private view returns (bytes32[] memory) {
return set._values;
}
// Bytes32Set
struct Bytes32Set {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _add(set._inner, value);
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _remove(set._inner, value);
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
return _contains(set._inner, value);
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(Bytes32Set storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
return _at(set._inner, index);
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
return _values(set._inner);
}
// AddressSet
struct AddressSet {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(AddressSet storage set, address value) internal returns (bool) {
return _add(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(AddressSet storage set, address value) internal returns (bool) {
return _remove(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(AddressSet storage set, address value) internal view returns (bool) {
return _contains(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(AddressSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(AddressSet storage set, uint256 index) internal view returns (address) {
return address(uint160(uint256(_at(set._inner, index))));
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function values(AddressSet storage set) internal view returns (address[] memory) {
bytes32[] memory store = _values(set._inner);
address[] memory result;
assembly {
result := store
}
return result;
}
// UintSet
struct UintSet {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(UintSet storage set, uint256 value) internal returns (bool) {
return _add(set._inner, bytes32(value));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(UintSet storage set, uint256 value) internal returns (bool) {
return _remove(set._inner, bytes32(value));
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(UintSet storage set, uint256 value) internal view returns (bool) {
return _contains(set._inner, bytes32(value));
}
/**
* @dev Returns the number of values on the set. O(1).
*/
function length(UintSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(UintSet storage set, uint256 index) internal view returns (uint256) {
return uint256(_at(set._inner, index));
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function values(UintSet storage set) internal view returns (uint256[] memory) {
bytes32[] memory store = _values(set._inner);
uint256[] memory result;
assembly {
result := store
}
return result;
}
}{
"optimizer": {
"enabled": true,
"runs": 1000
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"AdminApproved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"AdminRevoked","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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"punkIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":true,"internalType":"address","name":"fromAddress","type":"address"}],"name":"PunkBidEntered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"punkIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":true,"internalType":"address","name":"fromAddress","type":"address"}],"name":"PunkBidWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"punkIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":true,"internalType":"address","name":"fromAddress","type":"address"},{"indexed":true,"internalType":"address","name":"toAddress","type":"address"}],"name":"PunkBought","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"punkIndex","type":"uint256"}],"name":"PunkNoLongerForSale","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"punkIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"minValue","type":"uint256"},{"indexed":true,"internalType":"address","name":"toAddress","type":"address"}],"name":"PunkOffered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"TOTAL_PUNKS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"punkIndex","type":"uint256"},{"internalType":"uint256","name":"minPrice","type":"uint256"}],"name":"acceptBidForPunk","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"name":"approveAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"punkIndex","type":"uint256"}],"name":"buyPunk","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"punkIndex","type":"uint256"}],"name":"enterBidForPunk","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"getAdmins","outputs":[{"internalType":"address[]","name":"admins","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllWrappedPunks","outputs":[{"internalType":"int256[]","name":"","type":"int256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"punkIndex","type":"uint256"}],"name":"getBid","outputs":[{"components":[{"internalType":"bool","name":"hasBid","type":"bool"},{"internalType":"uint256","name":"punkIndex","type":"uint256"},{"internalType":"address","name":"bidder","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"internalType":"struct PunksMarket.Bid","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"punkIndex","type":"uint256"}],"name":"getOffer","outputs":[{"components":[{"internalType":"bool","name":"isForSale","type":"bool"},{"internalType":"uint256","name":"punkIndex","type":"uint256"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"uint256","name":"minValue","type":"uint256"},{"internalType":"address","name":"onlySellTo","type":"address"}],"internalType":"struct PunksMarket.Offer","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getPunksDetails","outputs":[{"components":[{"internalType":"bool","name":"wrapped","type":"bool"},{"internalType":"address","name":"owner","type":"address"},{"components":[{"internalType":"bool","name":"hasBid","type":"bool"},{"internalType":"uint256","name":"punkIndex","type":"uint256"},{"internalType":"address","name":"bidder","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"internalType":"struct PunksMarket.Bid","name":"bid","type":"tuple"},{"components":[{"internalType":"bool","name":"isForSale","type":"bool"},{"internalType":"uint256","name":"punkIndex","type":"uint256"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"uint256","name":"minValue","type":"uint256"},{"internalType":"address","name":"onlySellTo","type":"address"}],"internalType":"struct PunksMarket.Offer","name":"offer","type":"tuple"}],"internalType":"struct PunksMarket.Punk","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getPunksForAddress","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getWrappedPunksForAddress","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"name":"isAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"punkIndex","type":"uint256"},{"internalType":"uint256","name":"minSalePriceInWei","type":"uint256"}],"name":"offerPunkForSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"punkIndex","type":"uint256"},{"internalType":"uint256","name":"minSalePriceInWei","type":"uint256"},{"internalType":"address","name":"toAddress","type":"address"}],"name":"offerPunkForSaleToAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"punkContract","outputs":[{"internalType":"contract ICryptoPunk","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"punkIndex","type":"uint256"}],"name":"punkNoLongerForSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"punksWrapperContract","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"punkIndex","type":"uint256"}],"name":"returnBid","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"name":"revokeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"punkIndex","type":"uint256"}],"name":"revokeSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newpunksAddress","type":"address"}],"name":"setPunksWrapperContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalVolume","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"punkIndex","type":"uint256"}],"name":"withdrawBidForPunk","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
608060405234801561001057600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506003805460ff191690556001600455600580546001600160a01b031990811673282bdd42f4eb70e7a9d9f40c8fea0825b7f68c5d1790915560068054909116736ba6f2207e343923ba692e5cae646fb0f566db8d179055613446806100b86000396000f3fe6080604052600436106101b95760003560e01c80636d73e669116100eb578063bf31196f1161008f578063e0a9311011610061578063e0a9311014610605578063f2fde38b14610625578063f6eeff1e14610645578063f97e48ee1461066557005b8063bf31196f1461058f578063c238d44a146105af578063c44193c3146105cf578063d28e0782146105ef57005b80638456cb59116100c85780638456cb591461051c5780638da5cb5b14610531578063979bc6381461054f578063adad561c1461056f57005b80636d73e669146104d4578063715018a6146104f45780638264fe981461050957005b80633c889e6f1161015d5780634a01a8b21161012f5780634a01a8b21461044b5780635470ecb4146104785780635c975abb146104985780635f81a57c146104b057005b80633c889e6f146102b25780633e6099c41461034b5780633f4ba83a146103835780634579268a1461039857005b806324d7806c1161019657806324d7806c146102205780632d3456701461025057806331ae450b14610270578063360ff31e1461029257005b8063091dbfd2146101c25780630bbadc43146101d557806323165b751461020057005b366101c057005b005b6101c06101d03660046130e0565b610685565b3480156101e157600080fd5b506101ea6109f4565b6040516101f791906130f9565b60405180910390f35b34801561020c57600080fd5b506101c061021b36600461313d565b610b37565b34801561022c57600080fd5b5061024061023b366004613174565b611069565b60405190151581526020016101f7565b34801561025c57600080fd5b506101c061026b366004613174565b6110a8565b34801561027c57600080fd5b50610285611158565b6040516101f79190613191565b34801561029e57600080fd5b506101ea6102ad366004613174565b611207565b3480156102be57600080fd5b5061033e6102cd3660046130e0565b60408051608080820183526000808352602080840182905283850182905260609384018290529481526009855283902083519182018452805460ff161515825260018101549482019490945260028401546001600160a01b0316928101929092526003909201549181019190915290565b6040516101f791906131d2565b34801561035757600080fd5b5060055461036b906001600160a01b031681565b6040516001600160a01b0390911681526020016101f7565b34801561038f57600080fd5b506101c0611391565b3480156103a457600080fd5b5061043e6103b33660046130e0565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915250600090815260086020908152604091829020825160a081018452815460ff161515815260018201549281019290925260028101546001600160a01b03908116938301939093526003810154606083015260040154909116608082015290565b6040516101f79190613208565b34801561045757600080fd5b5061046b6104663660046130e0565b6113f5565b6040516101f79190613252565b34801561048457600080fd5b506101ea610493366004613174565b611623565b3480156104a457600080fd5b5060035460ff16610240565b3480156104bc57600080fd5b506104c660075481565b6040519081526020016101f7565b3480156104e057600080fd5b506101c06104ef366004613174565b6117b0565b34801561050057600080fd5b506101c061185a565b6101c06105173660046130e0565b6118fe565b34801561052857600080fd5b506101c0611e68565b34801561053d57600080fd5b506000546001600160a01b031661036b565b34801561055b57600080fd5b506101c061056a3660046130e0565b611eca565b34801561057b57600080fd5b506101c061058a366004613174565b6120e1565b34801561059b57600080fd5b506101c06105aa3660046132ff565b61215d565b3480156105bb57600080fd5b506101c06105ca3660046130e0565b6123e2565b3480156105db57600080fd5b506101c06105ea36600461313d565b612566565b3480156105fb57600080fd5b506104c661271081565b34801561061157600080fd5b506101c06106203660046130e0565b6127db565b34801561063157600080fd5b506101c0610640366004613174565b6129ed565b34801561065157600080fd5b506101c06106603660046130e0565b612b1e565b34801561067157600080fd5b5060065461036b906001600160a01b031681565b60035460ff16156106d05760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064015b60405180910390fd5b600260045414156107235760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106c7565b600260045561271081106107715760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881a5b99195e081b9bdd081d985b1a59605a1b60448201526064016106c7565b6005546040516331a9108f60e11b81526004810183905233916001600160a01b031690636352211e90602401602060405180830381865afa1580156107ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107de9190613338565b6001600160a01b031614156108355760405162461bcd60e51b815260206004820152601960248201527f596f7520616c7265616479206f776e20746869732070756e6b0000000000000060448201526064016106c7565b600034116108855760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420656e74657220626964206f66207a65726f000000000000000060448201526064016106c7565b6000818152600960209081526040918290208251608081018452815460ff161515815260018201549281019290925260028101546001600160a01b0316928201929092526003909101546060820181905234116109245760405162461bcd60e51b815260206004820152601360248201527f796f75722062696420697320746f6f206c6f770000000000000000000000000060448201526064016106c7565b6060810151156109405761094081604001518260600151612d49565b604080516080810182526001808252602080830186815233848601818152346060870181815260008b8152600987528990209751885460ff1916901515178855935195870195909555516002860180546001600160a01b0319166001600160a01b0390921691909117905590516003909401939093559251908152909184917f5b859394fabae0c1ba88baffe67e751ab5248d2e879028b8c8d6897b0519f56a91015b60405180910390a350506001600455565b604080516127108082526204e220820190925260609160009190602082016204e2008036833701905050905060005b612710811015610a5f57612b67828281518110610a4257610a4261336b565b602090810291909101015280610a5781613397565b915050610a23565b506000805b612710811015610b2f57600554600654604051630b02f02d60e31b8152600481018490526001600160a01b039283169290911690635817816890602401602060405180830381865afa158015610abe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ae29190613338565b6001600160a01b03161415610b1d5780838381518110610b0457610b0461336b565b602090810291909101015281610b1981613397565b9250505b80610b2781613397565b915050610a64565b509092915050565b60035460ff1615610b7d5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016106c7565b60026004541415610bd05760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106c7565b60026004556127108210610c1e5760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881a5b99195e081b9bdd081d985b1a59605a1b60448201526064016106c7565b6005546040516331a9108f60e11b81526004810184905233916001600160a01b031690636352211e90602401602060405180830381865afa158015610c67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c8b9190613338565b6001600160a01b031614610ced5760405162461bcd60e51b815260206004820152602360248201527f796f7520617265206e6f7420746865206f776e6572206f66207468697320746f60448201526235b2b760e91b60648201526084016106c7565b6000828152600960209081526040918290208251608081018452815460ff1615158082526001808401549483019490945260028301546001600160a01b03169482019490945260039091015460608201523392909114610d8f5760405162461bcd60e51b815260206004820152600f60248201527f50756e6b20686173206e6f20626964000000000000000000000000000000000060448201526064016106c7565b8281606001511015610de35760405162461bcd60e51b815260206004820152601260248201527f5468652062696420697320746f6f206c6f77000000000000000000000000000060448201526064016106c7565b6000816040015190506040518060a00160405280600015158152602001868152602001826001600160a01b031681526020016000815260200160006001600160a01b03168152506008600087815260200190815260200160002060008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506060820151816003015560808201518160040160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550905050600082606001519050604051806080016040528060001515815260200187815260200160006001600160a01b0316815260200160008152506009600088815260200190815260200160002060008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060608201518160030155905050610f878482612d49565b8060076000828254610f9991906133b2565b9091555050600554604051632142170760e11b81523360048201526001600160a01b03848116602483015260448201899052909116906342842e0e90606401600060405180830381600087803b158015610ff257600080fd5b505af1158015611006573d6000803e3d6000fd5b50505050816001600160a01b0316846001600160a01b0316877f58e5d5a525e3b40bc15abaa38b5882678db1ee68befd2f60bafe3a7fd06db9e3866060015160405161105491815260200190565b60405180910390a45050600160045550505050565b6000816001600160a01b03166110876000546001600160a01b031690565b6001600160a01b031614806110a257506110a2600183612df1565b92915050565b6000546001600160a01b031633146111025760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106c7565b61110d600182612df1565b156111555760405133906001600160a01b038316907f7c0c3c84c67c85fcac635147348bfe374c24a1a93d0366d1cfe9d8853cbf89d590600090a3611153600182612e16565b505b50565b60606111646001612e2b565b67ffffffffffffffff81111561117c5761117c613355565b6040519080825280602002602001820160405280156111a5578160200160208202803683370190505b50905060005b6111b56001612e2b565b811015611203576111c7600182612e35565b8282815181106111d9576111d961336b565b6001600160a01b0390921660209283029190910190910152806111fb81613397565b9150506111ab565b5090565b6006546040516370a0823160e01b81526001600160a01b0383811660048301526060926000929116906370a0823190602401602060405180830381865afa158015611256573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061127a91906133ca565b67ffffffffffffffff81111561129257611292613355565b6040519080825280602002602001820160405280156112bb578160200160208202803683370190505b5090506000805b61271081101561138857600654604051630b02f02d60e31b8152600481018390526001600160a01b03878116921690635817816890602401602060405180830381865afa158015611317573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133b9190613338565b6001600160a01b03161415611376578083838151811061135d5761135d61336b565b60209081029190910101528161137281613397565b9250505b8061138081613397565b9150506112c2565b50909392505050565b6000546001600160a01b031633146113eb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106c7565b6113f3612e41565b565b6114606040805160808082018352600080835260208084018290528451928301855281835282018190528184018190526060820152909182019081526040805160a0810182526000808252602082810182905292820181905260608201819052608082015291015290565b600654604051630b02f02d60e31b8152600481018490526000916001600160a01b031690635817816890602401602060405180830381865afa1580156114aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ce9190613338565b6005549091506000906001600160a01b038084169116141561155e576005546040516331a9108f60e11b8152600481018690526001600160a01b0390911690636352211e90602401602060405180830381865afa158015611533573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115579190613338565b9150600190505b604080516080808201835292151581526001600160a01b0393841660208083019190915260008781526009825283812084518087018652815460ff90811615158252600180840154838701526002808501548b16848a0152600394850154606080860191909152888a01949094529b85526008865293879020875160a081018952815490921615158252938401549481019490945298820154871694830194909452928301548188015260049092015490931691810191909152928101929092525090565b6005546040516370a0823160e01b81526001600160a01b0383811660048301526060926000929116906370a0823190602401602060405180830381865afa158015611672573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061169691906133ca565b67ffffffffffffffff8111156116ae576116ae613355565b6040519080825280602002602001820160405280156116d7578160200160208202803683370190505b5090506000805b612710811015611388576005546040516331a9108f60e11b8152600481018390526001600160a01b0390911690636352211e90602401602060405180830381865afa92505050801561174d575060408051601f3d908101601f1916820190925261174a91810190613338565b60015b6117565761179e565b856001600160a01b0316816001600160a01b0316141561179c57818484815181106117835761178361336b565b60209081029190910101528261179881613397565b9350505b505b806117a881613397565b9150506116de565b6000546001600160a01b0316331461180a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106c7565b611815600182612df1565b6111555760405133906001600160a01b038316907f7e1a1a08d52e4ba0e21554733d66165fd5151f99460116223d9e3a608eec5cb190600090a3611153600182612edd565b6000546001600160a01b031633146118b45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106c7565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60035460ff16156119445760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016106c7565b600260045414156119975760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106c7565b600260045561271081106119e55760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881a5b99195e081b9bdd081d985b1a59605a1b60448201526064016106c7565b600081815260086020908152604091829020825160a081018452815460ff16151580825260018301549382019390935260028201546001600160a01b0390811694820194909452600382015460608201526004909101549092166080830152611a905760405162461bcd60e51b815260206004820152601460248201527f50756e6b206973206e6f7420666f722073616c6500000000000000000000000060448201526064016106c7565b60808101516001600160a01b03161580611ab6575060808101516001600160a01b031633145b611b025760405162461bcd60e51b815260206004820152600d60248201527f507269766174652073616c652e0000000000000000000000000000000000000060448201526064016106c7565b8060600151341015611b565760405162461bcd60e51b815260206004820152601560248201527f4e6f7420656e6f7567682065746865722073656e64000000000000000000000060448201526064016106c7565b60408181015160055491516331a9108f60e11b81526004810185905290916001600160a01b031690636352211e90602401602060405180830381865afa158015611ba4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bc89190613338565b6001600160a01b0316816001600160a01b031614611c285760405162461bcd60e51b815260206004820152601e60248201527f73656c6c6572206e6f206c6f6e676572206f776e6572206f662070756e6b000060448201526064016106c7565b6040805160a081018252600080825260208083018781523384860190815260608501848152608086018581528a86526008909452959093209351845460ff191690151517845551600184015590516002830180546001600160a01b03199081166001600160a01b0393841617909155935160038401559051600490920180549093169116179055611cb98134612d49565b3460076000828254611ccb91906133b2565b9091555050600554604051632142170760e11b81526001600160a01b03838116600483015233602483015260448201869052909116906342842e0e90606401600060405180830381600087803b158015611d2457600080fd5b505af1158015611d38573d6000803e3d6000fd5b50505050336001600160a01b0316816001600160a01b0316847f58e5d5a525e3b40bc15abaa38b5882678db1ee68befd2f60bafe3a7fd06db9e334604051611d8291815260200190565b60405180910390a46000838152600960209081526040918290208251608081018452815460ff161515815260018201549281019290925260028101546001600160a01b031692820183905260030154606082015290331415611e5d57611dec338260600151612d49565b6040805160808101825260008082526020808301888152838501838152606085018481528a85526009909352949092209251835460ff19169015151783559051600183015591516002820180546001600160a01b0319166001600160a01b0390921691909117905590516003909101555b505060016004555050565b6000546001600160a01b03163314611ec25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106c7565b6113f3612ef2565b60026004541415611f1d5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106c7565b60026004556127108110611f735760405162461bcd60e51b815260206004820152601560248201527f746f6b656e20696e646578206e6f742076616c6964000000000000000000000060448201526064016106c7565b6000818152600960209081526040918290208251608081018452815460ff161515815260018201549281019290925260028101546001600160a01b031692820183905260030154606082015290331461200e5760405162461bcd60e51b815260206004820181905260248201527f54686520626964646572206973206e6f74206d6573736167652073656e64657260448201526064016106c7565b336001600160a01b0316827f6f30e1ee4d81dcc7a8a478577f65d2ed2edb120565960ac45fe7c50551c87932836060015160405161204e91815260200190565b60405180910390a360608181015160408051608081018252600080825260208083018881528385018381529684018381528984526009909252939091209151825460ff19169015151782559151600182015592516002840180546001600160a01b0319166001600160a01b03909216919091179055516003909201919091556120d73382612d49565b5050600160045550565b6000546001600160a01b0316331461213b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106c7565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b60035460ff16156121a35760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016106c7565b600260045414156121f65760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106c7565b600260045561271083106122445760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881a5b99195e081b9bdd081d985b1a59605a1b60448201526064016106c7565b6005546040516331a9108f60e11b81526004810185905233916001600160a01b031690636352211e90602401602060405180830381865afa15801561228d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122b19190613338565b6001600160a01b0316146123135760405162461bcd60e51b815260206004820152602360248201527f796f7520617265206e6f7420746865206f776e6572206f66207468697320746f60448201526235b2b760e91b60648201526084016106c7565b6040805160a0810182526001808252602080830187815233848601908152606085018881526001600160a01b038881166080880181815260008d8152600888528a90209851895460ff191690151517895594519688019690965591516002870180546001600160a01b031990811692851692909217905590516003870155915160049095018054909216941693909317909255915184815285917f3c7b682d5da98001a9b8cbda6c647d2c63d698a4184fd1d55e2ce7b66f5d21eb910160405180910390a35050600160045550565b336123f56000546001600160a01b031690565b6001600160a01b031614806124105750612410600133612df1565b6124685760405162461bcd60e51b8152602060048201526024808201527f41646d696e436f6e74726f6c3a204d757374206265206f776e6572206f7220616044820152633236b4b760e11b60648201526084016106c7565b61271081106124b15760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881a5b99195e081b9bdd081d985b1a59605a1b60448201526064016106c7565b6040805160a08101825260008082526020808301858152838501838152606085018481526080860185815288865260089094528685209551865460ff191690151517865591516001860155516002850180546001600160a01b03199081166001600160a01b0393841617909155915160038601559151600490940180549091169390911692909217909155905182917fb0e0a660b4e50f26f0b7ce75c24655fc76cc66e3334a54ff410277229fa10bd491a250565b60035460ff16156125ac5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016106c7565b600260045414156125ff5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106c7565b6002600455612710821061264d5760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881a5b99195e081b9bdd081d985b1a59605a1b60448201526064016106c7565b6005546040516331a9108f60e11b81526004810184905233916001600160a01b031690636352211e90602401602060405180830381865afa158015612696573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126ba9190613338565b6001600160a01b03161461271c5760405162461bcd60e51b815260206004820152602360248201527f796f7520617265206e6f7420746865206f776e6572206f66207468697320746f60448201526235b2b760e91b60648201526084016106c7565b6040805160a0810182526001808252602080830186815233848601908152606085018781526000608087018181528a8252600886528882209751885460ff191690151517885593519587019590955590516002860180546001600160a01b03199081166001600160a01b0393841617909155915160038701559151600490950180549091169490911693909317909255915183815284917f3c7b682d5da98001a9b8cbda6c647d2c63d698a4184fd1d55e2ce7b66f5d21eb91016109e3565b336127ee6000546001600160a01b031690565b6001600160a01b031614806128095750612809600133612df1565b6128615760405162461bcd60e51b8152602060048201526024808201527f41646d696e436f6e74726f6c3a204d757374206265206f776e6572206f7220616044820152633236b4b760e11b60648201526084016106c7565b6000600960008381526020019081526020016000206040518060800160405290816000820160009054906101000a900460ff16151515158152602001600182015481526020016002820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016003820154815250509050600081606001519050600082604001519050604051806080016040528060001515815260200185815260200160006001600160a01b0316815260200160008152506009600086815260200190815260200160002060008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060608201518160030155905050806001600160a01b0316847f6f30e1ee4d81dcc7a8a478577f65d2ed2edb120565960ac45fe7c50551c87932846040516129d591815260200190565b60405180910390a36129e78183612d49565b50505050565b6000546001600160a01b03163314612a475760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106c7565b6001600160a01b038116612ac35760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016106c7565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60026004541415612b715760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106c7565b60026004556127108110612bbf5760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881a5b99195e081b9bdd081d985b1a59605a1b60448201526064016106c7565b6005546040516331a9108f60e11b81526004810183905233916001600160a01b031690636352211e90602401602060405180830381865afa158015612c08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c2c9190613338565b6001600160a01b031614612c8e5760405162461bcd60e51b815260206004820152602360248201527f796f7520617265206e6f7420746865206f776e6572206f66207468697320746f60448201526235b2b760e91b60648201526084016106c7565b6040805160a0810182526000808252602080830185815233848601908152606085018481526080860185815288865260089094528685209551865460ff191690151517865591516001860155516002850180546001600160a01b03199081166001600160a01b0393841617909155915160038601559151600490940180549091169390911692909217909155905182917fb0e0a660b4e50f26f0b7ce75c24655fc76cc66e3334a54ff410277229fa10bd491a2506001600455565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612d96576040519150601f19603f3d011682016040523d82523d6000602084013e612d9b565b606091505b5050905080612dec5760405162461bcd60e51b815260206004820152601460248201527f4661696c656420746f2073656e6420457468657200000000000000000000000060448201526064016106c7565b505050565b6001600160a01b038116600090815260018301602052604081205415155b9392505050565b6000612e0f836001600160a01b038416612f6d565b60006110a2825490565b6000612e0f8383613067565b60035460ff16612e935760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f742070617573656400000000000000000000000060448201526064016106c7565b6003805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6000612e0f836001600160a01b038416613091565b60035460ff1615612f385760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016106c7565b6003805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612ec03390565b60008181526001830160205260408120548015613056576000612f916001836133e3565b8554909150600090612fa5906001906133e3565b905081811461300a576000866000018281548110612fc557612fc561336b565b9060005260206000200154905080876000018481548110612fe857612fe861336b565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061301b5761301b6133fa565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506110a2565b60009150506110a2565b5092915050565b600082600001828154811061307e5761307e61336b565b9060005260206000200154905092915050565b60008181526001830160205260408120546130d8575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556110a2565b5060006110a2565b6000602082840312156130f257600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b8181101561313157835183529284019291840191600101613115565b50909695505050505050565b6000806040838503121561315057600080fd5b50508035926020909101359150565b6001600160a01b038116811461115557600080fd5b60006020828403121561318657600080fd5b8135612e0f8161315f565b6020808252825182820181905260009190848201906040850190845b818110156131315783516001600160a01b0316835292840192918401916001016131ad565b815115158152602080830151908201526040808301516001600160a01b03169082015260608083015190820152608081016110a2565b60a081016110a282848051151582526020810151602083015260408101516001600160a01b0380821660408501526060830151606085015280608084015116608085015250505050565b6000610160820190508251151582526001600160a01b03602084015116602083015260408301516132b26040840182805115158252602081015160208301526001600160a01b036040820151166040830152606081015160608301525050565b506060838101518051151560c0850152602081015160e085015260408101516001600160a01b03908116610100860152918101516101208501526080810151909116610140840152613060565b60008060006060848603121561331457600080fd5b8335925060208401359150604084013561332d8161315f565b809150509250925092565b60006020828403121561334a57600080fd5b8151612e0f8161315f565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156133ab576133ab613381565b5060010190565b600082198211156133c5576133c5613381565b500190565b6000602082840312156133dc57600080fd5b5051919050565b6000828210156133f5576133f5613381565b500390565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220a66b8ed14c3f2d59d2b8d5999ff008775aedc1f5dfc18a125cc61a03b6edaa6264736f6c634300080b0033
Deployed Bytecode
0x6080604052600436106101b95760003560e01c80636d73e669116100eb578063bf31196f1161008f578063e0a9311011610061578063e0a9311014610605578063f2fde38b14610625578063f6eeff1e14610645578063f97e48ee1461066557005b8063bf31196f1461058f578063c238d44a146105af578063c44193c3146105cf578063d28e0782146105ef57005b80638456cb59116100c85780638456cb591461051c5780638da5cb5b14610531578063979bc6381461054f578063adad561c1461056f57005b80636d73e669146104d4578063715018a6146104f45780638264fe981461050957005b80633c889e6f1161015d5780634a01a8b21161012f5780634a01a8b21461044b5780635470ecb4146104785780635c975abb146104985780635f81a57c146104b057005b80633c889e6f146102b25780633e6099c41461034b5780633f4ba83a146103835780634579268a1461039857005b806324d7806c1161019657806324d7806c146102205780632d3456701461025057806331ae450b14610270578063360ff31e1461029257005b8063091dbfd2146101c25780630bbadc43146101d557806323165b751461020057005b366101c057005b005b6101c06101d03660046130e0565b610685565b3480156101e157600080fd5b506101ea6109f4565b6040516101f791906130f9565b60405180910390f35b34801561020c57600080fd5b506101c061021b36600461313d565b610b37565b34801561022c57600080fd5b5061024061023b366004613174565b611069565b60405190151581526020016101f7565b34801561025c57600080fd5b506101c061026b366004613174565b6110a8565b34801561027c57600080fd5b50610285611158565b6040516101f79190613191565b34801561029e57600080fd5b506101ea6102ad366004613174565b611207565b3480156102be57600080fd5b5061033e6102cd3660046130e0565b60408051608080820183526000808352602080840182905283850182905260609384018290529481526009855283902083519182018452805460ff161515825260018101549482019490945260028401546001600160a01b0316928101929092526003909201549181019190915290565b6040516101f791906131d2565b34801561035757600080fd5b5060055461036b906001600160a01b031681565b6040516001600160a01b0390911681526020016101f7565b34801561038f57600080fd5b506101c0611391565b3480156103a457600080fd5b5061043e6103b33660046130e0565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915250600090815260086020908152604091829020825160a081018452815460ff161515815260018201549281019290925260028101546001600160a01b03908116938301939093526003810154606083015260040154909116608082015290565b6040516101f79190613208565b34801561045757600080fd5b5061046b6104663660046130e0565b6113f5565b6040516101f79190613252565b34801561048457600080fd5b506101ea610493366004613174565b611623565b3480156104a457600080fd5b5060035460ff16610240565b3480156104bc57600080fd5b506104c660075481565b6040519081526020016101f7565b3480156104e057600080fd5b506101c06104ef366004613174565b6117b0565b34801561050057600080fd5b506101c061185a565b6101c06105173660046130e0565b6118fe565b34801561052857600080fd5b506101c0611e68565b34801561053d57600080fd5b506000546001600160a01b031661036b565b34801561055b57600080fd5b506101c061056a3660046130e0565b611eca565b34801561057b57600080fd5b506101c061058a366004613174565b6120e1565b34801561059b57600080fd5b506101c06105aa3660046132ff565b61215d565b3480156105bb57600080fd5b506101c06105ca3660046130e0565b6123e2565b3480156105db57600080fd5b506101c06105ea36600461313d565b612566565b3480156105fb57600080fd5b506104c661271081565b34801561061157600080fd5b506101c06106203660046130e0565b6127db565b34801561063157600080fd5b506101c0610640366004613174565b6129ed565b34801561065157600080fd5b506101c06106603660046130e0565b612b1e565b34801561067157600080fd5b5060065461036b906001600160a01b031681565b60035460ff16156106d05760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064015b60405180910390fd5b600260045414156107235760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106c7565b600260045561271081106107715760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881a5b99195e081b9bdd081d985b1a59605a1b60448201526064016106c7565b6005546040516331a9108f60e11b81526004810183905233916001600160a01b031690636352211e90602401602060405180830381865afa1580156107ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107de9190613338565b6001600160a01b031614156108355760405162461bcd60e51b815260206004820152601960248201527f596f7520616c7265616479206f776e20746869732070756e6b0000000000000060448201526064016106c7565b600034116108855760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420656e74657220626964206f66207a65726f000000000000000060448201526064016106c7565b6000818152600960209081526040918290208251608081018452815460ff161515815260018201549281019290925260028101546001600160a01b0316928201929092526003909101546060820181905234116109245760405162461bcd60e51b815260206004820152601360248201527f796f75722062696420697320746f6f206c6f770000000000000000000000000060448201526064016106c7565b6060810151156109405761094081604001518260600151612d49565b604080516080810182526001808252602080830186815233848601818152346060870181815260008b8152600987528990209751885460ff1916901515178855935195870195909555516002860180546001600160a01b0319166001600160a01b0390921691909117905590516003909401939093559251908152909184917f5b859394fabae0c1ba88baffe67e751ab5248d2e879028b8c8d6897b0519f56a91015b60405180910390a350506001600455565b604080516127108082526204e220820190925260609160009190602082016204e2008036833701905050905060005b612710811015610a5f57612b67828281518110610a4257610a4261336b565b602090810291909101015280610a5781613397565b915050610a23565b506000805b612710811015610b2f57600554600654604051630b02f02d60e31b8152600481018490526001600160a01b039283169290911690635817816890602401602060405180830381865afa158015610abe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ae29190613338565b6001600160a01b03161415610b1d5780838381518110610b0457610b0461336b565b602090810291909101015281610b1981613397565b9250505b80610b2781613397565b915050610a64565b509092915050565b60035460ff1615610b7d5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016106c7565b60026004541415610bd05760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106c7565b60026004556127108210610c1e5760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881a5b99195e081b9bdd081d985b1a59605a1b60448201526064016106c7565b6005546040516331a9108f60e11b81526004810184905233916001600160a01b031690636352211e90602401602060405180830381865afa158015610c67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c8b9190613338565b6001600160a01b031614610ced5760405162461bcd60e51b815260206004820152602360248201527f796f7520617265206e6f7420746865206f776e6572206f66207468697320746f60448201526235b2b760e91b60648201526084016106c7565b6000828152600960209081526040918290208251608081018452815460ff1615158082526001808401549483019490945260028301546001600160a01b03169482019490945260039091015460608201523392909114610d8f5760405162461bcd60e51b815260206004820152600f60248201527f50756e6b20686173206e6f20626964000000000000000000000000000000000060448201526064016106c7565b8281606001511015610de35760405162461bcd60e51b815260206004820152601260248201527f5468652062696420697320746f6f206c6f77000000000000000000000000000060448201526064016106c7565b6000816040015190506040518060a00160405280600015158152602001868152602001826001600160a01b031681526020016000815260200160006001600160a01b03168152506008600087815260200190815260200160002060008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506060820151816003015560808201518160040160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550905050600082606001519050604051806080016040528060001515815260200187815260200160006001600160a01b0316815260200160008152506009600088815260200190815260200160002060008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060608201518160030155905050610f878482612d49565b8060076000828254610f9991906133b2565b9091555050600554604051632142170760e11b81523360048201526001600160a01b03848116602483015260448201899052909116906342842e0e90606401600060405180830381600087803b158015610ff257600080fd5b505af1158015611006573d6000803e3d6000fd5b50505050816001600160a01b0316846001600160a01b0316877f58e5d5a525e3b40bc15abaa38b5882678db1ee68befd2f60bafe3a7fd06db9e3866060015160405161105491815260200190565b60405180910390a45050600160045550505050565b6000816001600160a01b03166110876000546001600160a01b031690565b6001600160a01b031614806110a257506110a2600183612df1565b92915050565b6000546001600160a01b031633146111025760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106c7565b61110d600182612df1565b156111555760405133906001600160a01b038316907f7c0c3c84c67c85fcac635147348bfe374c24a1a93d0366d1cfe9d8853cbf89d590600090a3611153600182612e16565b505b50565b60606111646001612e2b565b67ffffffffffffffff81111561117c5761117c613355565b6040519080825280602002602001820160405280156111a5578160200160208202803683370190505b50905060005b6111b56001612e2b565b811015611203576111c7600182612e35565b8282815181106111d9576111d961336b565b6001600160a01b0390921660209283029190910190910152806111fb81613397565b9150506111ab565b5090565b6006546040516370a0823160e01b81526001600160a01b0383811660048301526060926000929116906370a0823190602401602060405180830381865afa158015611256573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061127a91906133ca565b67ffffffffffffffff81111561129257611292613355565b6040519080825280602002602001820160405280156112bb578160200160208202803683370190505b5090506000805b61271081101561138857600654604051630b02f02d60e31b8152600481018390526001600160a01b03878116921690635817816890602401602060405180830381865afa158015611317573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133b9190613338565b6001600160a01b03161415611376578083838151811061135d5761135d61336b565b60209081029190910101528161137281613397565b9250505b8061138081613397565b9150506112c2565b50909392505050565b6000546001600160a01b031633146113eb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106c7565b6113f3612e41565b565b6114606040805160808082018352600080835260208084018290528451928301855281835282018190528184018190526060820152909182019081526040805160a0810182526000808252602082810182905292820181905260608201819052608082015291015290565b600654604051630b02f02d60e31b8152600481018490526000916001600160a01b031690635817816890602401602060405180830381865afa1580156114aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ce9190613338565b6005549091506000906001600160a01b038084169116141561155e576005546040516331a9108f60e11b8152600481018690526001600160a01b0390911690636352211e90602401602060405180830381865afa158015611533573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115579190613338565b9150600190505b604080516080808201835292151581526001600160a01b0393841660208083019190915260008781526009825283812084518087018652815460ff90811615158252600180840154838701526002808501548b16848a0152600394850154606080860191909152888a01949094529b85526008865293879020875160a081018952815490921615158252938401549481019490945298820154871694830194909452928301548188015260049092015490931691810191909152928101929092525090565b6005546040516370a0823160e01b81526001600160a01b0383811660048301526060926000929116906370a0823190602401602060405180830381865afa158015611672573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061169691906133ca565b67ffffffffffffffff8111156116ae576116ae613355565b6040519080825280602002602001820160405280156116d7578160200160208202803683370190505b5090506000805b612710811015611388576005546040516331a9108f60e11b8152600481018390526001600160a01b0390911690636352211e90602401602060405180830381865afa92505050801561174d575060408051601f3d908101601f1916820190925261174a91810190613338565b60015b6117565761179e565b856001600160a01b0316816001600160a01b0316141561179c57818484815181106117835761178361336b565b60209081029190910101528261179881613397565b9350505b505b806117a881613397565b9150506116de565b6000546001600160a01b0316331461180a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106c7565b611815600182612df1565b6111555760405133906001600160a01b038316907f7e1a1a08d52e4ba0e21554733d66165fd5151f99460116223d9e3a608eec5cb190600090a3611153600182612edd565b6000546001600160a01b031633146118b45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106c7565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60035460ff16156119445760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016106c7565b600260045414156119975760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106c7565b600260045561271081106119e55760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881a5b99195e081b9bdd081d985b1a59605a1b60448201526064016106c7565b600081815260086020908152604091829020825160a081018452815460ff16151580825260018301549382019390935260028201546001600160a01b0390811694820194909452600382015460608201526004909101549092166080830152611a905760405162461bcd60e51b815260206004820152601460248201527f50756e6b206973206e6f7420666f722073616c6500000000000000000000000060448201526064016106c7565b60808101516001600160a01b03161580611ab6575060808101516001600160a01b031633145b611b025760405162461bcd60e51b815260206004820152600d60248201527f507269766174652073616c652e0000000000000000000000000000000000000060448201526064016106c7565b8060600151341015611b565760405162461bcd60e51b815260206004820152601560248201527f4e6f7420656e6f7567682065746865722073656e64000000000000000000000060448201526064016106c7565b60408181015160055491516331a9108f60e11b81526004810185905290916001600160a01b031690636352211e90602401602060405180830381865afa158015611ba4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bc89190613338565b6001600160a01b0316816001600160a01b031614611c285760405162461bcd60e51b815260206004820152601e60248201527f73656c6c6572206e6f206c6f6e676572206f776e6572206f662070756e6b000060448201526064016106c7565b6040805160a081018252600080825260208083018781523384860190815260608501848152608086018581528a86526008909452959093209351845460ff191690151517845551600184015590516002830180546001600160a01b03199081166001600160a01b0393841617909155935160038401559051600490920180549093169116179055611cb98134612d49565b3460076000828254611ccb91906133b2565b9091555050600554604051632142170760e11b81526001600160a01b03838116600483015233602483015260448201869052909116906342842e0e90606401600060405180830381600087803b158015611d2457600080fd5b505af1158015611d38573d6000803e3d6000fd5b50505050336001600160a01b0316816001600160a01b0316847f58e5d5a525e3b40bc15abaa38b5882678db1ee68befd2f60bafe3a7fd06db9e334604051611d8291815260200190565b60405180910390a46000838152600960209081526040918290208251608081018452815460ff161515815260018201549281019290925260028101546001600160a01b031692820183905260030154606082015290331415611e5d57611dec338260600151612d49565b6040805160808101825260008082526020808301888152838501838152606085018481528a85526009909352949092209251835460ff19169015151783559051600183015591516002820180546001600160a01b0319166001600160a01b0390921691909117905590516003909101555b505060016004555050565b6000546001600160a01b03163314611ec25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106c7565b6113f3612ef2565b60026004541415611f1d5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106c7565b60026004556127108110611f735760405162461bcd60e51b815260206004820152601560248201527f746f6b656e20696e646578206e6f742076616c6964000000000000000000000060448201526064016106c7565b6000818152600960209081526040918290208251608081018452815460ff161515815260018201549281019290925260028101546001600160a01b031692820183905260030154606082015290331461200e5760405162461bcd60e51b815260206004820181905260248201527f54686520626964646572206973206e6f74206d6573736167652073656e64657260448201526064016106c7565b336001600160a01b0316827f6f30e1ee4d81dcc7a8a478577f65d2ed2edb120565960ac45fe7c50551c87932836060015160405161204e91815260200190565b60405180910390a360608181015160408051608081018252600080825260208083018881528385018381529684018381528984526009909252939091209151825460ff19169015151782559151600182015592516002840180546001600160a01b0319166001600160a01b03909216919091179055516003909201919091556120d73382612d49565b5050600160045550565b6000546001600160a01b0316331461213b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106c7565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b60035460ff16156121a35760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016106c7565b600260045414156121f65760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106c7565b600260045561271083106122445760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881a5b99195e081b9bdd081d985b1a59605a1b60448201526064016106c7565b6005546040516331a9108f60e11b81526004810185905233916001600160a01b031690636352211e90602401602060405180830381865afa15801561228d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122b19190613338565b6001600160a01b0316146123135760405162461bcd60e51b815260206004820152602360248201527f796f7520617265206e6f7420746865206f776e6572206f66207468697320746f60448201526235b2b760e91b60648201526084016106c7565b6040805160a0810182526001808252602080830187815233848601908152606085018881526001600160a01b038881166080880181815260008d8152600888528a90209851895460ff191690151517895594519688019690965591516002870180546001600160a01b031990811692851692909217905590516003870155915160049095018054909216941693909317909255915184815285917f3c7b682d5da98001a9b8cbda6c647d2c63d698a4184fd1d55e2ce7b66f5d21eb910160405180910390a35050600160045550565b336123f56000546001600160a01b031690565b6001600160a01b031614806124105750612410600133612df1565b6124685760405162461bcd60e51b8152602060048201526024808201527f41646d696e436f6e74726f6c3a204d757374206265206f776e6572206f7220616044820152633236b4b760e11b60648201526084016106c7565b61271081106124b15760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881a5b99195e081b9bdd081d985b1a59605a1b60448201526064016106c7565b6040805160a08101825260008082526020808301858152838501838152606085018481526080860185815288865260089094528685209551865460ff191690151517865591516001860155516002850180546001600160a01b03199081166001600160a01b0393841617909155915160038601559151600490940180549091169390911692909217909155905182917fb0e0a660b4e50f26f0b7ce75c24655fc76cc66e3334a54ff410277229fa10bd491a250565b60035460ff16156125ac5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016106c7565b600260045414156125ff5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106c7565b6002600455612710821061264d5760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881a5b99195e081b9bdd081d985b1a59605a1b60448201526064016106c7565b6005546040516331a9108f60e11b81526004810184905233916001600160a01b031690636352211e90602401602060405180830381865afa158015612696573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126ba9190613338565b6001600160a01b03161461271c5760405162461bcd60e51b815260206004820152602360248201527f796f7520617265206e6f7420746865206f776e6572206f66207468697320746f60448201526235b2b760e91b60648201526084016106c7565b6040805160a0810182526001808252602080830186815233848601908152606085018781526000608087018181528a8252600886528882209751885460ff191690151517885593519587019590955590516002860180546001600160a01b03199081166001600160a01b0393841617909155915160038701559151600490950180549091169490911693909317909255915183815284917f3c7b682d5da98001a9b8cbda6c647d2c63d698a4184fd1d55e2ce7b66f5d21eb91016109e3565b336127ee6000546001600160a01b031690565b6001600160a01b031614806128095750612809600133612df1565b6128615760405162461bcd60e51b8152602060048201526024808201527f41646d696e436f6e74726f6c3a204d757374206265206f776e6572206f7220616044820152633236b4b760e11b60648201526084016106c7565b6000600960008381526020019081526020016000206040518060800160405290816000820160009054906101000a900460ff16151515158152602001600182015481526020016002820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016003820154815250509050600081606001519050600082604001519050604051806080016040528060001515815260200185815260200160006001600160a01b0316815260200160008152506009600086815260200190815260200160002060008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060608201518160030155905050806001600160a01b0316847f6f30e1ee4d81dcc7a8a478577f65d2ed2edb120565960ac45fe7c50551c87932846040516129d591815260200190565b60405180910390a36129e78183612d49565b50505050565b6000546001600160a01b03163314612a475760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106c7565b6001600160a01b038116612ac35760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016106c7565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60026004541415612b715760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106c7565b60026004556127108110612bbf5760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881a5b99195e081b9bdd081d985b1a59605a1b60448201526064016106c7565b6005546040516331a9108f60e11b81526004810183905233916001600160a01b031690636352211e90602401602060405180830381865afa158015612c08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c2c9190613338565b6001600160a01b031614612c8e5760405162461bcd60e51b815260206004820152602360248201527f796f7520617265206e6f7420746865206f776e6572206f66207468697320746f60448201526235b2b760e91b60648201526084016106c7565b6040805160a0810182526000808252602080830185815233848601908152606085018481526080860185815288865260089094528685209551865460ff191690151517865591516001860155516002850180546001600160a01b03199081166001600160a01b0393841617909155915160038601559151600490940180549091169390911692909217909155905182917fb0e0a660b4e50f26f0b7ce75c24655fc76cc66e3334a54ff410277229fa10bd491a2506001600455565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612d96576040519150601f19603f3d011682016040523d82523d6000602084013e612d9b565b606091505b5050905080612dec5760405162461bcd60e51b815260206004820152601460248201527f4661696c656420746f2073656e6420457468657200000000000000000000000060448201526064016106c7565b505050565b6001600160a01b038116600090815260018301602052604081205415155b9392505050565b6000612e0f836001600160a01b038416612f6d565b60006110a2825490565b6000612e0f8383613067565b60035460ff16612e935760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f742070617573656400000000000000000000000060448201526064016106c7565b6003805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6000612e0f836001600160a01b038416613091565b60035460ff1615612f385760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016106c7565b6003805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612ec03390565b60008181526001830160205260408120548015613056576000612f916001836133e3565b8554909150600090612fa5906001906133e3565b905081811461300a576000866000018281548110612fc557612fc561336b565b9060005260206000200154905080876000018481548110612fe857612fe861336b565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061301b5761301b6133fa565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506110a2565b60009150506110a2565b5092915050565b600082600001828154811061307e5761307e61336b565b9060005260206000200154905092915050565b60008181526001830160205260408120546130d8575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556110a2565b5060006110a2565b6000602082840312156130f257600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b8181101561313157835183529284019291840191600101613115565b50909695505050505050565b6000806040838503121561315057600080fd5b50508035926020909101359150565b6001600160a01b038116811461115557600080fd5b60006020828403121561318657600080fd5b8135612e0f8161315f565b6020808252825182820181905260009190848201906040850190845b818110156131315783516001600160a01b0316835292840192918401916001016131ad565b815115158152602080830151908201526040808301516001600160a01b03169082015260608083015190820152608081016110a2565b60a081016110a282848051151582526020810151602083015260408101516001600160a01b0380821660408501526060830151606085015280608084015116608085015250505050565b6000610160820190508251151582526001600160a01b03602084015116602083015260408301516132b26040840182805115158252602081015160208301526001600160a01b036040820151166040830152606081015160608301525050565b506060838101518051151560c0850152602081015160e085015260408101516001600160a01b03908116610100860152918101516101208501526080810151909116610140840152613060565b60008060006060848603121561331457600080fd5b8335925060208401359150604084013561332d8161315f565b809150509250925092565b60006020828403121561334a57600080fd5b8151612e0f8161315f565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156133ab576133ab613381565b5060010190565b600082198211156133c5576133c5613381565b500190565b6000602082840312156133dc57600080fd5b5051919050565b6000828210156133f5576133f5613381565b500390565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220a66b8ed14c3f2d59d2b8d5999ff008775aedc1f5dfc18a125cc61a03b6edaa6264736f6c634300080b0033
Loading...
Loading
Loading...
Loading
Net Worth in USD
$24,349.91
Net Worth in ETH
11.0171
Token Allocations
ETH
100.00%
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| ETH | 100.00% | $2,210.19 | 11.0171 | $24,349.91 |
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.