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-27T03:10:07.147532Z
Constructor Arguments
000000000000000000000000311dd61df0e88ddc6803e7353f5d9b71522aeda9000000000000000000000000ae3db39196012a7bf6d38737192f260cdfe1e7ec0000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000010a741a462780000
Arg [0] (address) : 0x311dd61df0e88ddc6803e7353f5d9b71522aeda9
Arg [1] (address) : 0xae3db39196012a7bf6d38737192f260cdfe1e7ec
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;
uint32 internal constant latestAggregatorRoundId = 1;
// skcs contract
SKCSInterface public sKCS;
/// kcs-usd aggregator
AggregatorV2V3Interface public kcsUsdAggregator;
/**
* @notice aggregator contract version
*/
uint256 public constant override version = 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 = 1.6e18;
// 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,
"lowerBoundAnchorRatio must greater than or equal to minLowerBoundExchangeRate"
);
require(
maxUpperBoundExchangeRate >= _upperBoundExchangeRate,
"upperBoundAnchorRatio must less than or equal to maxUpperBoundExchangeRate"
);
require(
_upperBoundExchangeRate > _lowerBoundExchangeRate,
"upperBoundAnchorRatio must Less than lowerBoundAnchorRatio"
);
lowerBoundExchangeRate = _lowerBoundExchangeRate;
upperBoundExchangeRate = _upperBoundExchangeRate;
emit ExchangeRateRangeUpdated(lowerBoundExchangeRate, upperBoundExchangeRate);
}
/// @notice Emitted when the skcs contract of address is changed
event NewSKCS(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 NewSKCS(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 lowerBoundExchangeRate");
require(exchangeRate < upperBoundExchangeRate, "exchangeRate must less than 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":"NewSKCS","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
0x60c0604052600a6080819052691cd2d0d4c80bc81554d160b21b60a09081526200002d916004919062000207565b503480156200003b57600080fd5b5060405162001c6f38038062001c6f833981810160405260808110156200006157600080fd5b5080516020820151604083015160609093015191929091838383833380600081620000d3576040805162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f0000000000000000604482015290519081900360640190fd5b600080546001600160a01b0319166001600160a01b03848116919091179091558116156200010657620001068162000157565b5050600280546001600160a01b039687166001600160a01b03199182161790915560038054959096169416939093179093556005555060065550506007805460ff1916600117905550620002b39050565b6001600160a01b038116331415620001b6576040805162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826200023f57600085556200028a565b82601f106200025a57805160ff19168380011785556200028a565b828001600101855582156200028a579182015b828111156200028a5782518255916020019190600101906200026d565b50620002989291506200029c565b5090565b5b808211156200029857600081556001016200029d565b6119ac80620002c36000396000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c80638823da6c11610104578063bd6d894d116100a2578063ebaf763311610071578063ebaf76331461054c578063ec37e9ca1461057f578063f2fde38b14610587578063feaf968c146105ba576101da565b8063bd6d894d1461052c578063c32dacd414610534578063dc7f01241461053c578063e068342a14610544576101da565b8063a118f249116100de578063a118f249146104b7578063ae6ea8ec146104ea578063b5ab58dc146104f2578063b633620c1461050f576101da565b80638823da6c146104095780638da5cb5b1461043c5780639a6fc8f514610444576101da565b806350d25bcd1161017c5780637284e4161161014b5780637284e416146103e957806379ba5097146103f15780638038e4a1146103f95780638205bf6a14610401576101da565b806350d25bcd146102fa57806354fd4d5014610302578063668a0f021461030a5780636b14daf814610312576101da565b8063313ce567116101b8578063313ce56714610280578063317d95e91461029e57806349c116ec146102a65780634f4b12b0146102c9576101da565b80630183ca80146101df5780630a756983146101f9578063181f5a7714610203575b600080fd5b6101e76105c2565b60408051918252519081900360200190f35b6102016105ce565b005b61020b610635565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561024557818101518382015260200161022d565b50505050905090810190601f1680156102725780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610288610655565b6040805160ff9092168252519081900360200190f35b6101e761065a565b610201600480360360408110156102bc57600080fd5b5080359060200135610660565b6102d16107cb565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6101e76107e7565b6101e76108a2565b6101e76108a7565b6103d56004803603604081101561032857600080fd5b73ffffffffffffffffffffffffffffffffffffffff823516919081019060408101602082013564010000000081111561036057600080fd5b82018360208201111561037257600080fd5b8035906020019184600183028401116401000000008311171561039457600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061095d945050505050565b604080519115158252519081900360200190f35b61020b610992565b610201610a48565b610201610b4a565b6101e7610bb2565b6102016004803603602081101561041f57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610c68565b6102d1610d22565b61046d6004803603602081101561045a57600080fd5b503569ffffffffffffffffffff16610d3e565b604051808669ffffffffffffffffffff1681526020018581526020018481526020018381526020018269ffffffffffffffffffff1681526020019550505050505060405180910390f35b610201600480360360208110156104cd57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610e0d565b6101e7610ec8565b6101e76004803603602081101561050857600080fd5b5035610f65565b6101e76004803603602081101561052557600080fd5b503561101c565b6101e76110d3565b6101e761119d565b6103d56111a3565b6101e76111ac565b6102016004803603602081101561056257600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166111b8565b6102d1611248565b6102016004803603602081101561059d57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611264565b61046d611275565b670de0b6b3a764000081565b6105d6611342565b60075460ff161561063357600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f3be8a977a014527b50ae38adda80b56911c267328965c98ddc385d248f53963890600090a15b565b60606040518060600160405280602481526020016117fa60249139905090565b600881565b60065481565b610668611342565b81670de0b6b3a764000011156106c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604d815260200180611868604d913960600191505060405180910390fd5b806716345785d8a00000101561072a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604a81526020018061181e604a913960600191505060405180910390fd5b818111610782576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a81526020018061193d603a913960400191505060405180910390fd5b60058290556006819055604080518381526020810183905281517f7d5522ce264136eb7e835537fe0d3c16f4c949080e1c654e897b17ef32bd2003929181900390910190a15050565b60035473ffffffffffffffffffffffffffffffffffffffff1681565b600061082a336000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061095d92505050565b61089557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b61089d6113c8565b905090565b600181565b60006108ea336000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061095d92505050565b61095557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b61089d6114ad565b600061096983836114b2565b80610989575073ffffffffffffffffffffffffffffffffffffffff831632145b90505b92915050565b60606109d5336000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061095d92505050565b610a4057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b61089d6114ef565b60015473ffffffffffffffffffffffffffffffffffffffff163314610ace57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e657200000000000000000000604482015290519081900360640190fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610b52611342565b60075460ff1661063357600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517faebf329500988c6488a0074e5a0a9ff304561fc5c6fc877aeb1d59c8282c348090600090a1565b6000610bf5336000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061095d92505050565b610c6057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b61089d6115a3565b610c70611342565b73ffffffffffffffffffffffffffffffffffffffff811660009081526008602052604090205460ff1615610d1f5773ffffffffffffffffffffffffffffffffffffffff811660008181526008602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055815192835290517f3d68a6fce901d20453d1a7aa06bf3950302a735948037deb182a8db66df2a0d19281900390910190a15b50565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b6000806000806000610d87336000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061095d92505050565b610df257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b610dfb866115a7565b939a9299509097509550909350915050565b610e15611342565b73ffffffffffffffffffffffffffffffffffffffff811660009081526008602052604090205460ff16610d1f5773ffffffffffffffffffffffffffffffffffffffff811660008181526008602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055815192835290517f87286ad1f399c8e82bf0c4ef4fcdc570ea2e1e92176e5c848b6413545b885db49281900390910190a150565b600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166350d25bcd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f3357600080fd5b505afa158015610f47573d6000803e3d6000fd5b505050506040513d6020811015610f5d57600080fd5b505191505090565b6000610fa8336000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061095d92505050565b61101357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b61098c826115b7565b600061105f336000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061095d92505050565b6110ca57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b61098c826115c1565b6000806000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633ba0b9a96040518163ffffffff1660e01b8152600401604080518083038186803b15801561113f57600080fd5b505afa158015611153573d6000803e3d6000fd5b505050506040513d604081101561116957600080fd5b508051602090910151909250905060006111958261118f85670de0b6b3a76400006115cb565b9061163e565b935050505090565b60055481565b60075460ff1681565b6716345785d8a0000081565b6111c0611342565b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040805191909216808252602082019390935281517f7dda1ff7dbbe5e84c39984635016bc183cb268a30d91f9d9622027371e12b585929181900390910190a15050565b60025473ffffffffffffffffffffffffffffffffffffffff1681565b61126c611342565b610d1f816116c2565b60008060008060006112be336000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061095d92505050565b61132957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b6113316117bd565b945094509450945094509091929394565b60005473ffffffffffffffffffffffffffffffffffffffff16331461063357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b6000806113d36110d3565b9050600554811161142f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260358152602001806119086035913960400191505060405180910390fd5b6006548110611489576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806118b56032913960400191505060405180910390fd5b6000611493610ec8565b90506000611195670de0b6b3a764000061118f84866115cb565b600190565b73ffffffffffffffffffffffffffffffffffffffff821660009081526008602052604081205460ff168061098957505060075460ff161592915050565b60048054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156115995780601f1061156e57610100808354040283529160200191611599565b820191906000526020600020905b81548152906001019060200180831161157c57829003601f168201915b5050505050905090565b4290565b6000806000806000610dfb611275565b600061098c6107e7565b600061098c610bb2565b6000826115da5750600061098c565b828202828482816115e757fe5b0414610989576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806118e76021913960400191505060405180910390fd5b60008082116116ae57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b60008284816116b957fe5b04949350505050565b73ffffffffffffffffffffffffffffffffffffffff811633141561174757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015290519081900360640190fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600080600080600060016117cf6107e7565b6117d7610bb2565b6117df610bb2565b63ffffffff9390931698919750955090935060019250905056fe416363657373436f6e74726f6c6c6564534b435341676772656761746f7220312e302e307570706572426f756e64416e63686f72526174696f206d757374206c657373207468616e206f7220657175616c20746f206d61785570706572426f756e6445786368616e6765526174656c6f776572426f756e64416e63686f72526174696f206d7573742067726561746572207468616e206f7220657175616c20746f206d696e4c6f776572426f756e6445786368616e67655261746565786368616e676552617465206d757374206c657373207468616e207570706572426f756e6445786368616e676552617465536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7765786368616e676552617465206d7573742067726561746572207468616e206c6f776572426f756e6445786368616e6765526174657570706572426f756e64416e63686f72526174696f206d757374204c657373207468616e206c6f776572426f756e64416e63686f72526174696fa264697066735822122037bab6abe0468950b6ef8a7ab966ea853609c0cb26ced770286f02786d616bd564736f6c63430007060033000000000000000000000000311dd61df0e88ddc6803e7353f5d9b71522aeda9000000000000000000000000ae3db39196012a7bf6d38737192f260cdfe1e7ec0000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000010a741a462780000
Deployed ByteCode
0x608060405234801561001057600080fd5b50600436106101da5760003560e01c80638823da6c11610104578063bd6d894d116100a2578063ebaf763311610071578063ebaf76331461054c578063ec37e9ca1461057f578063f2fde38b14610587578063feaf968c146105ba576101da565b8063bd6d894d1461052c578063c32dacd414610534578063dc7f01241461053c578063e068342a14610544576101da565b8063a118f249116100de578063a118f249146104b7578063ae6ea8ec146104ea578063b5ab58dc146104f2578063b633620c1461050f576101da565b80638823da6c146104095780638da5cb5b1461043c5780639a6fc8f514610444576101da565b806350d25bcd1161017c5780637284e4161161014b5780637284e416146103e957806379ba5097146103f15780638038e4a1146103f95780638205bf6a14610401576101da565b806350d25bcd146102fa57806354fd4d5014610302578063668a0f021461030a5780636b14daf814610312576101da565b8063313ce567116101b8578063313ce56714610280578063317d95e91461029e57806349c116ec146102a65780634f4b12b0146102c9576101da565b80630183ca80146101df5780630a756983146101f9578063181f5a7714610203575b600080fd5b6101e76105c2565b60408051918252519081900360200190f35b6102016105ce565b005b61020b610635565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561024557818101518382015260200161022d565b50505050905090810190601f1680156102725780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610288610655565b6040805160ff9092168252519081900360200190f35b6101e761065a565b610201600480360360408110156102bc57600080fd5b5080359060200135610660565b6102d16107cb565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6101e76107e7565b6101e76108a2565b6101e76108a7565b6103d56004803603604081101561032857600080fd5b73ffffffffffffffffffffffffffffffffffffffff823516919081019060408101602082013564010000000081111561036057600080fd5b82018360208201111561037257600080fd5b8035906020019184600183028401116401000000008311171561039457600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061095d945050505050565b604080519115158252519081900360200190f35b61020b610992565b610201610a48565b610201610b4a565b6101e7610bb2565b6102016004803603602081101561041f57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610c68565b6102d1610d22565b61046d6004803603602081101561045a57600080fd5b503569ffffffffffffffffffff16610d3e565b604051808669ffffffffffffffffffff1681526020018581526020018481526020018381526020018269ffffffffffffffffffff1681526020019550505050505060405180910390f35b610201600480360360208110156104cd57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610e0d565b6101e7610ec8565b6101e76004803603602081101561050857600080fd5b5035610f65565b6101e76004803603602081101561052557600080fd5b503561101c565b6101e76110d3565b6101e761119d565b6103d56111a3565b6101e76111ac565b6102016004803603602081101561056257600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166111b8565b6102d1611248565b6102016004803603602081101561059d57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611264565b61046d611275565b670de0b6b3a764000081565b6105d6611342565b60075460ff161561063357600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040517f3be8a977a014527b50ae38adda80b56911c267328965c98ddc385d248f53963890600090a15b565b60606040518060600160405280602481526020016117fa60249139905090565b600881565b60065481565b610668611342565b81670de0b6b3a764000011156106c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604d815260200180611868604d913960600191505060405180910390fd5b806716345785d8a00000101561072a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604a81526020018061181e604a913960600191505060405180910390fd5b818111610782576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a81526020018061193d603a913960400191505060405180910390fd5b60058290556006819055604080518381526020810183905281517f7d5522ce264136eb7e835537fe0d3c16f4c949080e1c654e897b17ef32bd2003929181900390910190a15050565b60035473ffffffffffffffffffffffffffffffffffffffff1681565b600061082a336000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061095d92505050565b61089557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b61089d6113c8565b905090565b600181565b60006108ea336000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061095d92505050565b61095557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b61089d6114ad565b600061096983836114b2565b80610989575073ffffffffffffffffffffffffffffffffffffffff831632145b90505b92915050565b60606109d5336000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061095d92505050565b610a4057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b61089d6114ef565b60015473ffffffffffffffffffffffffffffffffffffffff163314610ace57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e657200000000000000000000604482015290519081900360640190fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610b52611342565b60075460ff1661063357600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517faebf329500988c6488a0074e5a0a9ff304561fc5c6fc877aeb1d59c8282c348090600090a1565b6000610bf5336000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061095d92505050565b610c6057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b61089d6115a3565b610c70611342565b73ffffffffffffffffffffffffffffffffffffffff811660009081526008602052604090205460ff1615610d1f5773ffffffffffffffffffffffffffffffffffffffff811660008181526008602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055815192835290517f3d68a6fce901d20453d1a7aa06bf3950302a735948037deb182a8db66df2a0d19281900390910190a15b50565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b6000806000806000610d87336000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061095d92505050565b610df257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b610dfb866115a7565b939a9299509097509550909350915050565b610e15611342565b73ffffffffffffffffffffffffffffffffffffffff811660009081526008602052604090205460ff16610d1f5773ffffffffffffffffffffffffffffffffffffffff811660008181526008602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055815192835290517f87286ad1f399c8e82bf0c4ef4fcdc570ea2e1e92176e5c848b6413545b885db49281900390910190a150565b600080600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166350d25bcd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f3357600080fd5b505afa158015610f47573d6000803e3d6000fd5b505050506040513d6020811015610f5d57600080fd5b505191505090565b6000610fa8336000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061095d92505050565b61101357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b61098c826115b7565b600061105f336000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061095d92505050565b6110ca57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b61098c826115c1565b6000806000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633ba0b9a96040518163ffffffff1660e01b8152600401604080518083038186803b15801561113f57600080fd5b505afa158015611153573d6000803e3d6000fd5b505050506040513d604081101561116957600080fd5b508051602090910151909250905060006111958261118f85670de0b6b3a76400006115cb565b9061163e565b935050505090565b60055481565b60075460ff1681565b6716345785d8a0000081565b6111c0611342565b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040805191909216808252602082019390935281517f7dda1ff7dbbe5e84c39984635016bc183cb268a30d91f9d9622027371e12b585929181900390910190a15050565b60025473ffffffffffffffffffffffffffffffffffffffff1681565b61126c611342565b610d1f816116c2565b60008060008060006112be336000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061095d92505050565b61132957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b6113316117bd565b945094509450945094509091929394565b60005473ffffffffffffffffffffffffffffffffffffffff16331461063357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b6000806113d36110d3565b9050600554811161142f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260358152602001806119086035913960400191505060405180910390fd5b6006548110611489576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806118b56032913960400191505060405180910390fd5b6000611493610ec8565b90506000611195670de0b6b3a764000061118f84866115cb565b600190565b73ffffffffffffffffffffffffffffffffffffffff821660009081526008602052604081205460ff168061098957505060075460ff161592915050565b60048054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156115995780601f1061156e57610100808354040283529160200191611599565b820191906000526020600020905b81548152906001019060200180831161157c57829003601f168201915b5050505050905090565b4290565b6000806000806000610dfb611275565b600061098c6107e7565b600061098c610bb2565b6000826115da5750600061098c565b828202828482816115e757fe5b0414610989576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806118e76021913960400191505060405180910390fd5b60008082116116ae57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b60008284816116b957fe5b04949350505050565b73ffffffffffffffffffffffffffffffffffffffff811633141561174757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015290519081900360640190fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600080600080600060016117cf6107e7565b6117d7610bb2565b6117df610bb2565b63ffffffff9390931698919750955090935060019250905056fe416363657373436f6e74726f6c6c6564534b435341676772656761746f7220312e302e307570706572426f756e64416e63686f72526174696f206d757374206c657373207468616e206f7220657175616c20746f206d61785570706572426f756e6445786368616e6765526174656c6f776572426f756e64416e63686f72526174696f206d7573742067726561746572207468616e206f7220657175616c20746f206d696e4c6f776572426f756e6445786368616e67655261746565786368616e676552617465206d757374206c657373207468616e207570706572426f756e6445786368616e676552617465536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7765786368616e676552617465206d7573742067726561746572207468616e206c6f776572426f756e6445786368616e6765526174657570706572426f756e64416e63686f72526174696f206d757374204c657373207468616e206c6f776572426f756e64416e63686f72526174696fa264697066735822122037bab6abe0468950b6ef8a7ab966ea853609c0cb26ced770286f02786d616bd564736f6c63430007060033