ETH Price: $2,603.64 (-3.28%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Start Party136337572021-11-17 15:22:261274 days ago1637162546IN
0xAba3506D...81070BA47
0 ETH0.0300332382
Start Party136333432021-11-17 13:56:181274 days ago1637157378IN
0xAba3506D...81070BA47
0 ETH0.03941731107.49550275
Start Party136205282021-11-15 13:17:331276 days ago1636982253IN
0xAba3506D...81070BA47
0 ETH0.04707634134.82589028
Start Party136189532021-11-15 7:15:431276 days ago1636960543IN
0xAba3506D...81070BA47
0 ETH0.0433012116.80362483
Start Party136130832021-11-14 9:09:291277 days ago1636880969IN
0xAba3506D...81070BA47
0 ETH0.0342980783.51065489
Start Party136031242021-11-12 19:17:331279 days ago1636744653IN
0xAba3506D...81070BA47
0 ETH0.05020744135.39791776
Start Party135980782021-11-12 0:23:121279 days ago1636676592IN
0xAba3506D...81070BA47
0 ETH0.050509136.27730971
Start Party135972482021-11-11 21:16:091279 days ago1636665369IN
0xAba3506D...81070BA47
0 ETH0.06624403163.06746404
Start Party135923722021-11-11 2:43:141280 days ago1636598594IN
0xAba3506D...81070BA47
0 ETH0.03919842105.74677929
Start Party135900632021-11-10 18:22:211281 days ago1636568541IN
0xAba3506D...81070BA47
0 ETH0.05976435164.57799103
Start Party135844652021-11-09 21:09:321281 days ago1636492172IN
0xAba3506D...81070BA47
0 ETH0.04831189117.62531094
Start Party135843732021-11-09 20:48:131281 days ago1636490893IN
0xAba3506D...81070BA47
0 ETH0.06847371184.71762585
Start Party135784002021-11-08 22:24:291282 days ago1636410269IN
0xAba3506D...81070BA47
0 ETH0.04502601124
Start Party135782632021-11-08 21:56:331282 days ago1636408593IN
0xAba3506D...81070BA47
0 ETH0.04835762130.42204605
Start Party135778382021-11-08 20:22:351282 days ago1636402955IN
0xAba3506D...81070BA47
0 ETH0.06507981183.38230837
Start Party135739742021-11-08 5:33:391283 days ago1636349619IN
0xAba3506D...81070BA47
0 ETH0.03811494104.03487516
Start Party135713332021-11-07 19:47:201284 days ago1636314440IN
0xAba3506D...81070BA47
0 ETH0.0463626120
Start Party135495992021-11-04 10:09:141287 days ago1636020554IN
0xAba3506D...81070BA47
0 ETH0.04732302130.28713137
Start Party135368902021-11-02 10:02:391289 days ago1635847359IN
0xAba3506D...81070BA47
0 ETH0.03995299110
Start Party135190562021-10-30 14:41:251292 days ago1635604885IN
0xAba3506D...81070BA47
0 ETH0.07015018189
Start Party135184392021-10-30 12:23:451292 days ago1635596625IN
0xAba3506D...81070BA47
0 ETH0.04148716114.2201763
Start Party135103752021-10-29 5:55:011293 days ago1635486901IN
0xAba3506D...81070BA47
0 ETH0.0577333155.74383338
Start Party134948432021-10-26 19:26:001296 days ago1635276360IN
0xAba3506D...81070BA47
0 ETH0.04538462125
Start Party134892732021-10-25 22:30:591296 days ago1635201059IN
0xAba3506D...81070BA47
0 ETH0.0360934899.36730995
Start Party134890222021-10-25 21:32:141296 days ago1635197534IN
0xAba3506D...81070BA47
0 ETH0.05793569141.02349962
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Method Block
From
To
-136337572021-11-17 15:22:261274 days ago1637162546
0xAba3506D...81070BA47
 Contract Creation0 ETH
-136333432021-11-17 13:56:181274 days ago1637157378
0xAba3506D...81070BA47
 Contract Creation0 ETH
-136205282021-11-15 13:17:331276 days ago1636982253
0xAba3506D...81070BA47
 Contract Creation0 ETH
-136189532021-11-15 7:15:431276 days ago1636960543
0xAba3506D...81070BA47
 Contract Creation0 ETH
-136130832021-11-14 9:09:291277 days ago1636880969
0xAba3506D...81070BA47
 Contract Creation0 ETH
-136031242021-11-12 19:17:331279 days ago1636744653
0xAba3506D...81070BA47
 Contract Creation0 ETH
-135980782021-11-12 0:23:121279 days ago1636676592
0xAba3506D...81070BA47
 Contract Creation0 ETH
-135972482021-11-11 21:16:091279 days ago1636665369
0xAba3506D...81070BA47
 Contract Creation0 ETH
-135923722021-11-11 2:43:141280 days ago1636598594
0xAba3506D...81070BA47
 Contract Creation0 ETH
-135900632021-11-10 18:22:211281 days ago1636568541
0xAba3506D...81070BA47
 Contract Creation0 ETH
-135844652021-11-09 21:09:321281 days ago1636492172
0xAba3506D...81070BA47
 Contract Creation0 ETH
-135843732021-11-09 20:48:131281 days ago1636490893
0xAba3506D...81070BA47
 Contract Creation0 ETH
-135784002021-11-08 22:24:291282 days ago1636410269
0xAba3506D...81070BA47
 Contract Creation0 ETH
-135782632021-11-08 21:56:331282 days ago1636408593
0xAba3506D...81070BA47
 Contract Creation0 ETH
-135778382021-11-08 20:22:351282 days ago1636402955
0xAba3506D...81070BA47
 Contract Creation0 ETH
-135739742021-11-08 5:33:391283 days ago1636349619
0xAba3506D...81070BA47
 Contract Creation0 ETH
-135713332021-11-07 19:47:201284 days ago1636314440
0xAba3506D...81070BA47
 Contract Creation0 ETH
-135495992021-11-04 10:09:141287 days ago1636020554
0xAba3506D...81070BA47
 Contract Creation0 ETH
-135368902021-11-02 10:02:391289 days ago1635847359
0xAba3506D...81070BA47
 Contract Creation0 ETH
-135190562021-10-30 14:41:251292 days ago1635604885
0xAba3506D...81070BA47
 Contract Creation0 ETH
-135184392021-10-30 12:23:451292 days ago1635596625
0xAba3506D...81070BA47
 Contract Creation0 ETH
-135103752021-10-29 5:55:011293 days ago1635486901
0xAba3506D...81070BA47
 Contract Creation0 ETH
-134948432021-10-26 19:26:001296 days ago1635276360
0xAba3506D...81070BA47
 Contract Creation0 ETH
-134892732021-10-25 22:30:591296 days ago1635201059
0xAba3506D...81070BA47
 Contract Creation0 ETH
-134890222021-10-25 21:32:141296 days ago1635197534
0xAba3506D...81070BA47
 Contract Creation0 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
PartyBidFactory

Compiler Version
v0.8.5+commit.a4f2e591

Optimization Enabled:
Yes with 999999 runs

Other Settings:
default evmVersion
File 1 of 14 : PartyBidFactory.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.5;

import {InitializedProxy} from "./InitializedProxy.sol";
import {PartyBid} from "./PartyBid.sol";

/**
 * @title PartyBid Factory
 * @author Anna Carroll
 *
 * WARNING: A malicious MarketWrapper contract could be used to steal user funds;
 * A poorly implemented MarketWrapper contract could permanently lose access to the NFT.
 * When deploying a PartyBid, exercise extreme caution.
 * Only use MarketWrapper contracts that have been audited and tested.
 */
contract PartyBidFactory {
    //======== Events ========

    event PartyBidDeployed(
        address partyBidProxy,
        address creator,
        address nftContract,
        uint256 tokenId,
        address marketWrapper,
        uint256 auctionId,
        address splitRecipient,
        uint256 splitBasisPoints,
        string name,
        string symbol
    );

    //======== Immutable storage =========

    address public immutable logic;
    address public immutable partyDAOMultisig;
    address public immutable tokenVaultFactory;
    address public immutable weth;

    //======== Mutable storage =========

    // PartyBid proxy => block number deployed at
    mapping(address => uint256) public deployedAt;

    //======== Constructor =========

    constructor(
        address _partyDAOMultisig,
        address _tokenVaultFactory,
        address _weth,
        address _logicMarketWrapper,
        address _logicNftContract,
        uint256 _logicTokenId,
        uint256 _logicAuctionId
    ) {
        partyDAOMultisig = _partyDAOMultisig;
        tokenVaultFactory = _tokenVaultFactory;
        weth = _weth;
        // deploy logic contract
        PartyBid _logicContract = new PartyBid(_partyDAOMultisig, _tokenVaultFactory, _weth);
        // initialize logic contract
        _logicContract.initialize(
            _logicMarketWrapper,
            _logicNftContract,
            _logicTokenId,
            _logicAuctionId,
            address(0),
            0,
            "PartyBid",
            "BID"
        );
        // store logic contract address
        logic = address(_logicContract);
    }

    //======== Deploy function =========

    function startParty(
        address _marketWrapper,
        address _nftContract,
        uint256 _tokenId,
        uint256 _auctionId,
        address _splitRecipient,
        uint256 _splitBasisPoints,
        string memory _name,
        string memory _symbol
    ) external returns (address partyBidProxy) {
        bytes memory _initializationCalldata =
            abi.encodeWithSignature(
                "initialize(address,address,uint256,uint256,address,uint256,string,string)",
                _marketWrapper,
                _nftContract,
                _tokenId,
                _auctionId,
                _splitRecipient,
                _splitBasisPoints,
                _name,
                _symbol
            );

        partyBidProxy = address(
            new InitializedProxy(
                logic,
                _initializationCalldata
            )
        );

        deployedAt[partyBidProxy] = block.number;

        emit PartyBidDeployed(
            partyBidProxy,
            msg.sender,
            _nftContract,
            _tokenId,
            _marketWrapper,
            _auctionId,
            _splitRecipient,
            _splitBasisPoints,
            _name,
            _symbol
        );
    }
}

File 2 of 14 : InitializedProxy.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.5;

/**
 * @title InitializedProxy
 * @author Anna Carroll
 */
contract InitializedProxy {
    // address of logic contract
    address public immutable logic;

    // ======== Constructor =========

    constructor(
        address _logic,
        bytes memory _initializationCalldata
    ) {
        logic = _logic;
        // Delegatecall into the logic contract, supplying initialization calldata
        (bool _ok, bytes memory returnData) =
            _logic.delegatecall(_initializationCalldata);
        // Revert if delegatecall to implementation reverts
        require(_ok, string(returnData));
    }

    // ======== Fallback =========

    fallback() external payable {
        address _impl = logic;
        assembly {
            let ptr := mload(0x40)
            calldatacopy(ptr, 0, calldatasize())
            let result := delegatecall(gas(), _impl, ptr, calldatasize(), 0, 0)
            let size := returndatasize()
            returndatacopy(ptr, 0, size)

            switch result
                case 0 {
                    revert(ptr, size)
                }
                default {
                    return(ptr, size)
                }
        }
    }

    // ======== Receive =========

    receive() external payable {} // solhint-disable-line no-empty-blocks
}

/*

      ___           ___           ___           ___           ___           ___                       ___
     /\  \         /\  \         /\  \         /\  \         |\__\         /\  \          ___        /\  \
    /::\  \       /::\  \       /::\  \        \:\  \        |:|  |       /::\  \        /\  \      /::\  \
   /:/\:\  \     /:/\:\  \     /:/\:\  \        \:\  \       |:|  |      /:/\:\  \       \:\  \    /:/\:\  \
  /::\~\:\  \   /::\~\:\  \   /::\~\:\  \       /::\  \      |:|__|__   /::\~\:\__\      /::\__\  /:/  \:\__\
 /:/\:\ \:\__\ /:/\:\ \:\__\ /:/\:\ \:\__\     /:/\:\__\     /::::\__\ /:/\:\ \:|__|  __/:/\/__/ /:/__/ \:|__|
 \/__\:\/:/  / \/__\:\/:/  / \/_|::\/:/  /    /:/  \/__/    /:/~~/~    \:\~\:\/:/  / /\/:/  /    \:\  \ /:/  /
      \::/  /       \::/  /     |:|::/  /    /:/  /        /:/  /       \:\ \::/  /  \::/__/      \:\  /:/  /
       \/__/        /:/  /      |:|\/__/     \/__/         \/__/         \:\/:/  /    \:\__\       \:\/:/  /
                   /:/  /       |:|  |                                    \::/__/      \/__/        \::/__/
                   \/__/         \|__|                                     ~~                        ~~

PartyBid v1
Anna Carroll for PartyDAO
*/

// SPDX-License-Identifier: MIT
pragma solidity 0.8.5;

// ============ External Imports: Inherited Contracts ============
// NOTE: we inherit from OpenZeppelin upgradeable contracts
// because of the proxy structure used for cheaper deploys
// (the proxies are NOT actually upgradeable)
import {
    ReentrancyGuardUpgradeable
} from "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol";
import {
    ERC721HolderUpgradeable
} from "@openzeppelin/contracts-upgradeable/token/ERC721/utils/ERC721HolderUpgradeable.sol";
// ============ External Imports: External Contracts & Contract Interfaces ============
import {
    IERC721VaultFactory
} from "./external/interfaces/IERC721VaultFactory.sol";
import {ITokenVault} from "./external/interfaces/ITokenVault.sol";
import {
    IERC721Metadata
} from "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol";
import {IWETH} from "./external/interfaces/IWETH.sol";

// ============ Internal Imports ============
import {IMarketWrapper} from "./market-wrapper/IMarketWrapper.sol";

contract PartyBid is ReentrancyGuardUpgradeable, ERC721HolderUpgradeable {
    // ============ Enums ============

    // State Transitions:
    //   (1) AUCTION_ACTIVE on deploy
    //   (2) AUCTION_WON or AUCTION_LOST on finalize()
    enum PartyStatus {AUCTION_ACTIVE, AUCTION_WON, AUCTION_LOST}

    // ============ Structs ============

    struct Contribution {
        uint256 amount;
        uint256 previousTotalContributedToParty;
    }

    // ============ Internal Constants ============

    // PartyBid version 2
    uint16 public constant VERSION = 2;
    // tokens are minted at a rate of 1 ETH : 1000 tokens
    uint16 internal constant TOKEN_SCALE = 1000;
    // PartyDAO receives an ETH fee equal to 2.5% of the winning bid
    uint16 internal constant ETH_FEE_BASIS_POINTS = 250;
    // PartyDAO receives a token fee equal to 2.5% of the total token supply
    uint16 internal constant TOKEN_FEE_BASIS_POINTS = 250;
    // token is relisted on Fractional with an
    // initial reserve price equal to 2x the winning bid
    uint8 internal constant RESALE_MULTIPLIER = 2;

    // ============ Immutables ============

    address public immutable partyDAOMultisig;
    IERC721VaultFactory public immutable tokenVaultFactory;
    IWETH public immutable weth;

    // ============ Public Not-Mutated Storage ============

    // market wrapper contract exposing interface for
    // market auctioning the NFT
    IMarketWrapper public marketWrapper;
    // NFT contract
    IERC721Metadata public nftContract;
    // Fractionalized NFT vault responsible for post-auction value capture
    ITokenVault public tokenVault;
    // ID of auction within market contract
    uint256 public auctionId;
    // ID of token within NFT contract
    uint256 public tokenId;
    // the address that will receive a portion of the tokens
    // if the PartyBid wins the auction
    address public splitRecipient;
    // percent of the total token supply
    // taken by the splitRecipient
    uint256 public splitBasisPoints;
    // ERC-20 name and symbol for fractional tokens
    string public name;
    string public symbol;

    // ============ Public Mutable Storage ============

    // state of the contract
    PartyStatus public partyStatus;
    // total ETH deposited by all contributors
    uint256 public totalContributedToParty;
    // the highest bid submitted by PartyBid
    uint256 public highestBid;
    // the total spent by PartyBid on the auction;
    // 0 if the NFT is lost; highest bid + 2.5% PartyDAO fee if NFT is won
    uint256 public totalSpent;
    // contributor => array of Contributions
    mapping(address => Contribution[]) public contributions;
    // contributor => total amount contributed
    mapping(address => uint256) public totalContributed;
    // contributor => true if contribution has been claimed
    mapping(address => bool) public claimed;

    // ============ Events ============

    event Contributed(
        address indexed contributor,
        uint256 amount,
        uint256 previousTotalContributedToParty,
        uint256 totalFromContributor
    );

    event Bid(uint256 amount);

    event Finalized(PartyStatus result, uint256 totalSpent, uint256 fee, uint256 totalContributed);

    event Claimed(
        address indexed contributor,
        uint256 totalContributed,
        uint256 excessContribution,
        uint256 tokenAmount
    );

    // ======== Modifiers =========

    modifier onlyPartyDAO() {
        require(
            msg.sender == partyDAOMultisig,
            "PartyBid:: only PartyDAO multisig"
        );
        _;
    }

    // ======== Constructor =========

    constructor(
        address _partyDAOMultisig,
        address _tokenVaultFactory,
        address _weth
    ) {
        partyDAOMultisig = _partyDAOMultisig;
        tokenVaultFactory = IERC721VaultFactory(_tokenVaultFactory);
        weth = IWETH(_weth);
    }

    // ======== Initializer =========

    function initialize(
        address _marketWrapper,
        address _nftContract,
        uint256 _tokenId,
        uint256 _auctionId,
        address _splitRecipient,
        uint256 _splitBasisPoints,
        string memory _name,
        string memory _symbol
    ) external initializer {
        // initialize ReentrancyGuard and ERC721Holder
        __ReentrancyGuard_init();
        __ERC721Holder_init();
        // set storage variables
        marketWrapper = IMarketWrapper(_marketWrapper);
        nftContract = IERC721Metadata(_nftContract);
        tokenId = _tokenId;
        auctionId = _auctionId;
        name = _name;
        symbol = _symbol;
        // validate that party split won't retain the total token supply
        uint256 _remainingBasisPoints = 10000 - TOKEN_FEE_BASIS_POINTS;
        require(_splitBasisPoints < _remainingBasisPoints, "PartyBid::initialize: basis points can't take 100%");
        // validate that a portion of the token supply is not being burned
        if (_splitRecipient == address(0)) {
            require(_splitBasisPoints == 0, "PartyBid::initialize: can't send tokens to burn addr");
        }
        splitBasisPoints = _splitBasisPoints;
        splitRecipient = _splitRecipient;
        // validate token exists
        require(_getOwner() != address(0), "PartyBid::initialize: NFT getOwner failed");
        // validate auction exists
        require(
            marketWrapper.auctionIdMatchesToken(
                _auctionId,
                _nftContract,
                _tokenId
            ),
            "PartyBid::initialize: auctionId doesn't match token"
        );
    }

    // ======== External: Contribute =========

    /**
     * @notice Contribute to the PartyBid's treasury
     * while the auction is still open
     * @dev Emits a Contributed event upon success; callable by anyone
     */
    function contribute() external payable nonReentrant {
        require(
            partyStatus == PartyStatus.AUCTION_ACTIVE,
            "PartyBid::contribute: auction not active"
        );
        address _contributor = msg.sender;
        uint256 _amount = msg.value;
        require(_amount > 0, "PartyBid::contribute: must contribute more than 0");
        // get the current contract balance
        uint256 _previousTotalContributedToParty = totalContributedToParty;
        // add contribution to contributor's array of contributions
        Contribution memory _contribution =
            Contribution({
                amount: _amount,
                previousTotalContributedToParty: _previousTotalContributedToParty
            });
        contributions[_contributor].push(_contribution);
        // add to contributor's total contribution
        totalContributed[_contributor] =
            totalContributed[_contributor] +
            _amount;
        // add to party's total contribution & emit event
        totalContributedToParty = totalContributedToParty + _amount;
        emit Contributed(
            _contributor,
            _amount,
            _previousTotalContributedToParty,
            totalContributed[_contributor]
        );
    }

    // ======== External: Bid =========

    /**
     * @notice Submit a bid to the Market
     * @dev Reverts if insufficient funds to place the bid and pay PartyDAO fees,
     * or if any external auction checks fail (including if PartyBid is current high bidder)
     * Emits a Bid event upon success.
     * Callable by any contributor
     */
    function bid() external nonReentrant {
        require(
            partyStatus == PartyStatus.AUCTION_ACTIVE,
            "PartyBid::bid: auction not active"
        );
        require(
            totalContributed[msg.sender] > 0,
            "PartyBid::bid: only contributors can bid"
        );
        require(
            address(this) !=
                marketWrapper.getCurrentHighestBidder(
                    auctionId
                ),
            "PartyBid::bid: already highest bidder"
        );
        require(
            !marketWrapper.isFinalized(auctionId),
            "PartyBid::bid: auction already finalized"
        );
        // get the minimum next bid for the auction
        uint256 _bid = marketWrapper.getMinimumBid(auctionId);
        // ensure there is enough ETH to place the bid including PartyDAO fee
        require(
            _bid <= getMaximumBid(),
            "PartyBid::bid: insufficient funds to bid"
        );
        // submit bid to Auction contract using delegatecall
        (bool success, bytes memory returnData) =
            address(marketWrapper).delegatecall(
                abi.encodeWithSignature("bid(uint256,uint256)", auctionId, _bid)
            );
        require(
            success,
            string(
                abi.encodePacked(
                    "PartyBid::bid: place bid failed: ",
                    returnData
                )
            )
        );
        // update highest bid submitted & emit success event
        highestBid = _bid;
        emit Bid(_bid);
    }

    // ======== External: Finalize =========

    /**
     * @notice Finalize the state of the auction
     * @dev Emits a Finalized event upon success; callable by anyone
     */
    function finalize() external nonReentrant {
        require(
            partyStatus == PartyStatus.AUCTION_ACTIVE,
            "PartyBid::finalize: auction not active"
        );
        // finalize auction if it hasn't already been done
        if (!marketWrapper.isFinalized(auctionId)) {
            marketWrapper.finalize(auctionId);
        }
        // after the auction has been finalized,
        // if the NFT is owned by the PartyBid, then the PartyBid won the auction
        address _owner = _getOwner();
        partyStatus = _owner == address(this) ? PartyStatus.AUCTION_WON : PartyStatus.AUCTION_LOST;
        uint256 _ethFee;
        // if the auction was won,
        if (partyStatus == PartyStatus.AUCTION_WON) {
            // calculate PartyDAO fee & record total spent
            _ethFee = _getEthFee(highestBid);
            totalSpent = highestBid + _ethFee;
            // transfer ETH fee to PartyDAO
            _transferETHOrWETH(partyDAOMultisig, _ethFee);
            // deploy fractionalized NFT vault
            // and mint fractional ERC-20 tokens
            _fractionalizeNFT();
        }
        // set the contract status & emit result
        emit Finalized(partyStatus, totalSpent, _ethFee, totalContributedToParty);
    }

    // ======== External: Claim =========

    /**
     * @notice Claim the tokens and excess ETH owed
     * to a single contributor after the auction has ended
     * @dev Emits a Claimed event upon success
     * callable by anyone (doesn't have to be the contributor)
     * @param _contributor the address of the contributor
     */
    function claim(address _contributor) external nonReentrant {
        // ensure auction has finalized
        require(
            partyStatus != PartyStatus.AUCTION_ACTIVE,
            "PartyBid::claim: auction not finalized"
        );
        // ensure contributor submitted some ETH
        require(
            totalContributed[_contributor] != 0,
            "PartyBid::claim: not a contributor"
        );
        // ensure the contributor hasn't already claimed
        require(
            !claimed[_contributor],
            "PartyBid::claim: contribution already claimed"
        );
        // mark the contribution as claimed
        claimed[_contributor] = true;
        // calculate the amount of fractional NFT tokens owed to the user
        // based on how much ETH they contributed towards the auction,
        // and the amount of excess ETH owed to the user
        (uint256 _tokenAmount, uint256 _ethAmount) =
            getClaimAmounts(_contributor);
        // transfer tokens to contributor for their portion of ETH used
        _transferTokens(_contributor, _tokenAmount);
        // if there is excess ETH, send it back to the contributor
        _transferETHOrWETH(_contributor, _ethAmount);
        emit Claimed(
            _contributor,
            totalContributed[_contributor],
            _ethAmount,
            _tokenAmount
        );
    }

    // ======== External: Emergency Escape Hatches (PartyDAO Multisig Only) =========

    /**
     * @notice Escape hatch: in case of emergency,
     * PartyDAO can use emergencyWithdrawEth to withdraw
     * ETH stuck in the contract
     */
    function emergencyWithdrawEth(uint256 _value)
        external
        onlyPartyDAO
    {
        _transferETHOrWETH(partyDAOMultisig, _value);
    }

    /**
     * @notice Escape hatch: in case of emergency,
     * PartyDAO can use emergencyCall to call an external contract
     * (e.g. to withdraw a stuck NFT or stuck ERC-20s)
     */
    function emergencyCall(address _contract, bytes memory _calldata)
        external
        onlyPartyDAO
        returns (bool _success, bytes memory _returnData)
    {
        (_success, _returnData) = _contract.call(_calldata);
        require(_success, string(_returnData));
    }

    /**
     * @notice Escape hatch: in case of emergency,
     * PartyDAO can force the PartyBid to finalize with status LOST
     * (e.g. if finalize is not callable)
     */
    function emergencyForceLost()
        external
        onlyPartyDAO
    {
        // set partyStatus to LOST
        partyStatus = PartyStatus.AUCTION_LOST;
        // emit Finalized event
        emit Finalized(partyStatus, 0, 0, totalContributedToParty);
    }

    // ======== Public: Utility Calculations =========

    /**
     * @notice Convert ETH value to equivalent token amount
     */
    function valueToTokens(uint256 _value)
        public
        pure
        returns (uint256 _tokens)
    {
        _tokens = _value * TOKEN_SCALE;
    }

    /**
     * @notice The maximum bid that can be submitted
     * while paying the ETH fee to PartyDAO
     * @return _maxBid the maximum bid
     */
    function getMaximumBid() public view returns (uint256 _maxBid) {
        _maxBid = (totalContributedToParty * 10000) / (10000 + ETH_FEE_BASIS_POINTS);
    }

    /**
     * @notice Calculate the amount of fractional NFT tokens owed to the contributor
     * based on how much ETH they contributed towards the auction,
     * and the amount of excess ETH owed to the contributor
     * based on how much ETH they contributed *not* used towards the auction
     * @param _contributor the address of the contributor
     * @return _tokenAmount the amount of fractional NFT tokens owed to the contributor
     * @return _ethAmount the amount of excess ETH owed to the contributor
     */
    function getClaimAmounts(address _contributor)
        public
        view
        returns (uint256 _tokenAmount, uint256 _ethAmount)
    {
        require(partyStatus != PartyStatus.AUCTION_ACTIVE, "PartyBid::getClaimAmounts: party still active; amounts undetermined");
        uint256 _totalContributed = totalContributed[_contributor];
        if (partyStatus == PartyStatus.AUCTION_WON) {
            // calculate the amount of this contributor's ETH
            // that was used for the winning bid
            uint256 _totalUsedForBid = totalEthUsedForBid(_contributor);
            if (_totalUsedForBid > 0) {
                _tokenAmount = valueToTokens(_totalUsedForBid);
            }
            // the rest of the contributor's ETH should be returned
            _ethAmount = _totalContributed - _totalUsedForBid;
        } else {
            // if the auction was lost, no ETH was spent;
            // all of the contributor's ETH should be returned
            _ethAmount = _totalContributed;
        }
    }

    /**
     * @notice Calculate the total amount of a contributor's funds
     * that were used towards the winning auction bid
     * @dev always returns 0 until the auction has been finalized
     * @param _contributor the address of the contributor
     * @return _total the sum of the contributor's funds that were
     * used towards the winning auction bid
     */
    function totalEthUsedForBid(address _contributor)
        public
        view
        returns (uint256 _total)
    {
        require(partyStatus != PartyStatus.AUCTION_ACTIVE, "PartyBid::totalEthUsedForBid: party still active; amounts undetermined");
        // load total amount spent once from storage
        uint256 _totalSpent = totalSpent;
        // get all of the contributor's contributions
        Contribution[] memory _contributions = contributions[_contributor];
        for (uint256 i = 0; i < _contributions.length; i++) {
            // calculate how much was used from this individual contribution
            uint256 _amount = _ethUsedForBid(_totalSpent, _contributions[i]);
            // if we reach a contribution that was not used,
            // no subsequent contributions will have been used either,
            // so we can stop calculating to save some gas
            if (_amount == 0) break;
            _total = _total + _amount;
        }
    }

    // ============ Internal: Bid ============

    /**
     * @notice Calculate ETH fee for PartyDAO
     * NOTE: Remove this fee causes a critical vulnerability
     * allowing anyone to exploit a PartyBid via price manipulation.
     * See Security Review in README for more info.
     * @return _fee the portion of _amount represented by scaling to ETH_FEE_BASIS_POINTS
     */
    function _getEthFee(uint256 _winningBid) internal pure returns (uint256 _fee) {
        _fee = (_winningBid * ETH_FEE_BASIS_POINTS) / 10000;
    }

    /**
     * @notice Calculate token amount for specified token recipient
     * @return _totalSupply the total token supply
     * @return _partyDAOAmount the amount of tokens for partyDAO fee,
     * which is equivalent to TOKEN_FEE_BASIS_POINTS of total supply
     * @return _splitRecipientAmount the amount of tokens for the token recipient,
     * which is equivalent to splitBasisPoints of total supply
     */
    function _getTokenInflationAmounts(uint256 _winningBid)
        internal
        view
        returns (uint256 _totalSupply, uint256 _partyDAOAmount, uint256 _splitRecipientAmount)
    {
        // the token supply will be inflated to provide a portion of the
        // total supply for PartyDAO, and a portion for the splitRecipient
        uint256 inflationBasisPoints = TOKEN_FEE_BASIS_POINTS + splitBasisPoints;
        _totalSupply = valueToTokens((_winningBid * 10000) / (10000 - inflationBasisPoints));
        // PartyDAO receives TOKEN_FEE_BASIS_POINTS of the total supply
        _partyDAOAmount = (_totalSupply * TOKEN_FEE_BASIS_POINTS) / 10000;
        // splitRecipient receives splitBasisPoints of the total supply
        _splitRecipientAmount = (_totalSupply * splitBasisPoints) / 10000;
    }

    // ============ Internal: Finalize ============

    /**
    * @notice Query the NFT contract to get the token owner
    * @dev nftContract must implement the ERC-721 token standard exactly:
    * function ownerOf(uint256 _tokenId) external view returns (address);
    * See https://eips.ethereum.org/EIPS/eip-721
    * @dev Returns address(0) if NFT token or NFT contract
    * no longer exists (token burned or contract self-destructed)
    * @return _owner the owner of the NFT
    */
    function _getOwner() internal view returns (address _owner) {
        (bool success, bytes memory returnData) =
            address(nftContract).staticcall(
                abi.encodeWithSignature(
                    "ownerOf(uint256)",
                    tokenId
                )
        );
        if (success && returnData.length > 0) {
            _owner = abi.decode(returnData, (address));
        }
    }

    /**
     * @notice Upon winning the auction, transfer the NFT
     * to fractional.art vault & mint fractional ERC-20 tokens
     */
    function _fractionalizeNFT() internal {
        // approve fractionalized NFT Factory to withdraw NFT
        nftContract.approve(address(tokenVaultFactory), tokenId);
        // PartyBid "votes" for a reserve price on Fractional
        // equal to 2x the winning bid
        uint256 _listPrice = RESALE_MULTIPLIER * highestBid;
        // users receive tokens at a rate of 1:TOKEN_SCALE for each ETH they contributed that was ultimately spent
        // partyDAO receives a percentage of the total token supply equivalent to TOKEN_FEE_BASIS_POINTS
        // splitRecipient receives a percentage of the total token supply equivalent to splitBasisPoints
        (uint256 _tokenSupply, uint256 _partyDAOAmount, uint256 _splitRecipientAmount) = _getTokenInflationAmounts(totalSpent);
        // deploy fractionalized NFT vault
        uint256 vaultNumber =
            tokenVaultFactory.mint(
                name,
                symbol,
                address(nftContract),
                tokenId,
                _tokenSupply,
                _listPrice,
                0
            );
        // store token vault address to storage
        tokenVault = ITokenVault(tokenVaultFactory.vaults(vaultNumber));
        // transfer curator to null address (burn the curator role)
        tokenVault.updateCurator(address(0));
        // transfer tokens to PartyDAO multisig
        _transferTokens(partyDAOMultisig, _partyDAOAmount);
        // transfer tokens to token recipient
        if (splitRecipient != address(0)) {
            _transferTokens(splitRecipient, _splitRecipientAmount);
        }
    }

    // ============ Internal: Claim ============

    /**
     * @notice Calculate the amount that was used towards
     * the winning auction bid from a single Contribution
     * @param _contribution the Contribution struct
     * @return the amount of funds from this contribution
     * that were used towards the winning auction bid
     */
    function _ethUsedForBid(uint256 _totalSpent, Contribution memory _contribution)
        internal
        view
        returns (uint256)
    {
        if (
            _contribution.previousTotalContributedToParty +
                _contribution.amount <=
            _totalSpent
        ) {
            // contribution was fully used
            return _contribution.amount;
        } else if (
            _contribution.previousTotalContributedToParty < _totalSpent
        ) {
            // contribution was partially used
            return _totalSpent - _contribution.previousTotalContributedToParty;
        }
        // contribution was not used
        return 0;
    }

    // ============ Internal: TransferTokens ============

    /**
    * @notice Transfer tokens to a recipient
    * @param _to recipient of tokens
    * @param _value amount of tokens
    */
    function _transferTokens(address _to, uint256 _value) internal {
        // skip if attempting to send 0 tokens
        if (_value == 0) {
            return;
        }
        // guard against rounding errors;
        // if token amount to send is greater than contract balance,
        // send full contract balance
        uint256 _partyBidBalance = tokenVault.balanceOf(address(this));
        if (_value > _partyBidBalance) {
            _value = _partyBidBalance;
        }
        tokenVault.transfer(_to, _value);
    }

    // ============ Internal: TransferEthOrWeth ============

    /**
     * @notice Attempt to transfer ETH to a recipient;
     * if transferring ETH fails, transfer WETH insteads
     * @param _to recipient of ETH or WETH
     * @param _value amount of ETH or WETH
     */
    function _transferETHOrWETH(address _to, uint256 _value) internal {
        // skip if attempting to send 0 ETH
        if (_value == 0) {
            return;
        }
        // guard against rounding errors;
        // if ETH amount to send is greater than contract balance,
        // send full contract balance
        if (_value > address(this).balance) {
            _value = address(this).balance;
        }
        // Try to transfer ETH to the given recipient.
        if (!_attemptETHTransfer(_to, _value)) {
            // If the transfer fails, wrap and send as WETH
            weth.deposit{value: _value}();
            weth.transfer(_to, _value);
            // At this point, the recipient can unwrap WETH.
        }
    }

    /**
     * @notice Attempt to transfer ETH to a recipient
     * @dev Sending ETH is not guaranteed to succeed
     * this method will return false if it fails.
     * We will limit the gas used in transfers, and handle failure cases.
     * @param _to recipient of ETH
     * @param _value amount of ETH
     */
    function _attemptETHTransfer(address _to, uint256 _value)
        internal
        returns (bool)
    {
        // Here increase the gas limit a reasonable amount above the default, and try
        // to send ETH to the recipient.
        // NOTE: This might allow the recipient to attempt a limited reentrancy attack.
        (bool success, ) = _to.call{value: _value, gas: 30000}("");
        return success;
    }
}

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;
import "../proxy/utils/Initializable.sol";

/**
 * @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 ReentrancyGuardUpgradeable is Initializable {
    // 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;

    function __ReentrancyGuard_init() internal initializer {
        __ReentrancyGuard_init_unchained();
    }

    function __ReentrancyGuard_init_unchained() internal initializer {
        _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 make 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;
    }
    uint256[49] private __gap;
}

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../IERC721ReceiverUpgradeable.sol";
import "../../../proxy/utils/Initializable.sol";

  /**
   * @dev Implementation of the {IERC721Receiver} interface.
   *
   * Accepts all token transfers.
   * Make sure the contract is able to use its token with {IERC721-safeTransferFrom}, {IERC721-approve} or {IERC721-setApprovalForAll}.
   */
contract ERC721HolderUpgradeable is Initializable, IERC721ReceiverUpgradeable {
    function __ERC721Holder_init() internal initializer {
        __ERC721Holder_init_unchained();
    }

    function __ERC721Holder_init_unchained() internal initializer {
    }

    /**
     * @dev See {IERC721Receiver-onERC721Received}.
     *
     * Always returns `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(address, address, uint256, bytes memory) public virtual override returns (bytes4) {
        return this.onERC721Received.selector;
    }
    uint256[50] private __gap;
}

//SPDX-License-Identifier: MIT
pragma solidity 0.8.5;

interface IERC721VaultFactory {
    /// @notice the mapping of vault number to vault address
    function vaults(uint256) external returns (address);

    /// @notice the function to mint a new vault
    /// @param _name the desired name of the vault
    /// @param _symbol the desired sumbol of the vault
    /// @param _token the ERC721 token address fo the NFT
    /// @param _id the uint256 ID of the token
    /// @param _listPrice the initial price of the NFT
    /// @return the ID of the vault
    function mint(string memory _name, string memory _symbol, address _token, uint256 _id, uint256 _supply, uint256 _listPrice, uint256 _fee) external returns(uint256);
}

//SPDX-License-Identifier: MIT
pragma solidity 0.8.5;

interface ITokenVault {
    /// @notice allow curator to update the curator address
    /// @param _curator the new curator
    function updateCurator(address _curator) external;

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) external view returns (uint256);
}

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {

    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

// SPDX-License-Identifier: MIT
pragma solidity 0.8.5;

interface IWETH {
    function deposit() external payable;

    function transfer(address to, uint256 value) external returns (bool);
}

// SPDX-License-Identifier: MIT
pragma solidity 0.8.5;

/**
 * @title IMarketWrapper
 * @author Anna Carroll
 * @notice IMarketWrapper provides a common interface for
 * interacting with NFT auction markets.
 * Contracts can abstract their interactions with
 * different NFT markets using IMarketWrapper.
 * NFT markets can become compatible with any contract
 * using IMarketWrapper by deploying a MarketWrapper contract
 * that implements this interface using the logic of their Market.
 *
 * WARNING: MarketWrapper contracts should NEVER write to storage!
 * When implementing a MarketWrapper, exercise caution; a poorly implemented
 * MarketWrapper contract could permanently lose access to the NFT or user funds.
 */
interface IMarketWrapper {
    /**
     * @notice Given the auctionId, nftContract, and tokenId, check that:
     * 1. the auction ID matches the token
     * referred to by tokenId + nftContract
     * 2. the auctionId refers to an *ACTIVE* auction
     * (e.g. an auction that will accept bids)
     * within this market contract
     * 3. any additional validation to ensure that
     * a PartyBid can bid on this auction
     * (ex: if the market allows arbitrary bidding currencies,
     * check that the auction currency is ETH)
     * Note: This function probably should have been named "isValidAuction"
     * @dev Called in PartyBid.sol in `initialize` at line 174
     * @return TRUE if the auction is valid
     */
    function auctionIdMatchesToken(
        uint256 auctionId,
        address nftContract,
        uint256 tokenId
    ) external view returns (bool);

    /**
     * @notice Calculate the minimum next bid for this auction.
     * PartyBid contracts always submit the minimum possible
     * bid that will be accepted by the Market contract.
     * usually, this is either the reserve price (if there are no bids)
     * or a certain percentage increase above the current highest bid
     * @dev Called in PartyBid.sol in `bid` at line 251
     * @return minimum bid amount
     */
    function getMinimumBid(uint256 auctionId) external view returns (uint256);

    /**
     * @notice Query the current highest bidder for this auction
     * It is assumed that there is always 1 winning highest bidder for an auction
     * This is used to ensure that PartyBid cannot outbid itself if it is already winning
     * @dev Called in PartyBid.sol in `bid` at line 241
     * @return highest bidder
     */
    function getCurrentHighestBidder(uint256 auctionId)
        external
        view
        returns (address);

    /**
     * @notice Submit bid to Market contract
     * @dev Called in PartyBid.sol in `bid` at line 259
     */
    function bid(uint256 auctionId, uint256 bidAmount) external;

    /**
     * @notice Determine whether the auction has been finalized
     * Used to check if it is still possible to bid
     * And to determine whether the PartyBid should finalize the auction
     * @dev Called in PartyBid.sol in `bid` at line 247
     * @dev and in `finalize` at line 288
     * @return TRUE if the auction has been finalized
     */
    function isFinalized(uint256 auctionId) external view returns (bool);

    /**
     * @notice Finalize the results of the auction
     * on the Market contract
     * It is assumed  that this operation is performed once for each auction,
     * that after it is done the auction is over and the NFT has been
     * transferred to the auction winner.
     * @dev Called in PartyBid.sol in `finalize` at line 289
     */
    function finalize(uint256 auctionId) external;
}

File 11 of 14 : Initializable.sol
// SPDX-License-Identifier: MIT

// solhint-disable-next-line compiler-version
pragma solidity ^0.8.0;

/**
 * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
 * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an
 * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
 * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
 *
 * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
 * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.
 *
 * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
 * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
 */
abstract contract Initializable {

    /**
     * @dev Indicates that the contract has been initialized.
     */
    bool private _initialized;

    /**
     * @dev Indicates that the contract is in the process of being initialized.
     */
    bool private _initializing;

    /**
     * @dev Modifier to protect an initializer function from being invoked twice.
     */
    modifier initializer() {
        require(_initializing || !_initialized, "Initializable: contract is already initialized");

        bool isTopLevelCall = !_initializing;
        if (isTopLevelCall) {
            _initializing = true;
            _initialized = true;
        }

        _;

        if (isTopLevelCall) {
            _initializing = false;
        }
    }
}

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721ReceiverUpgradeable {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);
}

// 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);
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 999999
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_partyDAOMultisig","type":"address"},{"internalType":"address","name":"_tokenVaultFactory","type":"address"},{"internalType":"address","name":"_weth","type":"address"},{"internalType":"address","name":"_logicMarketWrapper","type":"address"},{"internalType":"address","name":"_logicNftContract","type":"address"},{"internalType":"uint256","name":"_logicTokenId","type":"uint256"},{"internalType":"uint256","name":"_logicAuctionId","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"partyBidProxy","type":"address"},{"indexed":false,"internalType":"address","name":"creator","type":"address"},{"indexed":false,"internalType":"address","name":"nftContract","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"marketWrapper","type":"address"},{"indexed":false,"internalType":"uint256","name":"auctionId","type":"uint256"},{"indexed":false,"internalType":"address","name":"splitRecipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"splitBasisPoints","type":"uint256"},{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"string","name":"symbol","type":"string"}],"name":"PartyBidDeployed","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"deployedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"logic","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"partyDAOMultisig","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_marketWrapper","type":"address"},{"internalType":"address","name":"_nftContract","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_auctionId","type":"uint256"},{"internalType":"address","name":"_splitRecipient","type":"address"},{"internalType":"uint256","name":"_splitBasisPoints","type":"uint256"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"name":"startParty","outputs":[{"internalType":"address","name":"partyBidProxy","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tokenVaultFactory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

61010060405234801561001157600080fd5b506040516148cc3803806148cc833981016040819052610030916101ad565b6001600160601b0319606088811b821660a05287811b821660c05286901b1660e05260405160009088908890889061006790610184565b6001600160a01b03938416815291831660208301529091166040820152606001604051809103906000f0801580156100a3573d6000803e3d6000fd5b506040516332e1af1360e11b81526001600160a01b0387811660048301528681166024830152604482018690526064820185905260006084830181905260a483015261010060c483015260086101048301526714185c9d1e509a5960c21b61012483015261014060e483015260036101448301526210925160ea1b610164830152919250908216906365c35e269061018401600060405180830381600087803b15801561014f57600080fd5b505af1158015610163573d6000803e3d6000fd5b5050505060601b6001600160601b0319166080525061022595505050505050565b613c3d80610c8f83390190565b80516001600160a01b03811681146101a857600080fd5b919050565b600080600080600080600060e0888a0312156101c857600080fd5b6101d188610191565b96506101df60208901610191565b95506101ed60408901610191565b94506101fb60608901610191565b935061020960808901610191565b925060a0880151915060c0880151905092959891949750929550565b60805160601c60a05160601c60c05160601c60e05160601c610a2061026f600039600061010701526000607c0152600060e001526000818161015c015261021c0152610a206000f3fe608060405234801561001057600080fd5b50600436106100725760003560e01c80633fc8cef3116100505780633fc8cef31461010257806357dbdf5414610129578063d7dfa0dd1461015757600080fd5b80630b2030231461007757806324097e88146100c85780633c4d12d9146100db575b600080fd5b61009e7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b61009e6100d636600461040d565b61017e565b61009e7f000000000000000000000000000000000000000000000000000000000000000081565b61009e7f000000000000000000000000000000000000000000000000000000000000000081565b6101496101373660046103eb565b60006020819052908152604090205481565b6040519081526020016100bf565b61009e7f000000000000000000000000000000000000000000000000000000000000000081565b60008089898989898989896040516024016101a09897969594939291906105b6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f65c35e2600000000000000000000000000000000000000000000000000000000179052519091507f00000000000000000000000000000000000000000000000000000000000000009082906102479061030a565b61025292919061062d565b604051809103906000f08015801561026e573d6000803e3d6000fd5b509150436000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f5c34e5a88178f42f8c7110a58ea23913dfd9da0b9c447e3925aebaeb71fff00f82338b8b8e8c8c8c8c8c6040516102f59a9998979695949392919061052b565b60405180910390a15098975050505050505050565b6103578061069483390190565b803573ffffffffffffffffffffffffffffffffffffffff8116811461033b57600080fd5b919050565b600082601f83011261035157600080fd5b813567ffffffffffffffff8082111561036c5761036c610664565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156103b2576103b2610664565b816040528381528660208588010111156103cb57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000602082840312156103fd57600080fd5b61040682610317565b9392505050565b600080600080600080600080610100898b03121561042a57600080fd5b61043389610317565b975061044160208a01610317565b9650604089013595506060890135945061045d60808a01610317565b935060a0890135925060c089013567ffffffffffffffff8082111561048157600080fd5b61048d8c838d01610340565b935060e08b01359150808211156104a357600080fd5b506104b08b828c01610340565b9150509295985092959890939650565b6000815180845260005b818110156104e6576020818501810151868301820152016104ca565b818111156104f8576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600061014073ffffffffffffffffffffffffffffffffffffffff808e168452808d166020850152808c1660408501528a6060850152808a1660808501528860a085015280881660c0850152508560e084015280610100840152610590818401866104c0565b90508281036101208401526105a581856104c0565b9d9c50505050505050505050505050565b600061010073ffffffffffffffffffffffffffffffffffffffff808c168452808b1660208501528960408501528860608501528088166080850152508560a08401528060c084015261060a818401866104c0565b905082810360e084015261061e81856104c0565b9b9a5050505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316815260406020820152600061065c60408301846104c0565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fdfe60a060405234801561001057600080fd5b5060405161035738038061035783398101604081905261002f916100d7565b6001600160601b0319606083901b1660805260405160009081906001600160a01b0385169061005f9085906101a5565b600060405180830381855af49150503d806000811461009a576040519150601f19603f3d011682016040523d82523d6000602084013e61009f565b606091505b50915091508181906100cd5760405162461bcd60e51b81526004016100c491906101c1565b60405180910390fd5b505050505061023a565b600080604083850312156100ea57600080fd5b82516001600160a01b038116811461010157600080fd5b60208401519092506001600160401b038082111561011e57600080fd5b818501915085601f83011261013257600080fd5b81518181111561014457610144610224565b604051601f8201601f19908116603f0116810190838211818310171561016c5761016c610224565b8160405282815288602084870101111561018557600080fd5b6101968360208301602088016101f4565b80955050505050509250929050565b600082516101b78184602087016101f4565b9190910192915050565b60208152600082518060208401526101e08160408501602087016101f4565b601f01601f19169190910160400192915050565b60005b8381101561020f5781810151838201526020016101f7565b8381111561021e576000848401525b50505050565b634e487b7160e01b600052604160045260246000fd5b60805160601c60fc61025b60003960008181602a0152607b015260fc6000f3fe608060405260043610601f5760003560e01c8063d7dfa0dd14606b576025565b36602557005b6040517f00000000000000000000000000000000000000000000000000000000000000009036600082376000803683855af43d806000843e8180156067578184f35b8184fd5b348015607657600080fd5b50609d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f3fea2646970667358221220a3350e7abb318cfd6c2f0227ef2ec856c01e215d98d5d2e5e2202e41a3c4deaf64736f6c63430008050033a264697066735822122050918e61870b0f1ddead9eaaa62b87615ca8bfc3c7e27a4e53a4c75b79cfe6a564736f6c6343000805003360e06040523480156200001157600080fd5b5060405162003c3d38038062003c3d833981016040819052620000349162000079565b6001600160601b0319606093841b811660805291831b821660a05290911b1660c052620000c3565b80516001600160a01b03811681146200007457600080fd5b919050565b6000806000606084860312156200008f57600080fd5b6200009a846200005c565b9250620000aa602085016200005c565b9150620000ba604085016200005c565b90509250925092565b60805160601c60a05160601c60c05160601c613af462000149600039600081816103de0152818161266b01526127330152600081816102400152818161293d01528181612a1b0152612ae30152600081816103aa015281816107a20152818161136a0152818161141c0152818161174f01528181611ec90152612c250152613af46000f3fe6080604052600436106101fe5760003560e01c806365c35e261161011d578063d56d229d116100b0578063df51c07f1161007f578063f0c690ca11610064578063f0c690ca1461069e578063fb346eab146106be578063ffa1ad74146106d457600080fd5b8063df51c07f1461064a578063ef38bf011461067157600080fd5b8063d56d229d146105ea578063d57bde7914610617578063d7bb99ba1461062d578063dd06ba1a1461063557600080fd5b80639744b8dc116100ec5780639744b8dc1461052f578063a0f243b81461054f578063c4bf02201461057c578063c884ef83146105aa57600080fd5b806365c35e26146104c45780636971524f146104e457806382a5c69a1461050457806395d89b411461051a57600080fd5b80632bbce5e6116101955780634367a029116101645780634367a029146104205780634bb278f31461044d578063550b521c146104625780635bc789d91461049757600080fd5b80632bbce5e6146103825780633c4d12d9146103985780633fc8cef3146103cc578063429093cc1461040057600080fd5b806317821fdc116101d157806317821fdc1461032057806317d70f7c146103375780631998aeef1461034d5780631e83409a1461036257600080fd5b806306fdde03146102035780630b2030231461022e57806310782f8f14610287578063150b7a02146102ab575b600080fd5b34801561020f57600080fd5b506102186106fc565b60405161022591906137be565b60405180910390f35b34801561023a57600080fd5b506102627f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610225565b34801561029357600080fd5b5061029d60685481565b604051908152602001610225565b3480156102b757600080fd5b506102ef6102c636600461338c565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610225565b34801561032c57600080fd5b5061033561078a565b005b34801561034357600080fd5b5061029d60695481565b34801561035957600080fd5b506103356108c4565b34801561036e57600080fd5b5061033561037d36600461334b565b610ff0565b34801561038e57600080fd5b5061029d606b5481565b3480156103a457600080fd5b506102627f000000000000000000000000000000000000000000000000000000000000000081565b3480156103d857600080fd5b506102627f000000000000000000000000000000000000000000000000000000000000000081565b34801561040c57600080fd5b5061033561041b36600461354f565b611352565b34801561042c57600080fd5b50606a546102629073ffffffffffffffffffffffffffffffffffffffff1681565b34801561045957600080fd5b50610335611444565b34801561046e57600080fd5b5061048261047d366004613501565b6117ce565b60408051928352602083019190915201610225565b3480156104a357600080fd5b506067546102629073ffffffffffffffffffffffffffffffffffffffff1681565b3480156104d057600080fd5b506103356104df3660046133f8565b61180a565b3480156104f057600080fd5b506104826104ff36600461334b565b611d3d565b34801561051057600080fd5b5061029d606f5481565b34801561052657600080fd5b50610218611e8c565b34801561053b57600080fd5b5061029d61054a36600461354f565b611e99565b34801561055b57600080fd5b5061029d61056a36600461334b565b60736020526000908152604090205481565b34801561058857600080fd5b5061059c6105973660046134b1565b611ead565b604051610225929190613764565b3480156105b657600080fd5b506105da6105c536600461334b565b60746020526000908152604090205460ff1681565b6040519015158152602001610225565b3480156105f657600080fd5b506066546102629073ffffffffffffffffffffffffffffffffffffffff1681565b34801561062357600080fd5b5061029d60705481565b610335612024565b34801561064157600080fd5b5061029d6122e4565b34801561065657600080fd5b50606e546106649060ff1681565b6040516102259190613787565b34801561067d57600080fd5b506065546102629073ffffffffffffffffffffffffffffffffffffffff1681565b3480156106aa57600080fd5b5061029d6106b936600461334b565b612316565b3480156106ca57600080fd5b5061029d60715481565b3480156106e057600080fd5b506106e9600281565b60405161ffff9091168152602001610225565b606c805461070990613953565b80601f016020809104026020016040519081016040528092919081815260200182805461073590613953565b80156107825780601f1061075757610100808354040283529160200191610782565b820191906000526020600020905b81548152906001019060200180831161076557829003601f168201915b505050505081565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610854576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f50617274794269643a3a206f6e6c7920506172747944414f206d756c7469736960448201527f670000000000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b606e80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166002908117909155606f546040517f9a2087478f16b801ecd568a6676f5db758bda2a01b954b2c754257d11eb3770b926108ba9290916000918291613795565b60405180910390a1565b60026001541415610931576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161084b565b60026001556000606e5460ff16600281111561094f5761094f613a0f565b146109dc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f50617274794269643a3a6269643a2061756374696f6e206e6f7420616374697660448201527f6500000000000000000000000000000000000000000000000000000000000000606482015260840161084b565b33600090815260736020526040902054610a78576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f50617274794269643a3a6269643a206f6e6c7920636f6e7472696275746f727360448201527f2063616e20626964000000000000000000000000000000000000000000000000606482015260840161084b565b6065546068546040517f456b09c100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9092169163456b09c191610ad39160040190815260200190565b60206040518083038186803b158015610aeb57600080fd5b505afa158015610aff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b23919061336f565b73ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161415610bde576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50617274794269643a3a6269643a20616c72656164792068696768657374206260448201527f6964646572000000000000000000000000000000000000000000000000000000606482015260840161084b565b6065546068546040517f33727c4d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909216916333727c4d91610c399160040190815260200190565b60206040518083038186803b158015610c5157600080fd5b505afa158015610c65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c89919061352d565b15610d16576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f50617274794269643a3a6269643a2061756374696f6e20616c7265616479206660448201527f696e616c697a6564000000000000000000000000000000000000000000000000606482015260840161084b565b6065546068546040517f0600d4eb000000000000000000000000000000000000000000000000000000008152600481019190915260009173ffffffffffffffffffffffffffffffffffffffff1690630600d4eb9060240160206040518083038186803b158015610d8557600080fd5b505afa158015610d99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dbd9190613568565b9050610dc76122e4565b811115610e56576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f50617274794269643a3a6269643a20696e73756666696369656e742066756e6460448201527f7320746f20626964000000000000000000000000000000000000000000000000606482015260840161084b565b606554606854604051602481019190915260448101839052600091829173ffffffffffffffffffffffffffffffffffffffff90911690606401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f598647f80000000000000000000000000000000000000000000000000000000017905251610f1091906136dd565b600060405180830381855af49150503d8060008114610f4b576040519150601f19603f3d011682016040523d82523d6000602084013e610f50565b606091505b50915091508181604051602001610f6791906136f9565b60405160208183030381529060405290610fae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161084b91906137be565b5060708390556040518381527f7a183e84509e3fe5b0b3aac15347fd1c7d71fd1503001f1a1d7c9658077eb35f9060200160405180910390a150506001805550565b6002600154141561105d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161084b565b60026001556000606e5460ff16600281111561107b5761107b613a0f565b1415611109576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f50617274794269643a3a636c61696d3a2061756374696f6e206e6f742066696e60448201527f616c697a65640000000000000000000000000000000000000000000000000000606482015260840161084b565b73ffffffffffffffffffffffffffffffffffffffff81166000908152607360205260409020546111bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f50617274794269643a3a636c61696d3a206e6f74206120636f6e74726962757460448201527f6f72000000000000000000000000000000000000000000000000000000000000606482015260840161084b565b73ffffffffffffffffffffffffffffffffffffffff811660009081526074602052604090205460ff1615611271576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f50617274794269643a3a636c61696d3a20636f6e747269627574696f6e20616c60448201527f726561647920636c61696d656400000000000000000000000000000000000000606482015260840161084b565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260746020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055806112c983611d3d565b915091506112d783836124dc565b6112e18382612647565b73ffffffffffffffffffffffffffffffffffffffff83166000818152607360209081526040918290205482519081529081018490529081018490527f9cdcf2f7714cca3508c7f0110b04a90a80a3a8dd0e35de99689db74d28c5383e9060600160405180910390a250506001805550565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614611417576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f50617274794269643a3a206f6e6c7920506172747944414f206d756c7469736960448201527f6700000000000000000000000000000000000000000000000000000000000000606482015260840161084b565b6114417f000000000000000000000000000000000000000000000000000000000000000082612647565b50565b600260015414156114b1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161084b565b60026001556000606e5460ff1660028111156114cf576114cf613a0f565b1461155c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f50617274794269643a3a66696e616c697a653a2061756374696f6e206e6f742060448201527f6163746976650000000000000000000000000000000000000000000000000000606482015260840161084b565b6065546068546040517f33727c4d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909216916333727c4d916115b79160040190815260200190565b60206040518083038186803b1580156115cf57600080fd5b505afa1580156115e3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611607919061352d565b611699576065546068546040517f05261aea00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909216916305261aea916116669160040190815260200190565b600060405180830381600087803b15801561168057600080fd5b505af1158015611694573d6000803e3d6000fd5b505050505b60006116a36127b9565b905073ffffffffffffffffffffffffffffffffffffffff811630146116c95760026116cc565b60015b606e80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600183600281111561170657611706613a0f565b021790555060006001606e5460ff16600281111561172657611726613a0f565b141561177c576117376070546128e0565b905080607054611747919061385d565b6071556117747f000000000000000000000000000000000000000000000000000000000000000082612647565b61177c6128fa565b606e54607154606f546040517f9a2087478f16b801ecd568a6676f5db758bda2a01b954b2c754257d11eb3770b936117be9360ff909116929091869190613795565b60405180910390a1505060018055565b607260205281600052604060002081815481106117ea57600080fd5b600091825260209091206002909102018054600190910154909250905082565b600054610100900460ff1680611823575060005460ff16155b6118af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161084b565b600054610100900460ff161580156118ee57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000166101011790555b6118f6612c92565b6118fe612daf565b6065805473ffffffffffffffffffffffffffffffffffffffff808c167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925560668054928b169290911691909117905560698790556068869055825161197090606c906020860190613207565b50815161198490606d906020850190613207565b50600061199460fa6127106138ed565b61ffff169050808510611a29576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f50617274794269643a3a696e697469616c697a653a20626173697320706f696e60448201527f74732063616e27742074616b6520313030250000000000000000000000000000606482015260840161084b565b73ffffffffffffffffffffffffffffffffffffffff8616611ad2578415611ad2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f50617274794269643a3a696e697469616c697a653a2063616e27742073656e6460448201527f20746f6b656e7320746f206275726e2061646472000000000000000000000000606482015260840161084b565b606b859055606a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff88161790556000611b216127b9565b73ffffffffffffffffffffffffffffffffffffffff161415611bc5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f50617274794269643a3a696e697469616c697a653a204e4654206765744f776e60448201527f6572206661696c65640000000000000000000000000000000000000000000000606482015260840161084b565b6065546040517f97e2d3800000000000000000000000000000000000000000000000000000000081526004810189905273ffffffffffffffffffffffffffffffffffffffff8b81166024830152604482018b9052909116906397e2d3809060640160206040518083038186803b158015611c3e57600080fd5b505afa158015611c52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c76919061352d565b611d02576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f50617274794269643a3a696e697469616c697a653a2061756374696f6e49642060448201527f646f65736e2774206d6174636820746f6b656e00000000000000000000000000606482015260840161084b565b508015611d3257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555b505050505050505050565b60008080606e5460ff166002811115611d5857611d58613a0f565b1415611e0c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f50617274794269643a3a676574436c61696d416d6f756e74733a20706172747960448201527f207374696c6c206163746976653b20616d6f756e747320756e64657465726d6960648201527f6e65640000000000000000000000000000000000000000000000000000000000608482015260a40161084b565b73ffffffffffffffffffffffffffffffffffffffff83166000908152607360205260409020546001606e5460ff166002811115611e4b57611e4b613a0f565b1415611e82576000611e5c85612316565b90508015611e7057611e6d81611e99565b93505b611e7a8183613910565b925050611e86565b8091505b50915091565b606d805461070990613953565b6000611ea76103e8836138b0565b92915050565b600060603373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614611f76576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f50617274794269643a3a206f6e6c7920506172747944414f206d756c7469736960448201527f6700000000000000000000000000000000000000000000000000000000000000606482015260840161084b565b8373ffffffffffffffffffffffffffffffffffffffff1683604051611f9b91906136dd565b6000604051808303816000865af19150503d8060008114611fd8576040519150601f19603f3d011682016040523d82523d6000602084013e611fdd565b606091505b509092509050808261201c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161084b91906137be565b509250929050565b60026001541415612091576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161084b565b60026001556000606e5460ff1660028111156120af576120af613a0f565b1461213c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f50617274794269643a3a636f6e747269627574653a2061756374696f6e206e6f60448201527f7420616374697665000000000000000000000000000000000000000000000000606482015260840161084b565b3334806121cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f50617274794269643a3a636f6e747269627574653a206d75737420636f6e747260448201527f6962757465206d6f7265207468616e2030000000000000000000000000000000606482015260840161084b565b606f54604080518082018252838152602080820184815273ffffffffffffffffffffffffffffffffffffffff87166000818152607284528581208054600181810183559183528583208751600290920201908155935193019290925581526073909152919091205461223e90849061385d565b73ffffffffffffffffffffffffffffffffffffffff8516600090815260736020526040902055606f5461227290849061385d565b606f5573ffffffffffffffffffffffffffffffffffffffff84166000818152607360209081526040918290205482518781529182018690528183015290517fb2623081601722547aae8781994e01a1974d95b0ad9ce6a0cfbe17487556257f9181900360600190a25050600180555050565b60006122f360fa612710613837565b61ffff16606f5461271061230791906138b0565b6123119190613875565b905090565b600080606e5460ff16600281111561233057612330613a0f565b14156123e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604660248201527f50617274794269643a3a746f74616c45746855736564466f724269643a20706160448201527f727479207374696c6c206163746976653b20616d6f756e747320756e6465746560648201527f726d696e65640000000000000000000000000000000000000000000000000000608482015260a40161084b565b60715473ffffffffffffffffffffffffffffffffffffffff8316600090815260726020908152604080832080548251818502810185019093528083529192909190849084015b828210156124705783829060005260206000209060020201604051806040016040529081600082015481526020016001820154815250508152602001906001019061242a565b50505050905060005b81518110156124d45760006124a78484848151811061249a5761249a613a3e565b6020026020010151612e9b565b9050806124b457506124d4565b6124be818661385d565b94505080806124cc906139a7565b915050612479565b505050919050565b806124e5575050565b6067546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a082319060240160206040518083038186803b15801561254f57600080fd5b505afa158015612563573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125879190613568565b905080821115612595578091505b6067546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018590529091169063a9059cbb90604401602060405180830381600087803b15801561260957600080fd5b505af115801561261d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612641919061352d565b50505050565b80612650575050565b4781111561265b5750475b6126658282612eea565b6127b5577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b1580156126d157600080fd5b505af11580156126e5573d6000803e3d6000fd5b50506040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152602482018690527f000000000000000000000000000000000000000000000000000000000000000016935063a9059cbb92506044019050602060405180830381600087803b15801561277b57600080fd5b505af115801561278f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127b3919061352d565b505b5050565b60665460695460405160248101919091526000918291829173ffffffffffffffffffffffffffffffffffffffff1690604401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f6352211e000000000000000000000000000000000000000000000000000000001790525161286c91906136dd565b600060405180830381855afa9150503d80600081146128a7576040519150601f19603f3d011682016040523d82523d6000602084013e6128ac565b606091505b50915091508180156128bf575060008151115b156128db57808060200190518101906128d8919061336f565b92505b505090565b60006127106128f060fa846138b0565b611ea79190613875565b6066546069546040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482019290925291169063095ea7b390604401600060405180830381600087803b15801561299157600080fd5b505af11580156129a5573d6000803e3d6000fd5b5050607054600092506129ba915060026138b0565b905060008060006129cc607154612f5a565b6066546069546040517fbdc0111000000000000000000000000000000000000000000000000000000000815294975092955090935060009273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081169363bdc0111093612a5f93606c93606d93921691908b908d908a906004016137d1565b602060405180830381600087803b158015612a7957600080fd5b505af1158015612a8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ab19190613568565b6040517f8c64ea4a000000000000000000000000000000000000000000000000000000008152600481018290529091507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690638c64ea4a90602401602060405180830381600087803b158015612b3c57600080fd5b505af1158015612b50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b74919061336f565b606780547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691821790556040517f0c6a62dd00000000000000000000000000000000000000000000000000000000815260006004820152630c6a62dd90602401600060405180830381600087803b158015612c0857600080fd5b505af1158015612c1c573d6000803e3d6000fd5b50505050612c4a7f0000000000000000000000000000000000000000000000000000000000000000846124dc565b606a5473ffffffffffffffffffffffffffffffffffffffff1615612c8b57606a54612c8b9073ffffffffffffffffffffffffffffffffffffffff16836124dc565b5050505050565b600054610100900460ff1680612cab575060005460ff16155b612d37576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161084b565b600054610100900460ff16158015612d7657600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000166101011790555b612d7e612fda565b801561144157600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905550565b600054610100900460ff1680612dc8575060005460ff16155b612e54576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161084b565b600054610100900460ff16158015612e9357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000166101011790555b612d7e6130f3565b60008282600001518360200151612eb2919061385d565b11612ebf57508051611ea7565b8282602001511015612ee1576020820151612eda9084613910565b9050611ea7565b50600092915050565b6000808373ffffffffffffffffffffffffffffffffffffffff168361753090604051600060405180830381858888f193505050503d8060008114612f4a576040519150601f19603f3d011682016040523d82523d6000602084013e612f4f565b606091505b509095945050505050565b600080600080606b5460fa61ffff16612f73919061385d565b9050612f9a612f8482612710613910565b612f90876127106138b0565b61054a9190613875565b9350612710612faa60fa866138b0565b612fb49190613875565b9250612710606b5485612fc791906138b0565b612fd19190613875565b93959294505050565b600054610100900460ff1680612ff3575060005460ff16155b61307f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161084b565b600054610100900460ff161580156130be57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000166101011790555b60018055801561144157600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905550565b600054610100900460ff168061310c575060005460ff16155b613198576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161084b565b600054610100900460ff16158015612d7e57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016610101179055801561144157600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905550565b82805461321390613953565b90600052602060002090601f016020900481019282613235576000855561327b565b82601f1061324e57805160ff191683800117855561327b565b8280016001018555821561327b579182015b8281111561327b578251825591602001919060010190613260565b5061328792915061328b565b5090565b5b80821115613287576000815560010161328c565b600082601f8301126132b157600080fd5b813567ffffffffffffffff808211156132cc576132cc613a6d565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561331257613312613a6d565b8160405283815286602085880101111561332b57600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006020828403121561335d57600080fd5b813561336881613a9c565b9392505050565b60006020828403121561338157600080fd5b815161336881613a9c565b600080600080608085870312156133a257600080fd5b84356133ad81613a9c565b935060208501356133bd81613a9c565b925060408501359150606085013567ffffffffffffffff8111156133e057600080fd5b6133ec878288016132a0565b91505092959194509250565b600080600080600080600080610100898b03121561341557600080fd5b883561342081613a9c565b9750602089013561343081613a9c565b96506040890135955060608901359450608089013561344e81613a9c565b935060a0890135925060c089013567ffffffffffffffff8082111561347257600080fd5b61347e8c838d016132a0565b935060e08b013591508082111561349457600080fd5b506134a18b828c016132a0565b9150509295985092959890939650565b600080604083850312156134c457600080fd5b82356134cf81613a9c565b9150602083013567ffffffffffffffff8111156134eb57600080fd5b6134f7858286016132a0565b9150509250929050565b6000806040838503121561351457600080fd5b823561351f81613a9c565b946020939093013593505050565b60006020828403121561353f57600080fd5b8151801515811461336857600080fd5b60006020828403121561356157600080fd5b5035919050565b60006020828403121561357a57600080fd5b5051919050565b60008151808452613599816020860160208601613927565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60038110613602577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b8054600090600181811c908083168061362057607f831692505b602080841082141561365b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b8388526020880182801561367657600181146136a5576136d0565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008716825282820197506136d0565b60008981526020902060005b878110156136ca578154848201529086019084016136b1565b83019850505b5050505050505092915050565b600082516136ef818460208701613927565b9190910192915050565b7f50617274794269643a3a6269643a20706c61636520626964206661696c65643a81527f2000000000000000000000000000000000000000000000000000000000000000602082015260008251613757816021850160208701613927565b9190910160210192915050565b821515815260406020820152600061377f6040830184613581565b949350505050565b60208101611ea782846135cb565b608081016137a382876135cb565b84602083015283604083015282606083015295945050505050565b6020815260006133686020830184613581565b60e0815260006137e460e083018a613606565b82810360208401526137f6818a613606565b73ffffffffffffffffffffffffffffffffffffffff98909816604084015250506060810194909452608084019290925260a083015260c09091015292915050565b600061ffff808316818516808303821115613854576138546139e0565b01949350505050565b60008219821115613870576138706139e0565b500190565b6000826138ab577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156138e8576138e86139e0565b500290565b600061ffff83811690831681811015613908576139086139e0565b039392505050565b600082821015613922576139226139e0565b500390565b60005b8381101561394257818101518382015260200161392a565b838111156126415750506000910152565b600181811c9082168061396757607f821691505b602082108114156139a1577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156139d9576139d96139e0565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff8116811461144157600080fdfea26469706673582212203de1d2f659c5e703b0a295ff37e758808c714932915c1c756dc637fd697a6e9b64736f6c63430008050033000000000000000000000000f7f52dd34bc21eda08c0b804c7c1dbc48375820f00000000000000000000000085aa7f78bdb2de8f3e0c0010d99ad5853ffcfc63000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000011c07ce1315a3b92c9755f90cdf40b04b88c57310000000000000000000000008d04a8c79ceb0889bdd12acdf3fa9d207ed3ff6300000000000000000000000000000000000000000000000000000000000000fc000000000000000000000000000000000000000000000000000000000000030e

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100725760003560e01c80633fc8cef3116100505780633fc8cef31461010257806357dbdf5414610129578063d7dfa0dd1461015757600080fd5b80630b2030231461007757806324097e88146100c85780633c4d12d9146100db575b600080fd5b61009e7f00000000000000000000000085aa7f78bdb2de8f3e0c0010d99ad5853ffcfc6381565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b61009e6100d636600461040d565b61017e565b61009e7f000000000000000000000000f7f52dd34bc21eda08c0b804c7c1dbc48375820f81565b61009e7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b6101496101373660046103eb565b60006020819052908152604090205481565b6040519081526020016100bf565b61009e7f000000000000000000000000851eb3d4dc945598b957130fd8b394745f9c807481565b60008089898989898989896040516024016101a09897969594939291906105b6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f65c35e2600000000000000000000000000000000000000000000000000000000179052519091507f000000000000000000000000851eb3d4dc945598b957130fd8b394745f9c80749082906102479061030a565b61025292919061062d565b604051809103906000f08015801561026e573d6000803e3d6000fd5b509150436000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f5c34e5a88178f42f8c7110a58ea23913dfd9da0b9c447e3925aebaeb71fff00f82338b8b8e8c8c8c8c8c6040516102f59a9998979695949392919061052b565b60405180910390a15098975050505050505050565b6103578061069483390190565b803573ffffffffffffffffffffffffffffffffffffffff8116811461033b57600080fd5b919050565b600082601f83011261035157600080fd5b813567ffffffffffffffff8082111561036c5761036c610664565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156103b2576103b2610664565b816040528381528660208588010111156103cb57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000602082840312156103fd57600080fd5b61040682610317565b9392505050565b600080600080600080600080610100898b03121561042a57600080fd5b61043389610317565b975061044160208a01610317565b9650604089013595506060890135945061045d60808a01610317565b935060a0890135925060c089013567ffffffffffffffff8082111561048157600080fd5b61048d8c838d01610340565b935060e08b01359150808211156104a357600080fd5b506104b08b828c01610340565b9150509295985092959890939650565b6000815180845260005b818110156104e6576020818501810151868301820152016104ca565b818111156104f8576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600061014073ffffffffffffffffffffffffffffffffffffffff808e168452808d166020850152808c1660408501528a6060850152808a1660808501528860a085015280881660c0850152508560e084015280610100840152610590818401866104c0565b90508281036101208401526105a581856104c0565b9d9c50505050505050505050505050565b600061010073ffffffffffffffffffffffffffffffffffffffff808c168452808b1660208501528960408501528860608501528088166080850152508560a08401528060c084015261060a818401866104c0565b905082810360e084015261061e81856104c0565b9b9a5050505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316815260406020820152600061065c60408301846104c0565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fdfe60a060405234801561001057600080fd5b5060405161035738038061035783398101604081905261002f916100d7565b6001600160601b0319606083901b1660805260405160009081906001600160a01b0385169061005f9085906101a5565b600060405180830381855af49150503d806000811461009a576040519150601f19603f3d011682016040523d82523d6000602084013e61009f565b606091505b50915091508181906100cd5760405162461bcd60e51b81526004016100c491906101c1565b60405180910390fd5b505050505061023a565b600080604083850312156100ea57600080fd5b82516001600160a01b038116811461010157600080fd5b60208401519092506001600160401b038082111561011e57600080fd5b818501915085601f83011261013257600080fd5b81518181111561014457610144610224565b604051601f8201601f19908116603f0116810190838211818310171561016c5761016c610224565b8160405282815288602084870101111561018557600080fd5b6101968360208301602088016101f4565b80955050505050509250929050565b600082516101b78184602087016101f4565b9190910192915050565b60208152600082518060208401526101e08160408501602087016101f4565b601f01601f19169190910160400192915050565b60005b8381101561020f5781810151838201526020016101f7565b8381111561021e576000848401525b50505050565b634e487b7160e01b600052604160045260246000fd5b60805160601c60fc61025b60003960008181602a0152607b015260fc6000f3fe608060405260043610601f5760003560e01c8063d7dfa0dd14606b576025565b36602557005b6040517f00000000000000000000000000000000000000000000000000000000000000009036600082376000803683855af43d806000843e8180156067578184f35b8184fd5b348015607657600080fd5b50609d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f3fea2646970667358221220a3350e7abb318cfd6c2f0227ef2ec856c01e215d98d5d2e5e2202e41a3c4deaf64736f6c63430008050033a264697066735822122050918e61870b0f1ddead9eaaa62b87615ca8bfc3c7e27a4e53a4c75b79cfe6a564736f6c63430008050033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000f7f52dd34bc21eda08c0b804c7c1dbc48375820f00000000000000000000000085aa7f78bdb2de8f3e0c0010d99ad5853ffcfc63000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000011c07ce1315a3b92c9755f90cdf40b04b88c57310000000000000000000000008d04a8c79ceb0889bdd12acdf3fa9d207ed3ff6300000000000000000000000000000000000000000000000000000000000000fc000000000000000000000000000000000000000000000000000000000000030e

-----Decoded View---------------
Arg [0] : _partyDAOMultisig (address): 0xF7f52Dd34bc21eDA08c0b804C7c1dbc48375820f
Arg [1] : _tokenVaultFactory (address): 0x85Aa7f78BdB2DE8F3e0c0010d99AD5853fFcfC63
Arg [2] : _weth (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Arg [3] : _logicMarketWrapper (address): 0x11c07cE1315a3b92C9755F90cDF40B04b88c5731
Arg [4] : _logicNftContract (address): 0x8d04a8c79cEB0889Bdd12acdF3Fa9D207eD3Ff63
Arg [5] : _logicTokenId (uint256): 252
Arg [6] : _logicAuctionId (uint256): 782

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 000000000000000000000000f7f52dd34bc21eda08c0b804c7c1dbc48375820f
Arg [1] : 00000000000000000000000085aa7f78bdb2de8f3e0c0010d99ad5853ffcfc63
Arg [2] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [3] : 00000000000000000000000011c07ce1315a3b92c9755f90cdf40b04b88c5731
Arg [4] : 0000000000000000000000008d04a8c79ceb0889bdd12acdf3fa9d207ed3ff63
Arg [5] : 00000000000000000000000000000000000000000000000000000000000000fc
Arg [6] : 000000000000000000000000000000000000000000000000000000000000030e


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
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.