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