Source Code
Overview
S Balance
0 S
More Info
ContractCreator
Loading...
Loading
Contract Name:
VaultPriceFeed
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at testnet.sonicscan.org on 2024-12-15 */ pragma solidity 0.6.12; /** * @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 addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @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-contracts/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) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message 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, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. 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 mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. 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 mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File contracts/oracle/interfaces/IPriceFeed.sol // pragma solidity 0.6.12; interface IPriceFeed { function description() external view returns (string memory); function aggregator() external view returns (address); function latestAnswer() external view returns (int256); function latestRound() external view returns (uint80); function getRoundData(uint80 roundId) external view returns (uint80, int256, uint256, uint256, uint80); } // File contracts/oracle/interfaces/IChainlinkFlags.sol // pragma solidity 0.6.12; interface IChainlinkFlags { function getFlag(address) external view returns (bool); } // File contracts/amm/interfaces/IPancakePair.sol // pragma solidity >=0.5.0; interface IPancakePair { function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); } // File contracts/core/interfaces/IVaultPriceFeed.sol // pragma solidity 0.6.12; interface IVaultPriceFeed { function adjustmentBasisPoints(address _token) external view returns (uint256); function isAdjustmentAdditive(address _token) external view returns (bool); function setAdjustment(address _token, bool _isAdditive, uint256 _adjustmentBps) external; function setUseV2Pricing(bool _useV2Pricing) external; function setIsAmmEnabled(bool _isEnabled) external; function setIsSecondaryPriceEnabled(bool _isEnabled) external; function setSpreadBasisPoints(address _token, uint256 _spreadBasisPoints) external; function setSpreadThresholdBasisPoints(uint256 _spreadThresholdBasisPoints) external; function setFavorPrimaryPrice(bool _favorPrimaryPrice) external; function setPriceSampleSpace(uint256 _priceSampleSpace) external; function setMaxStrictPriceDeviation(uint256 _maxStrictPriceDeviation) external; function getPrice(address _token, bool _maximise, bool _includeAmmPrice, bool _useSwapPricing) external view returns (uint256); function getAmmPrice(address _token) external view returns (uint256); function getLatestPrimaryPrice(address _token) external view returns (uint256); function getPrimaryPrice(address _token, bool _maximise) external view returns (uint256); function setTokenConfig( address _token, address _priceFeed, uint256 _priceDecimals, bool _isStrictStable ) external; } // File contracts/oracle/interfaces/ISecondaryPriceFeed.sol // pragma solidity 0.6.12; interface ISecondaryPriceFeed { function getPrice(address _token, uint256 _referencePrice, bool _maximise) external view returns (uint256); } // File contracts/core/VaultPriceFeed.sol // pragma solidity 0.6.12; contract VaultPriceFeed is IVaultPriceFeed { using SafeMath for uint256; uint256 public constant PRICE_PRECISION = 10 ** 30; uint256 public constant ONE_USD = PRICE_PRECISION; uint256 public constant BASIS_POINTS_DIVISOR = 10000; uint256 public constant MAX_SPREAD_BASIS_POINTS = 50; uint256 public constant MAX_ADJUSTMENT_INTERVAL = 2 hours; uint256 public constant MAX_ADJUSTMENT_BASIS_POINTS = 20; // Identifier of the Sequencer offline flag on the Flags contract address constant private FLAG_ARBITRUM_SEQ_OFFLINE = address(bytes20(bytes32(uint256(keccak256("chainlink.flags.arbitrum-seq-offline")) - 1))); address public gov; address public chainlinkFlags; bool public isAmmEnabled = true; bool public isSecondaryPriceEnabled = true; bool public useV2Pricing = false; bool public favorPrimaryPrice = false; uint256 public priceSampleSpace = 3; uint256 public maxStrictPriceDeviation = 0; address public secondaryPriceFeed; uint256 public spreadThresholdBasisPoints = 30; address public btc; address public eth; address public bnb; address public bnbBusd; address public ethBnb; address public btcBnb; mapping (address => address) public priceFeeds; mapping (address => uint256) public priceDecimals; mapping (address => uint256) public spreadBasisPoints; // Chainlink can return prices for stablecoins // that differs from 1 USD by a larger percentage than stableSwapFeeBasisPoints // we use strictStableTokens to cap the price to 1 USD // this allows us to configure stablecoins like DAI as being a stableToken // while not being a strictStableToken mapping (address => bool) public strictStableTokens; mapping (address => uint256) public override adjustmentBasisPoints; mapping (address => bool) public override isAdjustmentAdditive; mapping (address => uint256) public lastAdjustmentTimings; modifier onlyGov() { require(msg.sender == gov, "VaultPriceFeed: forbidden"); _; } constructor() public { gov = msg.sender; } function setGov(address _gov) external onlyGov { gov = _gov; } function setChainlinkFlags(address _chainlinkFlags) external onlyGov { chainlinkFlags = _chainlinkFlags; } function setAdjustment(address _token, bool _isAdditive, uint256 _adjustmentBps) external override onlyGov { require( lastAdjustmentTimings[_token].add(MAX_ADJUSTMENT_INTERVAL) < block.timestamp, "VaultPriceFeed: adjustment frequency exceeded" ); require(_adjustmentBps <= MAX_ADJUSTMENT_BASIS_POINTS, "invalid _adjustmentBps"); isAdjustmentAdditive[_token] = _isAdditive; adjustmentBasisPoints[_token] = _adjustmentBps; lastAdjustmentTimings[_token] = block.timestamp; } function setUseV2Pricing(bool _useV2Pricing) external override onlyGov { useV2Pricing = _useV2Pricing; } function setIsAmmEnabled(bool _isEnabled) external override onlyGov { isAmmEnabled = _isEnabled; } function setIsSecondaryPriceEnabled(bool _isEnabled) external override onlyGov { isSecondaryPriceEnabled = _isEnabled; } function setSecondaryPriceFeed(address _secondaryPriceFeed) external onlyGov { secondaryPriceFeed = _secondaryPriceFeed; } function setTokens(address _btc, address _eth, address _bnb) external onlyGov { btc = _btc; eth = _eth; bnb = _bnb; } function setPairs(address _bnbBusd, address _ethBnb, address _btcBnb) external onlyGov { bnbBusd = _bnbBusd; ethBnb = _ethBnb; btcBnb = _btcBnb; } function setSpreadBasisPoints(address _token, uint256 _spreadBasisPoints) external override onlyGov { require(_spreadBasisPoints <= MAX_SPREAD_BASIS_POINTS, "VaultPriceFeed: invalid _spreadBasisPoints"); spreadBasisPoints[_token] = _spreadBasisPoints; } function setSpreadThresholdBasisPoints(uint256 _spreadThresholdBasisPoints) external override onlyGov { spreadThresholdBasisPoints = _spreadThresholdBasisPoints; } function setFavorPrimaryPrice(bool _favorPrimaryPrice) external override onlyGov { favorPrimaryPrice = _favorPrimaryPrice; } function setPriceSampleSpace(uint256 _priceSampleSpace) external override onlyGov { require(_priceSampleSpace > 0, "VaultPriceFeed: invalid _priceSampleSpace"); priceSampleSpace = _priceSampleSpace; } function setMaxStrictPriceDeviation(uint256 _maxStrictPriceDeviation) external override onlyGov { maxStrictPriceDeviation = _maxStrictPriceDeviation; } function setTokenConfig( address _token, address _priceFeed, uint256 _priceDecimals, bool _isStrictStable ) external override onlyGov { priceFeeds[_token] = _priceFeed; priceDecimals[_token] = _priceDecimals; strictStableTokens[_token] = _isStrictStable; } function getPrice(address _token, bool _maximise, bool _includeAmmPrice, bool /* _useSwapPricing */) public override view returns (uint256) { uint256 price = useV2Pricing ? getPriceV2(_token, _maximise, _includeAmmPrice) : getPriceV1(_token, _maximise, _includeAmmPrice); uint256 adjustmentBps = adjustmentBasisPoints[_token]; if (adjustmentBps > 0) { bool isAdditive = isAdjustmentAdditive[_token]; if (isAdditive) { price = price.mul(BASIS_POINTS_DIVISOR.add(adjustmentBps)).div(BASIS_POINTS_DIVISOR); } else { price = price.mul(BASIS_POINTS_DIVISOR.sub(adjustmentBps)).div(BASIS_POINTS_DIVISOR); } } return price; } function getPriceV1(address _token, bool _maximise, bool _includeAmmPrice) public view returns (uint256) { uint256 price = getPrimaryPrice(_token, _maximise); if (_includeAmmPrice && isAmmEnabled) { uint256 ammPrice = getAmmPrice(_token); if (ammPrice > 0) { if (_maximise && ammPrice > price) { price = ammPrice; } if (!_maximise && ammPrice < price) { price = ammPrice; } } } if (isSecondaryPriceEnabled) { price = getSecondaryPrice(_token, price, _maximise); } if (strictStableTokens[_token]) { uint256 delta = price > ONE_USD ? price.sub(ONE_USD) : ONE_USD.sub(price); if (delta <= maxStrictPriceDeviation) { return ONE_USD; } // if _maximise and price is e.g. 1.02, return 1.02 if (_maximise && price > ONE_USD) { return price; } // if !_maximise and price is e.g. 0.98, return 0.98 if (!_maximise && price < ONE_USD) { return price; } return ONE_USD; } uint256 _spreadBasisPoints = spreadBasisPoints[_token]; if (_maximise) { return price.mul(BASIS_POINTS_DIVISOR.add(_spreadBasisPoints)).div(BASIS_POINTS_DIVISOR); } return price.mul(BASIS_POINTS_DIVISOR.sub(_spreadBasisPoints)).div(BASIS_POINTS_DIVISOR); } function getPriceV2(address _token, bool _maximise, bool _includeAmmPrice) public view returns (uint256) { uint256 price = getPrimaryPrice(_token, _maximise); if (_includeAmmPrice && isAmmEnabled) { price = getAmmPriceV2(_token, _maximise, price); } if (isSecondaryPriceEnabled) { price = getSecondaryPrice(_token, price, _maximise); } if (strictStableTokens[_token]) { uint256 delta = price > ONE_USD ? price.sub(ONE_USD) : ONE_USD.sub(price); if (delta <= maxStrictPriceDeviation) { return ONE_USD; } // if _maximise and price is e.g. 1.02, return 1.02 if (_maximise && price > ONE_USD) { return price; } // if !_maximise and price is e.g. 0.98, return 0.98 if (!_maximise && price < ONE_USD) { return price; } return ONE_USD; } uint256 _spreadBasisPoints = spreadBasisPoints[_token]; if (_maximise) { return price.mul(BASIS_POINTS_DIVISOR.add(_spreadBasisPoints)).div(BASIS_POINTS_DIVISOR); } return price.mul(BASIS_POINTS_DIVISOR.sub(_spreadBasisPoints)).div(BASIS_POINTS_DIVISOR); } function getAmmPriceV2(address _token, bool _maximise, uint256 _primaryPrice) public view returns (uint256) { uint256 ammPrice = getAmmPrice(_token); if (ammPrice == 0) { return _primaryPrice; } uint256 diff = ammPrice > _primaryPrice ? ammPrice.sub(_primaryPrice) : _primaryPrice.sub(ammPrice); if (diff.mul(BASIS_POINTS_DIVISOR) < _primaryPrice.mul(spreadThresholdBasisPoints)) { if (favorPrimaryPrice) { return _primaryPrice; } return ammPrice; } if (_maximise && ammPrice > _primaryPrice) { return ammPrice; } if (!_maximise && ammPrice < _primaryPrice) { return ammPrice; } return _primaryPrice; } function getLatestPrimaryPrice(address _token) public override view returns (uint256) { address priceFeedAddress = priceFeeds[_token]; require(priceFeedAddress != address(0), "VaultPriceFeed: invalid price feed"); IPriceFeed priceFeed = IPriceFeed(priceFeedAddress); int256 price = priceFeed.latestAnswer(); require(price > 0, "VaultPriceFeed: invalid price"); return uint256(price); } function getPrimaryPrice(address _token, bool _maximise) public override view returns (uint256) { address priceFeedAddress = priceFeeds[_token]; require(priceFeedAddress != address(0), "VaultPriceFeed: invalid price feed"); if (chainlinkFlags != address(0)) { bool isRaised = IChainlinkFlags(chainlinkFlags).getFlag(FLAG_ARBITRUM_SEQ_OFFLINE); if (isRaised) { // If flag is raised we shouldn't perform any critical operations revert("Chainlink feeds are not being updated"); } } IPriceFeed priceFeed = IPriceFeed(priceFeedAddress); uint256 price = 0; uint80 roundId = priceFeed.latestRound(); for (uint80 i = 0; i < priceSampleSpace; i++) { if (roundId <= i) { break; } uint256 p; if (i == 0) { int256 _p = priceFeed.latestAnswer(); require(_p > 0, "VaultPriceFeed: invalid price"); p = uint256(_p); } else { (, int256 _p, , ,) = priceFeed.getRoundData(roundId - i); require(_p > 0, "VaultPriceFeed: invalid price"); p = uint256(_p); } if (price == 0) { price = p; continue; } if (_maximise && p > price) { price = p; continue; } if (!_maximise && p < price) { price = p; } } require(price > 0, "VaultPriceFeed: could not fetch price"); // normalise price precision uint256 _priceDecimals = priceDecimals[_token]; return price.mul(PRICE_PRECISION).div(10 ** _priceDecimals); } function getSecondaryPrice(address _token, uint256 _referencePrice, bool _maximise) public view returns (uint256) { if (secondaryPriceFeed == address(0)) { return _referencePrice; } return ISecondaryPriceFeed(secondaryPriceFeed).getPrice(_token, _referencePrice, _maximise); } function getAmmPrice(address _token) public override view returns (uint256) { if (_token == bnb) { // for bnbBusd, reserve0: BNB, reserve1: BUSD return getPairPrice(bnbBusd, true); } if (_token == eth) { uint256 price0 = getPairPrice(bnbBusd, true); // for ethBnb, reserve0: ETH, reserve1: BNB uint256 price1 = getPairPrice(ethBnb, true); // this calculation could overflow if (price0 / 10**30) * (price1 / 10**30) is more than 10**17 return price0.mul(price1).div(PRICE_PRECISION); } if (_token == btc) { uint256 price0 = getPairPrice(bnbBusd, true); // for btcBnb, reserve0: BTC, reserve1: BNB uint256 price1 = getPairPrice(btcBnb, true); // this calculation could overflow if (price0 / 10**30) * (price1 / 10**30) is more than 10**17 return price0.mul(price1).div(PRICE_PRECISION); } return 0; } // if divByReserve0: calculate price as reserve1 / reserve0 // if !divByReserve1: calculate price as reserve0 / reserve1 function getPairPrice(address _pair, bool _divByReserve0) public view returns (uint256) { (uint256 reserve0, uint256 reserve1, ) = IPancakePair(_pair).getReserves(); if (_divByReserve0) { if (reserve0 == 0) { return 0; } return reserve1.mul(PRICE_PRECISION).div(reserve0); } if (reserve1 == 0) { return 0; } return reserve0.mul(PRICE_PRECISION).div(reserve1); } }
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"BASIS_POINTS_DIVISOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_ADJUSTMENT_BASIS_POINTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_ADJUSTMENT_INTERVAL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SPREAD_BASIS_POINTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ONE_USD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE_PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"adjustmentBasisPoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bnb","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bnbBusd","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"btc","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"btcBnb","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"chainlinkFlags","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"eth","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ethBnb","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"favorPrimaryPrice","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"getAmmPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"bool","name":"_maximise","type":"bool"},{"internalType":"uint256","name":"_primaryPrice","type":"uint256"}],"name":"getAmmPriceV2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"getLatestPrimaryPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_pair","type":"address"},{"internalType":"bool","name":"_divByReserve0","type":"bool"}],"name":"getPairPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"bool","name":"_maximise","type":"bool"},{"internalType":"bool","name":"_includeAmmPrice","type":"bool"},{"internalType":"bool","name":"","type":"bool"}],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"bool","name":"_maximise","type":"bool"},{"internalType":"bool","name":"_includeAmmPrice","type":"bool"}],"name":"getPriceV1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"bool","name":"_maximise","type":"bool"},{"internalType":"bool","name":"_includeAmmPrice","type":"bool"}],"name":"getPriceV2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"bool","name":"_maximise","type":"bool"}],"name":"getPrimaryPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_referencePrice","type":"uint256"},{"internalType":"bool","name":"_maximise","type":"bool"}],"name":"getSecondaryPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gov","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isAdjustmentAdditive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isAmmEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSecondaryPriceEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastAdjustmentTimings","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxStrictPriceDeviation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"priceDecimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"priceFeeds","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceSampleSpace","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"secondaryPriceFeed","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"bool","name":"_isAdditive","type":"bool"},{"internalType":"uint256","name":"_adjustmentBps","type":"uint256"}],"name":"setAdjustment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_chainlinkFlags","type":"address"}],"name":"setChainlinkFlags","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_favorPrimaryPrice","type":"bool"}],"name":"setFavorPrimaryPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_gov","type":"address"}],"name":"setGov","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isEnabled","type":"bool"}],"name":"setIsAmmEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isEnabled","type":"bool"}],"name":"setIsSecondaryPriceEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxStrictPriceDeviation","type":"uint256"}],"name":"setMaxStrictPriceDeviation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_bnbBusd","type":"address"},{"internalType":"address","name":"_ethBnb","type":"address"},{"internalType":"address","name":"_btcBnb","type":"address"}],"name":"setPairs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_priceSampleSpace","type":"uint256"}],"name":"setPriceSampleSpace","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_secondaryPriceFeed","type":"address"}],"name":"setSecondaryPriceFeed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_spreadBasisPoints","type":"uint256"}],"name":"setSpreadBasisPoints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_spreadThresholdBasisPoints","type":"uint256"}],"name":"setSpreadThresholdBasisPoints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_priceFeed","type":"address"},{"internalType":"uint256","name":"_priceDecimals","type":"uint256"},{"internalType":"bool","name":"_isStrictStable","type":"bool"}],"name":"setTokenConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_btc","type":"address"},{"internalType":"address","name":"_eth","type":"address"},{"internalType":"address","name":"_bnb","type":"address"}],"name":"setTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_useV2Pricing","type":"bool"}],"name":"setUseV2Pricing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"spreadBasisPoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"spreadThresholdBasisPoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"strictStableTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"useV2Pricing","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040526001805461ffff60b01b1960ff60a81b1960ff60a01b19909216600160a01b1791909116600160a81b171690556003600281905560009055601e60055534801561004d57600080fd5b50600080546001600160a01b031916331790556121098061006f6000396000f3fe608060405234801561001057600080fd5b50600436106102675760003560e01c80630957aed91461026c5780631193c80914610286578063126082cf146102aa57806312d43a51146102b25780632fa03b8f146102ba5780632fbfe3d3146102d95780632fc3a70a146102f657806330536ee514610334578063378e7bf7146103505780633d949c5f146103585780633eba8d361461038e5780633ebbc601146103c25780633f0c3bb7146103ca578063443be209146103d257806348cac2771461040a57806349a876e4146104305780634a4b1f4f146104385780634b9ade471461044057806356bf9de41461047e57806356c8c2c1146104a4578063593d9e80146104d2578063604f37e9146104da57806367781c0e146104f95780636ce8a44b146105015780636fc8070814610527578063717cfe7a1461052f578063732391b414610555578063826e055f1461058b5780638b86616c146105b15780638c7c9e0c146105b957806393f69074146105c157806395082d25146104f9578063971bd396146105f957806397dfade7146106015780639917dc74146106095780639a0a6635146106285780639b18dc471461064e5780639b889380146106565780639dcb511a14610682578063a27ea386146106a8578063a28d57d8146106ce578063a2ad7b93146106d6578063a39c73a314610704578063b02a2de41461070c578063b731dd8714610740578063b8f611051461075d578063c2138d8c14610783578063cefe0f21146107a9578063cfad57a2146107cf578063d694376c146107f5578063e4440e0214610829578063eb1c92a914610831578063fd34ec4014610850575b600080fd5b61027461086f565b60408051918252519081900360200190f35b61028e610874565b604080516001600160a01b039092168252519081900360200190f35b610274610883565b61028e610889565b6102d7600480360360208110156102d057600080fd5b5035610898565b005b6102d7600480360360208110156102ef57600080fd5b5035610929565b6102746004803603608081101561030c57600080fd5b506001600160a01b03813516906020810135151590604081013515159060600135151561097b565b61033c610a39565b604080519115158252519081900360200190f35b610274610a49565b6102746004803603606081101561036e57600080fd5b506001600160a01b03813516906020810135151590604001351515610a4f565b610274600480360360608110156103a457600080fd5b506001600160a01b0381351690602081013590604001351515610c23565b61033c610cd1565b61033c610ce1565b6102d7600480360360608110156103e857600080fd5b506001600160a01b038135811691602081013582169160409091013516610cf1565b6102746004803603602081101561042057600080fd5b50356001600160a01b0316610d7d565b61028e610d8f565b610274610d9e565b6102d76004803603608081101561045657600080fd5b506001600160a01b038135811691602081013590911690604081013590606001351515610da3565b6102746004803603602081101561049457600080fd5b50356001600160a01b0316610e45565b610274600480360360408110156104ba57600080fd5b506001600160a01b0381351690602001351515610f59565b61033c611386565b6102d7600480360360208110156104f057600080fd5b50351515611396565b610274611401565b61033c6004803603602081101561051757600080fd5b50356001600160a01b0316611411565b610274611426565b6102746004803603602081101561054557600080fd5b50356001600160a01b031661142c565b6102746004803603606081101561056b57600080fd5b506001600160a01b0381351690602081013515159060400135151561143e565b6102d7600480360360208110156105a157600080fd5b50356001600160a01b0316611493565b61028e611502565b61028e611511565b6102d7600480360360608110156105d757600080fd5b506001600160a01b038135811691602081013582169160409091013516611520565b61028e6115ac565b61028e6115bb565b6102d76004803603602081101561061f57600080fd5b503515156115ca565b6102d76004803603602081101561063e57600080fd5b50356001600160a01b0316611635565b6102746116a4565b6102d76004803603604081101561066c57600080fd5b506001600160a01b0381351690602001356116aa565b61028e6004803603602081101561069857600080fd5b50356001600160a01b0316611753565b610274600480360360208110156106be57600080fd5b50356001600160a01b031661176e565b61028e611780565b610274600480360360408110156106ec57600080fd5b506001600160a01b038135169060200135151561178f565b61027461187c565b6102746004803603606081101561072257600080fd5b506001600160a01b0381351690602081013515159060400135611882565b6102d76004803603602081101561075657600080fd5b503561194a565b61033c6004803603602081101561077357600080fd5b50356001600160a01b031661199c565b6102746004803603602081101561079957600080fd5b50356001600160a01b03166119b1565b610274600480360360208110156107bf57600080fd5b50356001600160a01b0316611aaf565b6102d7600480360360208110156107e557600080fd5b50356001600160a01b0316611ac1565b6102d76004803603606081101561080b57600080fd5b506001600160a01b0381351690602081013515159060400135611b30565b61028e611c73565b6102d76004803603602081101561084757600080fd5b50351515611c82565b6102d76004803603602081101561086657600080fd5b50351515611ced565b603281565b600a546001600160a01b031681565b61271081565b6000546001600160a01b031681565b6000546001600160a01b031633146108e5576040805162461bcd60e51b81526020600482015260196024820152600080516020612023833981519152604482015290519081900360640190fd5b600081116109245760405162461bcd60e51b8152600401808060200182810382526029815260200180611f876029913960400191505060405180910390fd5b600255565b6000546001600160a01b03163314610976576040805162461bcd60e51b81526020600482015260196024820152600080516020612023833981519152604482015290519081900360640190fd5b600355565b6001546000908190600160b01b900460ff166109a15761099c868686610a4f565b6109ac565b6109ac86868661143e565b6001600160a01b0387166000908152601060205260409020549091508015610a2f576001600160a01b03871660009081526011602052604090205460ff168015610a1757610a10612710610a0a610a038286611d58565b8690611db0565b90611e09565b9250610a2d565b610a2a612710610a0a610a038286611e48565b92505b505b5095945050505050565b600154600160b01b900460ff1681565b60035481565b600080610a5c8585610f59565b9050828015610a745750600154600160a01b900460ff165b15610ab9576000610a84866119b1565b90508015610ab757848015610a9857508181115b15610aa1578091505b84158015610aae57508181105b15610ab7578091505b505b600154600160a81b900460ff1615610ad957610ad6858286610c23565b90505b6001600160a01b0385166000908152600f602052604090205460ff1615610bc257600068327cb2734119d3b7a9601e1b8211610b2a57610b2568327cb2734119d3b7a9601e1b83611e48565b610b40565b610b408268327cb2734119d3b7a9601e1b611e48565b90506003548111610b615768327cb2734119d3b7a9601e1b92505050610c1c565b848015610b79575068327cb2734119d3b7a9601e1b82115b15610b8657509050610c1c565b84158015610b9f575068327cb2734119d3b7a9601e1b82105b15610bac57509050610c1c565b68327cb2734119d3b7a9601e1b92505050610c1c565b6001600160a01b0385166000908152600e60205260409020548415610c0457610bfb612710610a0a610bf48285611d58565b8590611db0565b92505050610c1c565b610c17612710610a0a610bf48285611e48565b925050505b9392505050565b6004546000906001600160a01b0316610c3d575081610c1c565b6004805460408051630ffd9c6d60e31b81526001600160a01b038881169482019490945260248101879052851515604482015290519290911691637fece36891606480820192602092909190829003018186803b158015610c9d57600080fd5b505afa158015610cb1573d6000803e3d6000fd5b505050506040513d6020811015610cc757600080fd5b5051949350505050565b600154600160a81b900460ff1681565b600154600160a01b900460ff1681565b6000546001600160a01b03163314610d3e576040805162461bcd60e51b81526020600482015260196024820152600080516020612023833981519152604482015290519081900360640190fd5b600680546001600160a01b039485166001600160a01b031991821617909155600780549385169382169390931790925560088054919093169116179055565b60106020526000908152604090205481565b6008546001600160a01b031681565b601481565b6000546001600160a01b03163314610df0576040805162461bcd60e51b81526020600482015260196024820152600080516020612023833981519152604482015290519081900360640190fd5b6001600160a01b039384166000908152600c6020908152604080832080546001600160a01b0319169690971695909517909555600d855283812092909255600f90935220805460ff1916911515919091179055565b6001600160a01b038082166000908152600c602052604081205490911680610e9e5760405162461bcd60e51b81526004018080602001828103825260228152602001806120b26022913960400191505060405180910390fd5b60008190506000816001600160a01b03166350d25bcd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610ede57600080fd5b505afa158015610ef2573d6000803e3d6000fd5b505050506040513d6020811015610f0857600080fd5b5051905060008113610f4f576040805162461bcd60e51b815260206004820152601d6024820152600080516020612092833981519152604482015290519081900360640190fd5b925050505b919050565b6001600160a01b038083166000908152600c602052604081205490911680610fb25760405162461bcd60e51b81526004018080602001828103825260228152602001806120b26022913960400191505060405180910390fd5b6001546001600160a01b03161561108f5760015460408051631abf23ff60e11b815273a438451d6458044c3c8cd2f6f31c91ac882a6d91600482015290516000926001600160a01b03169163357e47fe916024808301926020929190829003018186803b15801561102257600080fd5b505afa158015611036573d6000803e3d6000fd5b505050506040513d602081101561104c57600080fd5b50519050801561108d5760405162461bcd60e51b81526004018080602001828103825260258152602001806120436025913960400191505060405180910390fd5b505b6000819050600080826001600160a01b031663668a0f026040518163ffffffff1660e01b815260040160206040518083038186803b1580156110d057600080fd5b505afa1580156110e4573d6000803e3d6000fd5b505050506040513d60208110156110fa57600080fd5b5051905060005b600254816001600160501b0316101561130157806001600160501b0316826001600160501b03161161113257611301565b60006001600160501b0382166111f5576000856001600160a01b03166350d25bcd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561117d57600080fd5b505afa158015611191573d6000803e3d6000fd5b505050506040513d60208110156111a757600080fd5b50519050600081136111ee576040805162461bcd60e51b815260206004820152601d6024820152600080516020612092833981519152604482015290519081900360640190fd5b90506112bd565b6000856001600160a01b0316639a6fc8f58486036040518263ffffffff1660e01b815260040180826001600160501b0316815260200191505060a06040518083038186803b15801561124657600080fd5b505afa15801561125a573d6000803e3d6000fd5b505050506040513d60a081101561127057600080fd5b50602001519050600081136112ba576040805162461bcd60e51b815260206004820152601d6024820152600080516020612092833981519152604482015290519081900360640190fd5b90505b836112c95792506112f9565b8780156112d557508381115b156112e15792506112f9565b871580156112ee57508381105b156112f7578093505b505b600101611101565b50600082116113415760405162461bcd60e51b8152600401808060200182810382526025815260200180611fb06025913960400191505060405180910390fd5b6001600160a01b0387166000908152600d6020526040902054611378600a82900a610a0a8568327cb2734119d3b7a9601e1b611db0565b955050505050505b92915050565b600154600160b81b900460ff1681565b6000546001600160a01b031633146113e3576040805162461bcd60e51b81526020600482015260196024820152600080516020612023833981519152604482015290519081900360640190fd5b60018054911515600160b81b0260ff60b81b19909216919091179055565b68327cb2734119d3b7a9601e1b81565b60116020526000908152604090205460ff1681565b60025481565b60126020526000908152604090205481565b60008061144b8585610f59565b90508280156114635750600154600160a01b900460ff165b15610ab957611473858583611882565b905060015460ff600160a81b9091041615610ad957610ad6858286610c23565b6000546001600160a01b031633146114e0576040805162461bcd60e51b81526020600482015260196024820152600080516020612023833981519152604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6004546001600160a01b031681565b6007546001600160a01b031681565b6000546001600160a01b0316331461156d576040805162461bcd60e51b81526020600482015260196024820152600080516020612023833981519152604482015290519081900360640190fd5b600980546001600160a01b039485166001600160a01b031991821617909155600a805493851693821693909317909255600b8054919093169116179055565b600b546001600160a01b031681565b6009546001600160a01b031681565b6000546001600160a01b03163314611617576040805162461bcd60e51b81526020600482015260196024820152600080516020612023833981519152604482015290519081900360640190fd5b60018054911515600160a01b0260ff60a01b19909216919091179055565b6000546001600160a01b03163314611682576040805162461bcd60e51b81526020600482015260196024820152600080516020612023833981519152604482015290519081900360640190fd5b600480546001600160a01b0319166001600160a01b0392909216919091179055565b611c2081565b6000546001600160a01b031633146116f7576040805162461bcd60e51b81526020600482015260196024820152600080516020612023833981519152604482015290519081900360640190fd5b60328111156117375760405162461bcd60e51b815260040180806020018281038252602a815260200180612068602a913960400191505060405180910390fd5b6001600160a01b039091166000908152600e6020526040902055565b600c602052600090815260409020546001600160a01b031681565b600e6020526000908152604090205481565b6006546001600160a01b031681565b6000806000846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156117cd57600080fd5b505afa1580156117e1573d6000803e3d6000fd5b505050506040513d60608110156117f757600080fd5b5080516020909101516001600160701b0391821693501690508315611849578161182657600092505050611380565b61184082610a0a8368327cb2734119d3b7a9601e1b611db0565b92505050611380565b8061185957600092505050611380565b61187381610a0a8468327cb2734119d3b7a9601e1b611db0565b95945050505050565b60055481565b60008061188e856119b1565b90508061189e5782915050610c1c565b60008382116118b6576118b18483611e48565b6118c0565b6118c08285611e48565b90506118d760055485611db090919063ffffffff16565b6118e382612710611db0565b101561190d57600154600160b81b900460ff1615611905578392505050610c1c565b509050610c1c565b84801561191957508382115b1561192657509050610c1c565b8415801561193357508382105b1561194057509050610c1c565b5091949350505050565b6000546001600160a01b03163314611997576040805162461bcd60e51b81526020600482015260196024820152600080516020612023833981519152604482015290519081900360640190fd5b600555565b600f6020526000908152604090205460ff1681565b6008546000906001600160a01b03838116911614156119e8576009546119e1906001600160a01b0316600161178f565b9050610f54565b6007546001600160a01b0383811691161415611a5a57600954600090611a18906001600160a01b0316600161178f565b600a54909150600090611a35906001600160a01b0316600161178f565b9050611a5168327cb2734119d3b7a9601e1b610a0a8484611db0565b92505050610f54565b6006546001600160a01b0383811691161415611aa757600954600090611a8a906001600160a01b0316600161178f565b600b54909150600090611a35906001600160a01b0316600161178f565b506000919050565b600d6020526000908152604090205481565b6000546001600160a01b03163314611b0e576040805162461bcd60e51b81526020600482015260196024820152600080516020612023833981519152604482015290519081900360640190fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314611b7d576040805162461bcd60e51b81526020600482015260196024820152600080516020612023833981519152604482015290519081900360640190fd5b6001600160a01b0383166000908152601260205260409020544290611ba490611c20611d58565b10611be05760405162461bcd60e51b815260040180806020018281038252602d815260200180611ff6602d913960400191505060405180910390fd5b6014811115611c2f576040805162461bcd60e51b8152602060048201526016602482015275696e76616c6964205f61646a7573746d656e7442707360501b604482015290519081900360640190fd5b6001600160a01b03929092166000908152601160209081526040808320805460ff191694151594909417909355601081528282209390935560129092529020429055565b6001546001600160a01b031681565b6000546001600160a01b03163314611ccf576040805162461bcd60e51b81526020600482015260196024820152600080516020612023833981519152604482015290519081900360640190fd5b60018054911515600160a81b0260ff60a81b19909216919091179055565b6000546001600160a01b03163314611d3a576040805162461bcd60e51b81526020600482015260196024820152600080516020612023833981519152604482015290519081900360640190fd5b60018054911515600160b01b0260ff60b01b19909216919091179055565b600082820183811015610c1c576040805162461bcd60e51b815260206004820152601b60248201527a536166654d6174683a206164646974696f6e206f766572666c6f7760281b604482015290519081900360640190fd5b600082611dbf57506000611380565b82820282848281611dcc57fe5b0414610c1c5760405162461bcd60e51b8152600401808060200182810382526021815260200180611fd56021913960400191505060405180910390fd5b6000610c1c83836040518060400160405280601a815260200179536166654d6174683a206469766973696f6e206279207a65726f60301b815250611e8a565b6000610c1c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611f2c565b60008183611f165760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611edb578181015183820152602001611ec3565b50505050905090810190601f168015611f085780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581611f2257fe5b0495945050505050565b60008184841115611f7e5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315611edb578181015183820152602001611ec3565b50505090039056fe5661756c745072696365466565643a20696e76616c6964205f707269636553616d706c6553706163655661756c745072696365466565643a20636f756c64206e6f74206665746368207072696365536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775661756c745072696365466565643a2061646a7573746d656e74206672657175656e63792065786365656465645661756c745072696365466565643a20666f7262696464656e00000000000000436861696e6c696e6b20666565647320617265206e6f74206265696e6720757064617465645661756c745072696365466565643a20696e76616c6964205f7370726561644261736973506f696e74735661756c745072696365466565643a20696e76616c69642070726963650000005661756c745072696365466565643a20696e76616c69642070726963652066656564a2646970667358221220ca608e3ae24a6316d653afa62660d6c124a1409d0b2dc508d3d48b489d8016d764736f6c634300060c0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102675760003560e01c80630957aed91461026c5780631193c80914610286578063126082cf146102aa57806312d43a51146102b25780632fa03b8f146102ba5780632fbfe3d3146102d95780632fc3a70a146102f657806330536ee514610334578063378e7bf7146103505780633d949c5f146103585780633eba8d361461038e5780633ebbc601146103c25780633f0c3bb7146103ca578063443be209146103d257806348cac2771461040a57806349a876e4146104305780634a4b1f4f146104385780634b9ade471461044057806356bf9de41461047e57806356c8c2c1146104a4578063593d9e80146104d2578063604f37e9146104da57806367781c0e146104f95780636ce8a44b146105015780636fc8070814610527578063717cfe7a1461052f578063732391b414610555578063826e055f1461058b5780638b86616c146105b15780638c7c9e0c146105b957806393f69074146105c157806395082d25146104f9578063971bd396146105f957806397dfade7146106015780639917dc74146106095780639a0a6635146106285780639b18dc471461064e5780639b889380146106565780639dcb511a14610682578063a27ea386146106a8578063a28d57d8146106ce578063a2ad7b93146106d6578063a39c73a314610704578063b02a2de41461070c578063b731dd8714610740578063b8f611051461075d578063c2138d8c14610783578063cefe0f21146107a9578063cfad57a2146107cf578063d694376c146107f5578063e4440e0214610829578063eb1c92a914610831578063fd34ec4014610850575b600080fd5b61027461086f565b60408051918252519081900360200190f35b61028e610874565b604080516001600160a01b039092168252519081900360200190f35b610274610883565b61028e610889565b6102d7600480360360208110156102d057600080fd5b5035610898565b005b6102d7600480360360208110156102ef57600080fd5b5035610929565b6102746004803603608081101561030c57600080fd5b506001600160a01b03813516906020810135151590604081013515159060600135151561097b565b61033c610a39565b604080519115158252519081900360200190f35b610274610a49565b6102746004803603606081101561036e57600080fd5b506001600160a01b03813516906020810135151590604001351515610a4f565b610274600480360360608110156103a457600080fd5b506001600160a01b0381351690602081013590604001351515610c23565b61033c610cd1565b61033c610ce1565b6102d7600480360360608110156103e857600080fd5b506001600160a01b038135811691602081013582169160409091013516610cf1565b6102746004803603602081101561042057600080fd5b50356001600160a01b0316610d7d565b61028e610d8f565b610274610d9e565b6102d76004803603608081101561045657600080fd5b506001600160a01b038135811691602081013590911690604081013590606001351515610da3565b6102746004803603602081101561049457600080fd5b50356001600160a01b0316610e45565b610274600480360360408110156104ba57600080fd5b506001600160a01b0381351690602001351515610f59565b61033c611386565b6102d7600480360360208110156104f057600080fd5b50351515611396565b610274611401565b61033c6004803603602081101561051757600080fd5b50356001600160a01b0316611411565b610274611426565b6102746004803603602081101561054557600080fd5b50356001600160a01b031661142c565b6102746004803603606081101561056b57600080fd5b506001600160a01b0381351690602081013515159060400135151561143e565b6102d7600480360360208110156105a157600080fd5b50356001600160a01b0316611493565b61028e611502565b61028e611511565b6102d7600480360360608110156105d757600080fd5b506001600160a01b038135811691602081013582169160409091013516611520565b61028e6115ac565b61028e6115bb565b6102d76004803603602081101561061f57600080fd5b503515156115ca565b6102d76004803603602081101561063e57600080fd5b50356001600160a01b0316611635565b6102746116a4565b6102d76004803603604081101561066c57600080fd5b506001600160a01b0381351690602001356116aa565b61028e6004803603602081101561069857600080fd5b50356001600160a01b0316611753565b610274600480360360208110156106be57600080fd5b50356001600160a01b031661176e565b61028e611780565b610274600480360360408110156106ec57600080fd5b506001600160a01b038135169060200135151561178f565b61027461187c565b6102746004803603606081101561072257600080fd5b506001600160a01b0381351690602081013515159060400135611882565b6102d76004803603602081101561075657600080fd5b503561194a565b61033c6004803603602081101561077357600080fd5b50356001600160a01b031661199c565b6102746004803603602081101561079957600080fd5b50356001600160a01b03166119b1565b610274600480360360208110156107bf57600080fd5b50356001600160a01b0316611aaf565b6102d7600480360360208110156107e557600080fd5b50356001600160a01b0316611ac1565b6102d76004803603606081101561080b57600080fd5b506001600160a01b0381351690602081013515159060400135611b30565b61028e611c73565b6102d76004803603602081101561084757600080fd5b50351515611c82565b6102d76004803603602081101561086657600080fd5b50351515611ced565b603281565b600a546001600160a01b031681565b61271081565b6000546001600160a01b031681565b6000546001600160a01b031633146108e5576040805162461bcd60e51b81526020600482015260196024820152600080516020612023833981519152604482015290519081900360640190fd5b600081116109245760405162461bcd60e51b8152600401808060200182810382526029815260200180611f876029913960400191505060405180910390fd5b600255565b6000546001600160a01b03163314610976576040805162461bcd60e51b81526020600482015260196024820152600080516020612023833981519152604482015290519081900360640190fd5b600355565b6001546000908190600160b01b900460ff166109a15761099c868686610a4f565b6109ac565b6109ac86868661143e565b6001600160a01b0387166000908152601060205260409020549091508015610a2f576001600160a01b03871660009081526011602052604090205460ff168015610a1757610a10612710610a0a610a038286611d58565b8690611db0565b90611e09565b9250610a2d565b610a2a612710610a0a610a038286611e48565b92505b505b5095945050505050565b600154600160b01b900460ff1681565b60035481565b600080610a5c8585610f59565b9050828015610a745750600154600160a01b900460ff165b15610ab9576000610a84866119b1565b90508015610ab757848015610a9857508181115b15610aa1578091505b84158015610aae57508181105b15610ab7578091505b505b600154600160a81b900460ff1615610ad957610ad6858286610c23565b90505b6001600160a01b0385166000908152600f602052604090205460ff1615610bc257600068327cb2734119d3b7a9601e1b8211610b2a57610b2568327cb2734119d3b7a9601e1b83611e48565b610b40565b610b408268327cb2734119d3b7a9601e1b611e48565b90506003548111610b615768327cb2734119d3b7a9601e1b92505050610c1c565b848015610b79575068327cb2734119d3b7a9601e1b82115b15610b8657509050610c1c565b84158015610b9f575068327cb2734119d3b7a9601e1b82105b15610bac57509050610c1c565b68327cb2734119d3b7a9601e1b92505050610c1c565b6001600160a01b0385166000908152600e60205260409020548415610c0457610bfb612710610a0a610bf48285611d58565b8590611db0565b92505050610c1c565b610c17612710610a0a610bf48285611e48565b925050505b9392505050565b6004546000906001600160a01b0316610c3d575081610c1c565b6004805460408051630ffd9c6d60e31b81526001600160a01b038881169482019490945260248101879052851515604482015290519290911691637fece36891606480820192602092909190829003018186803b158015610c9d57600080fd5b505afa158015610cb1573d6000803e3d6000fd5b505050506040513d6020811015610cc757600080fd5b5051949350505050565b600154600160a81b900460ff1681565b600154600160a01b900460ff1681565b6000546001600160a01b03163314610d3e576040805162461bcd60e51b81526020600482015260196024820152600080516020612023833981519152604482015290519081900360640190fd5b600680546001600160a01b039485166001600160a01b031991821617909155600780549385169382169390931790925560088054919093169116179055565b60106020526000908152604090205481565b6008546001600160a01b031681565b601481565b6000546001600160a01b03163314610df0576040805162461bcd60e51b81526020600482015260196024820152600080516020612023833981519152604482015290519081900360640190fd5b6001600160a01b039384166000908152600c6020908152604080832080546001600160a01b0319169690971695909517909555600d855283812092909255600f90935220805460ff1916911515919091179055565b6001600160a01b038082166000908152600c602052604081205490911680610e9e5760405162461bcd60e51b81526004018080602001828103825260228152602001806120b26022913960400191505060405180910390fd5b60008190506000816001600160a01b03166350d25bcd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610ede57600080fd5b505afa158015610ef2573d6000803e3d6000fd5b505050506040513d6020811015610f0857600080fd5b5051905060008113610f4f576040805162461bcd60e51b815260206004820152601d6024820152600080516020612092833981519152604482015290519081900360640190fd5b925050505b919050565b6001600160a01b038083166000908152600c602052604081205490911680610fb25760405162461bcd60e51b81526004018080602001828103825260228152602001806120b26022913960400191505060405180910390fd5b6001546001600160a01b03161561108f5760015460408051631abf23ff60e11b815273a438451d6458044c3c8cd2f6f31c91ac882a6d91600482015290516000926001600160a01b03169163357e47fe916024808301926020929190829003018186803b15801561102257600080fd5b505afa158015611036573d6000803e3d6000fd5b505050506040513d602081101561104c57600080fd5b50519050801561108d5760405162461bcd60e51b81526004018080602001828103825260258152602001806120436025913960400191505060405180910390fd5b505b6000819050600080826001600160a01b031663668a0f026040518163ffffffff1660e01b815260040160206040518083038186803b1580156110d057600080fd5b505afa1580156110e4573d6000803e3d6000fd5b505050506040513d60208110156110fa57600080fd5b5051905060005b600254816001600160501b0316101561130157806001600160501b0316826001600160501b03161161113257611301565b60006001600160501b0382166111f5576000856001600160a01b03166350d25bcd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561117d57600080fd5b505afa158015611191573d6000803e3d6000fd5b505050506040513d60208110156111a757600080fd5b50519050600081136111ee576040805162461bcd60e51b815260206004820152601d6024820152600080516020612092833981519152604482015290519081900360640190fd5b90506112bd565b6000856001600160a01b0316639a6fc8f58486036040518263ffffffff1660e01b815260040180826001600160501b0316815260200191505060a06040518083038186803b15801561124657600080fd5b505afa15801561125a573d6000803e3d6000fd5b505050506040513d60a081101561127057600080fd5b50602001519050600081136112ba576040805162461bcd60e51b815260206004820152601d6024820152600080516020612092833981519152604482015290519081900360640190fd5b90505b836112c95792506112f9565b8780156112d557508381115b156112e15792506112f9565b871580156112ee57508381105b156112f7578093505b505b600101611101565b50600082116113415760405162461bcd60e51b8152600401808060200182810382526025815260200180611fb06025913960400191505060405180910390fd5b6001600160a01b0387166000908152600d6020526040902054611378600a82900a610a0a8568327cb2734119d3b7a9601e1b611db0565b955050505050505b92915050565b600154600160b81b900460ff1681565b6000546001600160a01b031633146113e3576040805162461bcd60e51b81526020600482015260196024820152600080516020612023833981519152604482015290519081900360640190fd5b60018054911515600160b81b0260ff60b81b19909216919091179055565b68327cb2734119d3b7a9601e1b81565b60116020526000908152604090205460ff1681565b60025481565b60126020526000908152604090205481565b60008061144b8585610f59565b90508280156114635750600154600160a01b900460ff165b15610ab957611473858583611882565b905060015460ff600160a81b9091041615610ad957610ad6858286610c23565b6000546001600160a01b031633146114e0576040805162461bcd60e51b81526020600482015260196024820152600080516020612023833981519152604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6004546001600160a01b031681565b6007546001600160a01b031681565b6000546001600160a01b0316331461156d576040805162461bcd60e51b81526020600482015260196024820152600080516020612023833981519152604482015290519081900360640190fd5b600980546001600160a01b039485166001600160a01b031991821617909155600a805493851693821693909317909255600b8054919093169116179055565b600b546001600160a01b031681565b6009546001600160a01b031681565b6000546001600160a01b03163314611617576040805162461bcd60e51b81526020600482015260196024820152600080516020612023833981519152604482015290519081900360640190fd5b60018054911515600160a01b0260ff60a01b19909216919091179055565b6000546001600160a01b03163314611682576040805162461bcd60e51b81526020600482015260196024820152600080516020612023833981519152604482015290519081900360640190fd5b600480546001600160a01b0319166001600160a01b0392909216919091179055565b611c2081565b6000546001600160a01b031633146116f7576040805162461bcd60e51b81526020600482015260196024820152600080516020612023833981519152604482015290519081900360640190fd5b60328111156117375760405162461bcd60e51b815260040180806020018281038252602a815260200180612068602a913960400191505060405180910390fd5b6001600160a01b039091166000908152600e6020526040902055565b600c602052600090815260409020546001600160a01b031681565b600e6020526000908152604090205481565b6006546001600160a01b031681565b6000806000846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156117cd57600080fd5b505afa1580156117e1573d6000803e3d6000fd5b505050506040513d60608110156117f757600080fd5b5080516020909101516001600160701b0391821693501690508315611849578161182657600092505050611380565b61184082610a0a8368327cb2734119d3b7a9601e1b611db0565b92505050611380565b8061185957600092505050611380565b61187381610a0a8468327cb2734119d3b7a9601e1b611db0565b95945050505050565b60055481565b60008061188e856119b1565b90508061189e5782915050610c1c565b60008382116118b6576118b18483611e48565b6118c0565b6118c08285611e48565b90506118d760055485611db090919063ffffffff16565b6118e382612710611db0565b101561190d57600154600160b81b900460ff1615611905578392505050610c1c565b509050610c1c565b84801561191957508382115b1561192657509050610c1c565b8415801561193357508382105b1561194057509050610c1c565b5091949350505050565b6000546001600160a01b03163314611997576040805162461bcd60e51b81526020600482015260196024820152600080516020612023833981519152604482015290519081900360640190fd5b600555565b600f6020526000908152604090205460ff1681565b6008546000906001600160a01b03838116911614156119e8576009546119e1906001600160a01b0316600161178f565b9050610f54565b6007546001600160a01b0383811691161415611a5a57600954600090611a18906001600160a01b0316600161178f565b600a54909150600090611a35906001600160a01b0316600161178f565b9050611a5168327cb2734119d3b7a9601e1b610a0a8484611db0565b92505050610f54565b6006546001600160a01b0383811691161415611aa757600954600090611a8a906001600160a01b0316600161178f565b600b54909150600090611a35906001600160a01b0316600161178f565b506000919050565b600d6020526000908152604090205481565b6000546001600160a01b03163314611b0e576040805162461bcd60e51b81526020600482015260196024820152600080516020612023833981519152604482015290519081900360640190fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314611b7d576040805162461bcd60e51b81526020600482015260196024820152600080516020612023833981519152604482015290519081900360640190fd5b6001600160a01b0383166000908152601260205260409020544290611ba490611c20611d58565b10611be05760405162461bcd60e51b815260040180806020018281038252602d815260200180611ff6602d913960400191505060405180910390fd5b6014811115611c2f576040805162461bcd60e51b8152602060048201526016602482015275696e76616c6964205f61646a7573746d656e7442707360501b604482015290519081900360640190fd5b6001600160a01b03929092166000908152601160209081526040808320805460ff191694151594909417909355601081528282209390935560129092529020429055565b6001546001600160a01b031681565b6000546001600160a01b03163314611ccf576040805162461bcd60e51b81526020600482015260196024820152600080516020612023833981519152604482015290519081900360640190fd5b60018054911515600160a81b0260ff60a81b19909216919091179055565b6000546001600160a01b03163314611d3a576040805162461bcd60e51b81526020600482015260196024820152600080516020612023833981519152604482015290519081900360640190fd5b60018054911515600160b01b0260ff60b01b19909216919091179055565b600082820183811015610c1c576040805162461bcd60e51b815260206004820152601b60248201527a536166654d6174683a206164646974696f6e206f766572666c6f7760281b604482015290519081900360640190fd5b600082611dbf57506000611380565b82820282848281611dcc57fe5b0414610c1c5760405162461bcd60e51b8152600401808060200182810382526021815260200180611fd56021913960400191505060405180910390fd5b6000610c1c83836040518060400160405280601a815260200179536166654d6174683a206469766973696f6e206279207a65726f60301b815250611e8a565b6000610c1c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611f2c565b60008183611f165760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611edb578181015183820152602001611ec3565b50505050905090810190601f168015611f085780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581611f2257fe5b0495945050505050565b60008184841115611f7e5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315611edb578181015183820152602001611ec3565b50505090039056fe5661756c745072696365466565643a20696e76616c6964205f707269636553616d706c6553706163655661756c745072696365466565643a20636f756c64206e6f74206665746368207072696365536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775661756c745072696365466565643a2061646a7573746d656e74206672657175656e63792065786365656465645661756c745072696365466565643a20666f7262696464656e00000000000000436861696e6c696e6b20666565647320617265206e6f74206265696e6720757064617465645661756c745072696365466565643a20696e76616c6964205f7370726561644261736973506f696e74735661756c745072696365466565643a20696e76616c69642070726963650000005661756c745072696365466565643a20696e76616c69642070726963652066656564a2646970667358221220ca608e3ae24a6316d653afa62660d6c124a1409d0b2dc508d3d48b489d8016d764736f6c634300060c0033
Deployed Bytecode Sourcemap
8094:13914:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8351:52;;;:::i;:::-;;;;;;;;;;;;;;;;9284:21;;;:::i;:::-;;;;-1:-1:-1;;;;;9284:21:0;;;;;;;;;;;;;;8292:52;;;:::i;8761:18::-;;;:::i;12543:223::-;;;;;;;;;;;;;;;;-1:-1:-1;12543:223:0;;:::i;:::-;;12774:165;;;;;;;;;;;;;;;;-1:-1:-1;12774:165:0;;:::i;13284:758::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;13284:758:0;;;;;;;;;;;;;;;;;;;;;;;;:::i;8911:32::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;9036:42;;;:::i;14050:1593::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;14050:1593:0;;;;;;;;;;;;;;;;;:::i;20094:299::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;20094:299:0;;;;;;;;;;;;;;;:::i;8862:42::-;;;:::i;8824:31::-;;;:::i;11585:149::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;11585:149:0;;;;;;;;;;;;;;;;;;;:::i;9892:66::-;;;;;;;;;;;;;;;;-1:-1:-1;9892:66:0;-1:-1:-1;;;;;9892:66:0;;:::i;9230:18::-;;;:::i;8474:56::-;;;:::i;12947:329::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;12947:329:0;;;;;;;;;;;;;;;;;;;;;;;;:::i;17805:450::-;;;;;;;;;;;;;;;;-1:-1:-1;17805:450:0;-1:-1:-1;;;;;17805:450:0;;:::i;18263:1823::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;18263:1823:0;;;;;;;;;;:::i;8950:37::-;;;:::i;12397:138::-;;;;;;;;;;;;;;;;-1:-1:-1;12397:138:0;;;;:::i;8236:49::-;;;:::i;9965:62::-;;;;;;;;;;;;;;;;-1:-1:-1;9965:62:0;-1:-1:-1;;;;;9965:62:0;;:::i;8994:35::-;;;:::i;10034:57::-;;;;;;;;;;;;;;;;-1:-1:-1;10034:57:0;-1:-1:-1;;;;;10034:57:0;;:::i;15651:1329::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;15651:1329:0;;;;;;;;;;;;;;;;;:::i;10361:120::-;;;;;;;;;;;;;;;;-1:-1:-1;10361:120:0;-1:-1:-1;;;;;10361:120:0;;:::i;9085:33::-;;;:::i;9205:18::-;;;:::i;11742:178::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;11742:178:0;;;;;;;;;;;;;;;;;;;:::i;9312:21::-;;;:::i;9255:22::-;;;:::i;11179:112::-;;;;;;;;;;;;;;;;-1:-1:-1;11179:112:0;;;;:::i;11441:136::-;;;;;;;;;;;;;;;;-1:-1:-1;11441:136:0;-1:-1:-1;;;;;11441:136:0;;:::i;8410:57::-;;;:::i;11928:276::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;11928:276:0;;;;;;;;:::i;9342:46::-;;;;;;;;;;;;;;;;-1:-1:-1;9342:46:0;-1:-1:-1;;;;;9342:46:0;;:::i;9451:53::-;;;;;;;;;;;;;;;;-1:-1:-1;9451:53:0;-1:-1:-1;;;;;9451:53:0;;:::i;9180:18::-;;;:::i;21568:437::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21568:437:0;;;;;;;;;;:::i;9125:46::-;;;:::i;16988:809::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;16988:809:0;;;;;;;;;;;;;;;:::i;12212:177::-;;;;;;;;;;;;;;;;-1:-1:-1;12212:177:0;;:::i;9832:51::-;;;;;;;;;;;;;;;;-1:-1:-1;9832:51:0;-1:-1:-1;;;;;9832:51:0;;:::i;20401:1028::-;;;;;;;;;;;;;;;;-1:-1:-1;20401:1028:0;-1:-1:-1;;;;;20401:1028:0;;:::i;9395:49::-;;;;;;;;;;;;;;;;-1:-1:-1;9395:49:0;-1:-1:-1;;;;;9395:49:0;;:::i;10277:76::-;;;;;;;;;;;;;;;;-1:-1:-1;10277:76:0;-1:-1:-1;;;;;10277:76:0;;:::i;10489:556::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;10489:556:0;;;;;;;;;;;;;;;:::i;8786:29::-;;;:::i;11299:134::-;;;;;;;;;;;;;;;;-1:-1:-1;11299:134:0;;;;:::i;11053:118::-;;;;;;;;;;;;;;;;-1:-1:-1;11053:118:0;;;;:::i;8351:52::-;8401:2;8351:52;:::o;9284:21::-;;;-1:-1:-1;;;;;9284:21:0;;:::o;8292:52::-;8339:5;8292:52;:::o;8761:18::-;;;-1:-1:-1;;;;;8761:18:0;;:::o;12543:223::-;10152:3;;-1:-1:-1;;;;;10152:3:0;10138:10;:17;10130:55;;;;;-1:-1:-1;;;10130:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10130:55:0;;;;;;;;;;;;;;;12664:1:::1;12644:17;:21;12636:75;;;;-1:-1:-1::0;;;12636:75:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12722:16;:36:::0;12543:223::o;12774:165::-;10152:3;;-1:-1:-1;;;;;10152:3:0;10138:10;:17;10130:55;;;;;-1:-1:-1;;;10130:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10130:55:0;;;;;;;;;;;;;;;12881:23:::1;:50:::0;12774:165::o;13284:758::-;13451:12;;13415:7;;;;-1:-1:-1;;;13451:12:0;;;;:112;;13516:47;13527:6;13535:9;13546:16;13516:10;:47::i;:::-;13451:112;;;13466:47;13477:6;13485:9;13496:16;13466:10;:47::i;:::-;-1:-1:-1;;;;;13600:29:0;;13576:21;13600:29;;;:21;:29;;;;;;13435:128;;-1:-1:-1;13644:17:0;;13640:370;;-1:-1:-1;;;;;13696:28:0;;13678:15;13696:28;;;:20;:28;;;;;;;;13739:260;;;;13782:76;8339:5;13782:50;13792:39;8339:5;13817:13;13792:24;:39::i;:::-;13782:5;;:9;:50::i;:::-;:54;;:76::i;:::-;13774:84;;13739:260;;;13907:76;8339:5;13907:50;13917:39;8339:5;13942:13;13917:24;:39::i;13907:76::-;13899:84;;13739:260;13640:370;;-1:-1:-1;14029:5:0;13284:758;-1:-1:-1;;;;;13284:758:0:o;8911:32::-;;;-1:-1:-1;;;8911:32:0;;;;;:::o;9036:42::-;;;;:::o;14050:1593::-;14146:7;14166:13;14182:34;14198:6;14206:9;14182:15;:34::i;:::-;14166:50;;14233:16;:32;;;;-1:-1:-1;14253:12:0;;-1:-1:-1;;;14253:12:0;;;;14233:32;14229:376;;;14282:16;14301:19;14313:6;14301:11;:19::i;:::-;14282:38;-1:-1:-1;14339:12:0;;14335:259;;14376:9;:29;;;;;14400:5;14389:8;:16;14376:29;14372:94;;;14438:8;14430:16;;14372:94;14489:9;14488:10;:30;;;;;14513:5;14502:8;:16;14488:30;14484:95;;;14551:8;14543:16;;14484:95;14229:376;;14621:23;;-1:-1:-1;;;14621:23:0;;;;14617:107;;;14669:43;14687:6;14695:5;14702:9;14669:17;:43::i;:::-;14661:51;;14617:107;-1:-1:-1;;;;;14740:26:0;;;;;;:18;:26;;;;;;;;14736:590;;;14783:13;-1:-1:-1;;;14799:5:0;:15;:57;;14838:18;-1:-1:-1;;;14850:5:0;14838:11;:18::i;:::-;14799:57;;;14817:18;:5;-1:-1:-1;;;14817:9:0;:18::i;:::-;14783:73;;14884:23;;14875:5;:32;14871:87;;-1:-1:-1;;;14928:14:0;;;;;;14871:87;15043:9;:28;;;;;-1:-1:-1;;;15056:5:0;:15;15043:28;15039:81;;;-1:-1:-1;15099:5:0;-1:-1:-1;15092:12:0;;15039:81;15207:9;15206:10;:29;;;;;-1:-1:-1;;;15220:5:0;:15;15206:29;15202:82;;;-1:-1:-1;15263:5:0;-1:-1:-1;15256:12:0;;15202:82;-1:-1:-1;;;15300:14:0;;;;;;14736:590;-1:-1:-1;;;;;15367:25:0;;15338:26;15367:25;;;:17;:25;;;;;;15405:130;;;;15442:81;8339:5;15442:55;15452:44;8339:5;15477:18;15452:24;:44::i;:::-;15442:5;;:9;:55::i;:81::-;15435:88;;;;;;15405:130;15554:81;8339:5;15554:55;15564:44;8339:5;15589:18;15564:24;:44::i;15554:81::-;15547:88;;;;14050:1593;;;;;;:::o;20094:299::-;20223:18;;20199:7;;-1:-1:-1;;;;;20223:18:0;20219:65;;-1:-1:-1;20266:15:0;20259:22;;20219:65;20321:18;;;20301:84;;;-1:-1:-1;;;20301:84:0;;-1:-1:-1;;;;;20301:84:0;;;;;;;;;;;;;;;;;;;;;;;;;20321:18;;;;;20301:48;;:84;;;;;;;;;;;;;;;20321:18;20301:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20301:84:0;;20094:299;-1:-1:-1;;;;20094:299:0:o;8862:42::-;;;-1:-1:-1;;;8862:42:0;;;;;:::o;8824:31::-;;;-1:-1:-1;;;8824:31:0;;;;;:::o;11585:149::-;10152:3;;-1:-1:-1;;;;;10152:3:0;10138:10;:17;10130:55;;;;;-1:-1:-1;;;10130:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10130:55:0;;;;;;;;;;;;;;;11674:3:::1;:10:::0;;-1:-1:-1;;;;;11674:10:0;;::::1;-1:-1:-1::0;;;;;;11674:10:0;;::::1;;::::0;;;11695:3:::1;:10:::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;11716:3:::1;:10:::0;;;;;::::1;::::0;::::1;;::::0;;11585:149::o;9892:66::-;;;;;;;;;;;;;:::o;9230:18::-;;;-1:-1:-1;;;;;9230:18:0;;:::o;8474:56::-;8528:2;8474:56;:::o;12947:329::-;10152:3;;-1:-1:-1;;;;;10152:3:0;10138:10;:17;10130:55;;;;;-1:-1:-1;;;10130:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10130:55:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;13133:18:0;;::::1;;::::0;;;:10:::1;:18;::::0;;;;;;;:31;;-1:-1:-1;;;;;;13133:31:0::1;::::0;;;::::1;::::0;;;::::1;::::0;;;13175:13:::1;:21:::0;;;;;:38;;;;13224:18:::1;:26:::0;;;;:44;;-1:-1:-1;;13224:44:0::1;::::0;::::1;;::::0;;;::::1;::::0;;12947:329::o;17805:450::-;-1:-1:-1;;;;;17929:18:0;;;17882:7;17929:18;;;:10;:18;;;;;;17882:7;;17929:18;17966:30;17958:77;;;;-1:-1:-1;;;17958:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18048:20;18082:16;18048:51;;18112:12;18127:9;-1:-1:-1;;;;;18127:22:0;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18127:24:0;;-1:-1:-1;18178:1:0;18170:9;;18162:51;;;;;-1:-1:-1;;;18162:51:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;18162:51:0;;;;;;;;;;;;;;;18241:5;-1:-1:-1;;;17805:450:0;;;;:::o;18263:1823::-;-1:-1:-1;;;;;18397:18:0;;;18350:7;18397:18;;;:10;:18;;;;;;18350:7;;18397:18;18434:30;18426:77;;;;-1:-1:-1;;;18426:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18520:14;;-1:-1:-1;;;;;18520:14:0;:28;18516:340;;18597:14;;18581:66;;;-1:-1:-1;;;18581:66:0;;8663:89;18581:66;;;;;;18565:13;;-1:-1:-1;;;;;18597:14:0;;18581:39;;:66;;;;;;;;;;;;;;18597:14;18581:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18581:66:0;;-1:-1:-1;18662:183:0;;;;18782:47;;-1:-1:-1;;;18782:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18662:183;18516:340;;18868:20;18902:16;18868:51;;18932:13;18960:14;18977:9;-1:-1:-1;;;;;18977:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18977:23:0;;-1:-1:-1;19018:8:0;19013:829;19036:16;;19032:1;-1:-1:-1;;;;;19032:20:0;;19013:829;;;19089:1;-1:-1:-1;;;;;19078:12:0;:7;-1:-1:-1;;;;;19078:12:0;;19074:28;;19094:5;;19074:28;19116:9;-1:-1:-1;;;;;19146:6:0;;19142:382;;19173:9;19185;-1:-1:-1;;;;;19185:22:0;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19185:24:0;;-1:-1:-1;19241:1:0;19236:6;;19228:48;;;;;-1:-1:-1;;;19228:48:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;19228:48:0;;;;;;;;;;;;;;;19307:2;-1:-1:-1;19142:382:0;;;19354:9;19372;-1:-1:-1;;;;;19372:22:0;;19405:1;19395:7;:11;19372:35;;;;;;;;;;;;;-1:-1:-1;;;;;19372:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19372:35:0;;;;-1:-1:-1;19439:1:0;19434:6;;19426:48;;;;;-1:-1:-1;;;19426:48:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;19426:48:0;;;;;;;;;;;;;;;19505:2;-1:-1:-1;19142:382:0;19544:10;19540:87;;19583:1;-1:-1:-1;19603:8:0;;19540:87;19647:9;:22;;;;;19664:5;19660:1;:9;19647:22;19643:99;;;19698:1;-1:-1:-1;19718:8:0;;19643:99;19763:9;19762:10;:23;;;;;19780:5;19776:1;:9;19762:23;19758:73;;;19814:1;19806:9;;19758:73;19013:829;;19054:3;;19013:829;;;;19870:1;19862:5;:9;19854:59;;;;-1:-1:-1;;;19854:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19987:21:0;;19962:22;19987:21;;;:13;:21;;;;;;20026:52;20057:2;:20;;;20026:26;:5;-1:-1:-1;;;20026:9:0;:26::i;:52::-;20019:59;;;;;;;18263:1823;;;;;:::o;8950:37::-;;;-1:-1:-1;;;8950:37:0;;;;;:::o;12397:138::-;10152:3;;-1:-1:-1;;;;;10152:3:0;10138:10;:17;10130:55;;;;;-1:-1:-1;;;10130:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10130:55:0;;;;;;;;;;;;;;;12489:17:::1;:38:::0;;;::::1;;-1:-1:-1::0;;;12489:38:0::1;-1:-1:-1::0;;;;12489:38:0;;::::1;::::0;;;::::1;::::0;;12397:138::o;8236:49::-;-1:-1:-1;;;8236:49:0;:::o;9965:62::-;;;;;;;;;;;;;;;:::o;8994:35::-;;;;:::o;10034:57::-;;;;;;;;;;;;;:::o;15651:1329::-;15747:7;15767:13;15783:34;15799:6;15807:9;15783:15;:34::i;:::-;15767:50;;15834:16;:32;;;;-1:-1:-1;15854:12:0;;-1:-1:-1;;;15854:12:0;;;;15834:32;15830:112;;;15891:39;15905:6;15913:9;15924:5;15891:13;:39::i;:::-;15883:47;;15958:23;;;-1:-1:-1;;;15958:23:0;;;;15954:107;;;16006:43;16024:6;16032:5;16039:9;16006:17;:43::i;10361:120::-;10152:3;;-1:-1:-1;;;;;10152:3:0;10138:10;:17;10130:55;;;;;-1:-1:-1;;;10130:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10130:55:0;;;;;;;;;;;;;;;10441:14:::1;:32:::0;;-1:-1:-1;;;;;;10441:32:0::1;-1:-1:-1::0;;;;;10441:32:0;;;::::1;::::0;;;::::1;::::0;;10361:120::o;9085:33::-;;;-1:-1:-1;;;;;9085:33:0;;:::o;9205:18::-;;;-1:-1:-1;;;;;9205:18:0;;:::o;11742:178::-;10152:3;;-1:-1:-1;;;;;10152:3:0;10138:10;:17;10130:55;;;;;-1:-1:-1;;;10130:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10130:55:0;;;;;;;;;;;;;;;11840:7:::1;:18:::0;;-1:-1:-1;;;;;11840:18:0;;::::1;-1:-1:-1::0;;;;;;11840:18:0;;::::1;;::::0;;;11869:6:::1;:16:::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;11896:6:::1;:16:::0;;;;;::::1;::::0;::::1;;::::0;;11742:178::o;9312:21::-;;;-1:-1:-1;;;;;9312:21:0;;:::o;9255:22::-;;;-1:-1:-1;;;;;9255:22:0;;:::o;11179:112::-;10152:3;;-1:-1:-1;;;;;10152:3:0;10138:10;:17;10130:55;;;;;-1:-1:-1;;;10130:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10130:55:0;;;;;;;;;;;;;;;11258:12:::1;:25:::0;;;::::1;;-1:-1:-1::0;;;11258:25:0::1;-1:-1:-1::0;;;;11258:25:0;;::::1;::::0;;;::::1;::::0;;11179:112::o;11441:136::-;10152:3;;-1:-1:-1;;;;;10152:3:0;10138:10;:17;10130:55;;;;;-1:-1:-1;;;10130:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10130:55:0;;;;;;;;;;;;;;;11529:18:::1;:40:::0;;-1:-1:-1;;;;;;11529:40:0::1;-1:-1:-1::0;;;;;11529:40:0;;;::::1;::::0;;;::::1;::::0;;11441:136::o;8410:57::-;8460:7;8410:57;:::o;11928:276::-;10152:3;;-1:-1:-1;;;;;10152:3:0;10138:10;:17;10130:55;;;;;-1:-1:-1;;;10130:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10130:55:0;;;;;;;;;;;;;;;8401:2:::1;12047:18;:45;;12039:100;;;;-1:-1:-1::0;;;12039:100:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;12150:25:0;;::::1;;::::0;;;:17:::1;:25;::::0;;;;:46;11928:276::o;9342:46::-;;;;;;;;;;;;-1:-1:-1;;;;;9342:46:0;;:::o;9451:53::-;;;;;;;;;;;;;:::o;9180:18::-;;;-1:-1:-1;;;;;9180:18:0;;:::o;21568:437::-;21647:7;21668:16;21686;21721:5;-1:-1:-1;;;;;21708:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21708:33:0;;;;;;;-1:-1:-1;;;;;21667:74:0;;;;-1:-1:-1;21667:74:0;;-1:-1:-1;21752:143:0;;;;21791:13;21787:32;;21815:1;21808:8;;;;;;21787:32;21840:43;21874:8;21840:29;:8;-1:-1:-1;;;21840:12:0;:29::i;:43::-;21833:50;;;;;;21752:143;21909:13;21905:32;;21933:1;21926:8;;;;;;21905:32;21954:43;21988:8;21954:29;:8;-1:-1:-1;;;21954:12:0;:29::i;:43::-;21947:50;21568:437;-1:-1:-1;;;;;21568:437:0:o;9125:46::-;;;;:::o;16988:809::-;17087:7;17107:16;17126:19;17138:6;17126:11;:19::i;:::-;17107:38;-1:-1:-1;17160:13:0;17156:66;;17197:13;17190:20;;;;;17156:66;17234:12;17260:13;17249:8;:24;:84;;17306:27;:13;17324:8;17306:17;:27::i;:::-;17249:84;;;17276:27;:8;17289:13;17276:12;:27::i;:::-;17234:99;;17381:45;17399:26;;17381:13;:17;;:45;;;;:::i;:::-;17348:30;:4;8339:5;17348:8;:30::i;:::-;:78;17344:218;;;17447:17;;-1:-1:-1;;;17447:17:0;;;;17443:78;;;17492:13;17485:20;;;;;;17443:78;-1:-1:-1;17542:8:0;-1:-1:-1;17535:15:0;;17344:218;17578:9;:37;;;;;17602:13;17591:8;:24;17578:37;17574:85;;;-1:-1:-1;17639:8:0;-1:-1:-1;17632:15:0;;17574:85;17676:9;17675:10;:38;;;;;17700:13;17689:8;:24;17675:38;17671:86;;;-1:-1:-1;17737:8:0;-1:-1:-1;17730:15:0;;17671:86;-1:-1:-1;17776:13:0;;16988:809;-1:-1:-1;;;;16988:809:0:o;12212:177::-;10152:3;;-1:-1:-1;;;;;10152:3:0;10138:10;:17;10130:55;;;;;-1:-1:-1;;;10130:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10130:55:0;;;;;;;;;;;;;;;12325:26:::1;:56:::0;12212:177::o;9832:51::-;;;;;;;;;;;;;;;:::o;20401:1028::-;20502:3;;20468:7;;-1:-1:-1;;;;;20492:13:0;;;20502:3;;20492:13;20488:139;;;20601:7;;20588:27;;-1:-1:-1;;;;;20601:7:0;;20588:12;:27::i;:::-;20581:34;;;;20488:139;20653:3;;-1:-1:-1;;;;;20643:13:0;;;20653:3;;20643:13;20639:375;;;20703:7;;20673:14;;20690:27;;-1:-1:-1;;;;;20703:7:0;;20690:12;:27::i;:::-;20819:6;;20673:44;;-1:-1:-1;20789:14:0;;20806:26;;-1:-1:-1;;;;;20819:6:0;;20806:12;:26::i;:::-;20789:43;-1:-1:-1;20963:39:0;-1:-1:-1;;;20963:18:0;:6;20789:43;20963:10;:18::i;:39::-;20956:46;;;;;;20639:375;21040:3;;-1:-1:-1;;;;;21030:13:0;;;21040:3;;21030:13;21026:375;;;21090:7;;21060:14;;21077:27;;-1:-1:-1;;;;;21090:7:0;;21077:12;:27::i;:::-;21206:6;;21060:44;;-1:-1:-1;21176:14:0;;21193:26;;-1:-1:-1;;;;;21206:6:0;;21193:12;:26::i;21026:375::-;-1:-1:-1;21420:1:0;20401:1028;;;:::o;9395:49::-;;;;;;;;;;;;;:::o;10277:76::-;10152:3;;-1:-1:-1;;;;;10152:3:0;10138:10;:17;10130:55;;;;;-1:-1:-1;;;10130:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10130:55:0;;;;;;;;;;;;;;;10335:3:::1;:10:::0;;-1:-1:-1;;;;;;10335:10:0::1;-1:-1:-1::0;;;;;10335:10:0;;;::::1;::::0;;;::::1;::::0;;10277:76::o;10489:556::-;10152:3;;-1:-1:-1;;;;;10152:3:0;10138:10;:17;10130:55;;;;;-1:-1:-1;;;10130:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10130:55:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;10629:29:0;::::1;;::::0;;;:21:::1;:29;::::0;;;;;10690:15:::1;::::0;10629:58:::1;::::0;8460:7:::1;10629:33;:58::i;:::-;:76;10607:171;;;;-1:-1:-1::0;;;10607:171:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8528:2;10797:14;:45;;10789:80;;;::::0;;-1:-1:-1;;;10789:80:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;10789:80:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;10880:28:0;;;::::1;;::::0;;;:20:::1;:28;::::0;;;;;;;:42;;-1:-1:-1;;10880:42:0::1;::::0;::::1;;::::0;;;::::1;::::0;;;10933:21:::1;:29:::0;;;;;:46;;;;10990:21:::1;:29:::0;;;;;11022:15:::1;10990:47:::0;;10489:556::o;8786:29::-;;;-1:-1:-1;;;;;8786:29:0;;:::o;11299:134::-;10152:3;;-1:-1:-1;;;;;10152:3:0;10138:10;:17;10130:55;;;;;-1:-1:-1;;;10130:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10130:55:0;;;;;;;;;;;;;;;11389:23:::1;:36:::0;;;::::1;;-1:-1:-1::0;;;11389:36:0::1;-1:-1:-1::0;;;;11389:36:0;;::::1;::::0;;;::::1;::::0;;11299:134::o;11053:118::-;10152:3;;-1:-1:-1;;;;;10152:3:0;10138:10;:17;10130:55;;;;;-1:-1:-1;;;10130:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10130:55:0;;;;;;;;;;;;;;;11135:12:::1;:28:::0;;;::::1;;-1:-1:-1::0;;;11135:28:0::1;-1:-1:-1::0;;;;11135:28:0;;::::1;::::0;;;::::1;::::0;;11053:118::o;867:181::-;925:7;957:5;;;981:6;;;;973:46;;;;;-1:-1:-1;;;973:46:0;;;;;;;;;;;;-1:-1:-1;;;973:46:0;;;;;;;;;;;;;;2221:471;2279:7;2524:6;2520:47;;-1:-1:-1;2554:1:0;2547:8;;2520:47;2591:5;;;2595:1;2591;:5;:1;2615:5;;;;;:10;2607:56;;;;-1:-1:-1;;;2607:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3168:132;3226:7;3253:39;3257:1;3260;3253:39;;;;;;;;;;;;;-1:-1:-1;;;3253:39:0;;;:3;:39::i;1331:136::-;1389:7;1416:43;1420:1;1423;1416:43;;;;;;;;;;;;;;;;;:3;:43::i;3796:278::-;3882:7;3917:12;3910:5;3902:28;;;;-1:-1:-1;;;3902:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3941:9;3957:1;3953;:5;;;;;;;3796:278;-1:-1:-1;;;;;3796:278:0:o;1770:192::-;1856:7;1892:12;1884:6;;;;1876:29;;;;-1:-1:-1;;;1876:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1928:5:0;;;1770:192::o
Swarm Source
ipfs://ca608e3ae24a6316d653afa62660d6c124a1409d0b2dc508d3d48b489d8016d7
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.