Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- CLFeedRegistryAdapter
- Optimization enabled
- true
- Compiler version
- v0.8.28+commit.7893614a
- Optimization runs
- 200
- EVM Version
- paris
- Verified at
- 2025-06-02T12:47:58.981581Z
Constructor Arguments
0x00000000000000000000000053adbdaa3ee8725de80bf97173b1f1a0a48036de000000000000000000000000adf5aacfa254fbc566d3b81e04b95db4bcf7b40f
Arg [0] (address) : 0x53adbdaa3ee8725de80bf97173b1f1a0a48036de
Arg [1] (address) : 0xadf5aacfa254fbc566d3b81e04b95db4bcf7b40f
contracts/cl-adapters/registries/CLFeedRegistryAdapter.sol
// SPDX-License-Identifier: MIT // SPDX-FileCopyrightText: Copyright (c) 2024-2025 Schelling Point Labs Inc. pragma solidity ^0.8.28; import '../../interfaces/ICLFeedRegistryAdapter.sol'; import {ICLAggregatorAdapter} from '../../interfaces/ICLAggregatorAdapter.sol'; import {CLAdapterLib} from '../../libraries/CLAdapterLib.sol'; /// @title Registry aggregating information from CLAggregatorAdapters and the feed itself /// @author Aneta Tsvetkova /// @notice This contract is used to store and retrieve information about feeds /// @dev To reduce gas costs, the contract calls the dataFeedStore directly instead of using the CLAggregatorAdapter contract CLFeedRegistryAdapter is ICLFeedRegistryAdapter { /// @notice The data feed store contract address internal immutable DATA_FEED_STORE; /// @inheritdoc ICLFeedRegistryAdapter address public immutable override OWNER; /// @notice Feed data for a given pair mapping(address => mapping(address => FeedData)) internal feedData; /// @notice Constructor /// @param _owner The owner of the contract /// @param _dataFeedStore The address of the data feed store constructor(address _owner, address _dataFeedStore) { OWNER = _owner; DATA_FEED_STORE = _dataFeedStore; } /// @inheritdoc IChainlinkFeedRegistry function decimals( address base, address quote ) external view override returns (uint8) { return feedData[base][quote].decimals; } /// @inheritdoc IChainlinkFeedRegistry function description( address base, address quote ) external view override returns (string memory) { return feedData[base][quote].description; } /// @inheritdoc IChainlinkFeedRegistry function latestAnswer( address base, address quote ) external view override returns (int256) { return CLAdapterLib.latestAnswer(feedData[base][quote].id, DATA_FEED_STORE); } /// @inheritdoc IChainlinkFeedRegistry function getRoundData( address base, address quote, uint80 _roundId ) external view override returns (uint80, int256, uint256, uint256, uint80) { return CLAdapterLib.getRoundData( _roundId, feedData[base][quote].id, DATA_FEED_STORE ); } /// @inheritdoc IChainlinkFeedRegistry function getFeed( address base, address quote ) external view override returns (IChainlinkAggregator) { return feedData[base][quote].aggregator; } /// @inheritdoc ICLFeedRegistryAdapter function setFeeds(Feed[] calldata feeds) external override { if (msg.sender != OWNER) { revert OnlyOwner(); } for (uint256 i = 0; i < feeds.length; i++) { feedData[feeds[i].base][feeds[i].quote] = FeedData( IChainlinkAggregator(feeds[i].feed), ICLAggregatorAdapter(feeds[i].feed).decimals(), CLAdapterLib.shiftId(ICLAggregatorAdapter(feeds[i].feed).id()), ICLAggregatorAdapter(feeds[i].feed).description() ); } } /// @inheritdoc IChainlinkFeedRegistry function latestRound( address base, address quote ) external view override returns (uint256) { return CLAdapterLib.latestRound(feedData[base][quote].id, DATA_FEED_STORE); } /// @inheritdoc IChainlinkFeedRegistry function latestRoundData( address base, address quote ) external view override returns (uint80, int256, uint256, uint256, uint80) { return CLAdapterLib.latestRoundData(feedData[base][quote].id, DATA_FEED_STORE); } }
contracts/interfaces/ICLAggregatorAdapter.sol
// SPDX-License-Identifier: MIT pragma solidity ^0.8.28; import {IChainlinkAggregator} from './chainlink/IChainlinkAggregator.sol'; interface ICLAggregatorAdapter is IChainlinkAggregator { /// @notice The feed data this contract is responsible for /// @dev This is the feed ID for the mapping in the dataFeedStore /// @return _id The ID for the feed function id() external view returns (uint256); /// @notice The dataFeedStore this contract is responsible for /// @dev The address of the underlying contract that stores the data /// @return dataFeedStore The address of the dataFeedStore function dataFeedStore() external view returns (address); }
contracts/interfaces/ICLFeedRegistryAdapter.sol
// SPDX-License-Identifier: MIT pragma solidity ^0.8.28; import {IChainlinkFeedRegistry, IChainlinkAggregator} from './chainlink/IChainlinkFeedRegistry.sol'; interface ICLFeedRegistryAdapter is IChainlinkFeedRegistry { struct FeedData { IChainlinkAggregator aggregator; uint8 decimals; uint256 id; string description; } struct Feed { address base; address quote; address feed; } error OnlyOwner(); /// @notice Contract owner /// @return owner The address of the owner function OWNER() external view returns (address); /// @notice Set the feed for a given pair /// @dev Stores immutable values (decimals, id, description) and contract address from CLAggregatorAdapter /// @param feeds Array of base, quote and feed address data function setFeeds(Feed[] calldata feeds) external; }
contracts/interfaces/chainlink/IChainlinkAggregator.sol
/** * SPDX-FileCopyrightText: Copyright (c) 2021 SmartContract ChainLink Limited SEZC * * SPDX-License-Identifier: MIT */ pragma solidity ^0.8.28; interface IChainlinkAggregator { /// @notice Decimals for the feed data /// @return decimals The decimals of the feed function decimals() external view returns (uint8); /// @notice Description text for the feed data /// @return description The description of the feed function description() external view returns (string memory); /// @notice Get the latest answer for the feed /// @return answer The latest value stored function latestAnswer() external view returns (int256); /// @notice Get the latest round ID for the feed /// @return roundId The latest round ID function latestRound() external view returns (uint256); /// @notice Get the data for a round at a given round ID /// @param _roundId The round ID to retrieve the data for /// @return roundId The round ID /// @return answer The value stored for the round /// @return startedAt Timestamp of when the value was stored /// @return updatedAt Same as startedAt /// @return answeredInRound Same as roundId function getRoundData( uint80 _roundId ) external view returns ( uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound ); /// @notice Get the latest round data available /// @return roundId The latest round ID for the feed /// @return answer The value stored for the round /// @return startedAt Timestamp of when the value was stored /// @return updatedAt Same as startedAt /// @return answeredInRound Same as roundId function latestRoundData() external view returns ( uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound ); }
contracts/interfaces/chainlink/IChainlinkFeedRegistry.sol
/** * SPDX-FileCopyrightText: Copyright (c) 2021 SmartContract ChainLink Limited SEZC * * SPDX-License-Identifier: MIT */ pragma solidity ^0.8.28; import {IChainlinkAggregator} from './IChainlinkAggregator.sol'; interface IChainlinkFeedRegistry { /// @notice Get decimals for a feed pair /// @param base The base asset of the feed /// @param quote The quote asset of the feed /// @return decimals The decimals of the feed pair function decimals(address base, address quote) external view returns (uint8); /// @notice Get description for a feed pair /// @param base The base asset of the feed /// @param quote The quote asset of the feed /// @return description The description of the feed pair function description( address base, address quote ) external view returns (string memory); /// @notice Get the latest answer for a feed pair /// @param base The base asset of the feed /// @param quote The quote asset of the feed /// @return answer The value sotred for the feed pair function latestAnswer( address base, address quote ) external view returns (int256 answer); /// @notice Get the latest round ID for a feed pair /// @param base The base asset of the feed /// @param quote The quote asset of the feed /// @return roundId The latest round ID function latestRound( address base, address quote ) external view returns (uint256 roundId); /// @notice Get the round data for a feed pair at a given round ID /// @param base The base asset of the feed /// @param quote The quote asset of the feed /// @param _roundId The round ID to retrieve data for /// @return roundId The round ID /// @return answer The value stored for the feed at the given round ID /// @return startedAt The timestamp when the value was stored /// @return updatedAt Same as startedAt /// @return answeredInRound Same as roundId function getRoundData( address base, address quote, uint80 _roundId ) external view returns ( uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound ); /// @notice Get the latest round data for a feed pair /// @param base The base asset of the feed /// @param quote The quote asset of the feed /// @return roundId The latest round ID stored for the feed pair /// @return answer The latest value stored for the feed pair /// @return startedAt The timestamp when the value was stored /// @return updatedAt Same as startedAt /// @return answeredInRound Same as roundId function latestRoundData( address base, address quote ) external view returns ( uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound ); /// @notice Get the CLAggregatorAdapter contract for a feed pair /// @param base The base asset of the feed /// @param quote The quote asset of the feed /// @return aggregator The CLAggregatorAdapter contract given pair function getFeed( address base, address quote ) external view returns (IChainlinkAggregator aggregator); }
contracts/libraries/CLAdapterLib.sol
// SPDX-License-Identifier: MIT pragma solidity ^0.8.28; // ___ __ __ _ __ __ __ // / _ )/ /__ ____/ /__ ___ ___ ___ ___ ___ / |/ /__ / /__ _____ ____/ /__ // / _ / / _ \/ __/ '_/(_-</ -_) _ \(_-</ -_) / / -_) __/ |/|/ / _ \/ __/ '_/ // /____/_/\___/\__/_/\_\/___/\__/_//_/___/\__/ /_/|_/\__/\__/|__,__/\___/_/ /_/\_\ // _____ ____ ___ ___ ___ ________ // / __/ | / / |/ / / _ | / _ \/ __/ __/ // / _/ | |/ / /|_/ / / __ |/ // / _/_\ \ // /___/ |___/_/ /_/ /_/ |_/____/_/ /___/ // // Website: https://blocksense.network/ // Git Repository: https://github.com/blocksense-network/blocksense /// @title CLAdapterLib /// @author Aneta Tsvetkova /// @notice Library for calling dataFeedStore functions for Chainlink adapters /// @dev Contains utility functions for calling gas efficiently dataFeedStore functions and decoding return data library CLAdapterLib { /// @notice Gets the latest answer from the dataFeedStore /// @param dataFeedStore The address of the dataFeedStore contract /// @param id The ID of the feed /// @return answer The latest stored value after being decoded function latestAnswer( uint256 id, address dataFeedStore ) internal view returns (int256) { return int256( uint256( uint192( bytes24( // 1st byte is function selector // after that are 16 bytes of the feed id _callDataFeed(dataFeedStore, (uint256(0x82) << 248) | id) ) ) ) ); } /// @notice Gets the round data from the dataFeedStore /// @param _roundId The round ID to retrieve data for /// @param id The ID of the feed /// @param dataFeedStore The address of the dataFeedStore contract /// @return roundId The round ID /// @return answer The value stored for the feed at the given round ID /// @return startedAt The timestamp when the value was stored /// @return updatedAt Same as startedAt /// @return answeredInRound Same as roundId function getRoundData( uint80 _roundId, uint256 id, address dataFeedStore ) internal view returns (uint80, int256 answer, uint256 startedAt, uint256, uint80) { (answer, startedAt) = _decodeData( _callDataFeed( dataFeedStore, // 1st byte is function selector // after that are 16 bytes of the feed id // after the feed id are 2 bytes of the round id (uint256(0x86) << 248) | id | (uint256(_roundId) << 104) ) ); return (_roundId, answer, startedAt, startedAt, _roundId); } /// @notice Gets the latest round ID for a given feed from the dataFeedStore /// @param id The ID of the feed /// @param dataFeedStore The address of the dataFeedStore contract /// @return roundId The latest round ID function latestRound( uint256 id, address dataFeedStore ) internal view returns (uint256) { return uint256( // 1st byte is function selector // after that are 16 bytes of the feed id _callDataFeed(dataFeedStore, (uint256(0x81) << 248) | id) ); } /// @notice Gets the latest round data for a given feed from the dataFeedStore /// @dev Using assembly achieves lower gas costs /// @param id The ID of the feed /// @param dataFeedStore The address of the dataFeedStore contract /// @return roundId The latest round ID /// @return answer The latest stored value after being decoded /// @return startedAt The timestamp when the value was stored /// @return updatedAt Same as startedAt /// @return answeredInRound Same as roundId function latestRoundData( uint256 id, address dataFeedStore ) internal view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256, uint80) { bytes32 returnData; // using assembly staticcall costs less gas than using a view function assembly { // get free memory pointer let ptr := mload(0x40) // store selector in memory at location 0 // 1st byte is function selector // after that are 16 bytes of the feed id mstore( 0x00, or( 0x8300000000000000000000000000000000000000000000000000000000000000, id ) ) // call dataFeedStore with selector and store return value (64 bytes) at memory location ptr let success := staticcall(gas(), dataFeedStore, 0x00, 17, ptr, 64) // revert if call failed if iszero(success) { revert(0, 0) } // load return value from memory at location ptr // roundId is stored in the first 32 bytes of the returned 64 bytes roundId := mload(ptr) // value is stored in the second 32 bytes of the returned 64 bytes returnData := mload(add(ptr, 32)) } (answer, startedAt) = _decodeData(returnData); return (roundId, answer, startedAt, startedAt, roundId); } /// @notice Calls the dataFeedStore with the given data /// @dev Using assembly achieves lower gas costs /// Used as a call() function to dataFeedStore /// @param dataFeedStore The address of the dataFeedStore contract /// @param selector The data to call the dataFeedStore with /// @return returnData The return value from the dataFeedStore function _callDataFeed( address dataFeedStore, uint256 selector ) internal view returns (bytes32 returnData) { // using assembly staticcall costs less gas than using a view function assembly { // store selector in memory at location 0 mstore(0x00, selector) // call dataFeedStore with data and store return value (32 bytes) at memory location ptr let success := staticcall( gas(), // gas remaining dataFeedStore, // address to call 0x00, // location of data to call 19, // size of data to call - usually it is 17b but for _getRoundData it is 19b because of the 2 bytes of the roundId returnData, // where to store the return data 32 // how much data to store ) // revert if call failed if iszero(success) { revert(0, 0) } // assign loaded return value to returnData returnData := mload(returnData) } } /// @notice Decodes the return data from the dataFeedStore /// @param data The data to decode /// @return answer The value stored for the feed at the given round ID /// @return timestamp The timestamp when the value was stored function _decodeData(bytes32 data) internal pure returns (int256, uint256) { return ( int256(uint256(uint192(bytes24(data)))), uint64(uint256(data)) / 1000 // timestamp is stored in milliseconds ); } /// @notice Shifts the feed id to the left by 120 bits /// @dev This is used in the constructor to save gas when calling the dataFeedStore /// The dataFeedStore expects the feed id to be positioned in the calldata in a 16 bytes value starting from the 2nd byte /// @param id The feed id to shift function shiftId(uint256 id) internal pure returns (uint256) { return id << 120; } }
Compiler Settings
{"outputSelection":{"*":{"*":["*"],"":["*"]}},"optimizer":{"runs":200,"enabled":true},"libraries":{},"evmVersion":"paris"}
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_owner","internalType":"address"},{"type":"address","name":"_dataFeedStore","internalType":"address"}]},{"type":"error","name":"OnlyOwner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"OWNER","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[{"type":"address","name":"base","internalType":"address"},{"type":"address","name":"quote","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"description","inputs":[{"type":"address","name":"base","internalType":"address"},{"type":"address","name":"quote","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IChainlinkAggregator"}],"name":"getFeed","inputs":[{"type":"address","name":"base","internalType":"address"},{"type":"address","name":"quote","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint80","name":"","internalType":"uint80"},{"type":"int256","name":"","internalType":"int256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint80","name":"","internalType":"uint80"}],"name":"getRoundData","inputs":[{"type":"address","name":"base","internalType":"address"},{"type":"address","name":"quote","internalType":"address"},{"type":"uint80","name":"_roundId","internalType":"uint80"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"int256","name":"","internalType":"int256"}],"name":"latestAnswer","inputs":[{"type":"address","name":"base","internalType":"address"},{"type":"address","name":"quote","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"latestRound","inputs":[{"type":"address","name":"base","internalType":"address"},{"type":"address","name":"quote","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint80","name":"","internalType":"uint80"},{"type":"int256","name":"","internalType":"int256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint80","name":"","internalType":"uint80"}],"name":"latestRoundData","inputs":[{"type":"address","name":"base","internalType":"address"},{"type":"address","name":"quote","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setFeeds","inputs":[{"type":"tuple[]","name":"feeds","internalType":"struct ICLFeedRegistryAdapter.Feed[]","components":[{"type":"address","name":"base","internalType":"address"},{"type":"address","name":"quote","internalType":"address"},{"type":"address","name":"feed","internalType":"address"}]}]}]
Contract Creation Code
0x60c060405234801561001057600080fd5b50604051610dfe380380610dfe83398101604081905261002f91610062565b6001600160a01b0391821660a05216608052610095565b80516001600160a01b038116811461005d57600080fd5b919050565b6000806040838503121561007557600080fd5b61007e83610046565b915061008c60208401610046565b90509250929050565b60805160a051610d296100d560003960008181609d01526102360152600081816105a0015281816106060152818161066001526107780152610d296000f3fe608060405234801561001057600080fd5b50600436106100935760003560e01c8063d2edb6dd11610066578063d2edb6dd1461018e578063d4c282a3146101c4578063ec62f44b146101e5578063fa820de9146101f8578063fc58749e1461021857600080fd5b8063117803e31461009857806358e2d3a8146100dc578063b5720f821461012f578063bcfd032d14610144575b600080fd5b6100bf7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b61011d6100ea3660046108df565b6001600160a01b03918216600090815260208181526040808320939094168252919091522054600160a01b900460ff1690565b60405160ff90911681526020016100d3565b61014261013d366004610912565b61022b565b005b6101576101523660046108df565b610569565b6040805169ffffffffffffffffffff968716815260208101959095528401929092526060830152909116608082015260a0016100d3565b6100bf61019c3660046108df565b6001600160a01b03918216600090815260208181526040808320938516835292905220541690565b6101d76101d23660046108df565b6105d7565b6040519081526020016100d3565b6101d76101f33660046108df565b610631565b61020b6102063660046108df565b610684565b6040516100d391906109ad565b6101576102263660046109e0565b61073f565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461027457604051635fc483c560e01b815260040160405180910390fd5b60005b8181101561056457604051806080016040528084848481811061029c5761029c610a36565b90506060020160400160208101906102b49190610a4c565b6001600160a01b031681526020018484848181106102d4576102d4610a36565b90506060020160400160208101906102ec9190610a4c565b6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610329573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061034d9190610a67565b60ff1681526020016103e985858581811061036a5761036a610a36565b90506060020160400160208101906103829190610a4c565b6001600160a01b031663af640d0f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103e39190610a8a565b60781b90565b815260200184848481811061040057610400610a36565b90506060020160400160208101906104189190610a4c565b6001600160a01b0316637284e4166040518163ffffffff1660e01b8152600401600060405180830381865afa158015610455573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261047d9190810190610ab9565b905260008085858581811061049457610494610a36565b6104aa9260206060909202019081019150610a4c565b6001600160a01b03166001600160a01b0316815260200190815260200160002060008585858181106104de576104de610a36565b90506060020160200160208101906104f69190610a4c565b6001600160a01b0390811682526020808301939093526040918201600020845181549486015160ff16600160a01b026001600160a81b03199095169216919091179290921782558201516001820155606082015160028201906105599082610bf6565b505050600101610277565b505050565b6001600160a01b0380831660009081526020818152604080832093851683529290529081206001015481908190819081906105c4907f00000000000000000000000000000000000000000000000000000000000000006107b0565b939b929a50909850965090945092505050565b6001600160a01b0380831660009081526020818152604080832093851683529290529081206001015461062a907f0000000000000000000000000000000000000000000000000000000000000000610804565b9392505050565b6001600160a01b0380831660009081526020818152604080832093851683529290529081206001015461062a907f0000000000000000000000000000000000000000000000000000000000000000610820565b6001600160a01b038083166000908152602081815260408083209385168352929052206002018054606091906106b990610b6e565b80601f01602080910402602001604051908101604052809291908181526020018280546106e590610b6e565b80156107325780601f1061070757610100808354040283529160200191610732565b820191906000526020600020905b81548152906001019060200180831161071557829003601f168201915b5050505050905092915050565b6001600160a01b03808416600090815260208181526040808320938616835292905290812060010154819081908190819061079c9087907f0000000000000000000000000000000000000000000000000000000000000000610832565b939c929b5090995097509095509350505050565b60008060008060008060405188608360f81b17600052604081601160008b5afa806107da57600080fd5b508051965060208101519150506107f081610878565b969990985095965086958995509350505050565b600061081682604160f91b85176108a1565b60401c9392505050565b600061062a82608160f81b85176108a1565b6000808080806108656108608769ffffffffffffffffffff60681b60688c901b168a17604360f91b176108a1565b610878565b9899909897508796508995509350505050565b600080604083901c61088c6103e885610cb5565b909467ffffffffffffffff9091169350915050565b60008160005260208160136000865afa806108bb57600080fd5b505192915050565b80356001600160a01b03811681146108da57600080fd5b919050565b600080604083850312156108f257600080fd5b6108fb836108c3565b9150610909602084016108c3565b90509250929050565b6000806020838503121561092557600080fd5b823567ffffffffffffffff81111561093c57600080fd5b8301601f8101851361094d57600080fd5b803567ffffffffffffffff81111561096457600080fd5b85602060608302840101111561097957600080fd5b6020919091019590945092505050565b60005b838110156109a457818101518382015260200161098c565b50506000910152565b60208152600082518060208401526109cc816040850160208701610989565b601f01601f19169190910160400192915050565b6000806000606084860312156109f557600080fd5b6109fe846108c3565b9250610a0c602085016108c3565b9150604084013569ffffffffffffffffffff81168114610a2b57600080fd5b809150509250925092565b634e487b7160e01b600052603260045260246000fd5b600060208284031215610a5e57600080fd5b61062a826108c3565b600060208284031215610a7957600080fd5b815160ff8116811461062a57600080fd5b600060208284031215610a9c57600080fd5b5051919050565b634e487b7160e01b600052604160045260246000fd5b600060208284031215610acb57600080fd5b815167ffffffffffffffff811115610ae257600080fd5b8201601f81018413610af357600080fd5b805167ffffffffffffffff811115610b0d57610b0d610aa3565b604051601f8201601f19908116603f0116810167ffffffffffffffff81118282101715610b3c57610b3c610aa3565b604052818152828201602001861015610b5457600080fd5b610b65826020830160208601610989565b95945050505050565b600181811c90821680610b8257607f821691505b602082108103610ba257634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561056457806000526020600020601f840160051c81016020851015610bcf5750805b601f840160051c820191505b81811015610bef5760008155600101610bdb565b5050505050565b815167ffffffffffffffff811115610c1057610c10610aa3565b610c2481610c1e8454610b6e565b84610ba8565b6020601f821160018114610c585760008315610c405750848201515b600019600385901b1c1916600184901b178455610bef565b600084815260208120601f198516915b82811015610c885787850151825560209485019460019092019101610c68565b5084821015610ca65786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b600067ffffffffffffffff831680610cdd57634e487b7160e01b600052601260045260246000fd5b8067ffffffffffffffff8416049150509291505056fea26469706673582212202493fe20a45e2c3b407c1f8bd4dfe8450403444238143c4b52b267aebdefc11664736f6c634300081c003300000000000000000000000053adbdaa3ee8725de80bf97173b1f1a0a48036de000000000000000000000000adf5aacfa254fbc566d3b81e04b95db4bcf7b40f
Deployed ByteCode
0x608060405234801561001057600080fd5b50600436106100935760003560e01c8063d2edb6dd11610066578063d2edb6dd1461018e578063d4c282a3146101c4578063ec62f44b146101e5578063fa820de9146101f8578063fc58749e1461021857600080fd5b8063117803e31461009857806358e2d3a8146100dc578063b5720f821461012f578063bcfd032d14610144575b600080fd5b6100bf7f00000000000000000000000053adbdaa3ee8725de80bf97173b1f1a0a48036de81565b6040516001600160a01b0390911681526020015b60405180910390f35b61011d6100ea3660046108df565b6001600160a01b03918216600090815260208181526040808320939094168252919091522054600160a01b900460ff1690565b60405160ff90911681526020016100d3565b61014261013d366004610912565b61022b565b005b6101576101523660046108df565b610569565b6040805169ffffffffffffffffffff968716815260208101959095528401929092526060830152909116608082015260a0016100d3565b6100bf61019c3660046108df565b6001600160a01b03918216600090815260208181526040808320938516835292905220541690565b6101d76101d23660046108df565b6105d7565b6040519081526020016100d3565b6101d76101f33660046108df565b610631565b61020b6102063660046108df565b610684565b6040516100d391906109ad565b6101576102263660046109e0565b61073f565b336001600160a01b037f00000000000000000000000053adbdaa3ee8725de80bf97173b1f1a0a48036de161461027457604051635fc483c560e01b815260040160405180910390fd5b60005b8181101561056457604051806080016040528084848481811061029c5761029c610a36565b90506060020160400160208101906102b49190610a4c565b6001600160a01b031681526020018484848181106102d4576102d4610a36565b90506060020160400160208101906102ec9190610a4c565b6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610329573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061034d9190610a67565b60ff1681526020016103e985858581811061036a5761036a610a36565b90506060020160400160208101906103829190610a4c565b6001600160a01b031663af640d0f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103e39190610a8a565b60781b90565b815260200184848481811061040057610400610a36565b90506060020160400160208101906104189190610a4c565b6001600160a01b0316637284e4166040518163ffffffff1660e01b8152600401600060405180830381865afa158015610455573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261047d9190810190610ab9565b905260008085858581811061049457610494610a36565b6104aa9260206060909202019081019150610a4c565b6001600160a01b03166001600160a01b0316815260200190815260200160002060008585858181106104de576104de610a36565b90506060020160200160208101906104f69190610a4c565b6001600160a01b0390811682526020808301939093526040918201600020845181549486015160ff16600160a01b026001600160a81b03199095169216919091179290921782558201516001820155606082015160028201906105599082610bf6565b505050600101610277565b505050565b6001600160a01b0380831660009081526020818152604080832093851683529290529081206001015481908190819081906105c4907f000000000000000000000000adf5aacfa254fbc566d3b81e04b95db4bcf7b40f6107b0565b939b929a50909850965090945092505050565b6001600160a01b0380831660009081526020818152604080832093851683529290529081206001015461062a907f000000000000000000000000adf5aacfa254fbc566d3b81e04b95db4bcf7b40f610804565b9392505050565b6001600160a01b0380831660009081526020818152604080832093851683529290529081206001015461062a907f000000000000000000000000adf5aacfa254fbc566d3b81e04b95db4bcf7b40f610820565b6001600160a01b038083166000908152602081815260408083209385168352929052206002018054606091906106b990610b6e565b80601f01602080910402602001604051908101604052809291908181526020018280546106e590610b6e565b80156107325780601f1061070757610100808354040283529160200191610732565b820191906000526020600020905b81548152906001019060200180831161071557829003601f168201915b5050505050905092915050565b6001600160a01b03808416600090815260208181526040808320938616835292905290812060010154819081908190819061079c9087907f000000000000000000000000adf5aacfa254fbc566d3b81e04b95db4bcf7b40f610832565b939c929b5090995097509095509350505050565b60008060008060008060405188608360f81b17600052604081601160008b5afa806107da57600080fd5b508051965060208101519150506107f081610878565b969990985095965086958995509350505050565b600061081682604160f91b85176108a1565b60401c9392505050565b600061062a82608160f81b85176108a1565b6000808080806108656108608769ffffffffffffffffffff60681b60688c901b168a17604360f91b176108a1565b610878565b9899909897508796508995509350505050565b600080604083901c61088c6103e885610cb5565b909467ffffffffffffffff9091169350915050565b60008160005260208160136000865afa806108bb57600080fd5b505192915050565b80356001600160a01b03811681146108da57600080fd5b919050565b600080604083850312156108f257600080fd5b6108fb836108c3565b9150610909602084016108c3565b90509250929050565b6000806020838503121561092557600080fd5b823567ffffffffffffffff81111561093c57600080fd5b8301601f8101851361094d57600080fd5b803567ffffffffffffffff81111561096457600080fd5b85602060608302840101111561097957600080fd5b6020919091019590945092505050565b60005b838110156109a457818101518382015260200161098c565b50506000910152565b60208152600082518060208401526109cc816040850160208701610989565b601f01601f19169190910160400192915050565b6000806000606084860312156109f557600080fd5b6109fe846108c3565b9250610a0c602085016108c3565b9150604084013569ffffffffffffffffffff81168114610a2b57600080fd5b809150509250925092565b634e487b7160e01b600052603260045260246000fd5b600060208284031215610a5e57600080fd5b61062a826108c3565b600060208284031215610a7957600080fd5b815160ff8116811461062a57600080fd5b600060208284031215610a9c57600080fd5b5051919050565b634e487b7160e01b600052604160045260246000fd5b600060208284031215610acb57600080fd5b815167ffffffffffffffff811115610ae257600080fd5b8201601f81018413610af357600080fd5b805167ffffffffffffffff811115610b0d57610b0d610aa3565b604051601f8201601f19908116603f0116810167ffffffffffffffff81118282101715610b3c57610b3c610aa3565b604052818152828201602001861015610b5457600080fd5b610b65826020830160208601610989565b95945050505050565b600181811c90821680610b8257607f821691505b602082108103610ba257634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561056457806000526020600020601f840160051c81016020851015610bcf5750805b601f840160051c820191505b81811015610bef5760008155600101610bdb565b5050505050565b815167ffffffffffffffff811115610c1057610c10610aa3565b610c2481610c1e8454610b6e565b84610ba8565b6020601f821160018114610c585760008315610c405750848201515b600019600385901b1c1916600184901b178455610bef565b600084815260208120601f198516915b82811015610c885787850151825560209485019460019092019101610c68565b5084821015610ca65786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b600067ffffffffffffffff831680610cdd57634e487b7160e01b600052601260045260246000fd5b8067ffffffffffffffff8416049150509291505056fea26469706673582212202493fe20a45e2c3b407c1f8bd4dfe8450403444238143c4b52b267aebdefc11664736f6c634300081c0033