false
false

Contract Address Details

0x355f45dA085FC5fCD55b2b6bC991c773a1fe80a6

Contract Name
AccessControlledSKCSAggregator
Creator
0x7b11d3–9d29aa at 0x34fd7f–adfa5e
Balance
0 KCS
Tokens
Fetching tokens...
Transactions
2 Transactions
Transfers
0 Transfers
Gas Used
94,986
Last Balance Update
44718171
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
AccessControlledSKCSAggregator




Optimization enabled
true
Compiler version
v0.7.6+commit.7338295f




Optimization runs
20000
EVM Version
default




Verified at
2022-07-28T08:49:50.678840Z

Constructor Arguments

00000000000000000000000000ee2d494258d6c5a30d6b6472a09b27121ef451000000000000000000000000afc9c849b1a784955908d91ee43a3203fbc1f9500000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000010a741a462780000

Arg [0] (address) : 0x00ee2d494258d6c5a30d6b6472a09b27121ef451
Arg [1] (address) : 0xafc9c849b1a784955908d91ee43a3203fbc1f950
Arg [2] (uint256) : 1000000000000000000
Arg [3] (uint256) : 1200000000000000000

              

Contract source code

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

interface SKCSInterface {
  /// @notice exchange rate of from KCS to sKCS
  /// @return num is the amount of total KCS in protocol
  /// @return dem is the total supply of sKCS
  function exchangeRate() external view returns (uint256 num, uint256 dem);
}


// File contracts/interfaces/AggregatorInterface.sol




interface AggregatorInterface {
  function latestAnswer() external view returns (int256);

  function latestTimestamp() external view returns (uint256);

  function latestRound() external view returns (uint256);

  function getAnswer(uint256 roundId) external view returns (int256);

  function getTimestamp(uint256 roundId) external view returns (uint256);

  event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 updatedAt);
  event NewRound(uint256 indexed roundId, address indexed startedBy, uint256 startedAt);
}


// File contracts/interfaces/AggregatorV3Interface.sol




interface AggregatorV3Interface {
  function decimals() external view returns (uint8);

  function description() external view returns (string memory);

  function version() external view returns (uint256);

  // getRoundData and latestRoundData should both raise "No data present"
  // if they do not have data to report, instead of returning unset values
  // which could be misinterpreted as actual reported values.
  function getRoundData(uint80 _roundId)
    external
    view
    returns (
      uint80 roundId,
      int256 answer,
      uint256 startedAt,
      uint256 updatedAt,
      uint80 answeredInRound
    );

  function latestRoundData()
    external
    view
    returns (
      uint80 roundId,
      int256 answer,
      uint256 startedAt,
      uint256 updatedAt,
      uint80 answeredInRound
    );
}


// File contracts/interfaces/AggregatorV2V3Interface.sol





interface AggregatorV2V3Interface is AggregatorInterface, AggregatorV3Interface {}


// File contracts/interfaces/TypeAndVersionInterface.sol




abstract contract TypeAndVersionInterface {
  function typeAndVersion() external pure virtual returns (string memory);
}


// File contracts/SafeMath.sol




/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
  /**
   * @dev Returns the multiplication of two unsigned integers, reverting on
   * overflow.
   *
   * Counterpart to Solidity's `*` operator.
   *
   * Requirements:
   * - Multiplication cannot overflow.
   */
  function mul(uint256 a, uint256 b) internal pure returns (uint256) {
    // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
    // benefit is lost if 'b' is also tested.
    // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
    if (a == 0) {
      return 0;
    }

    uint256 c = a * b;
    require(c / a == b, "SafeMath: multiplication overflow");

    return c;
  }

  /**
   * @dev Returns the integer division of two unsigned integers. Reverts on
   * division by zero. The result is rounded towards zero.
   *
   * Counterpart to Solidity's `/` operator. Note: this function uses a
   * `revert` opcode (which leaves remaining gas untouched) while Solidity
   * uses an invalid opcode to revert (consuming all remaining gas).
   *
   * Requirements:
   * - The divisor cannot be zero.
   */
  function div(uint256 a, uint256 b) internal pure returns (uint256) {
    // Solidity only automatically asserts when dividing by 0
    require(b > 0, "SafeMath: division by zero");
    uint256 c = a / b;
    // assert(a == b * c + a % b); // There is no case in which this doesn't hold

    return c;
  }
}


// File contracts/interfaces/OwnableInterface.sol




interface OwnableInterface {
  function owner() external returns (address);

  function transferOwnership(address recipient) external;

  function acceptOwnership() external;
}


// File contracts/ConfirmedOwnerWithProposal.sol




/**
 * @title The ConfirmedOwner contract
 * @notice A contract with helpers for basic contract ownership.
 */
contract ConfirmedOwnerWithProposal is OwnableInterface {
  address private s_owner;
  address private s_pendingOwner;

  event OwnershipTransferRequested(address indexed from, address indexed to);
  event OwnershipTransferred(address indexed from, address indexed to);

  constructor(address newOwner, address pendingOwner) {
    require(newOwner != address(0), "Cannot set owner to zero");

    s_owner = newOwner;
    if (pendingOwner != address(0)) {
      _transferOwnership(pendingOwner);
    }
  }

  /**
   * @notice Allows an owner to begin transferring ownership to a new address,
   * pending.
   */
  function transferOwnership(address to) public override onlyOwner {
    _transferOwnership(to);
  }

  /**
   * @notice Allows an ownership transfer to be completed by the recipient.
   */
  function acceptOwnership() external override {
    require(msg.sender == s_pendingOwner, "Must be proposed owner");

    address oldOwner = s_owner;
    s_owner = msg.sender;
    s_pendingOwner = address(0);

    emit OwnershipTransferred(oldOwner, msg.sender);
  }

  /**
   * @notice Get the current owner
   */
  function owner() public view override returns (address) {
    return s_owner;
  }

  /**
   * @notice validate, transfer ownership, and emit relevant events
   */
  function _transferOwnership(address to) private {
    require(to != msg.sender, "Cannot transfer to self");

    s_pendingOwner = to;

    emit OwnershipTransferRequested(s_owner, to);
  }

  /**
   * @notice validate access
   */
  function _validateOwnership() internal view {
    require(msg.sender == s_owner, "Only callable by owner");
  }

  /**
   * @notice Reverts if called by anyone other than the contract owner.
   */
  modifier onlyOwner() {
    _validateOwnership();
    _;
  }
}


// File contracts/ConfirmedOwner.sol




/**
 * @title The ConfirmedOwner contract
 * @notice A contract with helpers for basic contract ownership.
 */
contract ConfirmedOwner is ConfirmedOwnerWithProposal {
  constructor(address newOwner) ConfirmedOwnerWithProposal(newOwner, address(0)) {}
}


// File contracts/OwnerIsCreator.sol




/**
 * @title The OwnerIsCreator contract
 * @notice A contract with helpers for basic contract ownership.
 */
contract OwnerIsCreator is ConfirmedOwner {
  constructor() ConfirmedOwner(msg.sender) {}
}


// File contracts/skcs/SKCSAggregator.sol








contract SKCSAggregator is OwnerIsCreator, AggregatorV2V3Interface, TypeAndVersionInterface {
  using SafeMath for uint256;

  // skcs contract
  SKCSInterface public sKCS;

  // kcs-usd aggregator
  AggregatorV2V3Interface public kcsUsdAggregator;

  /**
   * @notice aggregator contract version
   */
  uint256 public constant override version = 1;

  uint32 internal constant latestAggregatorRoundId = 1;

  /**
   * @return answers are stored in fixed-point format, with this many digits of precision
   */
  uint8 public constant override decimals = 8;

  string internal s_description = "sKCS / USD";

  // The lowest exchange rate of the supply of skcs to the num of kcs on skc
  uint256 public constant minLowerBoundExchangeRate = 1e18;
  // The highest exchange rate of the supply of skcs to the num of kcs on skc
  uint256 public constant maxUpperBoundExchangeRate = 2e18;

  // lowerBoundExchangeRate must be greater than minLowerBoundExchangeRate
  uint256 public lowerBoundExchangeRate;
  // upperBoundExchangeRate must be less than maxUpperBoundExchangeRate
  uint256 public upperBoundExchangeRate;

  /*
   * @param _lowerBoundExchangeRate lowest exchange rate of the supply of skcs to the num of kcs on skc
   * @param _upperBoundExchangeRate highest exchange rate of the supply of skcs to the num of kcs on skc
   */
  constructor(
    SKCSInterface _skcs,
    AggregatorV2V3Interface _kcsUsdAggregator,
    uint256 _lowerBoundExchangeRate,
    uint256 _upperBoundExchangeRate
  ) {
    sKCS = _skcs;
    kcsUsdAggregator = _kcsUsdAggregator;
    lowerBoundExchangeRate = _lowerBoundExchangeRate;
    upperBoundExchangeRate = _upperBoundExchangeRate;
  }

  /*
   * Versioning
   */
  function typeAndVersion() external pure virtual override returns (string memory) {
    return "SKCSAggregator 1.0.0";
  }

  /*
   * ExchangeRateRange logic
   */
  /// @notice Emitted when exchange rate incentive is changed by admin
  event ExchangeRateRangeUpdated(uint256 lowerBoundExchangeRate, uint256 upperBoundExchangeRate);

  function _setExchangeRateRange(uint256 _lowerBoundExchangeRate, uint256 _upperBoundExchangeRate) external onlyOwner {
    require(
      minLowerBoundExchangeRate <= _lowerBoundExchangeRate,
      "lowerBoundExchangeRate must greater than or equal to minLowerBoundExchangeRate"
    );
    require(
      maxUpperBoundExchangeRate >= _upperBoundExchangeRate,
      "upperBoundExchangeRate must less than or equal to maxUpperBoundExchangeRate"
    );
    require(
      _upperBoundExchangeRate > _lowerBoundExchangeRate,
      "upperBoundExchangeRate must Less than lowerBoundExchangeRate"
    );

    lowerBoundExchangeRate = _lowerBoundExchangeRate;
    upperBoundExchangeRate = _upperBoundExchangeRate;

    emit ExchangeRateRangeUpdated(lowerBoundExchangeRate, upperBoundExchangeRate);
  }

  /// @notice Emitted when the skcs contract of address is changed
  event NewSKCSUpdated(SKCSInterface oldSKCS, SKCSInterface newSKCS);

  /**
   * @notice Sets a new skcs contract
   * @dev Admin function to set a new skcs contract
   */
  function _setNewSKCS(SKCSInterface _newSKCS) external onlyOwner {
    SKCSInterface oldSKCS = sKCS;
    sKCS = _newSKCS;
    emit NewSKCSUpdated(oldSKCS, _newSKCS);
  }

  /*
   * v2 Aggregator interface
   */

  /**
   * @notice answer from the most recent report
   */
  function latestAnswer() public view virtual override returns (int256) {
    uint256 exchangeRate = exchangeRateCurrent();
    require(
      exchangeRate >= lowerBoundExchangeRate,
      "exchangeRate must greater than or equal to lowerBoundExchangeRate"
    );
    require(exchangeRate <= upperBoundExchangeRate, "exchangeRate must less than or equal to upperBoundExchangeRate");
    uint256 kcsUsdPrice = kcsUsdPriceCurrent();
    uint256 skcsUsdPrice = kcsUsdPrice.mul(exchangeRate).div(1e18);
    return int256(skcsUsdPrice);
  }

  // kcs-usd price form kcs-usd eac aggregator proxy, with 8 decimals
  function kcsUsdPriceCurrent() public view returns (uint256) {
    int256 kcsUsdPrice = kcsUsdAggregator.latestAnswer();
    return uint256(kcsUsdPrice);
  }

  // exchange rate form skcs proxy, kcs num / skcs total supply, with 18 decimals
  function exchangeRateCurrent() public view returns (uint256) {
    (uint256 kcsNum, uint256 skcsNum) = sKCS.exchangeRate();
    uint256 exchangeRate = kcsNum.mul(1e18).div(skcsNum);
    return exchangeRate;
  }

  /**
   * @notice timestamp of block in which last report was transmitted
   */
  function latestTimestamp() public view virtual override returns (uint256) {
    return block.timestamp;
  }

  /**
   * @notice Aggregator round (NOT OCR round) in which last report was transmitted
   */
  function latestRound() public view virtual override returns (uint256) {
    return latestAggregatorRoundId;
  }

  /**
   * @notice median of report from given aggregator round (NOT OCR round)
   * @param _roundId the aggregator round of the target report
   */
  function getAnswer(uint256 _roundId) public view virtual override returns (int256) {
    _roundId;
    return latestAnswer();
  }

  /**
   * @notice timestamp of block in which report from given aggregator round was transmitted
   * @param _roundId aggregator round (NOT OCR round) of target report
   */
  function getTimestamp(uint256 _roundId) public view virtual override returns (uint256) {
    _roundId;
    return latestTimestamp();
  }

  /**
   * @notice human-readable description of observable this contract is reporting on
   */
  function description() public view virtual override returns (string memory) {
    return s_description;
  }

  /**
   * @notice details for the given aggregator round
   * @param _roundId target aggregator round. Must fit in uint32
   * @return roundId _roundId
   * @return answer median of report from given _roundId
   * @return startedAt timestamp of block in which report from given _roundId was updated
   * @return updatedAt timestamp of block in which report from given _roundId was updated
   * @return answeredInRound _roundId
   */
  function getRoundData(uint80 _roundId)
    public
    view
    virtual
    override
    returns (
      uint80 roundId,
      int256 answer,
      uint256 startedAt,
      uint256 updatedAt,
      uint80 answeredInRound
    )
  {
    _roundId;

    return latestRoundData();
  }

  function latestRoundData()
    public
    view
    virtual
    override
    returns (
      uint80 roundId,
      int256 answer,
      uint256 startedAt,
      uint256 updatedAt,
      uint80 answeredInRound
    )
  {
    return (latestAggregatorRoundId, latestAnswer(), latestTimestamp(), latestTimestamp(), latestAggregatorRoundId);
  }
}


// File contracts/interfaces/AccessControllerInterface.sol




interface AccessControllerInterface {
  function hasAccess(address user, bytes calldata data) external view returns (bool);
}


// File contracts/SimpleWriteAccessController.sol





/**
 * @title SimpleWriteAccessController
 * @notice Gives access to accounts explicitly added to an access list by the
 * controller's owner.
 * @dev does not make any special permissions for externally, see
 * SimpleReadAccessController for that.
 */
contract SimpleWriteAccessController is AccessControllerInterface, OwnerIsCreator {
  bool public checkEnabled;
  mapping(address => bool) internal accessList;

  event AddedAccess(address user);
  event RemovedAccess(address user);
  event CheckAccessEnabled();
  event CheckAccessDisabled();

  constructor() {
    checkEnabled = true;
  }

  /**
   * @notice Returns the access of an address
   * @param _user The address to query
   */
  function hasAccess(address _user, bytes memory) public view virtual override returns (bool) {
    return accessList[_user] || !checkEnabled;
  }

  /**
   * @notice Adds an address to the access list
   * @param _user The address to add
   */
  function addAccess(address _user) external onlyOwner {
    if (!accessList[_user]) {
      accessList[_user] = true;

      emit AddedAccess(_user);
    }
  }

  /**
   * @notice Removes an address from the access list
   * @param _user The address to remove
   */
  function removeAccess(address _user) external onlyOwner {
    if (accessList[_user]) {
      accessList[_user] = false;

      emit RemovedAccess(_user);
    }
  }

  /**
   * @notice makes the access check enforced
   */
  function enableAccessCheck() external onlyOwner {
    if (!checkEnabled) {
      checkEnabled = true;

      emit CheckAccessEnabled();
    }
  }

  /**
   * @notice makes the access check unenforced
   */
  function disableAccessCheck() external onlyOwner {
    if (checkEnabled) {
      checkEnabled = false;

      emit CheckAccessDisabled();
    }
  }

  /**
   * @dev reverts if the caller does not have access
   */
  modifier checkAccess() {
    require(hasAccess(msg.sender, msg.data), "No access");
    _;
  }
}


// File contracts/SimpleReadAccessController.sol




/**
 * @title SimpleReadAccessController
 * @notice Gives access to:
 * - any externally owned account (note that offchain actors can always read
 * any contract storage regardless of onchain access control measures, so this
 * does not weaken the access control while improving usability)
 * - accounts explicitly added to an access list
 * @dev SimpleReadAccessController is not suitable for access controlling writes
 * since it grants any externally owned account access! See
 * SimpleWriteAccessController for that.
 */
contract SimpleReadAccessController is SimpleWriteAccessController {
  /**
   * @notice Returns the access of an address
   * @param _user The address to query
   */
  function hasAccess(address _user, bytes memory _calldata) public view virtual override returns (bool) {
    return super.hasAccess(_user, _calldata) || _user == tx.origin;
  }
}


// File contracts/skcs/AccessControlledSKCSAggregator.sol





/**
 * @notice Wrapper of SKCSAggregator which checks read access on Aggregator-interface methods
 */
contract AccessControlledSKCSAggregator is SKCSAggregator, SimpleReadAccessController {
  constructor(
    SKCSInterface _skcs,
    AggregatorV2V3Interface _kcsUsdAggregator,
    uint256 _lowerBoundExchangeRate,
    uint256 _upperBoundExchangeRate
  ) SKCSAggregator(_skcs, _kcsUsdAggregator, _lowerBoundExchangeRate, _upperBoundExchangeRate) {}

  /*
   * Versioning
   */

  function typeAndVersion() external pure virtual override returns (string memory) {
    return "AccessControlledSKCSAggregator 1.0.0";
  }

  /*
   * v2 Aggregator interface
   */

  /// @inheritdoc SKCSAggregator
  function latestAnswer() public view override checkAccess returns (int256) {
    return super.latestAnswer();
  }

  /// @inheritdoc SKCSAggregator
  function latestTimestamp() public view override checkAccess returns (uint256) {
    return super.latestTimestamp();
  }

  /// @inheritdoc SKCSAggregator
  function latestRound() public view override checkAccess returns (uint256) {
    return super.latestRound();
  }

  /// @inheritdoc SKCSAggregator
  function getAnswer(uint256 _roundId) public view override checkAccess returns (int256) {
    return super.getAnswer(_roundId);
  }

  /// @inheritdoc SKCSAggregator
  function getTimestamp(uint256 _roundId) public view override checkAccess returns (uint256) {
    return super.getTimestamp(_roundId);
  }

  /*
   * v3 Aggregator interface
   */

  /// @inheritdoc SKCSAggregator
  function description() public view override checkAccess returns (string memory) {
    return super.description();
  }

  /// @inheritdoc SKCSAggregator
  function getRoundData(uint80 _roundId)
    public
    view
    override
    checkAccess
    returns (
      uint80 roundId,
      int256 answer,
      uint256 startedAt,
      uint256 updatedAt,
      uint80 answeredInRound
    )
  {
    return super.getRoundData(_roundId);
  }

  /// @inheritdoc SKCSAggregator
  function latestRoundData()
    public
    view
    override
    checkAccess
    returns (
      uint80 roundId,
      int256 answer,
      uint256 startedAt,
      uint256 updatedAt,
      uint80 answeredInRound
    )
  {
    return super.latestRoundData();
  }
}
        

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_skcs","internalType":"contract SKCSInterface"},{"type":"address","name":"_kcsUsdAggregator","internalType":"contract AggregatorV2V3Interface"},{"type":"uint256","name":"_lowerBoundExchangeRate","internalType":"uint256"},{"type":"uint256","name":"_upperBoundExchangeRate","internalType":"uint256"}]},{"type":"event","name":"AddedAccess","inputs":[{"type":"address","name":"user","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"AnswerUpdated","inputs":[{"type":"int256","name":"current","internalType":"int256","indexed":true},{"type":"uint256","name":"roundId","internalType":"uint256","indexed":true},{"type":"uint256","name":"updatedAt","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"CheckAccessDisabled","inputs":[],"anonymous":false},{"type":"event","name":"CheckAccessEnabled","inputs":[],"anonymous":false},{"type":"event","name":"ExchangeRateRangeUpdated","inputs":[{"type":"uint256","name":"lowerBoundExchangeRate","internalType":"uint256","indexed":false},{"type":"uint256","name":"upperBoundExchangeRate","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"NewRound","inputs":[{"type":"uint256","name":"roundId","internalType":"uint256","indexed":true},{"type":"address","name":"startedBy","internalType":"address","indexed":true},{"type":"uint256","name":"startedAt","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"NewSKCSUpdated","inputs":[{"type":"address","name":"oldSKCS","internalType":"contract SKCSInterface","indexed":false},{"type":"address","name":"newSKCS","internalType":"contract SKCSInterface","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferRequested","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"RemovedAccess","inputs":[{"type":"address","name":"user","internalType":"address","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"_setExchangeRateRange","inputs":[{"type":"uint256","name":"_lowerBoundExchangeRate","internalType":"uint256"},{"type":"uint256","name":"_upperBoundExchangeRate","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"_setNewSKCS","inputs":[{"type":"address","name":"_newSKCS","internalType":"contract SKCSInterface"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"acceptOwnership","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addAccess","inputs":[{"type":"address","name":"_user","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"checkEnabled","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"description","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"disableAccessCheck","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"enableAccessCheck","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"exchangeRateCurrent","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"int256","name":"","internalType":"int256"}],"name":"getAnswer","inputs":[{"type":"uint256","name":"_roundId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint80","name":"roundId","internalType":"uint80"},{"type":"int256","name":"answer","internalType":"int256"},{"type":"uint256","name":"startedAt","internalType":"uint256"},{"type":"uint256","name":"updatedAt","internalType":"uint256"},{"type":"uint80","name":"answeredInRound","internalType":"uint80"}],"name":"getRoundData","inputs":[{"type":"uint80","name":"_roundId","internalType":"uint80"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getTimestamp","inputs":[{"type":"uint256","name":"_roundId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"hasAccess","inputs":[{"type":"address","name":"_user","internalType":"address"},{"type":"bytes","name":"_calldata","internalType":"bytes"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract AggregatorV2V3Interface"}],"name":"kcsUsdAggregator","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"kcsUsdPriceCurrent","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"int256","name":"","internalType":"int256"}],"name":"latestAnswer","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"latestRound","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint80","name":"roundId","internalType":"uint80"},{"type":"int256","name":"answer","internalType":"int256"},{"type":"uint256","name":"startedAt","internalType":"uint256"},{"type":"uint256","name":"updatedAt","internalType":"uint256"},{"type":"uint80","name":"answeredInRound","internalType":"uint80"}],"name":"latestRoundData","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"latestTimestamp","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"lowerBoundExchangeRate","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"maxUpperBoundExchangeRate","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"minLowerBoundExchangeRate","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"removeAccess","inputs":[{"type":"address","name":"_user","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract SKCSInterface"}],"name":"sKCS","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"to","internalType":"address"}]},{"type":"function","stateMutability":"pure","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"typeAndVersion","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"upperBoundExchangeRate","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"version","inputs":[]}]
              

Contract Creation Code

0x60c0604052600a6080819052691cd2d0d4c80bc81554d160b21b60a09081526200002d916004919062000207565b503480156200003b57600080fd5b5060405162001c8d38038062001c8d833981810160405260808110156200006157600080fd5b5080516020820151604083015160609093015191929091838383833380600081620000d3576040805162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f0000000000000000604482015290519081900360640190fd5b600080546001600160a01b0319166001600160a01b03848116919091179091558116156200010657620001068162000157565b5050600280546001600160a01b039687166001600160a01b03199182161790915560038054959096169416939093179093556005555060065550506007805460ff1916600117905550620002b39050565b6001600160a01b038116331415620001b6576040805162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826200023f57600085556200028a565b82601f106200025a57805160ff19168380011785556200028a565b828001600101855582156200028a579182015b828111156200028a5782518255916020019190600101906200026d565b50620002989291506200029c565b5090565b5b808211156200029857600081556001016200029d565b6119ca80620002c36000396000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c80638823da6c11610104578063bd6d894d116100a2578063ebaf763311610071578063ebaf76331461054c578063ec37e9ca1461057f578063f2fde38b14610587578063feaf968c146105ba576101da565b8063bd6d894d1461052c578063c32dacd414610534578063dc7f01241461053c578063e068342a14610544576101da565b8063a118f249116100de578063a118f249146104b7578063ae6ea8ec146104ea578063b5ab58dc146104f2578063b633620c1461050f576101da565b80638823da6c146104095780638da5cb5b1461043c5780639a6fc8f514610444576101da565b806350d25bcd1161017c5780637284e4161161014b5780637284e416146103e957806379ba5097146103f15780638038e4a1146103f95780638205bf6a14610401576101da565b806350d25bcd146102fa57806354fd4d5014610302578063668a0f021461030a5780636b14daf814610312576101da565b8063313ce567116101b8578063313ce56714610280578063317d95e91461029e57806349c116ec146102a65780634f4b12b0146102c9576101da565b80630183ca80146101df5780630a756983146101f9578063181f5a7714610203575b600080fd5b6101e76105c2565b60408051918252519081900360200190f35b6102016105ce565b005b61020b610635565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561024557818101518382015260200161022d565b50505050905090810190601f1680156102725780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610288610655565b6040805160ff9092168252519081900360200190f35b6101e761065a565b610201600480360360408110156102bc57600080fd5b5080359060200135610660565b6102d16107cb565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6101e76107e7565b6101e76108a2565b6101e76108a7565b6103d56004803603604081101561032857600080fd5b73ffffffffffffffffffffffffffffffffffffffff823516919081019060408101602082013564010000000081111561036057600080fd5b82018360208201111561037257600080fd5b8035906020019184600183028401116401000000008311171561039457600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061095d945050505050565b604080519115158252519081900360200190f35b61020b610992565b610201610a48565b610201610b4a565b6101e7610bb2565b6102016004803603602081101561041f57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610c68565b6102d1610d22565b61046d6004803603602081101561045a57600080fd5b503569ffffffffffffffffffff16610d3e565b604051808669ffffffffffffffffffff1681526020018581526020018481526020018381526020018269ffffffffffffffffffff1681526020019550505050505060405180910390f35b610201600480360360208110156104cd57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610e0d565b6101e7610ec8565b6101e76004803603602081101561050857600080fd5b5035610f65565b6101e76004803603602081101561052557600080fd5b503561101c565b6101e76110d3565b6101e761119d565b6103d56111a3565b6101e76111ac565b6102016004803603602081101561056257600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166111b8565b6102d1611248565b6102016004803603602081101561059d57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611264565b61046d611275565b670de0b6b3a764000081565b6105d6611342565b60075460ff161561063357600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f3be8a977a014527b50ae38adda80b56911c267328965c98ddc385d248f53963890600090a15b565b606060405180606001604052806024815260200161183860249139905090565b600881565b60065481565b610668611342565b81670de0b6b3a764000011156106c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604e8152602001806118e5604e913960600191505060405180910390fd5b80671bc16d674ec80000101561072a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604b81526020018061185c604b913960600191505060405180910390fd5b818111610782576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c8152602001806117fc603c913960400191505060405180910390fd5b60058290556006819055604080518381526020810183905281517f7d5522ce264136eb7e835537fe0d3c16f4c949080e1c654e897b17ef32bd2003929181900390910190a15050565b60035473ffffffffffffffffffffffffffffffffffffffff1681565b600061082a336000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061095d92505050565b61089557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b61089d6113c8565b905090565b600181565b60006108ea336000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061095d92505050565b61095557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b61089d6114af565b600061096983836114b4565b80610989575073ffffffffffffffffffffffffffffffffffffffff831632145b90505b92915050565b60606109d5336000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061095d92505050565b610a4057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b61089d6114f1565b60015473ffffffffffffffffffffffffffffffffffffffff163314610ace57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e657200000000000000000000604482015290519081900360640190fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610b52611342565b60075460ff1661063357600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517faebf329500988c6488a0074e5a0a9ff304561fc5c6fc877aeb1d59c8282c348090600090a1565b6000610bf5336000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061095d92505050565b610c6057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b61089d6115a5565b610c70611342565b73ffffffffffffffffffffffffffffffffffffffff811660009081526008602052604090205460ff1615610d1f5773ffffffffffffffffffffffffffffffffffffffff811660008181526008602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055815192835290517f3d68a6fce901d20453d1a7aa06bf3950302a735948037deb182a8db66df2a0d19281900390910190a15b50565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b6000806000806000610d87336000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061095d92505050565b610df257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b610dfb866115a9565b939a9299509097509550909350915050565b610e15611342565b73ffffffffffffffffffffffffffffffffffffffff811660009081526008602052604090205460ff16610d1f5773ffffffffffffffffffffffffffffffffffffffff811660008181526008602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055815192835290517f87286ad1f399c8e82bf0c4ef4fcdc570ea2e1e92176e5c848b6413545b885db49281900390910190a150565b600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166350d25bcd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f3357600080fd5b505afa158015610f47573d6000803e3d6000fd5b505050506040513d6020811015610f5d57600080fd5b505191505090565b6000610fa8336000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061095d92505050565b61101357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b61098c826115b9565b600061105f336000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061095d92505050565b6110ca57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b61098c826115c3565b6000806000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633ba0b9a96040518163ffffffff1660e01b8152600401604080518083038186803b15801561113f57600080fd5b505afa158015611153573d6000803e3d6000fd5b505050506040513d604081101561116957600080fd5b508051602090910151909250905060006111958261118f85670de0b6b3a76400006115cd565b90611640565b935050505090565b60055481565b60075460ff1681565b671bc16d674ec8000081565b6111c0611342565b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040805191909216808252602082019390935281517fea430dea9377830bc99bfffb4dda7383a51f174ba093d8144d43fb45c0c0b3f5929181900390910190a15050565b60025473ffffffffffffffffffffffffffffffffffffffff1681565b61126c611342565b610d1f816116c4565b60008060008060006112be336000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061095d92505050565b61132957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b6113316117bf565b945094509450945094509091929394565b60005473ffffffffffffffffffffffffffffffffffffffff16331461063357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b6000806113d36110d3565b9050600554811015611430576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260418152602001806119546041913960600191505060405180910390fd5b60065481111561148b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603e8152602001806118a7603e913960400191505060405180910390fd5b6000611495610ec8565b90506000611195670de0b6b3a764000061118f84866115cd565b600190565b73ffffffffffffffffffffffffffffffffffffffff821660009081526008602052604081205460ff168061098957505060075460ff161592915050565b60048054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561159b5780601f106115705761010080835404028352916020019161159b565b820191906000526020600020905b81548152906001019060200180831161157e57829003601f168201915b5050505050905090565b4290565b6000806000806000610dfb611275565b600061098c6107e7565b600061098c610bb2565b6000826115dc5750600061098c565b828202828482816115e957fe5b0414610989576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806119336021913960400191505060405180910390fd5b60008082116116b057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b60008284816116bb57fe5b04949350505050565b73ffffffffffffffffffffffffffffffffffffffff811633141561174957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015290519081900360640190fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600080600080600060016117d16107e7565b6117d9610bb2565b6117e1610bb2565b63ffffffff9390931698919750955090935060019250905056fe7570706572426f756e6445786368616e676552617465206d757374204c657373207468616e206c6f776572426f756e6445786368616e676552617465416363657373436f6e74726f6c6c6564534b435341676772656761746f7220312e302e307570706572426f756e6445786368616e676552617465206d757374206c657373207468616e206f7220657175616c20746f206d61785570706572426f756e6445786368616e67655261746565786368616e676552617465206d757374206c657373207468616e206f7220657175616c20746f207570706572426f756e6445786368616e6765526174656c6f776572426f756e6445786368616e676552617465206d7573742067726561746572207468616e206f7220657175616c20746f206d696e4c6f776572426f756e6445786368616e676552617465536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7765786368616e676552617465206d7573742067726561746572207468616e206f7220657175616c20746f206c6f776572426f756e6445786368616e676552617465a2646970667358221220f6e25fdf55c4008f834530e5195cf44f504d92fc0a8d65e53d90d71b5bfedbeb64736f6c6343000706003300000000000000000000000000ee2d494258d6c5a30d6b6472a09b27121ef451000000000000000000000000afc9c849b1a784955908d91ee43a3203fbc1f9500000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000010a741a462780000

Deployed ByteCode

0x608060405234801561001057600080fd5b50600436106101da5760003560e01c80638823da6c11610104578063bd6d894d116100a2578063ebaf763311610071578063ebaf76331461054c578063ec37e9ca1461057f578063f2fde38b14610587578063feaf968c146105ba576101da565b8063bd6d894d1461052c578063c32dacd414610534578063dc7f01241461053c578063e068342a14610544576101da565b8063a118f249116100de578063a118f249146104b7578063ae6ea8ec146104ea578063b5ab58dc146104f2578063b633620c1461050f576101da565b80638823da6c146104095780638da5cb5b1461043c5780639a6fc8f514610444576101da565b806350d25bcd1161017c5780637284e4161161014b5780637284e416146103e957806379ba5097146103f15780638038e4a1146103f95780638205bf6a14610401576101da565b806350d25bcd146102fa57806354fd4d5014610302578063668a0f021461030a5780636b14daf814610312576101da565b8063313ce567116101b8578063313ce56714610280578063317d95e91461029e57806349c116ec146102a65780634f4b12b0146102c9576101da565b80630183ca80146101df5780630a756983146101f9578063181f5a7714610203575b600080fd5b6101e76105c2565b60408051918252519081900360200190f35b6102016105ce565b005b61020b610635565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561024557818101518382015260200161022d565b50505050905090810190601f1680156102725780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610288610655565b6040805160ff9092168252519081900360200190f35b6101e761065a565b610201600480360360408110156102bc57600080fd5b5080359060200135610660565b6102d16107cb565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6101e76107e7565b6101e76108a2565b6101e76108a7565b6103d56004803603604081101561032857600080fd5b73ffffffffffffffffffffffffffffffffffffffff823516919081019060408101602082013564010000000081111561036057600080fd5b82018360208201111561037257600080fd5b8035906020019184600183028401116401000000008311171561039457600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061095d945050505050565b604080519115158252519081900360200190f35b61020b610992565b610201610a48565b610201610b4a565b6101e7610bb2565b6102016004803603602081101561041f57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610c68565b6102d1610d22565b61046d6004803603602081101561045a57600080fd5b503569ffffffffffffffffffff16610d3e565b604051808669ffffffffffffffffffff1681526020018581526020018481526020018381526020018269ffffffffffffffffffff1681526020019550505050505060405180910390f35b610201600480360360208110156104cd57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610e0d565b6101e7610ec8565b6101e76004803603602081101561050857600080fd5b5035610f65565b6101e76004803603602081101561052557600080fd5b503561101c565b6101e76110d3565b6101e761119d565b6103d56111a3565b6101e76111ac565b6102016004803603602081101561056257600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166111b8565b6102d1611248565b6102016004803603602081101561059d57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611264565b61046d611275565b670de0b6b3a764000081565b6105d6611342565b60075460ff161561063357600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f3be8a977a014527b50ae38adda80b56911c267328965c98ddc385d248f53963890600090a15b565b606060405180606001604052806024815260200161183860249139905090565b600881565b60065481565b610668611342565b81670de0b6b3a764000011156106c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604e8152602001806118e5604e913960600191505060405180910390fd5b80671bc16d674ec80000101561072a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604b81526020018061185c604b913960600191505060405180910390fd5b818111610782576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c8152602001806117fc603c913960400191505060405180910390fd5b60058290556006819055604080518381526020810183905281517f7d5522ce264136eb7e835537fe0d3c16f4c949080e1c654e897b17ef32bd2003929181900390910190a15050565b60035473ffffffffffffffffffffffffffffffffffffffff1681565b600061082a336000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061095d92505050565b61089557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b61089d6113c8565b905090565b600181565b60006108ea336000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061095d92505050565b61095557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b61089d6114af565b600061096983836114b4565b80610989575073ffffffffffffffffffffffffffffffffffffffff831632145b90505b92915050565b60606109d5336000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061095d92505050565b610a4057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b61089d6114f1565b60015473ffffffffffffffffffffffffffffffffffffffff163314610ace57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e657200000000000000000000604482015290519081900360640190fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610b52611342565b60075460ff1661063357600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517faebf329500988c6488a0074e5a0a9ff304561fc5c6fc877aeb1d59c8282c348090600090a1565b6000610bf5336000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061095d92505050565b610c6057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b61089d6115a5565b610c70611342565b73ffffffffffffffffffffffffffffffffffffffff811660009081526008602052604090205460ff1615610d1f5773ffffffffffffffffffffffffffffffffffffffff811660008181526008602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055815192835290517f3d68a6fce901d20453d1a7aa06bf3950302a735948037deb182a8db66df2a0d19281900390910190a15b50565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b6000806000806000610d87336000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061095d92505050565b610df257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b610dfb866115a9565b939a9299509097509550909350915050565b610e15611342565b73ffffffffffffffffffffffffffffffffffffffff811660009081526008602052604090205460ff16610d1f5773ffffffffffffffffffffffffffffffffffffffff811660008181526008602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055815192835290517f87286ad1f399c8e82bf0c4ef4fcdc570ea2e1e92176e5c848b6413545b885db49281900390910190a150565b600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166350d25bcd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f3357600080fd5b505afa158015610f47573d6000803e3d6000fd5b505050506040513d6020811015610f5d57600080fd5b505191505090565b6000610fa8336000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061095d92505050565b61101357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b61098c826115b9565b600061105f336000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061095d92505050565b6110ca57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b61098c826115c3565b6000806000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633ba0b9a96040518163ffffffff1660e01b8152600401604080518083038186803b15801561113f57600080fd5b505afa158015611153573d6000803e3d6000fd5b505050506040513d604081101561116957600080fd5b508051602090910151909250905060006111958261118f85670de0b6b3a76400006115cd565b90611640565b935050505090565b60055481565b60075460ff1681565b671bc16d674ec8000081565b6111c0611342565b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040805191909216808252602082019390935281517fea430dea9377830bc99bfffb4dda7383a51f174ba093d8144d43fb45c0c0b3f5929181900390910190a15050565b60025473ffffffffffffffffffffffffffffffffffffffff1681565b61126c611342565b610d1f816116c4565b60008060008060006112be336000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061095d92505050565b61132957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b6113316117bf565b945094509450945094509091929394565b60005473ffffffffffffffffffffffffffffffffffffffff16331461063357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b6000806113d36110d3565b9050600554811015611430576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260418152602001806119546041913960600191505060405180910390fd5b60065481111561148b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603e8152602001806118a7603e913960400191505060405180910390fd5b6000611495610ec8565b90506000611195670de0b6b3a764000061118f84866115cd565b600190565b73ffffffffffffffffffffffffffffffffffffffff821660009081526008602052604081205460ff168061098957505060075460ff161592915050565b60048054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561159b5780601f106115705761010080835404028352916020019161159b565b820191906000526020600020905b81548152906001019060200180831161157e57829003601f168201915b5050505050905090565b4290565b6000806000806000610dfb611275565b600061098c6107e7565b600061098c610bb2565b6000826115dc5750600061098c565b828202828482816115e957fe5b0414610989576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806119336021913960400191505060405180910390fd5b60008082116116b057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b60008284816116bb57fe5b04949350505050565b73ffffffffffffffffffffffffffffffffffffffff811633141561174957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015290519081900360640190fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600080600080600060016117d16107e7565b6117d9610bb2565b6117e1610bb2565b63ffffffff9390931698919750955090935060019250905056fe7570706572426f756e6445786368616e676552617465206d757374204c657373207468616e206c6f776572426f756e6445786368616e676552617465416363657373436f6e74726f6c6c6564534b435341676772656761746f7220312e302e307570706572426f756e6445786368616e676552617465206d757374206c657373207468616e206f7220657175616c20746f206d61785570706572426f756e6445786368616e67655261746565786368616e676552617465206d757374206c657373207468616e206f7220657175616c20746f207570706572426f756e6445786368616e6765526174656c6f776572426f756e6445786368616e676552617465206d7573742067726561746572207468616e206f7220657175616c20746f206d696e4c6f776572426f756e6445786368616e676552617465536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7765786368616e676552617465206d7573742067726561746572207468616e206f7220657175616c20746f206c6f776572426f756e6445786368616e676552617465a2646970667358221220f6e25fdf55c4008f834530e5195cf44f504d92fc0a8d65e53d90d71b5bfedbeb64736f6c63430007060033