false
false
0
The new Blockscout UI is now open source! Learn how to deploy it here
- We're indexing this chain right now. Some of the counts may be inaccurate.

Contract Address Details

0x3cE0Cc8fAD428e61bBC43D29C3f4fB6C7e1E6f06

Contract Name
CLFeedRegistryAdapter
Creator
0x9b35af–0a1a52 at 0xb02ae8–59083c
Balance
0 ETH
Tokens
Fetching tokens...
Transactions
Fetching transactions...
Transfers
Fetching transfers...
Gas Used
Fetching gas used...
Last Balance Update
2426418
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
CLFeedRegistryAdapter




Optimization enabled
true
Compiler version
v0.8.28+commit.7893614a




Optimization runs
200
EVM Version
paris




Verified at
2025-06-02T12:47:58.981581Z

Constructor Arguments

0x00000000000000000000000053adbdaa3ee8725de80bf97173b1f1a0a48036de000000000000000000000000adf5aacfa254fbc566d3b81e04b95db4bcf7b40f

Arg [0] (address) : 0x53adbdaa3ee8725de80bf97173b1f1a0a48036de
Arg [1] (address) : 0xadf5aacfa254fbc566d3b81e04b95db4bcf7b40f

              

contracts/cl-adapters/registries/CLFeedRegistryAdapter.sol

// SPDX-License-Identifier: MIT
// SPDX-FileCopyrightText: Copyright (c) 2024-2025 Schelling Point Labs Inc.
pragma solidity ^0.8.28;

import '../../interfaces/ICLFeedRegistryAdapter.sol';
import {ICLAggregatorAdapter} from '../../interfaces/ICLAggregatorAdapter.sol';
import {CLAdapterLib} from '../../libraries/CLAdapterLib.sol';

/// @title Registry aggregating information from CLAggregatorAdapters and the feed itself
/// @author Aneta Tsvetkova
/// @notice This contract is used to store and retrieve information about feeds
/// @dev To reduce gas costs, the contract calls the dataFeedStore directly instead of using the CLAggregatorAdapter
contract CLFeedRegistryAdapter is ICLFeedRegistryAdapter {
  /// @notice The data feed store contract
  address internal immutable DATA_FEED_STORE;
  /// @inheritdoc ICLFeedRegistryAdapter
  address public immutable override OWNER;

  /// @notice Feed data for a given pair
  mapping(address => mapping(address => FeedData)) internal feedData;

  /// @notice Constructor
  /// @param _owner The owner of the contract
  /// @param _dataFeedStore The address of the data feed store
  constructor(address _owner, address _dataFeedStore) {
    OWNER = _owner;
    DATA_FEED_STORE = _dataFeedStore;
  }

  /// @inheritdoc IChainlinkFeedRegistry
  function decimals(
    address base,
    address quote
  ) external view override returns (uint8) {
    return feedData[base][quote].decimals;
  }

  /// @inheritdoc IChainlinkFeedRegistry
  function description(
    address base,
    address quote
  ) external view override returns (string memory) {
    return feedData[base][quote].description;
  }

  /// @inheritdoc IChainlinkFeedRegistry
  function latestAnswer(
    address base,
    address quote
  ) external view override returns (int256) {
    return CLAdapterLib.latestAnswer(feedData[base][quote].id, DATA_FEED_STORE);
  }

  /// @inheritdoc IChainlinkFeedRegistry
  function getRoundData(
    address base,
    address quote,
    uint80 _roundId
  ) external view override returns (uint80, int256, uint256, uint256, uint80) {
    return
      CLAdapterLib.getRoundData(
        _roundId,
        feedData[base][quote].id,
        DATA_FEED_STORE
      );
  }

  /// @inheritdoc IChainlinkFeedRegistry
  function getFeed(
    address base,
    address quote
  ) external view override returns (IChainlinkAggregator) {
    return feedData[base][quote].aggregator;
  }

  /// @inheritdoc ICLFeedRegistryAdapter
  function setFeeds(Feed[] calldata feeds) external override {
    if (msg.sender != OWNER) {
      revert OnlyOwner();
    }

    for (uint256 i = 0; i < feeds.length; i++) {
      feedData[feeds[i].base][feeds[i].quote] = FeedData(
        IChainlinkAggregator(feeds[i].feed),
        ICLAggregatorAdapter(feeds[i].feed).decimals(),
        CLAdapterLib.shiftId(ICLAggregatorAdapter(feeds[i].feed).id()),
        ICLAggregatorAdapter(feeds[i].feed).description()
      );
    }
  }

  /// @inheritdoc IChainlinkFeedRegistry
  function latestRound(
    address base,
    address quote
  ) external view override returns (uint256) {
    return CLAdapterLib.latestRound(feedData[base][quote].id, DATA_FEED_STORE);
  }

  /// @inheritdoc IChainlinkFeedRegistry
  function latestRoundData(
    address base,
    address quote
  ) external view override returns (uint80, int256, uint256, uint256, uint80) {
    return
      CLAdapterLib.latestRoundData(feedData[base][quote].id, DATA_FEED_STORE);
  }
}
        

contracts/interfaces/ICLAggregatorAdapter.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.28;

import {IChainlinkAggregator} from './chainlink/IChainlinkAggregator.sol';

interface ICLAggregatorAdapter is IChainlinkAggregator {
  /// @notice The feed data this contract is responsible for
  /// @dev This is the feed ID for the mapping in the dataFeedStore
  /// @return _id The ID for the feed
  function id() external view returns (uint256);

  /// @notice The dataFeedStore this contract is responsible for
  /// @dev The address of the underlying contract that stores the data
  /// @return dataFeedStore The address of the dataFeedStore
  function dataFeedStore() external view returns (address);
}
          

contracts/interfaces/ICLFeedRegistryAdapter.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.28;

import {IChainlinkFeedRegistry, IChainlinkAggregator} from './chainlink/IChainlinkFeedRegistry.sol';

interface ICLFeedRegistryAdapter is IChainlinkFeedRegistry {
  struct FeedData {
    IChainlinkAggregator aggregator;
    uint8 decimals;
    uint256 id;
    string description;
  }

  struct Feed {
    address base;
    address quote;
    address feed;
  }

  error OnlyOwner();

  /// @notice Contract owner
  /// @return owner The address of the owner
  function OWNER() external view returns (address);

  /// @notice Set the feed for a given pair
  /// @dev Stores immutable values (decimals, id, description) and contract address from CLAggregatorAdapter
  /// @param feeds Array of base, quote and feed address data
  function setFeeds(Feed[] calldata feeds) external;
}
          

contracts/interfaces/chainlink/IChainlinkAggregator.sol

/**
 * SPDX-FileCopyrightText: Copyright (c) 2021 SmartContract ChainLink Limited SEZC
 *
 * SPDX-License-Identifier: MIT
 */
pragma solidity ^0.8.28;

interface IChainlinkAggregator {
  /// @notice Decimals for the feed data
  /// @return decimals The decimals of the feed
  function decimals() external view returns (uint8);

  /// @notice Description text for the feed data
  /// @return description The description of the feed
  function description() external view returns (string memory);

  /// @notice Get the latest answer for the feed
  /// @return answer The latest value stored
  function latestAnswer() external view returns (int256);

  /// @notice Get the latest round ID for the feed
  /// @return roundId The latest round ID
  function latestRound() external view returns (uint256);

  /// @notice Get the data for a round at a given round ID
  /// @param _roundId The round ID to retrieve the data for
  /// @return roundId The round ID
  /// @return answer The value stored for the round
  /// @return startedAt Timestamp of when the value was stored
  /// @return updatedAt Same as startedAt
  /// @return answeredInRound Same as roundId
  function getRoundData(
    uint80 _roundId
  )
    external
    view
    returns (
      uint80 roundId,
      int256 answer,
      uint256 startedAt,
      uint256 updatedAt,
      uint80 answeredInRound
    );

  /// @notice Get the latest round data available
  /// @return roundId The latest round ID for the feed
  /// @return answer The value stored for the round
  /// @return startedAt Timestamp of when the value was stored
  /// @return updatedAt Same as startedAt
  /// @return answeredInRound Same as roundId
  function latestRoundData()
    external
    view
    returns (
      uint80 roundId,
      int256 answer,
      uint256 startedAt,
      uint256 updatedAt,
      uint80 answeredInRound
    );
}
          

contracts/interfaces/chainlink/IChainlinkFeedRegistry.sol

/**
 * SPDX-FileCopyrightText: Copyright (c) 2021 SmartContract ChainLink Limited SEZC
 *
 * SPDX-License-Identifier: MIT
 */
pragma solidity ^0.8.28;

import {IChainlinkAggregator} from './IChainlinkAggregator.sol';

interface IChainlinkFeedRegistry {
  /// @notice Get decimals for a feed pair
  /// @param base The base asset of the feed
  /// @param quote The quote asset of the feed
  /// @return decimals The decimals of the feed pair
  function decimals(address base, address quote) external view returns (uint8);

  /// @notice Get description for a feed pair
  /// @param base The base asset of the feed
  /// @param quote The quote asset of the feed
  /// @return description The description of the feed pair
  function description(
    address base,
    address quote
  ) external view returns (string memory);

  /// @notice Get the latest answer for a feed pair
  /// @param base The base asset of the feed
  /// @param quote The quote asset of the feed
  /// @return answer The value sotred for the feed pair
  function latestAnswer(
    address base,
    address quote
  ) external view returns (int256 answer);

  /// @notice Get the latest round ID for a feed pair
  /// @param base The base asset of the feed
  /// @param quote The quote asset of the feed
  /// @return roundId The latest round ID
  function latestRound(
    address base,
    address quote
  ) external view returns (uint256 roundId);

  /// @notice Get the round data for a feed pair at a given round ID
  /// @param base The base asset of the feed
  /// @param quote The quote asset of the feed
  /// @param _roundId The round ID to retrieve data for
  /// @return roundId The round ID
  /// @return answer The value stored for the feed at the given round ID
  /// @return startedAt The timestamp when the value was stored
  /// @return updatedAt Same as startedAt
  /// @return answeredInRound Same as roundId
  function getRoundData(
    address base,
    address quote,
    uint80 _roundId
  )
    external
    view
    returns (
      uint80 roundId,
      int256 answer,
      uint256 startedAt,
      uint256 updatedAt,
      uint80 answeredInRound
    );

  /// @notice Get the latest round data for a feed pair
  /// @param base The base asset of the feed
  /// @param quote The quote asset of the feed
  /// @return roundId The latest round ID stored for the feed pair
  /// @return answer The latest value stored for the feed pair
  /// @return startedAt The timestamp when the value was stored
  /// @return updatedAt Same as startedAt
  /// @return answeredInRound Same as roundId
  function latestRoundData(
    address base,
    address quote
  )
    external
    view
    returns (
      uint80 roundId,
      int256 answer,
      uint256 startedAt,
      uint256 updatedAt,
      uint80 answeredInRound
    );

  /// @notice Get the CLAggregatorAdapter contract for a feed pair
  /// @param base The base asset of the feed
  /// @param quote The quote asset of the feed
  /// @return aggregator The CLAggregatorAdapter contract given pair
  function getFeed(
    address base,
    address quote
  ) external view returns (IChainlinkAggregator aggregator);
}
          

contracts/libraries/CLAdapterLib.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.28;

//    ___  __         __                           _  __    __                  __
//   / _ )/ /__  ____/ /__ ___ ___ ___  ___ ___   / |/ /__ / /__    _____  ____/ /__
//  / _  / / _ \/ __/  '_/(_-</ -_) _ \(_-</ -_) /    / -_) __/ |/|/ / _ \/ __/  '_/
// /____/_/\___/\__/_/\_\/___/\__/_//_/___/\__/ /_/|_/\__/\__/|__,__/\___/_/ /_/\_\
//    _____   ____  ___    ___   ___  ________
//   / __/ | / /  |/  /   / _ | / _ \/ __/ __/
//  / _/ | |/ / /|_/ /   / __ |/ // / _/_\ \
// /___/ |___/_/  /_/   /_/ |_/____/_/ /___/
//
// Website:         https://blocksense.network/
// Git Repository:  https://github.com/blocksense-network/blocksense

/// @title CLAdapterLib
/// @author Aneta Tsvetkova
/// @notice Library for calling dataFeedStore functions for Chainlink adapters
/// @dev Contains utility functions for calling gas efficiently dataFeedStore functions and decoding return data
library CLAdapterLib {
  /// @notice Gets the latest answer from the dataFeedStore
  /// @param dataFeedStore The address of the dataFeedStore contract
  /// @param id The ID of the feed
  /// @return answer The latest stored value after being decoded
  function latestAnswer(
    uint256 id,
    address dataFeedStore
  ) internal view returns (int256) {
    return
      int256(
        uint256(
          uint192(
            bytes24(
              // 1st byte is function selector
              // after that are 16 bytes of the feed id
              _callDataFeed(dataFeedStore, (uint256(0x82) << 248) | id)
            )
          )
        )
      );
  }

  /// @notice Gets the round data from the dataFeedStore
  /// @param _roundId The round ID to retrieve data for
  /// @param id The ID of the feed
  /// @param dataFeedStore The address of the dataFeedStore contract
  /// @return roundId The round ID
  /// @return answer The value stored for the feed at the given round ID
  /// @return startedAt The timestamp when the value was stored
  /// @return updatedAt Same as startedAt
  /// @return answeredInRound Same as roundId
  function getRoundData(
    uint80 _roundId,
    uint256 id,
    address dataFeedStore
  )
    internal
    view
    returns (uint80, int256 answer, uint256 startedAt, uint256, uint80)
  {
    (answer, startedAt) = _decodeData(
      _callDataFeed(
        dataFeedStore,
        // 1st byte is function selector
        // after that are 16 bytes of the feed id
        // after the feed id are 2 bytes of the round id
        (uint256(0x86) << 248) | id | (uint256(_roundId) << 104)
      )
    );
    return (_roundId, answer, startedAt, startedAt, _roundId);
  }

  /// @notice Gets the latest round ID for a given feed from the dataFeedStore
  /// @param id The ID of the feed
  /// @param dataFeedStore The address of the dataFeedStore contract
  /// @return roundId The latest round ID
  function latestRound(
    uint256 id,
    address dataFeedStore
  ) internal view returns (uint256) {
    return
      uint256(
        // 1st byte is function selector
        // after that are 16 bytes of the feed id
        _callDataFeed(dataFeedStore, (uint256(0x81) << 248) | id)
      );
  }

  /// @notice Gets the latest round data for a given feed from the dataFeedStore
  /// @dev Using assembly achieves lower gas costs
  /// @param id The ID of the feed
  /// @param dataFeedStore The address of the dataFeedStore contract
  /// @return roundId The latest round ID
  /// @return answer The latest stored value after being decoded
  /// @return startedAt The timestamp when the value was stored
  /// @return updatedAt Same as startedAt
  /// @return answeredInRound Same as roundId
  function latestRoundData(
    uint256 id,
    address dataFeedStore
  )
    internal
    view
    returns (uint80 roundId, int256 answer, uint256 startedAt, uint256, uint80)
  {
    bytes32 returnData;

    // using assembly staticcall costs less gas than using a view function
    assembly {
      // get free memory pointer
      let ptr := mload(0x40)

      // store selector in memory at location 0
      // 1st byte is function selector
      // after that are 16 bytes of the feed id
      mstore(
        0x00,
        or(
          0x8300000000000000000000000000000000000000000000000000000000000000,
          id
        )
      )

      // call dataFeedStore with selector and store return value (64 bytes) at memory location ptr
      let success := staticcall(gas(), dataFeedStore, 0x00, 17, ptr, 64)

      // revert if call failed
      if iszero(success) {
        revert(0, 0)
      }

      // load return value from memory at location ptr
      // roundId is stored in the first 32 bytes of the returned 64 bytes
      roundId := mload(ptr)

      // value is stored in the second 32 bytes of the returned 64 bytes
      returnData := mload(add(ptr, 32))
    }

    (answer, startedAt) = _decodeData(returnData);

    return (roundId, answer, startedAt, startedAt, roundId);
  }

  /// @notice Calls the dataFeedStore with the given data
  /// @dev Using assembly achieves lower gas costs
  /// Used as a call() function to dataFeedStore
  /// @param dataFeedStore The address of the dataFeedStore contract
  /// @param selector The data to call the dataFeedStore with
  /// @return returnData The return value from the dataFeedStore
  function _callDataFeed(
    address dataFeedStore,
    uint256 selector
  ) internal view returns (bytes32 returnData) {
    // using assembly staticcall costs less gas than using a view function
    assembly {
      // store selector in memory at location 0
      mstore(0x00, selector)

      // call dataFeedStore with data and store return value (32 bytes) at memory location ptr
      let success := staticcall(
        gas(), // gas remaining
        dataFeedStore, // address to call
        0x00, // location of data to call
        19, // size of data to call - usually it is 17b but for _getRoundData it is 19b because of the 2 bytes of the roundId
        returnData, // where to store the return data
        32 // how much data to store
      )

      // revert if call failed
      if iszero(success) {
        revert(0, 0)
      }

      // assign loaded return value to returnData
      returnData := mload(returnData)
    }
  }

  /// @notice Decodes the return data from the dataFeedStore
  /// @param data The data to decode
  /// @return answer The value stored for the feed at the given round ID
  /// @return timestamp The timestamp when the value was stored
  function _decodeData(bytes32 data) internal pure returns (int256, uint256) {
    return (
      int256(uint256(uint192(bytes24(data)))),
      uint64(uint256(data)) / 1000 // timestamp is stored in milliseconds
    );
  }

  /// @notice Shifts the feed id to the left by 120 bits
  /// @dev This is used in the constructor to save gas when calling the dataFeedStore
  /// The dataFeedStore expects the feed id to be positioned in the calldata in a 16 bytes value starting from the 2nd byte
  /// @param id The feed id to shift
  function shiftId(uint256 id) internal pure returns (uint256) {
    return id << 120;
  }
}
          

Compiler Settings

{"outputSelection":{"*":{"*":["*"],"":["*"]}},"optimizer":{"runs":200,"enabled":true},"libraries":{},"evmVersion":"paris"}
              

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_owner","internalType":"address"},{"type":"address","name":"_dataFeedStore","internalType":"address"}]},{"type":"error","name":"OnlyOwner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"OWNER","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[{"type":"address","name":"base","internalType":"address"},{"type":"address","name":"quote","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"description","inputs":[{"type":"address","name":"base","internalType":"address"},{"type":"address","name":"quote","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IChainlinkAggregator"}],"name":"getFeed","inputs":[{"type":"address","name":"base","internalType":"address"},{"type":"address","name":"quote","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint80","name":"","internalType":"uint80"},{"type":"int256","name":"","internalType":"int256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint80","name":"","internalType":"uint80"}],"name":"getRoundData","inputs":[{"type":"address","name":"base","internalType":"address"},{"type":"address","name":"quote","internalType":"address"},{"type":"uint80","name":"_roundId","internalType":"uint80"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"int256","name":"","internalType":"int256"}],"name":"latestAnswer","inputs":[{"type":"address","name":"base","internalType":"address"},{"type":"address","name":"quote","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"latestRound","inputs":[{"type":"address","name":"base","internalType":"address"},{"type":"address","name":"quote","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint80","name":"","internalType":"uint80"},{"type":"int256","name":"","internalType":"int256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint80","name":"","internalType":"uint80"}],"name":"latestRoundData","inputs":[{"type":"address","name":"base","internalType":"address"},{"type":"address","name":"quote","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setFeeds","inputs":[{"type":"tuple[]","name":"feeds","internalType":"struct ICLFeedRegistryAdapter.Feed[]","components":[{"type":"address","name":"base","internalType":"address"},{"type":"address","name":"quote","internalType":"address"},{"type":"address","name":"feed","internalType":"address"}]}]}]
              

Contract Creation Code

0x60c060405234801561001057600080fd5b50604051610dfe380380610dfe83398101604081905261002f91610062565b6001600160a01b0391821660a05216608052610095565b80516001600160a01b038116811461005d57600080fd5b919050565b6000806040838503121561007557600080fd5b61007e83610046565b915061008c60208401610046565b90509250929050565b60805160a051610d296100d560003960008181609d01526102360152600081816105a0015281816106060152818161066001526107780152610d296000f3fe608060405234801561001057600080fd5b50600436106100935760003560e01c8063d2edb6dd11610066578063d2edb6dd1461018e578063d4c282a3146101c4578063ec62f44b146101e5578063fa820de9146101f8578063fc58749e1461021857600080fd5b8063117803e31461009857806358e2d3a8146100dc578063b5720f821461012f578063bcfd032d14610144575b600080fd5b6100bf7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b61011d6100ea3660046108df565b6001600160a01b03918216600090815260208181526040808320939094168252919091522054600160a01b900460ff1690565b60405160ff90911681526020016100d3565b61014261013d366004610912565b61022b565b005b6101576101523660046108df565b610569565b6040805169ffffffffffffffffffff968716815260208101959095528401929092526060830152909116608082015260a0016100d3565b6100bf61019c3660046108df565b6001600160a01b03918216600090815260208181526040808320938516835292905220541690565b6101d76101d23660046108df565b6105d7565b6040519081526020016100d3565b6101d76101f33660046108df565b610631565b61020b6102063660046108df565b610684565b6040516100d391906109ad565b6101576102263660046109e0565b61073f565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461027457604051635fc483c560e01b815260040160405180910390fd5b60005b8181101561056457604051806080016040528084848481811061029c5761029c610a36565b90506060020160400160208101906102b49190610a4c565b6001600160a01b031681526020018484848181106102d4576102d4610a36565b90506060020160400160208101906102ec9190610a4c565b6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610329573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061034d9190610a67565b60ff1681526020016103e985858581811061036a5761036a610a36565b90506060020160400160208101906103829190610a4c565b6001600160a01b031663af640d0f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103e39190610a8a565b60781b90565b815260200184848481811061040057610400610a36565b90506060020160400160208101906104189190610a4c565b6001600160a01b0316637284e4166040518163ffffffff1660e01b8152600401600060405180830381865afa158015610455573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261047d9190810190610ab9565b905260008085858581811061049457610494610a36565b6104aa9260206060909202019081019150610a4c565b6001600160a01b03166001600160a01b0316815260200190815260200160002060008585858181106104de576104de610a36565b90506060020160200160208101906104f69190610a4c565b6001600160a01b0390811682526020808301939093526040918201600020845181549486015160ff16600160a01b026001600160a81b03199095169216919091179290921782558201516001820155606082015160028201906105599082610bf6565b505050600101610277565b505050565b6001600160a01b0380831660009081526020818152604080832093851683529290529081206001015481908190819081906105c4907f00000000000000000000000000000000000000000000000000000000000000006107b0565b939b929a50909850965090945092505050565b6001600160a01b0380831660009081526020818152604080832093851683529290529081206001015461062a907f0000000000000000000000000000000000000000000000000000000000000000610804565b9392505050565b6001600160a01b0380831660009081526020818152604080832093851683529290529081206001015461062a907f0000000000000000000000000000000000000000000000000000000000000000610820565b6001600160a01b038083166000908152602081815260408083209385168352929052206002018054606091906106b990610b6e565b80601f01602080910402602001604051908101604052809291908181526020018280546106e590610b6e565b80156107325780601f1061070757610100808354040283529160200191610732565b820191906000526020600020905b81548152906001019060200180831161071557829003601f168201915b5050505050905092915050565b6001600160a01b03808416600090815260208181526040808320938616835292905290812060010154819081908190819061079c9087907f0000000000000000000000000000000000000000000000000000000000000000610832565b939c929b5090995097509095509350505050565b60008060008060008060405188608360f81b17600052604081601160008b5afa806107da57600080fd5b508051965060208101519150506107f081610878565b969990985095965086958995509350505050565b600061081682604160f91b85176108a1565b60401c9392505050565b600061062a82608160f81b85176108a1565b6000808080806108656108608769ffffffffffffffffffff60681b60688c901b168a17604360f91b176108a1565b610878565b9899909897508796508995509350505050565b600080604083901c61088c6103e885610cb5565b909467ffffffffffffffff9091169350915050565b60008160005260208160136000865afa806108bb57600080fd5b505192915050565b80356001600160a01b03811681146108da57600080fd5b919050565b600080604083850312156108f257600080fd5b6108fb836108c3565b9150610909602084016108c3565b90509250929050565b6000806020838503121561092557600080fd5b823567ffffffffffffffff81111561093c57600080fd5b8301601f8101851361094d57600080fd5b803567ffffffffffffffff81111561096457600080fd5b85602060608302840101111561097957600080fd5b6020919091019590945092505050565b60005b838110156109a457818101518382015260200161098c565b50506000910152565b60208152600082518060208401526109cc816040850160208701610989565b601f01601f19169190910160400192915050565b6000806000606084860312156109f557600080fd5b6109fe846108c3565b9250610a0c602085016108c3565b9150604084013569ffffffffffffffffffff81168114610a2b57600080fd5b809150509250925092565b634e487b7160e01b600052603260045260246000fd5b600060208284031215610a5e57600080fd5b61062a826108c3565b600060208284031215610a7957600080fd5b815160ff8116811461062a57600080fd5b600060208284031215610a9c57600080fd5b5051919050565b634e487b7160e01b600052604160045260246000fd5b600060208284031215610acb57600080fd5b815167ffffffffffffffff811115610ae257600080fd5b8201601f81018413610af357600080fd5b805167ffffffffffffffff811115610b0d57610b0d610aa3565b604051601f8201601f19908116603f0116810167ffffffffffffffff81118282101715610b3c57610b3c610aa3565b604052818152828201602001861015610b5457600080fd5b610b65826020830160208601610989565b95945050505050565b600181811c90821680610b8257607f821691505b602082108103610ba257634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561056457806000526020600020601f840160051c81016020851015610bcf5750805b601f840160051c820191505b81811015610bef5760008155600101610bdb565b5050505050565b815167ffffffffffffffff811115610c1057610c10610aa3565b610c2481610c1e8454610b6e565b84610ba8565b6020601f821160018114610c585760008315610c405750848201515b600019600385901b1c1916600184901b178455610bef565b600084815260208120601f198516915b82811015610c885787850151825560209485019460019092019101610c68565b5084821015610ca65786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b600067ffffffffffffffff831680610cdd57634e487b7160e01b600052601260045260246000fd5b8067ffffffffffffffff8416049150509291505056fea26469706673582212202493fe20a45e2c3b407c1f8bd4dfe8450403444238143c4b52b267aebdefc11664736f6c634300081c003300000000000000000000000053adbdaa3ee8725de80bf97173b1f1a0a48036de000000000000000000000000adf5aacfa254fbc566d3b81e04b95db4bcf7b40f

Deployed ByteCode

0x608060405234801561001057600080fd5b50600436106100935760003560e01c8063d2edb6dd11610066578063d2edb6dd1461018e578063d4c282a3146101c4578063ec62f44b146101e5578063fa820de9146101f8578063fc58749e1461021857600080fd5b8063117803e31461009857806358e2d3a8146100dc578063b5720f821461012f578063bcfd032d14610144575b600080fd5b6100bf7f00000000000000000000000053adbdaa3ee8725de80bf97173b1f1a0a48036de81565b6040516001600160a01b0390911681526020015b60405180910390f35b61011d6100ea3660046108df565b6001600160a01b03918216600090815260208181526040808320939094168252919091522054600160a01b900460ff1690565b60405160ff90911681526020016100d3565b61014261013d366004610912565b61022b565b005b6101576101523660046108df565b610569565b6040805169ffffffffffffffffffff968716815260208101959095528401929092526060830152909116608082015260a0016100d3565b6100bf61019c3660046108df565b6001600160a01b03918216600090815260208181526040808320938516835292905220541690565b6101d76101d23660046108df565b6105d7565b6040519081526020016100d3565b6101d76101f33660046108df565b610631565b61020b6102063660046108df565b610684565b6040516100d391906109ad565b6101576102263660046109e0565b61073f565b336001600160a01b037f00000000000000000000000053adbdaa3ee8725de80bf97173b1f1a0a48036de161461027457604051635fc483c560e01b815260040160405180910390fd5b60005b8181101561056457604051806080016040528084848481811061029c5761029c610a36565b90506060020160400160208101906102b49190610a4c565b6001600160a01b031681526020018484848181106102d4576102d4610a36565b90506060020160400160208101906102ec9190610a4c565b6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610329573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061034d9190610a67565b60ff1681526020016103e985858581811061036a5761036a610a36565b90506060020160400160208101906103829190610a4c565b6001600160a01b031663af640d0f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103e39190610a8a565b60781b90565b815260200184848481811061040057610400610a36565b90506060020160400160208101906104189190610a4c565b6001600160a01b0316637284e4166040518163ffffffff1660e01b8152600401600060405180830381865afa158015610455573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261047d9190810190610ab9565b905260008085858581811061049457610494610a36565b6104aa9260206060909202019081019150610a4c565b6001600160a01b03166001600160a01b0316815260200190815260200160002060008585858181106104de576104de610a36565b90506060020160200160208101906104f69190610a4c565b6001600160a01b0390811682526020808301939093526040918201600020845181549486015160ff16600160a01b026001600160a81b03199095169216919091179290921782558201516001820155606082015160028201906105599082610bf6565b505050600101610277565b505050565b6001600160a01b0380831660009081526020818152604080832093851683529290529081206001015481908190819081906105c4907f000000000000000000000000adf5aacfa254fbc566d3b81e04b95db4bcf7b40f6107b0565b939b929a50909850965090945092505050565b6001600160a01b0380831660009081526020818152604080832093851683529290529081206001015461062a907f000000000000000000000000adf5aacfa254fbc566d3b81e04b95db4bcf7b40f610804565b9392505050565b6001600160a01b0380831660009081526020818152604080832093851683529290529081206001015461062a907f000000000000000000000000adf5aacfa254fbc566d3b81e04b95db4bcf7b40f610820565b6001600160a01b038083166000908152602081815260408083209385168352929052206002018054606091906106b990610b6e565b80601f01602080910402602001604051908101604052809291908181526020018280546106e590610b6e565b80156107325780601f1061070757610100808354040283529160200191610732565b820191906000526020600020905b81548152906001019060200180831161071557829003601f168201915b5050505050905092915050565b6001600160a01b03808416600090815260208181526040808320938616835292905290812060010154819081908190819061079c9087907f000000000000000000000000adf5aacfa254fbc566d3b81e04b95db4bcf7b40f610832565b939c929b5090995097509095509350505050565b60008060008060008060405188608360f81b17600052604081601160008b5afa806107da57600080fd5b508051965060208101519150506107f081610878565b969990985095965086958995509350505050565b600061081682604160f91b85176108a1565b60401c9392505050565b600061062a82608160f81b85176108a1565b6000808080806108656108608769ffffffffffffffffffff60681b60688c901b168a17604360f91b176108a1565b610878565b9899909897508796508995509350505050565b600080604083901c61088c6103e885610cb5565b909467ffffffffffffffff9091169350915050565b60008160005260208160136000865afa806108bb57600080fd5b505192915050565b80356001600160a01b03811681146108da57600080fd5b919050565b600080604083850312156108f257600080fd5b6108fb836108c3565b9150610909602084016108c3565b90509250929050565b6000806020838503121561092557600080fd5b823567ffffffffffffffff81111561093c57600080fd5b8301601f8101851361094d57600080fd5b803567ffffffffffffffff81111561096457600080fd5b85602060608302840101111561097957600080fd5b6020919091019590945092505050565b60005b838110156109a457818101518382015260200161098c565b50506000910152565b60208152600082518060208401526109cc816040850160208701610989565b601f01601f19169190910160400192915050565b6000806000606084860312156109f557600080fd5b6109fe846108c3565b9250610a0c602085016108c3565b9150604084013569ffffffffffffffffffff81168114610a2b57600080fd5b809150509250925092565b634e487b7160e01b600052603260045260246000fd5b600060208284031215610a5e57600080fd5b61062a826108c3565b600060208284031215610a7957600080fd5b815160ff8116811461062a57600080fd5b600060208284031215610a9c57600080fd5b5051919050565b634e487b7160e01b600052604160045260246000fd5b600060208284031215610acb57600080fd5b815167ffffffffffffffff811115610ae257600080fd5b8201601f81018413610af357600080fd5b805167ffffffffffffffff811115610b0d57610b0d610aa3565b604051601f8201601f19908116603f0116810167ffffffffffffffff81118282101715610b3c57610b3c610aa3565b604052818152828201602001861015610b5457600080fd5b610b65826020830160208601610989565b95945050505050565b600181811c90821680610b8257607f821691505b602082108103610ba257634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561056457806000526020600020601f840160051c81016020851015610bcf5750805b601f840160051c820191505b81811015610bef5760008155600101610bdb565b5050505050565b815167ffffffffffffffff811115610c1057610c10610aa3565b610c2481610c1e8454610b6e565b84610ba8565b6020601f821160018114610c585760008315610c405750848201515b600019600385901b1c1916600184901b178455610bef565b600084815260208120601f198516915b82811015610c885787850151825560209485019460019092019101610c68565b5084821015610ca65786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b600067ffffffffffffffff831680610cdd57634e487b7160e01b600052601260045260246000fd5b8067ffffffffffffffff8416049150509291505056fea26469706673582212202493fe20a45e2c3b407c1f8bd4dfe8450403444238143c4b52b267aebdefc11664736f6c634300081c0033