ETH Price: $2,936.42 (-6.21%)
Gas: 6 Gwei

Contract

0xC2C01B14ae7aBC88503faC352c114e5E5932d5D5
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
0x60806040173236362023-05-23 18:14:23408 days ago1684865663IN
 Create: UnitLondonMarketplaceV2
0 ETH0.2837761463.02462878

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
UnitLondonMarketplaceV2

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license
File 1 of 7 : UnitLondonMarketplaceV2.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "./utils/Proxy.sol";
import "./utils/RoyaltySplitter.sol";
import "./UnitLondonMarketplace.sol";

interface INFTV2 {
  function mint(uint256 tokenId, address user) external;

  function mint(uint256 tokenId, uint256 amount, address user) external;

  function transferFrom(address from, address to, uint256 tokenId) external;

  function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes memory data) external;

  function ownerOf(uint256 tokenId) external view returns (address);

  function balanceOf(address account, uint256 id) external view returns (uint256);

  function initialize(string calldata _name, string calldata _symbol) external;

  function transferOwnership(address newOwner) external;
}

interface IMetadata {
  function metadata() external view returns (string memory);
}

interface IProxy {
  function implementation() external view returns (address);
}

contract UnitLondonMarketplaceV2 is UnitLondonMarketplace {
  mapping(address => mapping(uint256 => address)) onChainMetadatas;

  address constant logic0V1 = 0xB6330B44CCC567D3252cF8987b4E1ed1d8ED744F;
  address constant logic1V1 = 0x402FEEB4b633D97Df94A53e232B5d7F12fb2976F;

  function addOnChain(
    address collection,
    uint256 tokenId,
    uint256 tokenLogic, // amount - 0 for 721, N for 1155
    uint256 price,
    uint256 startDate,
    address metadata
  ) external {
    require(onlyGrant() || collections[collection].artist == msg.sender, "Invalid artist");
    TokenData storage data = tokens[collection][tokenId];
    require(data.price == 0, "Invalid token");

    require(collections[collection].splitter != address(0), "Invalid on-chain");
    onChainMetadatas[collection][tokenId] = metadata;

    data.amount = tokenLogic;
    data.price = price;
    data.startDate = startDate;

    emit TokenUpdated(collection, tokenId, data);
  }

  function updateOnChainMetadata(address collection, uint256 tokenId, address metadata) external {
    require(onlyGrant() || collections[collection].artist == msg.sender, "Invalid artist");
    TokenData memory data = tokens[collection][tokenId];

    require(onChainMetadatas[collection][tokenId] != address(0), "Invalid on-chain");
    onChainMetadatas[collection][tokenId] = metadata;

    emit TokenUpdated(collection, tokenId, data);
  }

  function buy(
    address collection,
    uint256 tokenId,
    uint256 tokenLogic // amount - 0 for 721, N for 1155
  ) external payable override {
    address user = msg.sender;
    uint256 value = msg.value;
    TokenData storage tokenData = tokens[collection][tokenId];

    CollectionData memory collectionData = collections[collection];
    uint256 fee = (value * collectionData.mintFeePlatform) / RATIO;
    payable(platform).transfer(fee);
    payable(collectionData.artist).transfer(value - fee);

    // require(tokenData.price > 0, "Invalid token");
    require(tokenData.startDate < block.timestamp, "Invalid sale");
    if (tokenLogic == 0) {
      // ERC721
      require(tokenData.price == value, "Invalid price");

      if (collections[collection].splitter == address(0)) {
        // Manifolds
        INFTV2(collection).transferFrom(address(this), user, tokenId);
      } else {
        if (IProxy(collection).implementation() == logic0V1) {
          INFT(collection).mint(tokenId, tokenData.metadata, user);
        } else {
          INFTV2(collection).mint(tokenId, user);
        }
      }
      tokenLogic = 1;
    } else {
      // ERC1155
      require(tokenData.price * tokenLogic == value, "Invalid price");

      if (collections[collection].splitter == address(0)) {
        // Manifolds
        INFTV2(collection).safeTransferFrom(address(this), user, tokenId, tokenLogic, "");
      } else {
        tokenData.amount = tokenData.amount - tokenLogic;
        if (IProxy(collection).implementation() == logic1V1) {
          INFT(collection).mint(tokenId, tokenLogic, tokenData.metadata, user);
        } else {
          INFTV2(collection).mint(tokenId, tokenLogic, user);
        }
      }
    }
    emit TokenSold(collection, tokenId, tokenLogic, value);
  }

  function airdrop(address collection, uint256 tokenId, address[] calldata redeemers) external override {
    require(onlyGrant(), "Invalid permission");
    TokenData storage data = tokens[collection][tokenId];
    // require(data.price > 0, "Invalid token");

    if (collections[collection].splitter == address(0)) {
      // Manifolds
      if (collections[collection].logicIndex > 0) {
        // ERC1155
        uint256 tokenLogic = redeemers.length;
        for (uint256 i = 0; i < tokenLogic; i++) {
          INFTV2(collection).safeTransferFrom(address(this), redeemers[i], tokenId, 1, "");
        }
      } else {
        // ERC721
        INFTV2(collection).transferFrom(address(this), redeemers[0], tokenId);
      }
    } else {
      if (collections[collection].logicIndex > 0) {
        // ERC1155
        uint256 tokenLogic = redeemers.length;
        data.amount = data.amount - tokenLogic;
        for (uint256 i = 0; i < tokenLogic; i++) {
          if (IProxy(collection).implementation() == logic1V1) {
            INFT(collection).mint(tokenId, 1, data.metadata, redeemers[i]);
          } else {
            INFTV2(collection).mint(tokenId, 1, redeemers[i]);
          }
        }
      } else {
        // ERC721
        if (IProxy(collection).implementation() == logic0V1) {
          INFT(collection).mint(tokenId, data.metadata, redeemers[0]);
        } else {
          INFTV2(collection).mint(tokenId, redeemers[0]);
        }
      }
    }
    emit TokenAirdropped(collection, tokenId, redeemers);
  }

  function redeem(
    address collection,
    uint256 tokenId,
    address[] calldata redeemers,
    uint256[] calldata prices
  ) external override {
    require(onlyTrdparty());
    TokenData storage data = tokens[collection][tokenId];
    // require(data.price > 0, "Invalid token");

    if (collections[collection].splitter == address(0)) {
      // Manifolds
      if (collections[collection].logicIndex > 0) {
        // ERC1155
        uint256 tokenLogic = redeemers.length;
        for (uint256 i = 0; i < tokenLogic; i++) {
          INFTV2(collection).safeTransferFrom(address(this), redeemers[i], tokenId, 1, "");
        }
      } else {
        // ERC721
        INFTV2(collection).transferFrom(address(this), redeemers[0], tokenId);
      }
    } else {
      if (collections[collection].logicIndex > 0) {
        // ERC1155
        uint256 tokenLogic = redeemers.length;
        data.amount = data.amount - tokenLogic;
        for (uint256 i = 0; i < tokenLogic; i++) {
          if (IProxy(collection).implementation() == logic1V1) {
            INFT(collection).mint(tokenId, 1, data.metadata, redeemers[i]);
          } else {
            INFTV2(collection).mint(tokenId, 1, redeemers[i]);
          }
        }
      } else {
        // ERC721
        if (IProxy(collection).implementation() == logic0V1) {
          INFT(collection).mint(tokenId, data.metadata, redeemers[0]);
        } else {
          INFTV2(collection).mint(tokenId, redeemers[0]);
        }
      }
    }
    emit TokenRedeemed(collection, tokenId, redeemers, prices);
  }

  function tokenURI(address collection, uint256 tokenId) external view returns (string memory) {
    if (onChainMetadatas[collection][tokenId] == address(0)) {
      return tokens[collection][tokenId].metadata;
    } else {
      return IMetadata(onChainMetadatas[collection][tokenId]).metadata();
    }
  }
}

File 2 of 7 : UnitLondonMarketplace.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "./utils/Proxy.sol";
import "./utils/RoyaltySplitter.sol";
import "./utils/Vault.sol";
import "./utils/IOwnable.sol";

interface INFT {
  function mint(uint256 tokenId, string calldata metadata, address user) external;

  function mint(uint256 tokenId, uint256 amount, string calldata metadata, address user) external;

  function transferFrom(address from, address to, uint256 tokenId) external;

  function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes memory data) external;

  function ownerOf(uint256 tokenId) external view returns (address);

  function balanceOf(address account, uint256 id) external view returns (uint256);

  function initialize(string calldata _name, string calldata _symbol) external;

  function transferOwnership(address newOwner) external;
}

contract UnitLondonMarketplace is Vault, IOwnable {
  struct CollectionData {
    address artist;
    address splitter;
    uint32 mintFeePlatform;
    uint32 royaltyCollection;
    uint32 royaltyPlatform;
    uint32 logicIndex;
    string contractURI;
  }

  struct TokenData {
    uint256 price;
    uint256 amount;
    uint256 startDate;
    string metadata;
  }

  event PlatformUpdated(address oldPlatform, address newPlatform);
  event CollectionRegistered(address collection, CollectionData data);
  event TokenUpdated(address collection, uint256 tokenId, TokenData data);
  event TokenSold(address collection, uint256 tokenId, uint256 amount, uint256 value);
  event TokenAirdropped(address collection, uint256 tokenId, address[] redeemers);
  event TokenRedeemed(address collection, uint256 tokenId, address[] redeemers, uint256[] prices);

  uint256 constant RATIO = 10000;

  address implementation_;
  address public override owner;
  bool public initialized;

  address[2] public logics;

  uint32 public mintFeePlatform;
  uint32 public royaltyPlatform;

  mapping(address => bool) public artists;

  mapping(address => CollectionData) public collections;
  mapping(address => mapping(uint256 => TokenData)) public tokens;

  address public platform;
  address public trdparty;

  function onlyOwner() internal view returns (bool) {
    return msg.sender == owner;
  }

  function onlyTrdparty() internal view returns (bool) {
    return msg.sender == owner || msg.sender == trdparty;
  }

  function onlyGrant() internal view returns (bool) {
    return msg.sender == owner || msg.sender == platform;
  }

  function initialize(address[2] memory _logics) external {
    require(!initialized && onlyOwner());
    initialized = true;

    logics = _logics;
    mintFeePlatform = 3000; // 30.00%
    royaltyPlatform = 200; // 2.00%

    emit OwnershipTransferred(address(0), msg.sender);
  }

  function setPlatform(address newPlatform) external {
    if (platform == address(0)) {
      require(onlyOwner());
    } else {
      require(onlyGrant());
    }

    emit PlatformUpdated(platform, newPlatform);
    platform = newPlatform;
  }

  function setTrdparty(address newTrdparty) external {
    require(onlyOwner());

    trdparty = newTrdparty;
  }

  function setMintFeePlatform(uint32 newMintFeePlatform) external {
    require(onlyGrant());
    mintFeePlatform = newMintFeePlatform;
  }

  function setRoyaltyPlatform(uint32 newRoyaltyPlatform) external {
    require(onlyGrant());
    royaltyPlatform = newRoyaltyPlatform;
  }

  function setArtists(address[] calldata _artists) external {
    require(onlyGrant());
    for (uint256 i = 0; i < _artists.length; i++) {
      artists[_artists[i]] = true;
    }
  }

  function removeArtist(address artist) external {
    require(onlyGrant());
    delete artists[artist];
  }

  function withdraw() external {
    require(onlyGrant());
    payable(platform).transfer(address(this).balance);
  }

  function onlyArtist(address artist) internal view returns (bool) {
    require(artists[artist], "Invalid artist");
    return onlyGrant() || msg.sender == artist;
  }

  function registerCollection(
    uint32 logicIndex,
    string calldata name,
    string calldata symbol,
    address artist,
    uint32 royaltyArtist,
    string calldata contractURI
  ) external {
    require(onlyArtist(artist), "Invalid permission");
    Proxy proxy = new Proxy();
    proxy.setImplementation(logics[logicIndex]);

    address collection = address(proxy);
    CollectionData storage data = collections[collection];
    data.artist = artist;
    data.splitter = address(new RoyaltySplitter());
    data.mintFeePlatform = mintFeePlatform;
    data.royaltyCollection = royaltyArtist + royaltyPlatform;
    data.royaltyPlatform = royaltyPlatform;
    data.logicIndex = logicIndex;
    data.contractURI = contractURI;

    INFT(collection).initialize(name, symbol);
    INFT(collection).transferOwnership(artist);

    emit CollectionRegistered(collection, data);
  }

  function collectionURI(address collection) external view returns (string memory) {
    return collections[collection].contractURI;
  }

  function syncLogic(Proxy collection) external {
    collection.setImplementation(logics[collections[address(collection)].logicIndex]);
  }

  function registerManifold(uint32 logicIndex, address manifold, address artist, string calldata contractURI) external {
    require(onlyArtist(artist), "Invalid permission");

    CollectionData storage data = collections[manifold];
    require(data.artist == address(0), "Invalid collection");
    data.artist = artist;
    data.logicIndex = logicIndex;
    data.mintFeePlatform = mintFeePlatform;
    data.contractURI = contractURI;

    emit CollectionRegistered(manifold, data);
  }

  function updateCollectionMintFeePlatform(address collection, uint32 newMintFeePlatform) external {
    CollectionData storage data = collections[collection];

    require(onlyGrant(), "Invalid permission");
    data.mintFeePlatform = newMintFeePlatform;
    emit CollectionRegistered(collection, data);
  }

  function updateCollectionRoyaltyArtist(address collection, uint32 royaltyArtist) external {
    CollectionData storage data = collections[collection];

    require(onlyGrant(), "Invalid permission");
    data.royaltyCollection = royaltyArtist + royaltyPlatform;
    emit CollectionRegistered(collection, data);
  }

  function updateCollectionURI(address collection, string calldata contractURI) external {
    CollectionData storage data = collections[collection];

    require(onlyGrant(), "Invalid permission");
    data.contractURI = contractURI;
    emit CollectionRegistered(collection, data);
  }

  function emitCollectionRegistered(address[] calldata registers) external {
    require(onlyGrant(), "Invalid permission");

    for (uint256 i = 0; i < registers.length; i++) {
      address collection = registers[i];
      emit CollectionRegistered(collection, collections[collection]);
    }
  }

  function addToken(
    address collection,
    uint256 tokenId,
    uint256 tokenLogic, // amount - 0 for 721, N for 1155
    uint256 price,
    uint256 startDate,
    string calldata metadata
  ) external {
    require(onlyGrant() || collections[collection].artist == msg.sender, "Invalid artist");
    TokenData storage data = tokens[collection][tokenId];
    require(data.price == 0, "Invalid token");

    if (collections[collection].splitter == address(0)) {
      // Manifolds
      if (tokenLogic == 0) {
        // ERC721
        require(INFT(collection).ownerOf(tokenId) == address(this), "Invalid owner");
      } else {
        // ERC1155
        require(INFT(collection).balanceOf(address(this), tokenId) == tokenLogic, "Invalid owner");
      }
    } else {
      data.metadata = metadata;
    }

    data.amount = tokenLogic;
    data.price = price;
    data.startDate = startDate;

    emit TokenUpdated(collection, tokenId, data);
  }

  function updateTokenPrice(address collection, uint256 tokenId, uint256 price) external {
    require(onlyGrant() || collections[collection].artist == msg.sender, "Invalid artist");
    TokenData storage data = tokens[collection][tokenId];
    // require(data.price > 0, "Invalid token");

    data.price = price;

    emit TokenUpdated(collection, tokenId, data);
  }

  function updateTokenStartDate(address collection, uint256 tokenId, uint256 startDate) external {
    require(onlyGrant() || collections[collection].artist == msg.sender, "Invalid artist");
    TokenData storage data = tokens[collection][tokenId];
    require(data.startDate > 0, "Invalid token");

    data.startDate = startDate;

    emit TokenUpdated(collection, tokenId, data);
  }

  function updateTokenMetadata(address collection, uint256 tokenId, string calldata metadata) external {
    require(onlyGrant() || collections[collection].artist == msg.sender, "Invalid artist");
    TokenData storage data = tokens[collection][tokenId];

    data.metadata = metadata;

    emit TokenUpdated(collection, tokenId, data);
  }

  function buy(
    address collection,
    uint256 tokenId,
    uint256 tokenLogic // amount - 0 for 721, N for 1155
  ) external virtual payable {
    address user = msg.sender;
    uint256 value = msg.value;
    TokenData storage tokenData = tokens[collection][tokenId];

    CollectionData memory collectionData = collections[collection];
    uint256 fee = (value * collectionData.mintFeePlatform) / RATIO;
    payable(platform).transfer(fee);
    payable(collectionData.artist).transfer(value - fee);

    // require(tokenData.price > 0, "Invalid token");
    require(tokenData.startDate < block.timestamp, "Invalid sale");
    if (tokenLogic == 0) {
      // ERC721
      require(tokenData.price == value, "Invalid price");

      if (collections[collection].splitter == address(0)) {
        // Manifolds
        INFT(collection).transferFrom(address(this), user, tokenId);
      } else {
        INFT(collection).mint(tokenId, tokenData.metadata, user);
      }
      tokenLogic = 1;
    } else {
      // ERC1155
      require(tokenData.price * tokenLogic == value, "Invalid price");

      if (collections[collection].splitter == address(0)) {
        // Manifolds
        INFT(collection).safeTransferFrom(address(this), user, tokenId, tokenLogic, "");
      } else {
        tokenData.amount = tokenData.amount - tokenLogic;
        INFT(collection).mint(tokenId, tokenLogic, tokenData.metadata, user);
      }
    }
    emit TokenSold(collection, tokenId, tokenLogic, value);
  }

  function airdrop(address collection, uint256 tokenId, address[] calldata redeemers) external virtual {
    require(onlyGrant(), "Invalid permission");
    TokenData storage data = tokens[collection][tokenId];
    // require(data.price > 0, "Invalid token");

    if (collections[collection].splitter == address(0)) {
      // Manifolds
      if (collections[collection].logicIndex > 0) {
        // ERC1155
        uint256 tokenLogic = redeemers.length;
        for (uint256 i = 0; i < tokenLogic; i++) {
          INFT(collection).safeTransferFrom(address(this), redeemers[i], tokenId, 1, "");
        }
      } else {
        // ERC721
        INFT(collection).transferFrom(address(this), redeemers[0], tokenId);
      }
    } else {
      if (collections[collection].logicIndex > 0) {
        // ERC1155
        uint256 tokenLogic = redeemers.length;
        data.amount = data.amount - tokenLogic;
        for (uint256 i = 0; i < tokenLogic; i++) {
          INFT(collection).mint(tokenId, 1, data.metadata, redeemers[i]);
        }
      } else {
        // ERC721
        INFT(collection).mint(tokenId, data.metadata, redeemers[0]);
      }
    }
    emit TokenAirdropped(collection, tokenId, redeemers);
  }

  function redeem(
    address collection,
    uint256 tokenId,
    address[] calldata redeemers,
    uint256[] calldata prices
  ) external virtual {
    require(onlyTrdparty());
    TokenData storage data = tokens[collection][tokenId];
    // require(data.price > 0, "Invalid token");

    if (collections[collection].splitter == address(0)) {
      // Manifolds
      if (collections[collection].logicIndex > 0) {
        // ERC1155
        uint256 tokenLogic = redeemers.length;
        for (uint256 i = 0; i < tokenLogic; i++) {
          INFT(collection).safeTransferFrom(address(this), redeemers[i], tokenId, 1, "");
        }
      } else {
        // ERC721
        INFT(collection).transferFrom(address(this), redeemers[0], tokenId);
      }
    } else {
      if (collections[collection].logicIndex > 0) {
        // ERC1155
        uint256 tokenLogic = redeemers.length;
        data.amount = data.amount - tokenLogic;
        for (uint256 i = 0; i < tokenLogic; i++) {
          INFT(collection).mint(tokenId, 1, data.metadata, redeemers[i]);
        }
      } else {
        // ERC721
        INFT(collection).mint(tokenId, data.metadata, redeemers[0]);
      }
    }
    emit TokenRedeemed(collection, tokenId, redeemers, prices);
  }

  function royaltyInfo(address collection, uint256, uint256 value) external view returns (address, uint256) {
    CollectionData memory data = collections[collection];
    return (data.splitter, (value * data.royaltyCollection) / RATIO);
  }

  function collectRoyalties(address collection, ICoin[] calldata coins) external {
    address artist = msg.sender;
    CollectionData memory data = collections[collection];
    require(data.artist == artist, "Invalid artist");
    (uint256 balance, uint256[] memory coinBalances) = RoyaltySplitter(payable(data.splitter)).claim(coins);

    uint256 royalties = balance;
    uint256 feePlatform = (royalties * data.royaltyPlatform) / data.royaltyCollection;
    payable(platform).transfer(feePlatform);
    payable(artist).transfer(royalties - feePlatform);

    for (uint256 i = 0; i < coinBalances.length; i++) {
      royalties = coinBalances[i];
      feePlatform = (royalties * data.royaltyPlatform) / data.royaltyCollection;
      coins[i].transfer(platform, feePlatform);
      coins[i].transfer(artist, royalties - feePlatform);
    }
  }

  function transferOwnership(address newOwner) public virtual override {
    require(msg.sender == owner);
    owner = newOwner;
    emit OwnershipTransferred(msg.sender, newOwner);
  }

  function setLogic(uint256 index, address newLogic) external {
    require(onlyOwner());
    logics[index] = newLogic;
  }

  function escapeTokens(address token, uint256 amount) external {
    require(onlyGrant());
    INFT(token).transferFrom(address(this), msg.sender, amount);
  }

  function escapeSafeTokens(address token, uint256 id, uint256 amount) external {
    require(onlyGrant());
    INFT(token).safeTransferFrom(address(this), msg.sender, id, amount, "");
  }
}

File 3 of 7 : IOwnable.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface IOwnable {
  event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

  function owner() external view returns (address);

  function transferOwnership(address newOwner) external;

  // function renounceOwnership() external;
}

File 4 of 7 : Proxy.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "./ProxyData.sol";

/**
 * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM
 * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to
 * be specified by overriding the virtual {_implementation} function.
 *
 * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a
 * different contract through the {_delegate} function.
 *
 * The success and return data of the delegated call will be returned back to the caller of the proxy.
 */
contract Proxy is ProxyData {
  receive() external payable {}

  function setImplementation(address newImpl) public {
    require(msg.sender == admin);
    implementation_ = newImpl;
  }

  function implementation() public view returns (address impl) {
    impl = implementation_;
  }

  /**
   * @dev Delegates the current call to `implementation`.
   *
   * This function does not return to its internall call site, it will return directly to the external caller.
   */
  function _delegate(address implementation__) internal virtual {
    assembly {
      // Copy msg.data. We take full control of memory in this inline assembly
      // block because it will not return to Solidity code. We overwrite the
      // Solidity scratch pad at memory position 0.
      calldatacopy(0, 0, calldatasize())

      // Call the implementation.
      // out and outsize are 0 because we don't know the size yet.
      let result := delegatecall(gas(), implementation__, 0, calldatasize(), 0, 0)

      // Copy the returned data.
      returndatacopy(0, 0, returndatasize())

      switch result
      // delegatecall returns 0 on error.
      case 0 {
        revert(0, returndatasize())
      }
      default {
        return(0, returndatasize())
      }
    }
  }

  /**
   * @dev This is a virtual function that should be overriden so it returns the address to which the fallback function
   * and {_fallback} should delegate.
   */
  function _implementation() internal view returns (address) {
    return implementation_;
  }

  /**
   * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other
   * function in the contract matches the call data.
   */
  fallback() external payable virtual {
    _delegate(_implementation());
  }
}

File 5 of 7 : ProxyData.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract ProxyData {
  address implementation_;
  address public admin;

  constructor() {
    admin = msg.sender;
  }
}

File 6 of 7 : RoyaltySplitter.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface ICoin {
  function balanceOf(address) external view returns (uint256);

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

contract RoyaltySplitter {
  address owner;

  constructor() {
    owner = msg.sender;
  }

  function claim(ICoin[] calldata coins) external returns (uint256 balance, uint256[] memory coinBalances) {
    require(owner == msg.sender);

    balance = address(this).balance;
    payable(owner).transfer(balance);

    uint256 coinCount = coins.length;
    coinBalances = new uint256[](coinCount);

    for (uint256 i = 0; i < coinCount; i++) {
      coinBalances[i] = coins[i].balanceOf(address(this));
      coins[i].transfer(owner, coinBalances[i]);
    }
  }

  fallback() external payable {}

  receive() external payable {}
}

File 7 of 7 : Vault.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract Vault {
  function onERC1155Received(
    address,
    address,
    uint256,
    uint256,
    bytes calldata
  ) public virtual returns (bytes4) {
    return this.onERC1155Received.selector;
  }

  function onERC1155BatchReceived(
    address,
    address,
    uint256[] calldata,
    uint256[] calldata,
    bytes calldata
  ) public virtual returns (bytes4) {
    return this.onERC1155BatchReceived.selector;
  }

  function onERC721Received(
    address,
    address,
    uint256,
    bytes calldata
  ) external virtual returns (bytes4) {
    return 0x150b7a02;
  }

  // Used by ERC721BasicToken.sol
  function onERC721Received(
    address,
    uint256,
    bytes calldata
  ) external virtual returns (bytes4) {
    return 0xf0b9e5ba;
  }

  receive() external payable {}
}

Settings
{
  "evmVersion": "london",
  "libraries": {},
  "metadata": {
    "bytecodeHash": "ipfs",
    "useLiteralContent": true
  },
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "remappings": [],
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"collection","type":"address"},{"components":[{"internalType":"address","name":"artist","type":"address"},{"internalType":"address","name":"splitter","type":"address"},{"internalType":"uint32","name":"mintFeePlatform","type":"uint32"},{"internalType":"uint32","name":"royaltyCollection","type":"uint32"},{"internalType":"uint32","name":"royaltyPlatform","type":"uint32"},{"internalType":"uint32","name":"logicIndex","type":"uint32"},{"internalType":"string","name":"contractURI","type":"string"}],"indexed":false,"internalType":"struct UnitLondonMarketplace.CollectionData","name":"data","type":"tuple"}],"name":"CollectionRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldPlatform","type":"address"},{"indexed":false,"internalType":"address","name":"newPlatform","type":"address"}],"name":"PlatformUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"collection","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"redeemers","type":"address[]"}],"name":"TokenAirdropped","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"collection","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"redeemers","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"prices","type":"uint256[]"}],"name":"TokenRedeemed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"collection","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TokenSold","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"collection","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"components":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"startDate","type":"uint256"},{"internalType":"string","name":"metadata","type":"string"}],"indexed":false,"internalType":"struct UnitLondonMarketplace.TokenData","name":"data","type":"tuple"}],"name":"TokenUpdated","type":"event"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"tokenLogic","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"startDate","type":"uint256"},{"internalType":"address","name":"metadata","type":"address"}],"name":"addOnChain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"tokenLogic","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"startDate","type":"uint256"},{"internalType":"string","name":"metadata","type":"string"}],"name":"addToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address[]","name":"redeemers","type":"address[]"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"artists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"tokenLogic","type":"uint256"}],"name":"buy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"contract ICoin[]","name":"coins","type":"address[]"}],"name":"collectRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"}],"name":"collectionURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"collections","outputs":[{"internalType":"address","name":"artist","type":"address"},{"internalType":"address","name":"splitter","type":"address"},{"internalType":"uint32","name":"mintFeePlatform","type":"uint32"},{"internalType":"uint32","name":"royaltyCollection","type":"uint32"},{"internalType":"uint32","name":"royaltyPlatform","type":"uint32"},{"internalType":"uint32","name":"logicIndex","type":"uint32"},{"internalType":"string","name":"contractURI","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"registers","type":"address[]"}],"name":"emitCollectionRegistered","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"escapeSafeTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"escapeTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[2]","name":"_logics","type":"address[2]"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"logics","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintFeePlatform","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"platform","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address[]","name":"redeemers","type":"address[]"},{"internalType":"uint256[]","name":"prices","type":"uint256[]"}],"name":"redeem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"logicIndex","type":"uint32"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"address","name":"artist","type":"address"},{"internalType":"uint32","name":"royaltyArtist","type":"uint32"},{"internalType":"string","name":"contractURI","type":"string"}],"name":"registerCollection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"logicIndex","type":"uint32"},{"internalType":"address","name":"manifold","type":"address"},{"internalType":"address","name":"artist","type":"address"},{"internalType":"string","name":"contractURI","type":"string"}],"name":"registerManifold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"artist","type":"address"}],"name":"removeArtist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyPlatform","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_artists","type":"address[]"}],"name":"setArtists","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"address","name":"newLogic","type":"address"}],"name":"setLogic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"newMintFeePlatform","type":"uint32"}],"name":"setMintFeePlatform","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newPlatform","type":"address"}],"name":"setPlatform","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"newRoyaltyPlatform","type":"uint32"}],"name":"setRoyaltyPlatform","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newTrdparty","type":"address"}],"name":"setTrdparty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract Proxy","name":"collection","type":"address"}],"name":"syncLogic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokens","outputs":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"startDate","type":"uint256"},{"internalType":"string","name":"metadata","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"trdparty","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint32","name":"newMintFeePlatform","type":"uint32"}],"name":"updateCollectionMintFeePlatform","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint32","name":"royaltyArtist","type":"uint32"}],"name":"updateCollectionRoyaltyArtist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"string","name":"contractURI","type":"string"}],"name":"updateCollectionURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"metadata","type":"address"}],"name":"updateOnChainMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"metadata","type":"string"}],"name":"updateTokenMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"}],"name":"updateTokenPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"startDate","type":"uint256"}],"name":"updateTokenStartDate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405234801561001057600080fd5b5061507e806100206000396000f3fe6080604052600436106102805760003560e01c80637c292f991161014f578063cc00acbb116100c1578063e9dc63751161007a578063e9dc63751461084e578063f024ab2e1461086e578063f0b9e5ba1461088e578063f23a6e61146108b9578063f2fde38b146108e6578063fc94a5b41461090657600080fd5b8063cc00acbb1461078e578063cd1fb20e146107ae578063ceac4a2b146107ce578063d3d6dce7146107ee578063d8c6d49a1461080e578063ddc8edf71461082e57600080fd5b8063a59ac6dd11610113578063a59ac6dd146106cc578063ae78ea6e146106df578063bc197c81146106ff578063c16304181461072e578063c346d9db1461074e578063c7cef92a1461076e57600080fd5b80637c292f991461061f5780638da5cb5b1461063f57806394a88a411461065f578063978d5b761461067f578063995426f11461069f57600080fd5b806345c7c025116101f3578063538bd5ea116101ac578063538bd5ea1461053b578063580011141461057a5780635c5b763d1461059a5780636945c5ea146105bf5780637117b0bc146105df578063793f3f60146105ff57600080fd5b806345c7c0251461044157806348b09f7b146104735780634abf825d146104935780634bde38c8146104c35780634d637ad0146104fb578063532a10bd1461051b57600080fd5b8063150b7a0211610245578063150b7a0214610353578063158ef93e146103985780632b63ce68146103b957806332293c5c146103d95780633ccfd60b146103f957806343add2e61461040e57600080fd5b8062f1e7b31461028c578063069dab8f146102ae5780630fc0ac3a146102f357806311162f1f14610313578063143cedd91461033357600080fd5b3661028757005b600080fd5b34801561029857600080fd5b506102ac6102a7366004613948565b610926565b005b3480156102ba57600080fd5b506102de6102c936600461399c565b60056020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b3480156102ff57600080fd5b506102ac61030e36600461399c565b610d64565b34801561031f57600080fd5b506102ac61032e366004613a01565b610d9d565b34801561033f57600080fd5b506102ac61034e366004613a61565b610e15565b34801561035f57600080fd5b5061037f61036e366004613b33565b630a85bd0160e11b95945050505050565b6040516001600160e01b031990911681526020016102ea565b3480156103a457600080fd5b506001546102de90600160a01b900460ff1681565b3480156103c557600080fd5b506102ac6103d436600461399c565b61110c565b3480156103e557600080fd5b506102ac6103f4366004613ba5565b6111a4565b34801561040557600080fd5b506102ac61140f565b34801561041a57600080fd5b5061042e61042936600461399c565b61145c565b6040516102ea9796959493929190613c7d565b34801561044d57600080fd5b5060045461045e9063ffffffff1681565b60405163ffffffff90911681526020016102ea565b34801561047f57600080fd5b506102ac61048e366004613cda565b61153f565b34801561049f57600080fd5b506104b36104ae366004613d0a565b61158d565b6040516102ea9493929190613d36565b3480156104cf57600080fd5b506008546104e3906001600160a01b031681565b6040516001600160a01b0390911681526020016102ea565b34801561050757600080fd5b506102ac610516366004613d65565b611652565b34801561052757600080fd5b506102ac610536366004613dc0565b6116fc565b34801561054757600080fd5b5061055b610556366004613ddb565b611735565b604080516001600160a01b0390931683526020830191909152016102ea565b34801561058657600080fd5b506102ac610595366004613e10565b61187f565b3480156105a657600080fd5b5060045461045e90640100000000900463ffffffff1681565b3480156105cb57600080fd5b506102ac6105da36600461399c565b611a6a565b3480156105eb57600080fd5b506102ac6105fa366004613e52565b611b10565b34801561060b57600080fd5b506102ac61061a366004613eb0565b611c75565b34801561062b57600080fd5b506102ac61063a366004613eff565b61220a565b34801561064b57600080fd5b506001546104e3906001600160a01b031681565b34801561066b57600080fd5b506102ac61067a366004613dc0565b6122af565b34801561068b57600080fd5b506102ac61069a36600461399c565b6122dc565b3480156106ab57600080fd5b506106bf6106ba36600461399c565b61230e565b6040516102ea9190613f34565b6102ac6106da366004613ddb565b6123bd565b3480156106eb57600080fd5b506102ac6106fa366004613f47565b612a33565b34801561070b57600080fd5b5061037f61071a366004613f88565b63bc197c8160e01b98975050505050505050565b34801561073a57600080fd5b506102ac610749366004613ddb565b612ae5565b34801561075a57600080fd5b506102ac610769366004613f47565b612b9a565b34801561077a57600080fd5b506104e3610789366004614046565b612c1d565b34801561079a57600080fd5b506102ac6107a936600461405f565b612c3d565b3480156107ba57600080fd5b506102ac6107c9366004613eff565b6131c3565b3480156107da57600080fd5b506102ac6107e93660046140ea565b61323f565b3480156107fa57600080fd5b506102ac610809366004613d0a565b613357565b34801561081a57600080fd5b506102ac61082936600461418c565b6133ce565b34801561083a57600080fd5b506102ac610849366004613ddb565b613463565b34801561085a57600080fd5b506106bf610869366004613d0a565b6134f4565b34801561087a57600080fd5b506102ac610889366004613ddb565b613667565b34801561089a57600080fd5b5061037f6108a9366004613d65565b63785cf2dd60e11b949350505050565b3480156108c557600080fd5b5061037f6108d4366004614214565b63f23a6e6160e01b9695505050505050565b3480156108f257600080fd5b506102ac61090136600461399c565b6136e1565b34801561091257600080fd5b506009546104e3906001600160a01b031681565b6001600160a01b038084166000908152600660209081526040808320815160e08101835281548616815260018201549586169381019390935263ffffffff600160a01b8604811692840192909252600160c01b850482166060840152600160e01b9094048116608083015260028401541660a082015260038301805433949160c08401916109b39061427d565b80601f01602080910402602001604051908101604052809291908181526020018280546109df9061427d565b8015610a2c5780601f10610a0157610100808354040283529160200191610a2c565b820191906000526020600020905b815481529060010190602001808311610a0f57829003601f168201915b5050505050815250509050816001600160a01b031681600001516001600160a01b031614610a755760405162461bcd60e51b8152600401610a6c906142b7565b60405180910390fd5b60008082602001516001600160a01b031663318d9e5d87876040518363ffffffff1660e01b8152600401610aaa9291906142df565b6000604051808303816000875af1158015610ac9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610af1919081019061432d565b9150915060008290506000846060015163ffffffff16856080015163ffffffff1683610b1d91906143f4565b610b279190614413565b6008546040519192506001600160a01b03169082156108fc029083906000818181858888f19350505050158015610b62573d6000803e3d6000fd5b506001600160a01b0386166108fc610b7a8385614435565b6040518115909202916000818181858888f19350505050158015610ba2573d6000803e3d6000fd5b5060005b8351811015610d5857838181518110610bc157610bc161444c565b60200260200101519250856060015163ffffffff16866080015163ffffffff1684610bec91906143f4565b610bf69190614413565b9150888882818110610c0a57610c0a61444c565b9050602002016020810190610c1f919061399c565b60085460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810185905291169063a9059cbb906044016020604051808303816000875af1158015610c71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c959190614462565b50888882818110610ca857610ca861444c565b9050602002016020810190610cbd919061399c565b6001600160a01b031663a9059cbb88610cd68587614435565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015610d21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d459190614462565b5080610d5081614484565b915050610ba6565b50505050505050505050565b6001546001600160a01b03163314610d7b57600080fd5b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383166000908152600660205260409020610dbd613744565b610dd95760405162461bcd60e51b8152600401610a6c9061449d565b610de76003820184846137ed565b506000805160206150298339815191528482604051610e079291906145cf565b60405180910390a150505050565b610e1e8461376f565b610e3a5760405162461bcd60e51b8152600401610a6c9061449d565b6000604051610e4890613871565b604051809103906000f080158015610e64573d6000803e3d6000fd5b509050806001600160a01b031663d784d42660028c63ffffffff1660028110610e8f57610e8f61444c565b015460405160e083901b6001600160e01b03191681526001600160a01b039091166004820152602401600060405180830381600087803b158015610ed257600080fd5b505af1158015610ee6573d6000803e3d6000fd5b505050506001600160a01b038181166000908152600660205260409081902080546001600160a01b03191692881692909217825551829190610f279061387e565b604051809103906000f080158015610f43573d6000803e3d6000fd5b506001820180546001600160a01b031981166001600160a01b03939093169283178255600480546001600160c01b031990921690931763ffffffff918216600160a01b02179091559054610fa19164010000000090910416876145fb565b60018201805463ffffffff60c01b198116600160c01b63ffffffff9485160290811783556004546001600160c01b039092166001600160e01b03909116176401000000009091048316600160e01b0217905560028201805463ffffffff1916918e169190911790556110176003820186866137ed565b5060405163266c45bb60e11b81526001600160a01b03831690634cd88b769061104a908e908e908e908e9060040161464c565b600060405180830381600087803b15801561106457600080fd5b505af1158015611078573d6000803e3d6000fd5b505060405163f2fde38b60e01b81526001600160a01b038a811660048301528516925063f2fde38b9150602401600060405180830381600087803b1580156110bf57600080fd5b505af11580156110d3573d6000803e3d6000fd5b5050505060008051602061502983398151915282826040516110f69291906145cf565b60405180910390a1505050505050505050505050565b6001600160a01b038116600081815260066020526040902060029081015463d784d426919063ffffffff168181106111465761114661444c565b015460405160e083901b6001600160e01b03191681526001600160a01b039091166004820152602401600060405180830381600087803b15801561118957600080fd5b505af115801561119d573d6000803e3d6000fd5b5050505050565b6111ac613744565b806111d057506001600160a01b038781166000908152600660205260409020541633145b6111ec5760405162461bcd60e51b8152600401610a6c906142b7565b6001600160a01b0387166000908152600760209081526040808320898452909152902080541561122e5760405162461bcd60e51b8152600401610a6c9061467e565b6001600160a01b03888116600090815260066020526040902060010154166113ba578560000361130e576040516331a9108f60e11b81526004810188905230906001600160a01b038a1690636352211e90602401602060405180830381865afa15801561129f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c391906146a5565b6001600160a01b0316146113095760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b21037bbb732b960991b6044820152606401610a6c565b6113ca565b604051627eeac760e11b81523060048201526024810188905286906001600160a01b038a169062fdd58e90604401602060405180830381865afa158015611359573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061137d91906146c2565b146113095760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b21037bbb732b960991b6044820152606401610a6c565b6113c86003820184846137ed565b505b6001810186905584815560028101849055604051600080516020615009833981519152906113fd908a908a9085906146db565b60405180910390a15050505050505050565b611417613744565b61142057600080fd5b6008546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015611459573d6000803e3d6000fd5b50565b60066020526000908152604090208054600182015460028301546003840180546001600160a01b03948516959484169463ffffffff600160a01b8604811695600160c01b8104821695600160e01b9091048216949116926114bc9061427d565b80601f01602080910402602001604051908101604052809291908181526020018280546114e89061427d565b80156115355780601f1061150a57610100808354040283529160200191611535565b820191906000526020600020905b81548152906001019060200180831161151857829003601f168201915b5050505050905087565b6001546001600160a01b0316331461155657600080fd5b806002836002811061156a5761156a61444c565b0180546001600160a01b0319166001600160a01b03929092169190911790555050565b6007602052816000526040600020602052806000526040600020600091509150508060000154908060010154908060020154908060030180546115cf9061427d565b80601f01602080910402602001604051908101604052809291908181526020018280546115fb9061427d565b80156116485780601f1061161d57610100808354040283529160200191611648565b820191906000526020600020905b81548152906001019060200180831161162b57829003601f168201915b5050505050905084565b61165a613744565b8061167e57506001600160a01b038481166000908152600660205260409020541633145b61169a5760405162461bcd60e51b8152600401610a6c906142b7565b6001600160a01b038416600090815260076020908152604080832086845290915290206116cb6003820184846137ed565b506000805160206150098339815191528585836040516116ed939291906146db565b60405180910390a15050505050565b611704613744565b61170d57600080fd5b6004805463ffffffff9092166401000000000267ffffffff0000000019909216919091179055565b6001600160a01b038084166000908152600660209081526040808320815160e08101835281548616815260018201549586169381019390935263ffffffff600160a01b8604811692840192909252600160c01b850482166060840152600160e01b9094048116608083015260028401541660a08201526003830180549293849384939260c08401916117c69061427d565b80601f01602080910402602001604051908101604052809291908181526020018280546117f29061427d565b801561183f5780601f106118145761010080835404028352916020019161183f565b820191906000526020600020905b81548152906001019060200180831161182257829003601f168201915b50505050508152505090508060200151612710826060015163ffffffff168661186891906143f4565b6118729190614413565b9250925050935093915050565b611887613744565b806118ab57506001600160a01b038381166000908152600660205260409020541633145b6118c75760405162461bcd60e51b8152600401610a6c906142b7565b6001600160a01b038316600090815260076020908152604080832085845282528083208151608081018352815481526001820154938101939093526002810154918301919091526003810180546060840191906119239061427d565b80601f016020809104026020016040519081016040528092919081815260200182805461194f9061427d565b801561199c5780601f106119715761010080835404028352916020019161199c565b820191906000526020600020905b81548152906001019060200180831161197f57829003601f168201915b505050919092525050506001600160a01b038581166000908152600a6020908152604080832088845290915290205491925016611a0e5760405162461bcd60e51b815260206004820152601060248201526f24b73b30b634b21037b716b1b430b4b760811b6044820152606401610a6c565b6001600160a01b038481166000908152600a602090815260408083208784529091529081902080546001600160a01b031916928516929092179091555160008051602061500983398151915290610e0790869086908590614730565b6008546001600160a01b0316611a96576001546001600160a01b03163314611a9157600080fd5b611aa7565b611a9e613744565b611aa757600080fd5b600854604080516001600160a01b03928316815291831660208301527fccf7c8ab7aedfd798c03d9e20e653a33f1610b20698386b6a00f78a5c3bea6ea910160405180910390a1600880546001600160a01b0319166001600160a01b0392909216919091179055565b611b18613744565b80611b3c57506001600160a01b038681166000908152600660205260409020541633145b611b585760405162461bcd60e51b8152600401610a6c906142b7565b6001600160a01b03861660009081526007602090815260408083208884529091529020805415611b9a5760405162461bcd60e51b8152600401610a6c9061467e565b6001600160a01b0387811660009081526006602052604090206001015416611bf75760405162461bcd60e51b815260206004820152601060248201526f24b73b30b634b21037b716b1b430b4b760811b6044820152606401610a6c565b6001600160a01b038781166000908152600a602090815260408083208a84529091529081902080546001600160a01b0319169285169290921790915560018201869055848255600282018490555160008051602061500983398151915290611c64908990899085906146db565b60405180910390a150505050505050565b611c7d613744565b611c995760405162461bcd60e51b8152600401610a6c9061449d565b6001600160a01b03808516600081815260076020908152604080832088845282528083209383526006909152902060010154909116611e38576001600160a01b03851660009081526006602052604090206002015463ffffffff1615611daa578160005b81811015611da357866001600160a01b031663f242432a30878785818110611d2757611d2761444c565b9050602002016020810190611d3c919061399c565b8960016040518563ffffffff1660e01b8152600401611d5e949392919061477e565b600060405180830381600087803b158015611d7857600080fd5b505af1158015611d8c573d6000803e3d6000fd5b505050508080611d9b90614484565b915050611cfd565b50506121d5565b846001600160a01b03166323b872dd3085856000818110611dcd57611dcd61444c565b9050602002016020810190611de2919061399c565b876040518463ffffffff1660e01b8152600401611e01939291906147b6565b600060405180830381600087803b158015611e1b57600080fd5b505af1158015611e2f573d6000803e3d6000fd5b505050506121d5565b6001600160a01b03851660009081526006602052604090206002015463ffffffff16156120555760018101548290611e71908290614435565b600183015560005b81811015611da35773402feeb4b633d97df94a53e232b5d7f12fb2976f6001600160a01b0316876001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611edd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f0191906146a5565b6001600160a01b031603611fa257866001600160a01b031663c72216e187600186600301898987818110611f3757611f3761444c565b9050602002016020810190611f4c919061399c565b6040518563ffffffff1660e01b8152600401611f6b94939291906147da565b600060405180830381600087803b158015611f8557600080fd5b505af1158015611f99573d6000803e3d6000fd5b50505050612043565b866001600160a01b031663e7d3fe6b876001888886818110611fc657611fc661444c565b9050602002016020810190611fdb919061399c565b6040516001600160e01b031960e086901b168152600481019390935260248301919091526001600160a01b03166044820152606401600060405180830381600087803b15801561202a57600080fd5b505af115801561203e573d6000803e3d6000fd5b505050505b8061204d81614484565b915050611e79565b73b6330b44ccc567d3252cf8987b4e1ed1d8ed744f6001600160a01b0316856001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156120b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120d591906146a5565b6001600160a01b03160361213d57846001600160a01b0316631ac429b285836003018686600081811061210a5761210a61444c565b905060200201602081019061211f919061399c565b6040518463ffffffff1660e01b8152600401611e0193929190614812565b846001600160a01b03166394bf804d85858560008181106121605761216061444c565b9050602002016020810190612175919061399c565b6040516001600160e01b031960e085901b16815260048101929092526001600160a01b03166024820152604401600060405180830381600087803b1580156121bc57600080fd5b505af11580156121d0573d6000803e3d6000fd5b505050505b7f697fb1e1909e56fd7cec8c61f588088d95763e431f9539789e04b17dbbeb4e9f858585856040516116ed949392919061488c565b6001600160a01b038216600090815260066020526040902061222a613744565b6122465760405162461bcd60e51b8152600401610a6c9061449d565b60045461226190640100000000900463ffffffff16836145fb565b8160010160186101000a81548163ffffffff021916908363ffffffff16021790555060008051602061502983398151915283826040516122a29291906145cf565b60405180910390a1505050565b6122b7613744565b6122c057600080fd5b6004805463ffffffff191663ffffffff92909216919091179055565b6122e4613744565b6122ed57600080fd5b6001600160a01b03166000908152600560205260409020805460ff19169055565b6001600160a01b03811660009081526006602052604090206003018054606091906123389061427d565b80601f01602080910402602001604051908101604052809291908181526020018280546123649061427d565b80156123b15780601f10612386576101008083540402835291602001916123b1565b820191906000526020600020905b81548152906001019060200180831161239457829003601f168201915b50505050509050919050565b6001600160a01b038084166000818152600760209081526040808320878452825280832093835260068252808320815160e08101835281548716815260018201549687169381019390935263ffffffff600160a01b8704811692840192909252600160c01b860482166060840152600160e01b9095048116608083015260028501541660a082015260038401805433953495949392909160c0840191906124639061427d565b80601f016020809104026020016040519081016040528092919081815260200182805461248f9061427d565b80156124dc5780601f106124b1576101008083540402835291602001916124dc565b820191906000526020600020905b8154815290600101906020018083116124bf57829003601f168201915b50505050508152505090506000612710826040015163ffffffff168561250291906143f4565b61250c9190614413565b6008546040519192506001600160a01b03169082156108fc029083906000818181858888f19350505050158015612547573d6000803e3d6000fd5b5081516001600160a01b03166108fc6125608387614435565b6040518115909202916000818181858888f19350505050158015612588573d6000803e3d6000fd5b50428360020154106125cb5760405162461bcd60e51b815260206004820152600c60248201526b496e76616c69642073616c6560a01b6044820152606401610a6c565b856000036127c957825484146126135760405162461bcd60e51b815260206004820152600d60248201526c496e76616c696420707269636560981b6044820152606401610a6c565b6001600160a01b038881166000908152600660205260409020600101541661269c576040516323b872dd60e01b81526001600160a01b038916906323b872dd9061266590309089908c906004016147b6565b600060405180830381600087803b15801561267f57600080fd5b505af1158015612693573d6000803e3d6000fd5b505050506127c0565b73b6330b44ccc567d3252cf8987b4e1ed1d8ed744f6001600160a01b0316886001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156126f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061271c91906146a5565b6001600160a01b03160361275d57604051630d6214d960e11b81526001600160a01b03891690631ac429b290612665908a9060038801908a90600401614812565b6040516394bf804d60e01b8152600481018890526001600160a01b0386811660248301528916906394bf804d90604401600060405180830381600087803b1580156127a757600080fd5b505af11580156127bb573d6000803e3d6000fd5b505050505b600195506129e5565b825484906127d89088906143f4565b146128155760405162461bcd60e51b815260206004820152600d60248201526c496e76616c696420707269636560981b6044820152606401610a6c565b6001600160a01b03888116600090815260066020526040902060010154166128a057604051637921219560e11b81526001600160a01b0389169063f242432a9061286990309089908c908c9060040161477e565b600060405180830381600087803b15801561288357600080fd5b505af1158015612897573d6000803e3d6000fd5b505050506129e5565b8583600101546128b09190614435565b836001018190555073402feeb4b633d97df94a53e232b5d7f12fb2976f6001600160a01b0316886001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612914573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061293891906146a5565b6001600160a01b03160361297b5760405163c72216e160e01b81526001600160a01b0389169063c72216e190612869908a908a9060038901908b906004016147da565b60405163e7d3fe6b60e01b815260048101889052602481018790526001600160a01b03868116604483015289169063e7d3fe6b90606401600060405180830381600087803b1580156129cc57600080fd5b505af11580156129e0573d6000803e3d6000fd5b505050505b604080516001600160a01b038a16815260208101899052908101879052606081018590527f8323bebb324b6e1a1d4886a1f210640461bb275263dae69967f001d053ab0b2b906080016113fd565b612a3b613744565b612a575760405162461bcd60e51b8152600401610a6c9061449d565b60005b81811015612ae0576000838383818110612a7657612a7661444c565b9050602002016020810190612a8b919061399c565b6001600160a01b03811660009081526006602052604090819020905191925060008051602061502983398151915291612ac59184916145cf565b60405180910390a15080612ad881614484565b915050612a5a565b505050565b612aed613744565b80612b1157506001600160a01b038381166000908152600660205260409020541633145b612b2d5760405162461bcd60e51b8152600401610a6c906142b7565b6001600160a01b038316600090815260076020908152604080832085845290915290206002810154612b715760405162461bcd60e51b8152600401610a6c9061467e565b6002810182905560405160008051602061500983398151915290610e07908690869085906146db565b612ba2613744565b612bab57600080fd5b60005b81811015612ae057600160056000858585818110612bce57612bce61444c565b9050602002016020810190612be3919061399c565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580612c1581614484565b915050612bae565b60028160028110612c2d57600080fd5b01546001600160a01b0316905081565b612c456137c4565b612c4e57600080fd5b6001600160a01b0380871660008181526007602090815260408083208a845282528083209383526006909152902060010154909116612ded576001600160a01b03871660009081526006602052604090206002015463ffffffff1615612d5f578360005b81811015612d5857886001600160a01b031663f242432a30898985818110612cdc57612cdc61444c565b9050602002016020810190612cf1919061399c565b8b60016040518563ffffffff1660e01b8152600401612d13949392919061477e565b600060405180830381600087803b158015612d2d57600080fd5b505af1158015612d41573d6000803e3d6000fd5b505050508080612d5090614484565b915050612cb2565b505061318a565b866001600160a01b03166323b872dd3087876000818110612d8257612d8261444c565b9050602002016020810190612d97919061399c565b896040518463ffffffff1660e01b8152600401612db6939291906147b6565b600060405180830381600087803b158015612dd057600080fd5b505af1158015612de4573d6000803e3d6000fd5b5050505061318a565b6001600160a01b03871660009081526006602052604090206002015463ffffffff161561300a5760018101548490612e26908290614435565b600183015560005b81811015612d585773402feeb4b633d97df94a53e232b5d7f12fb2976f6001600160a01b0316896001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612e92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612eb691906146a5565b6001600160a01b031603612f5757886001600160a01b031663c72216e1896001866003018b8b87818110612eec57612eec61444c565b9050602002016020810190612f01919061399c565b6040518563ffffffff1660e01b8152600401612f2094939291906147da565b600060405180830381600087803b158015612f3a57600080fd5b505af1158015612f4e573d6000803e3d6000fd5b50505050612ff8565b886001600160a01b031663e7d3fe6b8960018a8a86818110612f7b57612f7b61444c565b9050602002016020810190612f90919061399c565b6040516001600160e01b031960e086901b168152600481019390935260248301919091526001600160a01b03166044820152606401600060405180830381600087803b158015612fdf57600080fd5b505af1158015612ff3573d6000803e3d6000fd5b505050505b8061300281614484565b915050612e2e565b73b6330b44ccc567d3252cf8987b4e1ed1d8ed744f6001600160a01b0316876001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613066573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061308a91906146a5565b6001600160a01b0316036130f257866001600160a01b0316631ac429b28783600301888860008181106130bf576130bf61444c565b90506020020160208101906130d4919061399c565b6040518463ffffffff1660e01b8152600401612db693929190614812565b866001600160a01b03166394bf804d87878760008181106131155761311561444c565b905060200201602081019061312a919061399c565b6040516001600160e01b031960e085901b16815260048101929092526001600160a01b03166024820152604401600060405180830381600087803b15801561317157600080fd5b505af1158015613185573d6000803e3d6000fd5b505050505b7fe0821bf606cb336080c648b71c071cec3fcf34e2ecda22693a2bc8c9936f8e5a878787878787604051611c64969594939291906148b4565b6001600160a01b03821660009081526006602052604090206131e3613744565b6131ff5760405162461bcd60e51b8152600401610a6c9061449d565b60018101805463ffffffff60a01b1916600160a01b63ffffffff851602179055604051600080516020615029833981519152906122a290859084906145cf565b6132488361376f565b6132645760405162461bcd60e51b8152600401610a6c9061449d565b6001600160a01b0380851660009081526006602052604090208054909116156132c45760405162461bcd60e51b815260206004820152601260248201527124b73b30b634b21031b7b63632b1ba34b7b760711b6044820152606401610a6c565b80546001600160a01b0319166001600160a01b03851617815560028101805463ffffffff191663ffffffff8881169190911790915560045460018301805463ffffffff60a01b191691909216600160a01b021790556133276003820184846137ed565b5060008051602061502983398151915285826040516133479291906145cf565b60405180910390a1505050505050565b61335f613744565b61336857600080fd5b6040516323b872dd60e01b81526001600160a01b038316906323b872dd90613398903090339086906004016147b6565b600060405180830381600087803b1580156133b257600080fd5b505af11580156133c6573d6000803e3d6000fd5b505050505050565b600154600160a01b900460ff161580156133f257506001546001600160a01b031633145b6133fb57600080fd5b6001805460ff60a01b1916600160a01b17905561341a6002828161388b565b506004805467ffffffffffffffff191664c800000bb817905560405133906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350565b61346b613744565b8061348f57506001600160a01b038381166000908152600660205260409020541633145b6134ab5760405162461bcd60e51b8152600401610a6c906142b7565b6001600160a01b038316600090815260076020908152604080832085845290915290819020828155905160008051602061500983398151915290610e07908690869085906146db565b6001600160a01b038281166000908152600a60209081526040808320858452909152902054606091166135d7576001600160a01b0383166000908152600760209081526040808320858452909152902060030180546135529061427d565b80601f016020809104026020016040519081016040528092919081815260200182805461357e9061427d565b80156135cb5780601f106135a0576101008083540402835291602001916135cb565b820191906000526020600020905b8154815290600101906020018083116135ae57829003601f168201915b50505050509050613661565b6001600160a01b038084166000908152600a6020908152604080832086845290915280822054815163392f37e960e01b8152915193169263392f37e9926004808401939192918290030181865afa158015613636573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261365e919081019061491c565b90505b92915050565b61366f613744565b61367857600080fd5b604051637921219560e11b81526001600160a01b0384169063f242432a906136aa90309033908790879060040161477e565b600060405180830381600087803b1580156136c457600080fd5b505af11580156136d8573d6000803e3d6000fd5b50505050505050565b6001546001600160a01b031633146136f857600080fd5b600180546001600160a01b0319166001600160a01b03831690811790915560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b6001546000906001600160a01b031633148061376a57506008546001600160a01b031633145b905090565b6001600160a01b03811660009081526005602052604081205460ff166137a75760405162461bcd60e51b8152600401610a6c906142b7565b6137af613744565b806136615750506001600160a01b0316331490565b6001546000906001600160a01b031633148061376a5750506009546001600160a01b0316331490565b8280546137f99061427d565b90600052602060002090601f01602090048101928261381b5760008555613861565b82601f106138345782800160ff19823516178555613861565b82800160010185558215613861579182015b82811115613861578235825591602001919060010190613846565b5061386d9291506138d3565b5090565b6101c6806149b083390190565b61049380614b7683390190565b8260028101928215613861579160200282015b8281111561386157825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019061389e565b5b8082111561386d57600081556001016138d4565b6001600160a01b038116811461145957600080fd5b60008083601f84011261390f57600080fd5b5081356001600160401b0381111561392657600080fd5b6020830191508360208260051b850101111561394157600080fd5b9250929050565b60008060006040848603121561395d57600080fd5b8335613968816138e8565b925060208401356001600160401b0381111561398357600080fd5b61398f868287016138fd565b9497909650939450505050565b6000602082840312156139ae57600080fd5b81356139b9816138e8565b9392505050565b60008083601f8401126139d257600080fd5b5081356001600160401b038111156139e957600080fd5b60208301915083602082850101111561394157600080fd5b600080600060408486031215613a1657600080fd5b8335613a21816138e8565b925060208401356001600160401b03811115613a3c57600080fd5b61398f868287016139c0565b803563ffffffff81168114613a5c57600080fd5b919050565b600080600080600080600080600060c08a8c031215613a7f57600080fd5b613a888a613a48565b985060208a01356001600160401b0380821115613aa457600080fd5b613ab08d838e016139c0565b909a50985060408c0135915080821115613ac957600080fd5b613ad58d838e016139c0565b909850965060608c01359150613aea826138e8565b819550613af960808d01613a48565b945060a08c0135915080821115613b0f57600080fd5b50613b1c8c828d016139c0565b915080935050809150509295985092959850929598565b600080600080600060808688031215613b4b57600080fd5b8535613b56816138e8565b94506020860135613b66816138e8565b93506040860135925060608601356001600160401b03811115613b8857600080fd5b613b94888289016139c0565b969995985093965092949392505050565b600080600080600080600060c0888a031215613bc057600080fd5b8735613bcb816138e8565b96506020880135955060408801359450606088013593506080880135925060a08801356001600160401b03811115613c0257600080fd5b613c0e8a828b016139c0565b989b979a50959850939692959293505050565b60005b83811015613c3c578181015183820152602001613c24565b83811115613c4b576000848401525b50505050565b60008151808452613c69816020860160208601613c21565b601f01601f19169290920160200192915050565b6001600160a01b0388811682528716602082015263ffffffff868116604083015285811660608301528481166080830152831660a082015260e060c08201819052600090613ccd90830184613c51565b9998505050505050505050565b60008060408385031215613ced57600080fd5b823591506020830135613cff816138e8565b809150509250929050565b60008060408385031215613d1d57600080fd5b8235613d28816138e8565b946020939093013593505050565b848152836020820152826040820152608060608201526000613d5b6080830184613c51565b9695505050505050565b60008060008060608587031215613d7b57600080fd5b8435613d86816138e8565b93506020850135925060408501356001600160401b03811115613da857600080fd5b613db4878288016139c0565b95989497509550505050565b600060208284031215613dd257600080fd5b6139b982613a48565b600080600060608486031215613df057600080fd5b8335613dfb816138e8565b95602085013595506040909401359392505050565b600080600060608486031215613e2557600080fd5b8335613e30816138e8565b9250602084013591506040840135613e47816138e8565b809150509250925092565b60008060008060008060c08789031215613e6b57600080fd5b8635613e76816138e8565b95506020870135945060408701359350606087013592506080870135915060a0870135613ea2816138e8565b809150509295509295509295565b60008060008060608587031215613ec657600080fd5b8435613ed1816138e8565b93506020850135925060408501356001600160401b03811115613ef357600080fd5b613db4878288016138fd565b60008060408385031215613f1257600080fd5b8235613f1d816138e8565b9150613f2b60208401613a48565b90509250929050565b6020815260006139b96020830184613c51565b60008060208385031215613f5a57600080fd5b82356001600160401b03811115613f7057600080fd5b613f7c858286016138fd565b90969095509350505050565b60008060008060008060008060a0898b031215613fa457600080fd5b8835613faf816138e8565b97506020890135613fbf816138e8565b965060408901356001600160401b0380821115613fdb57600080fd5b613fe78c838d016138fd565b909850965060608b013591508082111561400057600080fd5b61400c8c838d016138fd565b909650945060808b013591508082111561402557600080fd5b506140328b828c016139c0565b999c989b5096995094979396929594505050565b60006020828403121561405857600080fd5b5035919050565b6000806000806000806080878903121561407857600080fd5b8635614083816138e8565b95506020870135945060408701356001600160401b03808211156140a657600080fd5b6140b28a838b016138fd565b909650945060608901359150808211156140cb57600080fd5b506140d889828a016138fd565b979a9699509497509295939492505050565b60008060008060006080868803121561410257600080fd5b61410b86613a48565b9450602086013561411b816138e8565b9350604086013561412b816138e8565b925060608601356001600160401b03811115613b8857600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561418457614184614146565b604052919050565b60006040828403121561419e57600080fd5b82601f8301126141ad57600080fd5b604051604081018181106001600160401b03821117156141cf576141cf614146565b80604052508060408401858111156141e657600080fd5b845b818110156142095780356141fb816138e8565b8352602092830192016141e8565b509195945050505050565b60008060008060008060a0878903121561422d57600080fd5b8635614238816138e8565b95506020870135614248816138e8565b9450604087013593506060870135925060808701356001600160401b0381111561427157600080fd5b6140d889828a016139c0565b600181811c9082168061429157607f821691505b6020821081036142b157634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252600e908201526d125b9d985b1a5908185c9d1a5cdd60921b604082015260600190565b60208082528181018390526000908460408401835b86811015614322578235614307816138e8565b6001600160a01b0316825291830191908301906001016142f4565b509695505050505050565b6000806040838503121561434057600080fd5b825191506020808401516001600160401b038082111561435f57600080fd5b818601915086601f83011261437357600080fd5b81518181111561438557614385614146565b8060051b915061439684830161415c565b81815291830184019184810190898411156143b057600080fd5b938501935b838510156143ce578451825293850193908501906143b5565b8096505050505050509250929050565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561440e5761440e6143de565b500290565b60008261443057634e487b7160e01b600052601260045260246000fd5b500490565b600082821015614447576144476143de565b500390565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561447457600080fd5b815180151581146139b957600080fd5b600060018201614496576144966143de565b5060010190565b60208082526012908201527124b73b30b634b2103832b936b4b9b9b4b7b760711b604082015260600190565b8054600090600181811c90808316806144e357607f831692505b6020808410820361450457634e487b7160e01b600052602260045260246000fd5b83885281801561451b576001811461452f5761455d565b60ff1986168983015260408901965061455d565b876000528160002060005b868110156145555781548b820185015290850190830161453a565b8a0183019750505b50505050505092915050565b80546001600160a01b0390811683526001820154908116602084015263ffffffff60a082811c8216604086015260c083811c8316606087015260e093841c608087015260028501549092169085015283018190526000906139b9908401600384016144c9565b6001600160a01b03831681526040602082018190526000906145f390830184614569565b949350505050565b600063ffffffff80831681851680830382111561461a5761461a6143de565b01949350505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b604081526000614660604083018688614623565b8281036020840152614673818587614623565b979650505050505050565b6020808252600d908201526c24b73b30b634b2103a37b5b2b760991b604082015260600190565b6000602082840312156146b757600080fd5b81516139b9816138e8565b6000602082840312156146d457600080fd5b5051919050565b60018060a01b0384168152826020820152606060408201528154606082015260018201546080820152600282015460a0820152608060c0820152600061472760e08301600385016144c9565b95945050505050565b60018060a01b0384168152826020820152606060408201528151606082015260208201516080820152604082015160a082015260006060830151608060c0840152613d5b60e0840182613c51565b6001600160a01b0394851681529290931660208301526040820152606081019190915260a06080820181905260009082015260c00190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b8481528360208201526080604082015260006147f960808301856144c9565b905060018060a01b038316606083015295945050505050565b83815260606020820152600061482b60608301856144c9565b905060018060a01b0383166040830152949350505050565b8183526000602080850194508260005b85811015614881578135614866816138e8565b6001600160a01b031687529582019590820190600101614853565b509495945050505050565b60018060a01b0385168152836020820152606060408201526000613d5b606083018486614843565b60018060a01b03871681528560208201526080604082015260006148dc608083018688614843565b82810360608401528381526001600160fb1b038411156148fb57600080fd5b8360051b808660208401376000910160200190815298975050505050505050565b60006020828403121561492e57600080fd5b81516001600160401b038082111561494557600080fd5b818401915084601f83011261495957600080fd5b81518181111561496b5761496b614146565b61497e601f8201601f191660200161415c565b915080825285602082850101111561499557600080fd5b6149a6816020840160208601613c21565b5094935050505056fe608060405234801561001057600080fd5b50600180546001600160a01b03191633179055610194806100326000396000f3fe6080604052600436106100385760003560e01c80635c60da1b1461005b578063d784d42614610091578063f851a440146100b15761003f565b3661003f57005b6100596100546000546001600160a01b031690565b6100d1565b005b34801561006757600080fd5b506000546001600160a01b03165b6040516001600160a01b03909116815260200160405180910390f35b34801561009d57600080fd5b506100596100ac36600461012e565b6100f5565b3480156100bd57600080fd5b50600154610075906001600160a01b031681565b3660008037600080366000845af43d6000803e8080156100f0573d6000f35b3d6000fd5b6001546001600160a01b0316331461010c57600080fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b60006020828403121561014057600080fd5b81356001600160a01b038116811461015757600080fd5b939250505056fea2646970667358221220896ebb08dd18f6564218e821be1efaf7bf68aef300ce401b9d824beac489440e64736f6c634300080d0033608060405234801561001057600080fd5b50600080546001600160a01b03191633179055610461806100326000396000f3fe60806040526004361061001f5760003560e01c8063318d9e5d1461002857005b3661002657005b005b34801561003457600080fd5b506100486100433660046102aa565b61005f565b60405161005692919061031f565b60405180910390f35b600080546060906001600160a01b0316331461007a57600080fd5b600080546040514794506001600160a01b039091169184156108fc02918591818181858888f193505050501580156100b6573d6000803e3d6000fd5b50828067ffffffffffffffff8111156100d1576100d161036d565b6040519080825280602002602001820160405280156100fa578160200160208202803683370190505b50915060005b818110156102a15785858281811061011a5761011a610383565b905060200201602081019061012f9190610399565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a0823190602401602060405180830381865afa158015610175573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061019991906103c9565b8382815181106101ab576101ab610383565b6020026020010181815250508585828181106101c9576101c9610383565b90506020020160208101906101de9190610399565b6001600160a01b031663a9059cbb60008054906101000a90046001600160a01b031685848151811061021257610212610383565b60200260200101516040518363ffffffff1660e01b815260040161024b9291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af115801561026a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061028e91906103e2565b508061029981610404565b915050610100565b50509250929050565b600080602083850312156102bd57600080fd5b823567ffffffffffffffff808211156102d557600080fd5b818501915085601f8301126102e957600080fd5b8135818111156102f857600080fd5b8660208260051b850101111561030d57600080fd5b60209290920196919550909350505050565b6000604082018483526020604081850152818551808452606086019150828701935060005b8181101561036057845183529383019391830191600101610344565b5090979650505050505050565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000602082840312156103ab57600080fd5b81356001600160a01b03811681146103c257600080fd5b9392505050565b6000602082840312156103db57600080fd5b5051919050565b6000602082840312156103f457600080fd5b815180151581146103c257600080fd5b60006001820161042457634e487b7160e01b600052601160045260246000fd5b506001019056fea2646970667358221220da4dd3007fc0a624cab312a4b7e369357c91f50a372d00521eb12d38150db02564736f6c634300080d003355051f15f5e00e073840106c2a0dcc81a812871cbf1eb910e076142be7a651251de8ebe8a1cc80aecbf7494b39ac9751b21b09af43af9dd45e310697a49d7900a26469706673582212202408ca2e40f810cf15d8ea5d874e622a7647cf791094483cb9ed18e20388a0f564736f6c634300080d0033

Deployed Bytecode

0x6080604052600436106102805760003560e01c80637c292f991161014f578063cc00acbb116100c1578063e9dc63751161007a578063e9dc63751461084e578063f024ab2e1461086e578063f0b9e5ba1461088e578063f23a6e61146108b9578063f2fde38b146108e6578063fc94a5b41461090657600080fd5b8063cc00acbb1461078e578063cd1fb20e146107ae578063ceac4a2b146107ce578063d3d6dce7146107ee578063d8c6d49a1461080e578063ddc8edf71461082e57600080fd5b8063a59ac6dd11610113578063a59ac6dd146106cc578063ae78ea6e146106df578063bc197c81146106ff578063c16304181461072e578063c346d9db1461074e578063c7cef92a1461076e57600080fd5b80637c292f991461061f5780638da5cb5b1461063f57806394a88a411461065f578063978d5b761461067f578063995426f11461069f57600080fd5b806345c7c025116101f3578063538bd5ea116101ac578063538bd5ea1461053b578063580011141461057a5780635c5b763d1461059a5780636945c5ea146105bf5780637117b0bc146105df578063793f3f60146105ff57600080fd5b806345c7c0251461044157806348b09f7b146104735780634abf825d146104935780634bde38c8146104c35780634d637ad0146104fb578063532a10bd1461051b57600080fd5b8063150b7a0211610245578063150b7a0214610353578063158ef93e146103985780632b63ce68146103b957806332293c5c146103d95780633ccfd60b146103f957806343add2e61461040e57600080fd5b8062f1e7b31461028c578063069dab8f146102ae5780630fc0ac3a146102f357806311162f1f14610313578063143cedd91461033357600080fd5b3661028757005b600080fd5b34801561029857600080fd5b506102ac6102a7366004613948565b610926565b005b3480156102ba57600080fd5b506102de6102c936600461399c565b60056020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b3480156102ff57600080fd5b506102ac61030e36600461399c565b610d64565b34801561031f57600080fd5b506102ac61032e366004613a01565b610d9d565b34801561033f57600080fd5b506102ac61034e366004613a61565b610e15565b34801561035f57600080fd5b5061037f61036e366004613b33565b630a85bd0160e11b95945050505050565b6040516001600160e01b031990911681526020016102ea565b3480156103a457600080fd5b506001546102de90600160a01b900460ff1681565b3480156103c557600080fd5b506102ac6103d436600461399c565b61110c565b3480156103e557600080fd5b506102ac6103f4366004613ba5565b6111a4565b34801561040557600080fd5b506102ac61140f565b34801561041a57600080fd5b5061042e61042936600461399c565b61145c565b6040516102ea9796959493929190613c7d565b34801561044d57600080fd5b5060045461045e9063ffffffff1681565b60405163ffffffff90911681526020016102ea565b34801561047f57600080fd5b506102ac61048e366004613cda565b61153f565b34801561049f57600080fd5b506104b36104ae366004613d0a565b61158d565b6040516102ea9493929190613d36565b3480156104cf57600080fd5b506008546104e3906001600160a01b031681565b6040516001600160a01b0390911681526020016102ea565b34801561050757600080fd5b506102ac610516366004613d65565b611652565b34801561052757600080fd5b506102ac610536366004613dc0565b6116fc565b34801561054757600080fd5b5061055b610556366004613ddb565b611735565b604080516001600160a01b0390931683526020830191909152016102ea565b34801561058657600080fd5b506102ac610595366004613e10565b61187f565b3480156105a657600080fd5b5060045461045e90640100000000900463ffffffff1681565b3480156105cb57600080fd5b506102ac6105da36600461399c565b611a6a565b3480156105eb57600080fd5b506102ac6105fa366004613e52565b611b10565b34801561060b57600080fd5b506102ac61061a366004613eb0565b611c75565b34801561062b57600080fd5b506102ac61063a366004613eff565b61220a565b34801561064b57600080fd5b506001546104e3906001600160a01b031681565b34801561066b57600080fd5b506102ac61067a366004613dc0565b6122af565b34801561068b57600080fd5b506102ac61069a36600461399c565b6122dc565b3480156106ab57600080fd5b506106bf6106ba36600461399c565b61230e565b6040516102ea9190613f34565b6102ac6106da366004613ddb565b6123bd565b3480156106eb57600080fd5b506102ac6106fa366004613f47565b612a33565b34801561070b57600080fd5b5061037f61071a366004613f88565b63bc197c8160e01b98975050505050505050565b34801561073a57600080fd5b506102ac610749366004613ddb565b612ae5565b34801561075a57600080fd5b506102ac610769366004613f47565b612b9a565b34801561077a57600080fd5b506104e3610789366004614046565b612c1d565b34801561079a57600080fd5b506102ac6107a936600461405f565b612c3d565b3480156107ba57600080fd5b506102ac6107c9366004613eff565b6131c3565b3480156107da57600080fd5b506102ac6107e93660046140ea565b61323f565b3480156107fa57600080fd5b506102ac610809366004613d0a565b613357565b34801561081a57600080fd5b506102ac61082936600461418c565b6133ce565b34801561083a57600080fd5b506102ac610849366004613ddb565b613463565b34801561085a57600080fd5b506106bf610869366004613d0a565b6134f4565b34801561087a57600080fd5b506102ac610889366004613ddb565b613667565b34801561089a57600080fd5b5061037f6108a9366004613d65565b63785cf2dd60e11b949350505050565b3480156108c557600080fd5b5061037f6108d4366004614214565b63f23a6e6160e01b9695505050505050565b3480156108f257600080fd5b506102ac61090136600461399c565b6136e1565b34801561091257600080fd5b506009546104e3906001600160a01b031681565b6001600160a01b038084166000908152600660209081526040808320815160e08101835281548616815260018201549586169381019390935263ffffffff600160a01b8604811692840192909252600160c01b850482166060840152600160e01b9094048116608083015260028401541660a082015260038301805433949160c08401916109b39061427d565b80601f01602080910402602001604051908101604052809291908181526020018280546109df9061427d565b8015610a2c5780601f10610a0157610100808354040283529160200191610a2c565b820191906000526020600020905b815481529060010190602001808311610a0f57829003601f168201915b5050505050815250509050816001600160a01b031681600001516001600160a01b031614610a755760405162461bcd60e51b8152600401610a6c906142b7565b60405180910390fd5b60008082602001516001600160a01b031663318d9e5d87876040518363ffffffff1660e01b8152600401610aaa9291906142df565b6000604051808303816000875af1158015610ac9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610af1919081019061432d565b9150915060008290506000846060015163ffffffff16856080015163ffffffff1683610b1d91906143f4565b610b279190614413565b6008546040519192506001600160a01b03169082156108fc029083906000818181858888f19350505050158015610b62573d6000803e3d6000fd5b506001600160a01b0386166108fc610b7a8385614435565b6040518115909202916000818181858888f19350505050158015610ba2573d6000803e3d6000fd5b5060005b8351811015610d5857838181518110610bc157610bc161444c565b60200260200101519250856060015163ffffffff16866080015163ffffffff1684610bec91906143f4565b610bf69190614413565b9150888882818110610c0a57610c0a61444c565b9050602002016020810190610c1f919061399c565b60085460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810185905291169063a9059cbb906044016020604051808303816000875af1158015610c71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c959190614462565b50888882818110610ca857610ca861444c565b9050602002016020810190610cbd919061399c565b6001600160a01b031663a9059cbb88610cd68587614435565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015610d21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d459190614462565b5080610d5081614484565b915050610ba6565b50505050505050505050565b6001546001600160a01b03163314610d7b57600080fd5b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383166000908152600660205260409020610dbd613744565b610dd95760405162461bcd60e51b8152600401610a6c9061449d565b610de76003820184846137ed565b506000805160206150298339815191528482604051610e079291906145cf565b60405180910390a150505050565b610e1e8461376f565b610e3a5760405162461bcd60e51b8152600401610a6c9061449d565b6000604051610e4890613871565b604051809103906000f080158015610e64573d6000803e3d6000fd5b509050806001600160a01b031663d784d42660028c63ffffffff1660028110610e8f57610e8f61444c565b015460405160e083901b6001600160e01b03191681526001600160a01b039091166004820152602401600060405180830381600087803b158015610ed257600080fd5b505af1158015610ee6573d6000803e3d6000fd5b505050506001600160a01b038181166000908152600660205260409081902080546001600160a01b03191692881692909217825551829190610f279061387e565b604051809103906000f080158015610f43573d6000803e3d6000fd5b506001820180546001600160a01b031981166001600160a01b03939093169283178255600480546001600160c01b031990921690931763ffffffff918216600160a01b02179091559054610fa19164010000000090910416876145fb565b60018201805463ffffffff60c01b198116600160c01b63ffffffff9485160290811783556004546001600160c01b039092166001600160e01b03909116176401000000009091048316600160e01b0217905560028201805463ffffffff1916918e169190911790556110176003820186866137ed565b5060405163266c45bb60e11b81526001600160a01b03831690634cd88b769061104a908e908e908e908e9060040161464c565b600060405180830381600087803b15801561106457600080fd5b505af1158015611078573d6000803e3d6000fd5b505060405163f2fde38b60e01b81526001600160a01b038a811660048301528516925063f2fde38b9150602401600060405180830381600087803b1580156110bf57600080fd5b505af11580156110d3573d6000803e3d6000fd5b5050505060008051602061502983398151915282826040516110f69291906145cf565b60405180910390a1505050505050505050505050565b6001600160a01b038116600081815260066020526040902060029081015463d784d426919063ffffffff168181106111465761114661444c565b015460405160e083901b6001600160e01b03191681526001600160a01b039091166004820152602401600060405180830381600087803b15801561118957600080fd5b505af115801561119d573d6000803e3d6000fd5b5050505050565b6111ac613744565b806111d057506001600160a01b038781166000908152600660205260409020541633145b6111ec5760405162461bcd60e51b8152600401610a6c906142b7565b6001600160a01b0387166000908152600760209081526040808320898452909152902080541561122e5760405162461bcd60e51b8152600401610a6c9061467e565b6001600160a01b03888116600090815260066020526040902060010154166113ba578560000361130e576040516331a9108f60e11b81526004810188905230906001600160a01b038a1690636352211e90602401602060405180830381865afa15801561129f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c391906146a5565b6001600160a01b0316146113095760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b21037bbb732b960991b6044820152606401610a6c565b6113ca565b604051627eeac760e11b81523060048201526024810188905286906001600160a01b038a169062fdd58e90604401602060405180830381865afa158015611359573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061137d91906146c2565b146113095760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b21037bbb732b960991b6044820152606401610a6c565b6113c86003820184846137ed565b505b6001810186905584815560028101849055604051600080516020615009833981519152906113fd908a908a9085906146db565b60405180910390a15050505050505050565b611417613744565b61142057600080fd5b6008546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015611459573d6000803e3d6000fd5b50565b60066020526000908152604090208054600182015460028301546003840180546001600160a01b03948516959484169463ffffffff600160a01b8604811695600160c01b8104821695600160e01b9091048216949116926114bc9061427d565b80601f01602080910402602001604051908101604052809291908181526020018280546114e89061427d565b80156115355780601f1061150a57610100808354040283529160200191611535565b820191906000526020600020905b81548152906001019060200180831161151857829003601f168201915b5050505050905087565b6001546001600160a01b0316331461155657600080fd5b806002836002811061156a5761156a61444c565b0180546001600160a01b0319166001600160a01b03929092169190911790555050565b6007602052816000526040600020602052806000526040600020600091509150508060000154908060010154908060020154908060030180546115cf9061427d565b80601f01602080910402602001604051908101604052809291908181526020018280546115fb9061427d565b80156116485780601f1061161d57610100808354040283529160200191611648565b820191906000526020600020905b81548152906001019060200180831161162b57829003601f168201915b5050505050905084565b61165a613744565b8061167e57506001600160a01b038481166000908152600660205260409020541633145b61169a5760405162461bcd60e51b8152600401610a6c906142b7565b6001600160a01b038416600090815260076020908152604080832086845290915290206116cb6003820184846137ed565b506000805160206150098339815191528585836040516116ed939291906146db565b60405180910390a15050505050565b611704613744565b61170d57600080fd5b6004805463ffffffff9092166401000000000267ffffffff0000000019909216919091179055565b6001600160a01b038084166000908152600660209081526040808320815160e08101835281548616815260018201549586169381019390935263ffffffff600160a01b8604811692840192909252600160c01b850482166060840152600160e01b9094048116608083015260028401541660a08201526003830180549293849384939260c08401916117c69061427d565b80601f01602080910402602001604051908101604052809291908181526020018280546117f29061427d565b801561183f5780601f106118145761010080835404028352916020019161183f565b820191906000526020600020905b81548152906001019060200180831161182257829003601f168201915b50505050508152505090508060200151612710826060015163ffffffff168661186891906143f4565b6118729190614413565b9250925050935093915050565b611887613744565b806118ab57506001600160a01b038381166000908152600660205260409020541633145b6118c75760405162461bcd60e51b8152600401610a6c906142b7565b6001600160a01b038316600090815260076020908152604080832085845282528083208151608081018352815481526001820154938101939093526002810154918301919091526003810180546060840191906119239061427d565b80601f016020809104026020016040519081016040528092919081815260200182805461194f9061427d565b801561199c5780601f106119715761010080835404028352916020019161199c565b820191906000526020600020905b81548152906001019060200180831161197f57829003601f168201915b505050919092525050506001600160a01b038581166000908152600a6020908152604080832088845290915290205491925016611a0e5760405162461bcd60e51b815260206004820152601060248201526f24b73b30b634b21037b716b1b430b4b760811b6044820152606401610a6c565b6001600160a01b038481166000908152600a602090815260408083208784529091529081902080546001600160a01b031916928516929092179091555160008051602061500983398151915290610e0790869086908590614730565b6008546001600160a01b0316611a96576001546001600160a01b03163314611a9157600080fd5b611aa7565b611a9e613744565b611aa757600080fd5b600854604080516001600160a01b03928316815291831660208301527fccf7c8ab7aedfd798c03d9e20e653a33f1610b20698386b6a00f78a5c3bea6ea910160405180910390a1600880546001600160a01b0319166001600160a01b0392909216919091179055565b611b18613744565b80611b3c57506001600160a01b038681166000908152600660205260409020541633145b611b585760405162461bcd60e51b8152600401610a6c906142b7565b6001600160a01b03861660009081526007602090815260408083208884529091529020805415611b9a5760405162461bcd60e51b8152600401610a6c9061467e565b6001600160a01b0387811660009081526006602052604090206001015416611bf75760405162461bcd60e51b815260206004820152601060248201526f24b73b30b634b21037b716b1b430b4b760811b6044820152606401610a6c565b6001600160a01b038781166000908152600a602090815260408083208a84529091529081902080546001600160a01b0319169285169290921790915560018201869055848255600282018490555160008051602061500983398151915290611c64908990899085906146db565b60405180910390a150505050505050565b611c7d613744565b611c995760405162461bcd60e51b8152600401610a6c9061449d565b6001600160a01b03808516600081815260076020908152604080832088845282528083209383526006909152902060010154909116611e38576001600160a01b03851660009081526006602052604090206002015463ffffffff1615611daa578160005b81811015611da357866001600160a01b031663f242432a30878785818110611d2757611d2761444c565b9050602002016020810190611d3c919061399c565b8960016040518563ffffffff1660e01b8152600401611d5e949392919061477e565b600060405180830381600087803b158015611d7857600080fd5b505af1158015611d8c573d6000803e3d6000fd5b505050508080611d9b90614484565b915050611cfd565b50506121d5565b846001600160a01b03166323b872dd3085856000818110611dcd57611dcd61444c565b9050602002016020810190611de2919061399c565b876040518463ffffffff1660e01b8152600401611e01939291906147b6565b600060405180830381600087803b158015611e1b57600080fd5b505af1158015611e2f573d6000803e3d6000fd5b505050506121d5565b6001600160a01b03851660009081526006602052604090206002015463ffffffff16156120555760018101548290611e71908290614435565b600183015560005b81811015611da35773402feeb4b633d97df94a53e232b5d7f12fb2976f6001600160a01b0316876001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611edd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f0191906146a5565b6001600160a01b031603611fa257866001600160a01b031663c72216e187600186600301898987818110611f3757611f3761444c565b9050602002016020810190611f4c919061399c565b6040518563ffffffff1660e01b8152600401611f6b94939291906147da565b600060405180830381600087803b158015611f8557600080fd5b505af1158015611f99573d6000803e3d6000fd5b50505050612043565b866001600160a01b031663e7d3fe6b876001888886818110611fc657611fc661444c565b9050602002016020810190611fdb919061399c565b6040516001600160e01b031960e086901b168152600481019390935260248301919091526001600160a01b03166044820152606401600060405180830381600087803b15801561202a57600080fd5b505af115801561203e573d6000803e3d6000fd5b505050505b8061204d81614484565b915050611e79565b73b6330b44ccc567d3252cf8987b4e1ed1d8ed744f6001600160a01b0316856001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156120b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120d591906146a5565b6001600160a01b03160361213d57846001600160a01b0316631ac429b285836003018686600081811061210a5761210a61444c565b905060200201602081019061211f919061399c565b6040518463ffffffff1660e01b8152600401611e0193929190614812565b846001600160a01b03166394bf804d85858560008181106121605761216061444c565b9050602002016020810190612175919061399c565b6040516001600160e01b031960e085901b16815260048101929092526001600160a01b03166024820152604401600060405180830381600087803b1580156121bc57600080fd5b505af11580156121d0573d6000803e3d6000fd5b505050505b7f697fb1e1909e56fd7cec8c61f588088d95763e431f9539789e04b17dbbeb4e9f858585856040516116ed949392919061488c565b6001600160a01b038216600090815260066020526040902061222a613744565b6122465760405162461bcd60e51b8152600401610a6c9061449d565b60045461226190640100000000900463ffffffff16836145fb565b8160010160186101000a81548163ffffffff021916908363ffffffff16021790555060008051602061502983398151915283826040516122a29291906145cf565b60405180910390a1505050565b6122b7613744565b6122c057600080fd5b6004805463ffffffff191663ffffffff92909216919091179055565b6122e4613744565b6122ed57600080fd5b6001600160a01b03166000908152600560205260409020805460ff19169055565b6001600160a01b03811660009081526006602052604090206003018054606091906123389061427d565b80601f01602080910402602001604051908101604052809291908181526020018280546123649061427d565b80156123b15780601f10612386576101008083540402835291602001916123b1565b820191906000526020600020905b81548152906001019060200180831161239457829003601f168201915b50505050509050919050565b6001600160a01b038084166000818152600760209081526040808320878452825280832093835260068252808320815160e08101835281548716815260018201549687169381019390935263ffffffff600160a01b8704811692840192909252600160c01b860482166060840152600160e01b9095048116608083015260028501541660a082015260038401805433953495949392909160c0840191906124639061427d565b80601f016020809104026020016040519081016040528092919081815260200182805461248f9061427d565b80156124dc5780601f106124b1576101008083540402835291602001916124dc565b820191906000526020600020905b8154815290600101906020018083116124bf57829003601f168201915b50505050508152505090506000612710826040015163ffffffff168561250291906143f4565b61250c9190614413565b6008546040519192506001600160a01b03169082156108fc029083906000818181858888f19350505050158015612547573d6000803e3d6000fd5b5081516001600160a01b03166108fc6125608387614435565b6040518115909202916000818181858888f19350505050158015612588573d6000803e3d6000fd5b50428360020154106125cb5760405162461bcd60e51b815260206004820152600c60248201526b496e76616c69642073616c6560a01b6044820152606401610a6c565b856000036127c957825484146126135760405162461bcd60e51b815260206004820152600d60248201526c496e76616c696420707269636560981b6044820152606401610a6c565b6001600160a01b038881166000908152600660205260409020600101541661269c576040516323b872dd60e01b81526001600160a01b038916906323b872dd9061266590309089908c906004016147b6565b600060405180830381600087803b15801561267f57600080fd5b505af1158015612693573d6000803e3d6000fd5b505050506127c0565b73b6330b44ccc567d3252cf8987b4e1ed1d8ed744f6001600160a01b0316886001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156126f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061271c91906146a5565b6001600160a01b03160361275d57604051630d6214d960e11b81526001600160a01b03891690631ac429b290612665908a9060038801908a90600401614812565b6040516394bf804d60e01b8152600481018890526001600160a01b0386811660248301528916906394bf804d90604401600060405180830381600087803b1580156127a757600080fd5b505af11580156127bb573d6000803e3d6000fd5b505050505b600195506129e5565b825484906127d89088906143f4565b146128155760405162461bcd60e51b815260206004820152600d60248201526c496e76616c696420707269636560981b6044820152606401610a6c565b6001600160a01b03888116600090815260066020526040902060010154166128a057604051637921219560e11b81526001600160a01b0389169063f242432a9061286990309089908c908c9060040161477e565b600060405180830381600087803b15801561288357600080fd5b505af1158015612897573d6000803e3d6000fd5b505050506129e5565b8583600101546128b09190614435565b836001018190555073402feeb4b633d97df94a53e232b5d7f12fb2976f6001600160a01b0316886001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612914573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061293891906146a5565b6001600160a01b03160361297b5760405163c72216e160e01b81526001600160a01b0389169063c72216e190612869908a908a9060038901908b906004016147da565b60405163e7d3fe6b60e01b815260048101889052602481018790526001600160a01b03868116604483015289169063e7d3fe6b90606401600060405180830381600087803b1580156129cc57600080fd5b505af11580156129e0573d6000803e3d6000fd5b505050505b604080516001600160a01b038a16815260208101899052908101879052606081018590527f8323bebb324b6e1a1d4886a1f210640461bb275263dae69967f001d053ab0b2b906080016113fd565b612a3b613744565b612a575760405162461bcd60e51b8152600401610a6c9061449d565b60005b81811015612ae0576000838383818110612a7657612a7661444c565b9050602002016020810190612a8b919061399c565b6001600160a01b03811660009081526006602052604090819020905191925060008051602061502983398151915291612ac59184916145cf565b60405180910390a15080612ad881614484565b915050612a5a565b505050565b612aed613744565b80612b1157506001600160a01b038381166000908152600660205260409020541633145b612b2d5760405162461bcd60e51b8152600401610a6c906142b7565b6001600160a01b038316600090815260076020908152604080832085845290915290206002810154612b715760405162461bcd60e51b8152600401610a6c9061467e565b6002810182905560405160008051602061500983398151915290610e07908690869085906146db565b612ba2613744565b612bab57600080fd5b60005b81811015612ae057600160056000858585818110612bce57612bce61444c565b9050602002016020810190612be3919061399c565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580612c1581614484565b915050612bae565b60028160028110612c2d57600080fd5b01546001600160a01b0316905081565b612c456137c4565b612c4e57600080fd5b6001600160a01b0380871660008181526007602090815260408083208a845282528083209383526006909152902060010154909116612ded576001600160a01b03871660009081526006602052604090206002015463ffffffff1615612d5f578360005b81811015612d5857886001600160a01b031663f242432a30898985818110612cdc57612cdc61444c565b9050602002016020810190612cf1919061399c565b8b60016040518563ffffffff1660e01b8152600401612d13949392919061477e565b600060405180830381600087803b158015612d2d57600080fd5b505af1158015612d41573d6000803e3d6000fd5b505050508080612d5090614484565b915050612cb2565b505061318a565b866001600160a01b03166323b872dd3087876000818110612d8257612d8261444c565b9050602002016020810190612d97919061399c565b896040518463ffffffff1660e01b8152600401612db6939291906147b6565b600060405180830381600087803b158015612dd057600080fd5b505af1158015612de4573d6000803e3d6000fd5b5050505061318a565b6001600160a01b03871660009081526006602052604090206002015463ffffffff161561300a5760018101548490612e26908290614435565b600183015560005b81811015612d585773402feeb4b633d97df94a53e232b5d7f12fb2976f6001600160a01b0316896001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612e92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612eb691906146a5565b6001600160a01b031603612f5757886001600160a01b031663c72216e1896001866003018b8b87818110612eec57612eec61444c565b9050602002016020810190612f01919061399c565b6040518563ffffffff1660e01b8152600401612f2094939291906147da565b600060405180830381600087803b158015612f3a57600080fd5b505af1158015612f4e573d6000803e3d6000fd5b50505050612ff8565b886001600160a01b031663e7d3fe6b8960018a8a86818110612f7b57612f7b61444c565b9050602002016020810190612f90919061399c565b6040516001600160e01b031960e086901b168152600481019390935260248301919091526001600160a01b03166044820152606401600060405180830381600087803b158015612fdf57600080fd5b505af1158015612ff3573d6000803e3d6000fd5b505050505b8061300281614484565b915050612e2e565b73b6330b44ccc567d3252cf8987b4e1ed1d8ed744f6001600160a01b0316876001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613066573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061308a91906146a5565b6001600160a01b0316036130f257866001600160a01b0316631ac429b28783600301888860008181106130bf576130bf61444c565b90506020020160208101906130d4919061399c565b6040518463ffffffff1660e01b8152600401612db693929190614812565b866001600160a01b03166394bf804d87878760008181106131155761311561444c565b905060200201602081019061312a919061399c565b6040516001600160e01b031960e085901b16815260048101929092526001600160a01b03166024820152604401600060405180830381600087803b15801561317157600080fd5b505af1158015613185573d6000803e3d6000fd5b505050505b7fe0821bf606cb336080c648b71c071cec3fcf34e2ecda22693a2bc8c9936f8e5a878787878787604051611c64969594939291906148b4565b6001600160a01b03821660009081526006602052604090206131e3613744565b6131ff5760405162461bcd60e51b8152600401610a6c9061449d565b60018101805463ffffffff60a01b1916600160a01b63ffffffff851602179055604051600080516020615029833981519152906122a290859084906145cf565b6132488361376f565b6132645760405162461bcd60e51b8152600401610a6c9061449d565b6001600160a01b0380851660009081526006602052604090208054909116156132c45760405162461bcd60e51b815260206004820152601260248201527124b73b30b634b21031b7b63632b1ba34b7b760711b6044820152606401610a6c565b80546001600160a01b0319166001600160a01b03851617815560028101805463ffffffff191663ffffffff8881169190911790915560045460018301805463ffffffff60a01b191691909216600160a01b021790556133276003820184846137ed565b5060008051602061502983398151915285826040516133479291906145cf565b60405180910390a1505050505050565b61335f613744565b61336857600080fd5b6040516323b872dd60e01b81526001600160a01b038316906323b872dd90613398903090339086906004016147b6565b600060405180830381600087803b1580156133b257600080fd5b505af11580156133c6573d6000803e3d6000fd5b505050505050565b600154600160a01b900460ff161580156133f257506001546001600160a01b031633145b6133fb57600080fd5b6001805460ff60a01b1916600160a01b17905561341a6002828161388b565b506004805467ffffffffffffffff191664c800000bb817905560405133906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350565b61346b613744565b8061348f57506001600160a01b038381166000908152600660205260409020541633145b6134ab5760405162461bcd60e51b8152600401610a6c906142b7565b6001600160a01b038316600090815260076020908152604080832085845290915290819020828155905160008051602061500983398151915290610e07908690869085906146db565b6001600160a01b038281166000908152600a60209081526040808320858452909152902054606091166135d7576001600160a01b0383166000908152600760209081526040808320858452909152902060030180546135529061427d565b80601f016020809104026020016040519081016040528092919081815260200182805461357e9061427d565b80156135cb5780601f106135a0576101008083540402835291602001916135cb565b820191906000526020600020905b8154815290600101906020018083116135ae57829003601f168201915b50505050509050613661565b6001600160a01b038084166000908152600a6020908152604080832086845290915280822054815163392f37e960e01b8152915193169263392f37e9926004808401939192918290030181865afa158015613636573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261365e919081019061491c565b90505b92915050565b61366f613744565b61367857600080fd5b604051637921219560e11b81526001600160a01b0384169063f242432a906136aa90309033908790879060040161477e565b600060405180830381600087803b1580156136c457600080fd5b505af11580156136d8573d6000803e3d6000fd5b50505050505050565b6001546001600160a01b031633146136f857600080fd5b600180546001600160a01b0319166001600160a01b03831690811790915560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b6001546000906001600160a01b031633148061376a57506008546001600160a01b031633145b905090565b6001600160a01b03811660009081526005602052604081205460ff166137a75760405162461bcd60e51b8152600401610a6c906142b7565b6137af613744565b806136615750506001600160a01b0316331490565b6001546000906001600160a01b031633148061376a5750506009546001600160a01b0316331490565b8280546137f99061427d565b90600052602060002090601f01602090048101928261381b5760008555613861565b82601f106138345782800160ff19823516178555613861565b82800160010185558215613861579182015b82811115613861578235825591602001919060010190613846565b5061386d9291506138d3565b5090565b6101c6806149b083390190565b61049380614b7683390190565b8260028101928215613861579160200282015b8281111561386157825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019061389e565b5b8082111561386d57600081556001016138d4565b6001600160a01b038116811461145957600080fd5b60008083601f84011261390f57600080fd5b5081356001600160401b0381111561392657600080fd5b6020830191508360208260051b850101111561394157600080fd5b9250929050565b60008060006040848603121561395d57600080fd5b8335613968816138e8565b925060208401356001600160401b0381111561398357600080fd5b61398f868287016138fd565b9497909650939450505050565b6000602082840312156139ae57600080fd5b81356139b9816138e8565b9392505050565b60008083601f8401126139d257600080fd5b5081356001600160401b038111156139e957600080fd5b60208301915083602082850101111561394157600080fd5b600080600060408486031215613a1657600080fd5b8335613a21816138e8565b925060208401356001600160401b03811115613a3c57600080fd5b61398f868287016139c0565b803563ffffffff81168114613a5c57600080fd5b919050565b600080600080600080600080600060c08a8c031215613a7f57600080fd5b613a888a613a48565b985060208a01356001600160401b0380821115613aa457600080fd5b613ab08d838e016139c0565b909a50985060408c0135915080821115613ac957600080fd5b613ad58d838e016139c0565b909850965060608c01359150613aea826138e8565b819550613af960808d01613a48565b945060a08c0135915080821115613b0f57600080fd5b50613b1c8c828d016139c0565b915080935050809150509295985092959850929598565b600080600080600060808688031215613b4b57600080fd5b8535613b56816138e8565b94506020860135613b66816138e8565b93506040860135925060608601356001600160401b03811115613b8857600080fd5b613b94888289016139c0565b969995985093965092949392505050565b600080600080600080600060c0888a031215613bc057600080fd5b8735613bcb816138e8565b96506020880135955060408801359450606088013593506080880135925060a08801356001600160401b03811115613c0257600080fd5b613c0e8a828b016139c0565b989b979a50959850939692959293505050565b60005b83811015613c3c578181015183820152602001613c24565b83811115613c4b576000848401525b50505050565b60008151808452613c69816020860160208601613c21565b601f01601f19169290920160200192915050565b6001600160a01b0388811682528716602082015263ffffffff868116604083015285811660608301528481166080830152831660a082015260e060c08201819052600090613ccd90830184613c51565b9998505050505050505050565b60008060408385031215613ced57600080fd5b823591506020830135613cff816138e8565b809150509250929050565b60008060408385031215613d1d57600080fd5b8235613d28816138e8565b946020939093013593505050565b848152836020820152826040820152608060608201526000613d5b6080830184613c51565b9695505050505050565b60008060008060608587031215613d7b57600080fd5b8435613d86816138e8565b93506020850135925060408501356001600160401b03811115613da857600080fd5b613db4878288016139c0565b95989497509550505050565b600060208284031215613dd257600080fd5b6139b982613a48565b600080600060608486031215613df057600080fd5b8335613dfb816138e8565b95602085013595506040909401359392505050565b600080600060608486031215613e2557600080fd5b8335613e30816138e8565b9250602084013591506040840135613e47816138e8565b809150509250925092565b60008060008060008060c08789031215613e6b57600080fd5b8635613e76816138e8565b95506020870135945060408701359350606087013592506080870135915060a0870135613ea2816138e8565b809150509295509295509295565b60008060008060608587031215613ec657600080fd5b8435613ed1816138e8565b93506020850135925060408501356001600160401b03811115613ef357600080fd5b613db4878288016138fd565b60008060408385031215613f1257600080fd5b8235613f1d816138e8565b9150613f2b60208401613a48565b90509250929050565b6020815260006139b96020830184613c51565b60008060208385031215613f5a57600080fd5b82356001600160401b03811115613f7057600080fd5b613f7c858286016138fd565b90969095509350505050565b60008060008060008060008060a0898b031215613fa457600080fd5b8835613faf816138e8565b97506020890135613fbf816138e8565b965060408901356001600160401b0380821115613fdb57600080fd5b613fe78c838d016138fd565b909850965060608b013591508082111561400057600080fd5b61400c8c838d016138fd565b909650945060808b013591508082111561402557600080fd5b506140328b828c016139c0565b999c989b5096995094979396929594505050565b60006020828403121561405857600080fd5b5035919050565b6000806000806000806080878903121561407857600080fd5b8635614083816138e8565b95506020870135945060408701356001600160401b03808211156140a657600080fd5b6140b28a838b016138fd565b909650945060608901359150808211156140cb57600080fd5b506140d889828a016138fd565b979a9699509497509295939492505050565b60008060008060006080868803121561410257600080fd5b61410b86613a48565b9450602086013561411b816138e8565b9350604086013561412b816138e8565b925060608601356001600160401b03811115613b8857600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561418457614184614146565b604052919050565b60006040828403121561419e57600080fd5b82601f8301126141ad57600080fd5b604051604081018181106001600160401b03821117156141cf576141cf614146565b80604052508060408401858111156141e657600080fd5b845b818110156142095780356141fb816138e8565b8352602092830192016141e8565b509195945050505050565b60008060008060008060a0878903121561422d57600080fd5b8635614238816138e8565b95506020870135614248816138e8565b9450604087013593506060870135925060808701356001600160401b0381111561427157600080fd5b6140d889828a016139c0565b600181811c9082168061429157607f821691505b6020821081036142b157634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252600e908201526d125b9d985b1a5908185c9d1a5cdd60921b604082015260600190565b60208082528181018390526000908460408401835b86811015614322578235614307816138e8565b6001600160a01b0316825291830191908301906001016142f4565b509695505050505050565b6000806040838503121561434057600080fd5b825191506020808401516001600160401b038082111561435f57600080fd5b818601915086601f83011261437357600080fd5b81518181111561438557614385614146565b8060051b915061439684830161415c565b81815291830184019184810190898411156143b057600080fd5b938501935b838510156143ce578451825293850193908501906143b5565b8096505050505050509250929050565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561440e5761440e6143de565b500290565b60008261443057634e487b7160e01b600052601260045260246000fd5b500490565b600082821015614447576144476143de565b500390565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561447457600080fd5b815180151581146139b957600080fd5b600060018201614496576144966143de565b5060010190565b60208082526012908201527124b73b30b634b2103832b936b4b9b9b4b7b760711b604082015260600190565b8054600090600181811c90808316806144e357607f831692505b6020808410820361450457634e487b7160e01b600052602260045260246000fd5b83885281801561451b576001811461452f5761455d565b60ff1986168983015260408901965061455d565b876000528160002060005b868110156145555781548b820185015290850190830161453a565b8a0183019750505b50505050505092915050565b80546001600160a01b0390811683526001820154908116602084015263ffffffff60a082811c8216604086015260c083811c8316606087015260e093841c608087015260028501549092169085015283018190526000906139b9908401600384016144c9565b6001600160a01b03831681526040602082018190526000906145f390830184614569565b949350505050565b600063ffffffff80831681851680830382111561461a5761461a6143de565b01949350505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b604081526000614660604083018688614623565b8281036020840152614673818587614623565b979650505050505050565b6020808252600d908201526c24b73b30b634b2103a37b5b2b760991b604082015260600190565b6000602082840312156146b757600080fd5b81516139b9816138e8565b6000602082840312156146d457600080fd5b5051919050565b60018060a01b0384168152826020820152606060408201528154606082015260018201546080820152600282015460a0820152608060c0820152600061472760e08301600385016144c9565b95945050505050565b60018060a01b0384168152826020820152606060408201528151606082015260208201516080820152604082015160a082015260006060830151608060c0840152613d5b60e0840182613c51565b6001600160a01b0394851681529290931660208301526040820152606081019190915260a06080820181905260009082015260c00190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b8481528360208201526080604082015260006147f960808301856144c9565b905060018060a01b038316606083015295945050505050565b83815260606020820152600061482b60608301856144c9565b905060018060a01b0383166040830152949350505050565b8183526000602080850194508260005b85811015614881578135614866816138e8565b6001600160a01b031687529582019590820190600101614853565b509495945050505050565b60018060a01b0385168152836020820152606060408201526000613d5b606083018486614843565b60018060a01b03871681528560208201526080604082015260006148dc608083018688614843565b82810360608401528381526001600160fb1b038411156148fb57600080fd5b8360051b808660208401376000910160200190815298975050505050505050565b60006020828403121561492e57600080fd5b81516001600160401b038082111561494557600080fd5b818401915084601f83011261495957600080fd5b81518181111561496b5761496b614146565b61497e601f8201601f191660200161415c565b915080825285602082850101111561499557600080fd5b6149a6816020840160208601613c21565b5094935050505056fe608060405234801561001057600080fd5b50600180546001600160a01b03191633179055610194806100326000396000f3fe6080604052600436106100385760003560e01c80635c60da1b1461005b578063d784d42614610091578063f851a440146100b15761003f565b3661003f57005b6100596100546000546001600160a01b031690565b6100d1565b005b34801561006757600080fd5b506000546001600160a01b03165b6040516001600160a01b03909116815260200160405180910390f35b34801561009d57600080fd5b506100596100ac36600461012e565b6100f5565b3480156100bd57600080fd5b50600154610075906001600160a01b031681565b3660008037600080366000845af43d6000803e8080156100f0573d6000f35b3d6000fd5b6001546001600160a01b0316331461010c57600080fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b60006020828403121561014057600080fd5b81356001600160a01b038116811461015757600080fd5b939250505056fea2646970667358221220896ebb08dd18f6564218e821be1efaf7bf68aef300ce401b9d824beac489440e64736f6c634300080d0033608060405234801561001057600080fd5b50600080546001600160a01b03191633179055610461806100326000396000f3fe60806040526004361061001f5760003560e01c8063318d9e5d1461002857005b3661002657005b005b34801561003457600080fd5b506100486100433660046102aa565b61005f565b60405161005692919061031f565b60405180910390f35b600080546060906001600160a01b0316331461007a57600080fd5b600080546040514794506001600160a01b039091169184156108fc02918591818181858888f193505050501580156100b6573d6000803e3d6000fd5b50828067ffffffffffffffff8111156100d1576100d161036d565b6040519080825280602002602001820160405280156100fa578160200160208202803683370190505b50915060005b818110156102a15785858281811061011a5761011a610383565b905060200201602081019061012f9190610399565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a0823190602401602060405180830381865afa158015610175573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061019991906103c9565b8382815181106101ab576101ab610383565b6020026020010181815250508585828181106101c9576101c9610383565b90506020020160208101906101de9190610399565b6001600160a01b031663a9059cbb60008054906101000a90046001600160a01b031685848151811061021257610212610383565b60200260200101516040518363ffffffff1660e01b815260040161024b9291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af115801561026a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061028e91906103e2565b508061029981610404565b915050610100565b50509250929050565b600080602083850312156102bd57600080fd5b823567ffffffffffffffff808211156102d557600080fd5b818501915085601f8301126102e957600080fd5b8135818111156102f857600080fd5b8660208260051b850101111561030d57600080fd5b60209290920196919550909350505050565b6000604082018483526020604081850152818551808452606086019150828701935060005b8181101561036057845183529383019391830191600101610344565b5090979650505050505050565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000602082840312156103ab57600080fd5b81356001600160a01b03811681146103c257600080fd5b9392505050565b6000602082840312156103db57600080fd5b5051919050565b6000602082840312156103f457600080fd5b815180151581146103c257600080fd5b60006001820161042457634e487b7160e01b600052601160045260246000fd5b506001019056fea2646970667358221220da4dd3007fc0a624cab312a4b7e369357c91f50a372d00521eb12d38150db02564736f6c634300080d003355051f15f5e00e073840106c2a0dcc81a812871cbf1eb910e076142be7a651251de8ebe8a1cc80aecbf7494b39ac9751b21b09af43af9dd45e310697a49d7900a26469706673582212202408ca2e40f810cf15d8ea5d874e622a7647cf791094483cb9ed18e20388a0f564736f6c634300080d0033

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  ]

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.