Overview
ETH Balance
83.774819845483573445 ETH
Eth Value
$262,287.70 (@ $3,130.87/ETH)Token Holdings
More Info
Private Name Tags
ContractCreator
Latest 7 from a total of 7 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Transfer Ownersh... | 11837026 | 1368 days ago | IN | 0 ETH | 0.0066465 | ||||
Accept Anchor Ow... | 11837022 | 1368 days ago | IN | 0 ETH | 0.0080574 | ||||
Set Market Cap T... | 11836956 | 1368 days ago | IN | 0 ETH | 0.00604266 | ||||
Set Step Weight | 11836953 | 1368 days ago | IN | 0 ETH | 0.00539058 | ||||
Set Minimum Weig... | 11836951 | 1368 days ago | IN | 0 ETH | 0.00538629 | ||||
Add Reserve | 11836949 | 1368 days ago | IN | 0 ETH | 0.01973595 | ||||
0x60806040 | 11836947 | 1368 days ago | IN | 0 ETH | 0.58790823 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
21144002 | 2 days ago | 0.40964034 ETH | ||||
19958063 | 167 days ago | 0.14837889 ETH | ||||
19957915 | 167 days ago | 0.082444 ETH | ||||
19825244 | 186 days ago | 0.1360262 ETH | ||||
19825235 | 186 days ago | 0.46149672 ETH | ||||
19825217 | 186 days ago | 0.19960206 ETH | ||||
19698377 | 204 days ago | 0.09741989 ETH | ||||
19396775 | 246 days ago | 0.09714921 ETH | ||||
19256857 | 266 days ago | 0.1385207 ETH | ||||
19102484 | 287 days ago | 0.41247528 ETH | ||||
19102477 | 287 days ago | 0.27314078 ETH | ||||
18977442 | 305 days ago | 0.39322221 ETH | ||||
18977430 | 305 days ago | 0.41011893 ETH | ||||
18977417 | 305 days ago | 0.08208633 ETH | ||||
18773955 | 333 days ago | 0.0904874 ETH | ||||
18759019 | 335 days ago | 0.23087477 ETH | ||||
18746233 | 337 days ago | 0.07326019 ETH | ||||
18746229 | 337 days ago | 0.07157626 ETH | ||||
18740060 | 338 days ago | 0.07328226 ETH | ||||
18740049 | 338 days ago | 0.07161571 ETH | ||||
18578795 | 361 days ago | 0.13905785 ETH | ||||
18429193 | 382 days ago | 0.49085124 ETH | ||||
18402250 | 385 days ago | 1.9391162 ETH | ||||
18373372 | 389 days ago | 0.37068837 ETH | ||||
18306738 | 399 days ago | 0.10138864 ETH |
Loading...
Loading
Contract Name:
DynamicLiquidTokenConverter
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-02-13 */ // SPDX-License-Identifier: Bprotocol Foundation (Bancor) LICENSE // File: solidity/contracts/utility/interfaces/IOwned.sol pragma solidity 0.6.12; /* Owned contract interface */ interface IOwned { // this function isn't since the compiler emits automatically generated getter functions as external function owner() external view returns (address); function transferOwnership(address _newOwner) external; function acceptOwnership() external; } // File: solidity/contracts/converter/interfaces/IConverterAnchor.sol pragma solidity 0.6.12; /* Converter Anchor interface */ interface IConverterAnchor is IOwned { } // File: solidity/contracts/token/interfaces/IERC20Token.sol pragma solidity 0.6.12; /* ERC20 Standard Token interface */ interface IERC20Token { function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); function totalSupply() external view returns (uint256); function balanceOf(address _owner) external view returns (uint256); function allowance(address _owner, address _spender) external view returns (uint256); function transfer(address _to, uint256 _value) external returns (bool); function transferFrom(address _from, address _to, uint256 _value) external returns (bool); function approve(address _spender, uint256 _value) external returns (bool); } // File: solidity/contracts/utility/interfaces/IWhitelist.sol pragma solidity 0.6.12; /* Whitelist interface */ interface IWhitelist { function isWhitelisted(address _address) external view returns (bool); } // File: solidity/contracts/converter/interfaces/IConverter.sol pragma solidity 0.6.12; /* Converter interface */ interface IConverter is IOwned { function converterType() external pure returns (uint16); function anchor() external view returns (IConverterAnchor); function isActive() external view returns (bool); function targetAmountAndFee(IERC20Token _sourceToken, IERC20Token _targetToken, uint256 _amount) external view returns (uint256, uint256); function convert(IERC20Token _sourceToken, IERC20Token _targetToken, uint256 _amount, address _trader, address payable _beneficiary) external payable returns (uint256); function conversionWhitelist() external view returns (IWhitelist); function conversionFee() external view returns (uint32); function maxConversionFee() external view returns (uint32); function reserveBalance(IERC20Token _reserveToken) external view returns (uint256); receive() external payable; function transferAnchorOwnership(address _newOwner) external; function acceptAnchorOwnership() external; function setConversionFee(uint32 _conversionFee) external; function setConversionWhitelist(IWhitelist _whitelist) external; function withdrawTokens(IERC20Token _token, address _to, uint256 _amount) external; function withdrawETH(address payable _to) external; function addReserve(IERC20Token _token, uint32 _ratio) external; // deprecated, backward compatibility function token() external view returns (IConverterAnchor); function transferTokenOwnership(address _newOwner) external; function acceptTokenOwnership() external; function connectors(IERC20Token _address) external view returns (uint256, uint32, bool, bool, bool); function getConnectorBalance(IERC20Token _connectorToken) external view returns (uint256); function connectorTokens(uint256 _index) external view returns (IERC20Token); function connectorTokenCount() external view returns (uint16); } // File: solidity/contracts/converter/interfaces/IConverterUpgrader.sol pragma solidity 0.6.12; /* Converter Upgrader interface */ interface IConverterUpgrader { function upgrade(bytes32 _version) external; function upgrade(uint16 _version) external; } // File: solidity/contracts/converter/interfaces/IBancorFormula.sol pragma solidity 0.6.12; /* Bancor Formula interface */ interface IBancorFormula { function purchaseTargetAmount(uint256 _supply, uint256 _reserveBalance, uint32 _reserveWeight, uint256 _amount) external view returns (uint256); function saleTargetAmount(uint256 _supply, uint256 _reserveBalance, uint32 _reserveWeight, uint256 _amount) external view returns (uint256); function crossReserveTargetAmount(uint256 _sourceReserveBalance, uint32 _sourceReserveWeight, uint256 _targetReserveBalance, uint32 _targetReserveWeight, uint256 _amount) external view returns (uint256); function fundCost(uint256 _supply, uint256 _reserveBalance, uint32 _reserveRatio, uint256 _amount) external view returns (uint256); function fundSupplyAmount(uint256 _supply, uint256 _reserveBalance, uint32 _reserveRatio, uint256 _amount) external view returns (uint256); function liquidateReserveAmount(uint256 _supply, uint256 _reserveBalance, uint32 _reserveRatio, uint256 _amount) external view returns (uint256); function balancedWeights(uint256 _primaryReserveStakedBalance, uint256 _primaryReserveBalance, uint256 _secondaryReserveBalance, uint256 _reserveRateNumerator, uint256 _reserveRateDenominator) external view returns (uint32, uint32); } // File: solidity/contracts/utility/Owned.sol pragma solidity 0.6.12; /** * @dev Provides support and utilities for contract ownership */ contract Owned is IOwned { address public override owner; address public newOwner; /** * @dev triggered when the owner is updated * * @param _prevOwner previous owner * @param _newOwner new owner */ event OwnerUpdate(address indexed _prevOwner, address indexed _newOwner); /** * @dev initializes a new Owned instance */ constructor() public { owner = msg.sender; } // allows execution by the owner only modifier ownerOnly { _ownerOnly(); _; } // error message binary size optimization function _ownerOnly() internal view { require(msg.sender == owner, "ERR_ACCESS_DENIED"); } /** * @dev allows transferring the contract ownership * the new owner still needs to accept the transfer * can only be called by the contract owner * * @param _newOwner new contract owner */ function transferOwnership(address _newOwner) public override ownerOnly { require(_newOwner != owner, "ERR_SAME_OWNER"); newOwner = _newOwner; } /** * @dev used by a new owner to accept an ownership transfer */ function acceptOwnership() override public { require(msg.sender == newOwner, "ERR_ACCESS_DENIED"); emit OwnerUpdate(owner, newOwner); owner = newOwner; newOwner = address(0); } } // File: solidity/contracts/utility/Utils.sol pragma solidity 0.6.12; /** * @dev Utilities & Common Modifiers */ contract Utils { // verifies that a value is greater than zero modifier greaterThanZero(uint256 _value) { _greaterThanZero(_value); _; } // error message binary size optimization function _greaterThanZero(uint256 _value) internal pure { require(_value > 0, "ERR_ZERO_VALUE"); } // validates an address - currently only checks that it isn't null modifier validAddress(address _address) { _validAddress(_address); _; } // error message binary size optimization function _validAddress(address _address) internal pure { require(_address != address(0), "ERR_INVALID_ADDRESS"); } // verifies that the address is different than this contract address modifier notThis(address _address) { _notThis(_address); _; } // error message binary size optimization function _notThis(address _address) internal view { require(_address != address(this), "ERR_ADDRESS_IS_SELF"); } } // File: solidity/contracts/utility/interfaces/IContractRegistry.sol pragma solidity 0.6.12; /* Contract Registry interface */ interface IContractRegistry { function addressOf(bytes32 _contractName) external view returns (address); } // File: solidity/contracts/utility/ContractRegistryClient.sol pragma solidity 0.6.12; /** * @dev Base contract for ContractRegistry clients */ contract ContractRegistryClient is Owned, Utils { bytes32 internal constant CONTRACT_REGISTRY = "ContractRegistry"; bytes32 internal constant BANCOR_NETWORK = "BancorNetwork"; bytes32 internal constant BANCOR_FORMULA = "BancorFormula"; bytes32 internal constant CONVERTER_FACTORY = "ConverterFactory"; bytes32 internal constant CONVERSION_PATH_FINDER = "ConversionPathFinder"; bytes32 internal constant CONVERTER_UPGRADER = "BancorConverterUpgrader"; bytes32 internal constant CONVERTER_REGISTRY = "BancorConverterRegistry"; bytes32 internal constant CONVERTER_REGISTRY_DATA = "BancorConverterRegistryData"; bytes32 internal constant BNT_TOKEN = "BNTToken"; bytes32 internal constant BANCOR_X = "BancorX"; bytes32 internal constant BANCOR_X_UPGRADER = "BancorXUpgrader"; bytes32 internal constant CHAINLINK_ORACLE_WHITELIST = "ChainlinkOracleWhitelist"; IContractRegistry public registry; // address of the current contract-registry IContractRegistry public prevRegistry; // address of the previous contract-registry bool public onlyOwnerCanUpdateRegistry; // only an owner can update the contract-registry /** * @dev verifies that the caller is mapped to the given contract name * * @param _contractName contract name */ modifier only(bytes32 _contractName) { _only(_contractName); _; } // error message binary size optimization function _only(bytes32 _contractName) internal view { require(msg.sender == addressOf(_contractName), "ERR_ACCESS_DENIED"); } /** * @dev initializes a new ContractRegistryClient instance * * @param _registry address of a contract-registry contract */ constructor(IContractRegistry _registry) internal validAddress(address(_registry)) { registry = IContractRegistry(_registry); prevRegistry = IContractRegistry(_registry); } /** * @dev updates to the new contract-registry */ function updateRegistry() public { // verify that this function is permitted require(msg.sender == owner || !onlyOwnerCanUpdateRegistry, "ERR_ACCESS_DENIED"); // get the new contract-registry IContractRegistry newRegistry = IContractRegistry(addressOf(CONTRACT_REGISTRY)); // verify that the new contract-registry is different and not zero require(newRegistry != registry && address(newRegistry) != address(0), "ERR_INVALID_REGISTRY"); // verify that the new contract-registry is pointing to a non-zero contract-registry require(newRegistry.addressOf(CONTRACT_REGISTRY) != address(0), "ERR_INVALID_REGISTRY"); // save a backup of the current contract-registry before replacing it prevRegistry = registry; // replace the current contract-registry with the new contract-registry registry = newRegistry; } /** * @dev restores the previous contract-registry */ function restoreRegistry() public ownerOnly { // restore the previous contract-registry registry = prevRegistry; } /** * @dev restricts the permission to update the contract-registry * * @param _onlyOwnerCanUpdateRegistry indicates whether or not permission is restricted to owner only */ function restrictRegistryUpdate(bool _onlyOwnerCanUpdateRegistry) public ownerOnly { // change the permission to update the contract-registry onlyOwnerCanUpdateRegistry = _onlyOwnerCanUpdateRegistry; } /** * @dev returns the address associated with the given contract name * * @param _contractName contract name * * @return contract address */ function addressOf(bytes32 _contractName) internal view returns (address) { return registry.addressOf(_contractName); } } // File: solidity/contracts/utility/ReentrancyGuard.sol pragma solidity 0.6.12; /** * @dev ReentrancyGuard * * The contract provides protection against re-entrancy - calling a function (directly or * indirectly) from within itself. */ contract ReentrancyGuard { // true while protected code is being executed, false otherwise bool private locked = false; /** * @dev ensures instantiation only by sub-contracts */ constructor() internal {} // protects a function against reentrancy attacks modifier protected() { _protected(); locked = true; _; locked = false; } // error message binary size optimization function _protected() internal view { require(!locked, "ERR_REENTRANCY"); } } // File: solidity/contracts/utility/SafeMath.sol pragma solidity 0.6.12; /** * @dev Library for basic math operations with overflow/underflow protection */ library SafeMath { /** * @dev returns the sum of _x and _y, reverts if the calculation overflows * * @param _x value 1 * @param _y value 2 * * @return sum */ function add(uint256 _x, uint256 _y) internal pure returns (uint256) { uint256 z = _x + _y; require(z >= _x, "ERR_OVERFLOW"); return z; } /** * @dev returns the difference of _x minus _y, reverts if the calculation underflows * * @param _x minuend * @param _y subtrahend * * @return difference */ function sub(uint256 _x, uint256 _y) internal pure returns (uint256) { require(_x >= _y, "ERR_UNDERFLOW"); return _x - _y; } /** * @dev returns the product of multiplying _x by _y, reverts if the calculation overflows * * @param _x factor 1 * @param _y factor 2 * * @return product */ function mul(uint256 _x, uint256 _y) internal pure returns (uint256) { // gas optimization if (_x == 0) return 0; uint256 z = _x * _y; require(z / _x == _y, "ERR_OVERFLOW"); return z; } /** * @dev Integer division of two numbers truncating the quotient, reverts on division by zero. * * @param _x dividend * @param _y divisor * * @return quotient */ function div(uint256 _x, uint256 _y) internal pure returns (uint256) { require(_y > 0, "ERR_DIVIDE_BY_ZERO"); uint256 c = _x / _y; return c; } } // File: solidity/contracts/utility/TokenHandler.sol pragma solidity 0.6.12; contract TokenHandler { bytes4 private constant APPROVE_FUNC_SELECTOR = bytes4(keccak256("approve(address,uint256)")); bytes4 private constant TRANSFER_FUNC_SELECTOR = bytes4(keccak256("transfer(address,uint256)")); bytes4 private constant TRANSFER_FROM_FUNC_SELECTOR = bytes4(keccak256("transferFrom(address,address,uint256)")); /** * @dev executes the ERC20 token's `approve` function and reverts upon failure * the main purpose of this function is to prevent a non standard ERC20 token * from failing silently * * @param _token ERC20 token address * @param _spender approved address * @param _value allowance amount */ function safeApprove(IERC20Token _token, address _spender, uint256 _value) internal { (bool success, bytes memory data) = address(_token).call(abi.encodeWithSelector(APPROVE_FUNC_SELECTOR, _spender, _value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'ERR_APPROVE_FAILED'); } /** * @dev executes the ERC20 token's `transfer` function and reverts upon failure * the main purpose of this function is to prevent a non standard ERC20 token * from failing silently * * @param _token ERC20 token address * @param _to target address * @param _value transfer amount */ function safeTransfer(IERC20Token _token, address _to, uint256 _value) internal { (bool success, bytes memory data) = address(_token).call(abi.encodeWithSelector(TRANSFER_FUNC_SELECTOR, _to, _value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'ERR_TRANSFER_FAILED'); } /** * @dev executes the ERC20 token's `transferFrom` function and reverts upon failure * the main purpose of this function is to prevent a non standard ERC20 token * from failing silently * * @param _token ERC20 token address * @param _from source address * @param _to target address * @param _value transfer amount */ function safeTransferFrom(IERC20Token _token, address _from, address _to, uint256 _value) internal { (bool success, bytes memory data) = address(_token).call(abi.encodeWithSelector(TRANSFER_FROM_FUNC_SELECTOR, _from, _to, _value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'ERR_TRANSFER_FROM_FAILED'); } } // File: solidity/contracts/utility/interfaces/ITokenHolder.sol pragma solidity 0.6.12; /* Token Holder interface */ interface ITokenHolder is IOwned { function withdrawTokens(IERC20Token _token, address _to, uint256 _amount) external; } // File: solidity/contracts/utility/TokenHolder.sol pragma solidity 0.6.12; /** * @dev We consider every contract to be a 'token holder' since it's currently not possible * for a contract to deny receiving tokens. * * The TokenHolder's contract sole purpose is to provide a safety mechanism that allows * the owner to send tokens that were sent to the contract by mistake back to their sender. * * Note that we use the non standard ERC-20 interface which has no return value for transfer * in order to support both non standard as well as standard token contracts. * see https://github.com/ethereum/solidity/issues/4116 */ contract TokenHolder is ITokenHolder, TokenHandler, Owned, Utils { /** * @dev withdraws tokens held by the contract and sends them to an account * can only be called by the owner * * @param _token ERC20 token contract address * @param _to account to receive the new amount * @param _amount amount to withdraw */ function withdrawTokens(IERC20Token _token, address _to, uint256 _amount) public virtual override ownerOnly validAddress(address(_token)) validAddress(_to) notThis(_to) { safeTransfer(_token, _to, _amount); } } // File: solidity/contracts/token/interfaces/IEtherToken.sol pragma solidity 0.6.12; /* Ether Token interface */ interface IEtherToken is IERC20Token { function deposit() external payable; function withdraw(uint256 _amount) external; function depositTo(address _to) external payable; function withdrawTo(address payable _to, uint256 _amount) external; } // File: solidity/contracts/bancorx/interfaces/IBancorX.sol pragma solidity 0.6.12; interface IBancorX { function token() external view returns (IERC20Token); function xTransfer(bytes32 _toBlockchain, bytes32 _to, uint256 _amount, uint256 _id) external; function getXTransferAmount(uint256 _xTransferId, address _for) external view returns (uint256); } // File: solidity/contracts/converter/ConverterBase.sol pragma solidity 0.6.12; /** * @dev ConverterBase * * The converter contains the main logic for conversions between different ERC20 tokens. * * It is also the upgradable part of the mechanism (note that upgrades are opt-in). * * The anchor must be set on construction and cannot be changed afterwards. * Wrappers are provided for some of the anchor's functions, for easier access. * * Once the converter accepts ownership of the anchor, it becomes the anchor's sole controller * and can execute any of its functions. * * To upgrade the converter, anchor ownership must be transferred to a new converter, along with * any relevant data. * * Note that the converter can transfer anchor ownership to a new converter that * doesn't allow upgrades anymore, for finalizing the relationship between the converter * and the anchor. * * Converter types (defined as uint16 type) - * 0 = liquid token converter * 1 = liquidity pool v1 converter * 2 = liquidity pool v2 converter * * Note that converters don't currently support tokens with transfer fees. */ abstract contract ConverterBase is IConverter, TokenHandler, TokenHolder, ContractRegistryClient, ReentrancyGuard { using SafeMath for uint256; uint32 internal constant PPM_RESOLUTION = 1000000; IERC20Token internal constant ETH_RESERVE_ADDRESS = IERC20Token(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE); struct Reserve { uint256 balance; // reserve balance uint32 weight; // reserve weight, represented in ppm, 1-1000000 bool deprecated1; // deprecated bool deprecated2; // deprecated bool isSet; // true if the reserve is valid, false otherwise } /** * @dev version number */ uint16 public constant version = 40; IConverterAnchor public override anchor; // converter anchor contract IWhitelist public override conversionWhitelist; // whitelist contract with list of addresses that are allowed to use the converter IERC20Token[] public reserveTokens; // ERC20 standard token addresses (prior version 17, use 'connectorTokens' instead) mapping (IERC20Token => Reserve) public reserves; // reserve token addresses -> reserve data (prior version 17, use 'connectors' instead) uint32 public reserveRatio = 0; // ratio between the reserves and the market cap, equal to the total reserve weights uint32 public override maxConversionFee = 0; // maximum conversion fee for the lifetime of the contract, // represented in ppm, 0...1000000 (0 = no fee, 100 = 0.01%, 1000000 = 100%) uint32 public override conversionFee = 0; // current conversion fee, represented in ppm, 0...maxConversionFee bool public constant conversionsEnabled = true; // deprecated, backward compatibility /** * @dev triggered when the converter is activated * * @param _type converter type * @param _anchor converter anchor * @param _activated true if the converter was activated, false if it was deactivated */ event Activation(uint16 indexed _type, IConverterAnchor indexed _anchor, bool indexed _activated); /** * @dev triggered when a conversion between two tokens occurs * * @param _fromToken source ERC20 token * @param _toToken target ERC20 token * @param _trader wallet that initiated the trade * @param _amount amount converted, in the source token * @param _return amount returned, minus conversion fee * @param _conversionFee conversion fee */ event Conversion( IERC20Token indexed _fromToken, IERC20Token indexed _toToken, address indexed _trader, uint256 _amount, uint256 _return, int256 _conversionFee ); /** * @dev triggered when the rate between two tokens in the converter changes * note that the event might be dispatched for rate updates between any two tokens in the converter * note that prior to version 28, you should use the 'PriceDataUpdate' event instead * * @param _token1 address of the first token * @param _token2 address of the second token * @param _rateN rate of 1 unit of `_token1` in `_token2` (numerator) * @param _rateD rate of 1 unit of `_token1` in `_token2` (denominator) */ event TokenRateUpdate( IERC20Token indexed _token1, IERC20Token indexed _token2, uint256 _rateN, uint256 _rateD ); /** * @dev triggered when the conversion fee is updated * * @param _prevFee previous fee percentage, represented in ppm * @param _newFee new fee percentage, represented in ppm */ event ConversionFeeUpdate(uint32 _prevFee, uint32 _newFee); /** * @dev used by sub-contracts to initialize a new converter * * @param _anchor anchor governed by the converter * @param _registry address of a contract registry contract * @param _maxConversionFee maximum conversion fee, represented in ppm */ constructor( IConverterAnchor _anchor, IContractRegistry _registry, uint32 _maxConversionFee ) validAddress(address(_anchor)) ContractRegistryClient(_registry) internal validConversionFee(_maxConversionFee) { anchor = _anchor; maxConversionFee = _maxConversionFee; } // ensures that the converter is active modifier active() { _active(); _; } // error message binary size optimization function _active() internal view { require(isActive(), "ERR_INACTIVE"); } // ensures that the converter is not active modifier inactive() { _inactive(); _; } // error message binary size optimization function _inactive() internal view { require(!isActive(), "ERR_ACTIVE"); } // validates a reserve token address - verifies that the address belongs to one of the reserve tokens modifier validReserve(IERC20Token _address) { _validReserve(_address); _; } // error message binary size optimization function _validReserve(IERC20Token _address) internal view { require(reserves[_address].isSet, "ERR_INVALID_RESERVE"); } // validates conversion fee modifier validConversionFee(uint32 _conversionFee) { _validConversionFee(_conversionFee); _; } // error message binary size optimization function _validConversionFee(uint32 _conversionFee) internal pure { require(_conversionFee <= PPM_RESOLUTION, "ERR_INVALID_CONVERSION_FEE"); } // validates reserve weight modifier validReserveWeight(uint32 _weight) { _validReserveWeight(_weight); _; } // error message binary size optimization function _validReserveWeight(uint32 _weight) internal pure { require(_weight > 0 && _weight <= PPM_RESOLUTION, "ERR_INVALID_RESERVE_WEIGHT"); } // overrides interface declaration function converterType() public pure virtual override returns (uint16); // overrides interface declaration function targetAmountAndFee(IERC20Token _sourceToken, IERC20Token _targetToken, uint256 _amount) public view virtual override returns (uint256, uint256); /** * @dev deposits ether * can only be called if the converter has an ETH reserve */ receive() external override payable { require(reserves[ETH_RESERVE_ADDRESS].isSet, "ERR_INVALID_RESERVE"); // require(hasETHReserve(), "ERR_INVALID_RESERVE"); // a workaround for a problem when running solidity-coverage // see https://github.com/sc-forks/solidity-coverage/issues/487 } /** * @dev withdraws ether * can only be called by the owner if the converter is inactive or by upgrader contract * can only be called after the upgrader contract has accepted the ownership of this contract * can only be called if the converter has an ETH reserve * * @param _to address to send the ETH to */ function withdrawETH(address payable _to) public override virtual protected ownerOnly validReserve(ETH_RESERVE_ADDRESS) { address converterUpgrader = addressOf(CONVERTER_UPGRADER); // verify that the converter is inactive or that the owner is the upgrader contract require(!isActive() || owner == converterUpgrader, "ERR_ACCESS_DENIED"); _to.transfer(address(this).balance); // sync the ETH reserve balance syncReserveBalance(ETH_RESERVE_ADDRESS); } /** * @dev checks whether or not the converter version is 28 or higher * * @return true, since the converter version is 28 or higher */ function isV28OrHigher() public pure returns (bool) { return true; } /** * @dev allows the owner to update & enable the conversion whitelist contract address * when set, only addresses that are whitelisted are actually allowed to use the converter * note that the whitelist check is actually done by the BancorNetwork contract * * @param _whitelist address of a whitelist contract */ function setConversionWhitelist(IWhitelist _whitelist) public override ownerOnly notThis(address(_whitelist)) { conversionWhitelist = _whitelist; } /** * @dev returns true if the converter is active, false otherwise * * @return true if the converter is active, false otherwise */ function isActive() public view virtual override returns (bool) { return anchor.owner() == address(this); } /** * @dev transfers the anchor ownership * the new owner needs to accept the transfer * can only be called by the converter upgrder while the upgrader is the owner * note that prior to version 28, you should use 'transferAnchorOwnership' instead * * @param _newOwner new token owner */ function transferAnchorOwnership(address _newOwner) public virtual override ownerOnly only(CONVERTER_UPGRADER) { anchor.transferOwnership(_newOwner); } /** * @dev accepts ownership of the anchor after an ownership transfer * most converters are also activated as soon as they accept the anchor ownership * can only be called by the contract owner * note that prior to version 28, you should use 'acceptTokenOwnership' instead */ function acceptAnchorOwnership() public virtual override ownerOnly { // verify the the converter has at least one reserve require(reserveTokenCount() > 0, "ERR_INVALID_RESERVE_COUNT"); anchor.acceptOwnership(); syncReserveBalances(); } /** * @dev updates the current conversion fee * can only be called by the contract owner * * @param _conversionFee new conversion fee, represented in ppm */ function setConversionFee(uint32 _conversionFee) public override ownerOnly { require(_conversionFee <= maxConversionFee, "ERR_INVALID_CONVERSION_FEE"); emit ConversionFeeUpdate(conversionFee, _conversionFee); conversionFee = _conversionFee; } /** * @dev withdraws tokens held by the converter and sends them to an account * can only be called by the owner * note that reserve tokens can only be withdrawn by the owner while the converter is inactive * unless the owner is the converter upgrader contract * * @param _token ERC20 token contract address * @param _to account to receive the new amount * @param _amount amount to withdraw */ function withdrawTokens(IERC20Token _token, address _to, uint256 _amount) public virtual override(IConverter, TokenHolder) protected ownerOnly { address converterUpgrader = addressOf(CONVERTER_UPGRADER); // if the token is not a reserve token, allow withdrawal // otherwise verify that the converter is inactive or that the owner is the upgrader contract require(!reserves[_token].isSet || !isActive() || owner == converterUpgrader, "ERR_ACCESS_DENIED"); super.withdrawTokens(_token, _to, _amount); // if the token is a reserve token, sync the reserve balance if (reserves[_token].isSet) syncReserveBalance(_token); } /** * @dev upgrades the converter to the latest version * can only be called by the owner * note that the owner needs to call acceptOwnership on the new converter after the upgrade */ function upgrade() public ownerOnly { IConverterUpgrader converterUpgrader = IConverterUpgrader(addressOf(CONVERTER_UPGRADER)); // trigger de-activation event emit Activation(converterType(), anchor, false); transferOwnership(address(converterUpgrader)); converterUpgrader.upgrade(version); acceptOwnership(); } /** * @dev returns the number of reserve tokens defined * note that prior to version 17, you should use 'connectorTokenCount' instead * * @return number of reserve tokens */ function reserveTokenCount() public view returns (uint16) { return uint16(reserveTokens.length); } /** * @dev defines a new reserve token for the converter * can only be called by the owner while the converter is inactive * * @param _token address of the reserve token * @param _weight reserve weight, represented in ppm, 1-1000000 */ function addReserve(IERC20Token _token, uint32 _weight) public virtual override ownerOnly inactive validAddress(address(_token)) notThis(address(_token)) validReserveWeight(_weight) { // validate input require(address(_token) != address(anchor) && !reserves[_token].isSet, "ERR_INVALID_RESERVE"); require(_weight <= PPM_RESOLUTION - reserveRatio, "ERR_INVALID_RESERVE_WEIGHT"); require(reserveTokenCount() < uint16(-1), "ERR_INVALID_RESERVE_COUNT"); Reserve storage newReserve = reserves[_token]; newReserve.balance = 0; newReserve.weight = _weight; newReserve.isSet = true; reserveTokens.push(_token); reserveRatio += _weight; } /** * @dev returns the reserve's weight * added in version 28 * * @param _reserveToken reserve token contract address * * @return reserve weight */ function reserveWeight(IERC20Token _reserveToken) public view validReserve(_reserveToken) returns (uint32) { return reserves[_reserveToken].weight; } /** * @dev returns the reserve's balance * note that prior to version 17, you should use 'getConnectorBalance' instead * * @param _reserveToken reserve token contract address * * @return reserve balance */ function reserveBalance(IERC20Token _reserveToken) public override view validReserve(_reserveToken) returns (uint256) { return reserves[_reserveToken].balance; } /** * @dev checks whether or not the converter has an ETH reserve * * @return true if the converter has an ETH reserve, false otherwise */ function hasETHReserve() public view returns (bool) { return reserves[ETH_RESERVE_ADDRESS].isSet; } /** * @dev converts a specific amount of source tokens to target tokens * can only be called by the bancor network contract * * @param _sourceToken source ERC20 token * @param _targetToken target ERC20 token * @param _amount amount of tokens to convert (in units of the source token) * @param _trader address of the caller who executed the conversion * @param _beneficiary wallet to receive the conversion result * * @return amount of tokens received (in units of the target token) */ function convert(IERC20Token _sourceToken, IERC20Token _targetToken, uint256 _amount, address _trader, address payable _beneficiary) public override payable protected only(BANCOR_NETWORK) returns (uint256) { // validate input require(_sourceToken != _targetToken, "ERR_SAME_SOURCE_TARGET"); // if a whitelist is set, verify that both and trader and the beneficiary are whitelisted require(address(conversionWhitelist) == address(0) || (conversionWhitelist.isWhitelisted(_trader) && conversionWhitelist.isWhitelisted(_beneficiary)), "ERR_NOT_WHITELISTED"); return doConvert(_sourceToken, _targetToken, _amount, _trader, _beneficiary); } /** * @dev converts a specific amount of source tokens to target tokens * called by ConverterBase and allows the inherited contracts to implement custom conversion logic * * @param _sourceToken source ERC20 token * @param _targetToken target ERC20 token * @param _amount amount of tokens to convert (in units of the source token) * @param _trader address of the caller who executed the conversion * @param _beneficiary wallet to receive the conversion result * * @return amount of tokens received (in units of the target token) */ function doConvert( IERC20Token _sourceToken, IERC20Token _targetToken, uint256 _amount, address _trader, address payable _beneficiary) internal virtual returns (uint256); /** * @dev returns the conversion fee for a given target amount * * @param _targetAmount target amount * * @return conversion fee */ function calculateFee(uint256 _targetAmount) internal view returns (uint256) { return _targetAmount.mul(conversionFee).div(PPM_RESOLUTION); } /** * @dev syncs the stored reserve balance for a given reserve with the real reserve balance * * @param _reserveToken address of the reserve token */ function syncReserveBalance(IERC20Token _reserveToken) internal validReserve(_reserveToken) { if (_reserveToken == ETH_RESERVE_ADDRESS) reserves[_reserveToken].balance = address(this).balance; else reserves[_reserveToken].balance = _reserveToken.balanceOf(address(this)); } /** * @dev syncs all stored reserve balances */ function syncReserveBalances() internal { uint256 reserveCount = reserveTokens.length; for (uint256 i = 0; i < reserveCount; i++) syncReserveBalance(reserveTokens[i]); } /** * @dev helper, dispatches the Conversion event * * @param _sourceToken source ERC20 token * @param _targetToken target ERC20 token * @param _trader address of the caller who executed the conversion * @param _amount amount purchased/sold (in the source token) * @param _returnAmount amount returned (in the target token) */ function dispatchConversionEvent( IERC20Token _sourceToken, IERC20Token _targetToken, address _trader, uint256 _amount, uint256 _returnAmount, uint256 _feeAmount) internal { // fee amount is converted to 255 bits - // negative amount means the fee is taken from the source token, positive amount means its taken from the target token // currently the fee is always taken from the target token // since we convert it to a signed number, we first ensure that it's capped at 255 bits to prevent overflow assert(_feeAmount < 2 ** 255); emit Conversion(_sourceToken, _targetToken, _trader, _amount, _returnAmount, int256(_feeAmount)); } /** * @dev deprecated since version 28, backward compatibility - use only for earlier versions */ function token() public view override returns (IConverterAnchor) { return anchor; } /** * @dev deprecated, backward compatibility */ function transferTokenOwnership(address _newOwner) public override ownerOnly { transferAnchorOwnership(_newOwner); } /** * @dev deprecated, backward compatibility */ function acceptTokenOwnership() public override ownerOnly { acceptAnchorOwnership(); } /** * @dev deprecated, backward compatibility */ function connectors(IERC20Token _address) public view override returns (uint256, uint32, bool, bool, bool) { Reserve memory reserve = reserves[_address]; return(reserve.balance, reserve.weight, false, false, reserve.isSet); } /** * @dev deprecated, backward compatibility */ function connectorTokens(uint256 _index) public view override returns (IERC20Token) { return ConverterBase.reserveTokens[_index]; } /** * @dev deprecated, backward compatibility */ function connectorTokenCount() public view override returns (uint16) { return reserveTokenCount(); } /** * @dev deprecated, backward compatibility */ function getConnectorBalance(IERC20Token _connectorToken) public view override returns (uint256) { return reserveBalance(_connectorToken); } /** * @dev deprecated, backward compatibility */ function getReturn(IERC20Token _sourceToken, IERC20Token _targetToken, uint256 _amount) public view returns (uint256, uint256) { return targetAmountAndFee(_sourceToken, _targetToken, _amount); } } // File: solidity/contracts/token/interfaces/IDSToken.sol pragma solidity 0.6.12; /* DSToken interface */ interface IDSToken is IConverterAnchor, IERC20Token { function issue(address _to, uint256 _amount) external; function destroy(address _from, uint256 _amount) external; } // File: solidity/contracts/converter/types/liquid-token/LiquidTokenConverter.sol pragma solidity 0.6.12; /** * @dev Liquid Token Converter * * The liquid token converter is a specialized version of a converter that manages a liquid token. * * The converters govern a token with a single reserve and allow converting between the two. * Liquid tokens usually have fractional reserve (reserve ratio smaller than 100%). */ contract LiquidTokenConverter is ConverterBase { /** * @dev initializes a new LiquidTokenConverter instance * * @param _token liquid token governed by the converter * @param _registry address of a contract registry contract * @param _maxConversionFee maximum conversion fee, represented in ppm */ constructor( IDSToken _token, IContractRegistry _registry, uint32 _maxConversionFee ) ConverterBase(_token, _registry, _maxConversionFee) public { } /** * @dev returns the converter type * * @return see the converter types in the the main contract doc */ function converterType() public pure override returns (uint16) { return 0; } /** * @dev accepts ownership of the anchor after an ownership transfer * also activates the converter * can only be called by the contract owner * note that prior to version 28, you should use 'acceptTokenOwnership' instead */ function acceptAnchorOwnership() public override ownerOnly { super.acceptAnchorOwnership(); emit Activation(converterType(), anchor, true); } /** * @dev defines the reserve token for the converter * can only be called by the owner while the converter is inactive and the * reserve wasn't defined yet * * @param _token address of the reserve token * @param _weight reserve weight, represented in ppm, 1-1000000 */ function addReserve(IERC20Token _token, uint32 _weight) public override ownerOnly { // verify that the converter doesn't have a reserve yet require(reserveTokenCount() == 0, "ERR_INVALID_RESERVE_COUNT"); super.addReserve(_token, _weight); } /** * @dev returns the expected target amount of converting the source token to the * target token along with the fee * * @param _sourceToken contract address of the source token * @param _targetToken contract address of the target token * @param _amount amount of tokens received from the user * * @return expected target amount * @return expected fee */ function targetAmountAndFee(IERC20Token _sourceToken, IERC20Token _targetToken, uint256 _amount) public view override returns (uint256, uint256) { if (_targetToken == IDSToken(address(anchor)) && reserves[_sourceToken].isSet) return purchaseTargetAmount(_amount); if (_sourceToken == IDSToken(address(anchor)) && reserves[_targetToken].isSet) return saleTargetAmount(_amount); // invalid input revert("ERR_INVALID_TOKEN"); } /** * @dev converts between the liquid token and its reserve * can only be called by the bancor network contract * * @param _sourceToken source ERC20 token * @param _targetToken target ERC20 token * @param _amount amount of tokens to convert (in units of the source token) * @param _trader address of the caller who executed the conversion * @param _beneficiary wallet to receive the conversion result * * @return amount of tokens received (in units of the target token) */ function doConvert(IERC20Token _sourceToken, IERC20Token _targetToken, uint256 _amount, address _trader, address payable _beneficiary) internal override returns (uint256) { uint256 targetAmount; IERC20Token reserveToken; if (_targetToken == IDSToken(address(anchor)) && reserves[_sourceToken].isSet) { reserveToken = _sourceToken; targetAmount = buy(_amount, _trader, _beneficiary); } else if (_sourceToken == IDSToken(address(anchor)) && reserves[_targetToken].isSet) { reserveToken = _targetToken; targetAmount = sell(_amount, _trader, _beneficiary); } else { // invalid input revert("ERR_INVALID_TOKEN"); } // dispatch rate update for the liquid token uint256 totalSupply = IDSToken(address(anchor)).totalSupply(); uint32 reserveWeight = reserves[reserveToken].weight; emit TokenRateUpdate(IDSToken(address(anchor)), reserveToken, reserveBalance(reserveToken).mul(PPM_RESOLUTION), totalSupply.mul(reserveWeight)); return targetAmount; } /** * @dev returns the expected target amount of buying with a given amount of tokens * * @param _amount amount of reserve tokens to get the target amount for * * @return amount of liquid tokens that the user will receive * @return amount of liquid tokens that the user will pay as fee */ function purchaseTargetAmount(uint256 _amount) internal view active returns (uint256, uint256) { uint256 totalSupply = IDSToken(address(anchor)).totalSupply(); IERC20Token reserveToken = reserveTokens[0]; // if the current supply is zero, then return the input amount divided by the normalized reserve-weight if (totalSupply == 0) return (_amount.mul(PPM_RESOLUTION).div(reserves[reserveToken].weight), 0); uint256 amount = IBancorFormula(addressOf(BANCOR_FORMULA)).purchaseTargetAmount( totalSupply, reserveBalance(reserveToken), reserves[reserveToken].weight, _amount ); // return the amount minus the conversion fee and the conversion fee uint256 fee = calculateFee(amount); return (amount - fee, fee); } /** * @dev returns the expected target amount of selling a given amount of tokens * * @param _amount amount of liquid tokens to get the target amount for * * @return expected reserve tokens * @return expected fee */ function saleTargetAmount(uint256 _amount) internal view active returns (uint256, uint256) { uint256 totalSupply = IDSToken(address(anchor)).totalSupply(); IERC20Token reserveToken = reserveTokens[0]; // if selling the entire supply, then return the entire reserve if (totalSupply == _amount) return (reserveBalance(reserveToken), 0); uint256 amount = IBancorFormula(addressOf(BANCOR_FORMULA)).saleTargetAmount( totalSupply, reserveBalance(reserveToken), reserves[reserveToken].weight, _amount ); // return the amount minus the conversion fee and the conversion fee uint256 fee = calculateFee(amount); return (amount - fee, fee); } /** * @dev buys the liquid token by depositing in its reserve * * @param _amount amount of reserve token to buy the token for * @param _trader address of the caller who executed the conversion * @param _beneficiary wallet to receive the conversion result * * @return amount of liquid tokens received */ function buy(uint256 _amount, address _trader, address _beneficiary) internal returns (uint256) { // get expected target amount and fee (uint256 amount, uint256 fee) = purchaseTargetAmount(_amount); // ensure the trade gives something in return require(amount != 0, "ERR_ZERO_TARGET_AMOUNT"); IERC20Token reserveToken = reserveTokens[0]; // ensure that the input amount was already deposited if (reserveToken == ETH_RESERVE_ADDRESS) require(msg.value == _amount, "ERR_ETH_AMOUNT_MISMATCH"); else require(msg.value == 0 && reserveToken.balanceOf(address(this)).sub(reserveBalance(reserveToken)) >= _amount, "ERR_INVALID_AMOUNT"); // sync the reserve balance syncReserveBalance(reserveToken); // issue new funds to the beneficiary in the liquid token IDSToken(address(anchor)).issue(_beneficiary, amount); // dispatch the conversion event dispatchConversionEvent(reserveToken, IDSToken(address(anchor)), _trader, _amount, amount, fee); return amount; } /** * @dev sells the liquid token by withdrawing from its reserve * * @param _amount amount of liquid tokens to sell * @param _trader address of the caller who executed the conversion * @param _beneficiary wallet to receive the conversion result * * @return amount of reserve tokens received */ function sell(uint256 _amount, address _trader, address payable _beneficiary) internal returns (uint256) { // ensure that the input amount was already deposited require(_amount <= IDSToken(address(anchor)).balanceOf(address(this)), "ERR_INVALID_AMOUNT"); // get expected target amount and fee (uint256 amount, uint256 fee) = saleTargetAmount(_amount); // ensure the trade gives something in return require(amount != 0, "ERR_ZERO_TARGET_AMOUNT"); IERC20Token reserveToken = reserveTokens[0]; // ensure that the trade will only deplete the reserve balance if the total supply is depleted as well uint256 tokenSupply = IDSToken(address(anchor)).totalSupply(); uint256 rsvBalance = reserveBalance(reserveToken); assert(amount < rsvBalance || (amount == rsvBalance && _amount == tokenSupply)); // destroy the tokens from the converter balance in the liquid token IDSToken(address(anchor)).destroy(address(this), _amount); // update the reserve balance reserves[reserveToken].balance = reserves[reserveToken].balance.sub(amount); // transfer funds to the beneficiary in the reserve token if (reserveToken == ETH_RESERVE_ADDRESS) _beneficiary.transfer(amount); else safeTransfer(reserveToken, _beneficiary, amount); // dispatch the conversion event dispatchConversionEvent(IDSToken(address(anchor)), reserveToken, _trader, _amount, amount, fee); return amount; } } // File: solidity/contracts/converter/types/liquid-token/DynamicLiquidTokenConverter.sol pragma solidity 0.6.12; /** * @dev Liquid Token Converter * * The dynamic liquid token converter is a specialized version of a converter that manages a liquid token * and allows for a reduction in reserve weight within a predefined set of boundaries. * * The converters govern a token with a single reserve and allow converting between the two. * Liquid tokens usually have fractional reserve (reserve ratio smaller than 100%). * The weight can be reduced by the defined stepWeight any time the defined marketCapThreshold * has been reached. */ contract DynamicLiquidTokenConverter is LiquidTokenConverter { uint32 public minimumWeight = 30000; uint32 public stepWeight = 10000; uint256 public marketCapThreshold = 10000 ether; uint256 lastWeightAdjustmentMarketCap = 0; event ReserveTokenWeightUpdate(uint32 _prevWeight, uint32 _newWeight, uint256 _percentage, uint256 _balance); /** * @dev initializes a new DyamicLiquidTokenConverter instance * * @param _token liquid token governed by the converter * @param _registry address of a contract registry contract * @param _maxConversionFee maximum conversion fee, represented in ppm */ constructor( IDSToken _token, IContractRegistry _registry, uint32 _maxConversionFee ) LiquidTokenConverter(_token, _registry, _maxConversionFee) public { } /** * @dev updates the market cap threshold * can only be called by the owner while inactive * * @param _marketCapThreshold new threshold */ function setMarketCapThreshold(uint256 _marketCapThreshold) public ownerOnly inactive { marketCapThreshold = _marketCapThreshold; } /** * @dev updates the current minimum weight * can only be called by the owner while inactive * * @param _minimumWeight new minimum weight, represented in ppm */ function setMinimumWeight(uint32 _minimumWeight) public ownerOnly inactive { minimumWeight = _minimumWeight; } /** * @dev updates the current step weight * can only be called by the owner while inactive * * @param _stepWeight new step weight, represented in ppm */ function setStepWeight(uint32 _stepWeight) public ownerOnly inactive { stepWeight = _stepWeight; } /** * @dev updates the token reserve weight * can only be called by the owner * * @param _reserveToken address of the reserve token */ function reduceWeight(IERC20Token _reserveToken) public validReserve(_reserveToken) ownerOnly { uint256 currentMarketCap = getMarketCap(_reserveToken); require(currentMarketCap > (lastWeightAdjustmentMarketCap.add(marketCapThreshold)), "ERR_MARKET_CAP_BELOW_THRESHOLD"); Reserve storage reserve = reserves[_reserveToken]; uint256 newWeight = uint256(reserve.weight).sub(stepWeight); uint32 oldWeight = reserve.weight; require(newWeight >= minimumWeight, "ERR_INVALID_RESERVE_WEIGHT"); uint256 percentage = uint256(PPM_RESOLUTION).sub(newWeight.mul(1e6).div(reserve.weight)); uint32 weight = uint32(newWeight); reserve.weight = weight; reserveRatio = weight; uint256 balance = reserveBalance(_reserveToken).mul(percentage).div(1e6); if (_reserveToken == ETH_RESERVE_ADDRESS) msg.sender.transfer(balance); else safeTransfer(_reserveToken, msg.sender, balance); lastWeightAdjustmentMarketCap = currentMarketCap; syncReserveBalance(_reserveToken); emit ReserveTokenWeightUpdate(oldWeight, weight, percentage, reserve.balance); } function getMarketCap(IERC20Token _reserveToken) public view returns(uint256) { Reserve storage reserve = reserves[_reserveToken]; return reserveBalance(_reserveToken).mul(1e6).div(reserve.weight); } /** * Upgrade functions. Overriden to allow upgrades by owner. **/ /** * @dev withdraws ether * can only be called by the owner * can only be called if the converter has an ETH reserve * * @param _to address to send the ETH to */ function withdrawETH(address payable _to) public override protected ownerOnly validReserve(ETH_RESERVE_ADDRESS) { _to.transfer(address(this).balance); // sync the ETH reserve balance syncReserveBalance(ETH_RESERVE_ADDRESS); } /** * @dev transfers the anchor ownership * the new owner needs to accept the transfer * * @param _newOwner new token owner */ function transferAnchorOwnership(address _newOwner) public override ownerOnly { anchor.transferOwnership(_newOwner); } /** * @dev withdraws tokens held by the converter and sends them to an account * can only be called by the owner * * @param _token ERC20 token contract address * @param _to account to receive the new amount * @param _amount amount to withdraw */ function withdrawTokens(IERC20Token _token, address _to, uint256 _amount) public override protected ownerOnly { TokenHolder.withdrawTokens(_token, _to, _amount); // if the token is a reserve token, sync the reserve balance if (reserves[_token].isSet) syncReserveBalance(_token); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IDSToken","name":"_token","type":"address"},{"internalType":"contract IContractRegistry","name":"_registry","type":"address"},{"internalType":"uint32","name":"_maxConversionFee","type":"uint32"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint16","name":"_type","type":"uint16"},{"indexed":true,"internalType":"contract IConverterAnchor","name":"_anchor","type":"address"},{"indexed":true,"internalType":"bool","name":"_activated","type":"bool"}],"name":"Activation","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IERC20Token","name":"_fromToken","type":"address"},{"indexed":true,"internalType":"contract IERC20Token","name":"_toToken","type":"address"},{"indexed":true,"internalType":"address","name":"_trader","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_return","type":"uint256"},{"indexed":false,"internalType":"int256","name":"_conversionFee","type":"int256"}],"name":"Conversion","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"_prevFee","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"_newFee","type":"uint32"}],"name":"ConversionFeeUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_prevOwner","type":"address"},{"indexed":true,"internalType":"address","name":"_newOwner","type":"address"}],"name":"OwnerUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"_prevWeight","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"_newWeight","type":"uint32"},{"indexed":false,"internalType":"uint256","name":"_percentage","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_balance","type":"uint256"}],"name":"ReserveTokenWeightUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IERC20Token","name":"_token1","type":"address"},{"indexed":true,"internalType":"contract IERC20Token","name":"_token2","type":"address"},{"indexed":false,"internalType":"uint256","name":"_rateN","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_rateD","type":"uint256"}],"name":"TokenRateUpdate","type":"event"},{"inputs":[],"name":"acceptAnchorOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"acceptTokenOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20Token","name":"_token","type":"address"},{"internalType":"uint32","name":"_weight","type":"uint32"}],"name":"addReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"anchor","outputs":[{"internalType":"contract IConverterAnchor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"connectorTokenCount","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"connectorTokens","outputs":[{"internalType":"contract IERC20Token","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20Token","name":"_address","type":"address"}],"name":"connectors","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint32","name":"","type":"uint32"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"conversionFee","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"conversionWhitelist","outputs":[{"internalType":"contract IWhitelist","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"conversionsEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20Token","name":"_sourceToken","type":"address"},{"internalType":"contract IERC20Token","name":"_targetToken","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_trader","type":"address"},{"internalType":"address payable","name":"_beneficiary","type":"address"}],"name":"convert","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"converterType","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"contract IERC20Token","name":"_connectorToken","type":"address"}],"name":"getConnectorBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20Token","name":"_reserveToken","type":"address"}],"name":"getMarketCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20Token","name":"_sourceToken","type":"address"},{"internalType":"contract IERC20Token","name":"_targetToken","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"getReturn","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hasETHReserve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isV28OrHigher","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"marketCapThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxConversionFee","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumWeight","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"newOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"onlyOwnerCanUpdateRegistry","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"prevRegistry","outputs":[{"internalType":"contract IContractRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20Token","name":"_reserveToken","type":"address"}],"name":"reduceWeight","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"registry","outputs":[{"internalType":"contract IContractRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20Token","name":"_reserveToken","type":"address"}],"name":"reserveBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reserveRatio","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reserveTokenCount","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"reserveTokens","outputs":[{"internalType":"contract IERC20Token","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20Token","name":"_reserveToken","type":"address"}],"name":"reserveWeight","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20Token","name":"","type":"address"}],"name":"reserves","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint32","name":"weight","type":"uint32"},{"internalType":"bool","name":"deprecated1","type":"bool"},{"internalType":"bool","name":"deprecated2","type":"bool"},{"internalType":"bool","name":"isSet","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"restoreRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_onlyOwnerCanUpdateRegistry","type":"bool"}],"name":"restrictRegistryUpdate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_conversionFee","type":"uint32"}],"name":"setConversionFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IWhitelist","name":"_whitelist","type":"address"}],"name":"setConversionWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketCapThreshold","type":"uint256"}],"name":"setMarketCapThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_minimumWeight","type":"uint32"}],"name":"setMinimumWeight","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_stepWeight","type":"uint32"}],"name":"setStepWeight","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stepWeight","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20Token","name":"_sourceToken","type":"address"},{"internalType":"contract IERC20Token","name":"_targetToken","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"targetAmountAndFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IConverterAnchor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferAnchorOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferTokenOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"updateRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"upgrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"_to","type":"address"}],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20Token","name":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040526003805460ff60a81b19169055600880546001600160801b0319166d75300000000000000000000000001763ffffffff60801b191661027160841b17905569021e19e0c9bab24000006009556000600a553480156200006257600080fd5b506040516200353f3803806200353f833981810160405260608110156200008857600080fd5b5080516020820151604090920151600080546001600160a01b031916331790559091908282828282828180620000be8162000158565b50600280546001600160a01b039092166001600160a01b031992831681179091556003805490921617905582620000f58162000158565b816200010181620001b7565b5050600480546001600160a01b039094166001600160a01b031990941693909317909255506008805463ffffffff9092166401000000000263ffffffff60201b199092169190911790555062000216945050505050565b6001600160a01b038116620001b4576040805162461bcd60e51b815260206004820152601360248201527f4552525f494e56414c49445f4144445245535300000000000000000000000000604482015290519081900360640190fd5b50565b620f424063ffffffff82161115620001b4576040805162461bcd60e51b815260206004820152601a60248201527f4552525f494e56414c49445f434f4e56455253494f4e5f464545000000000000604482015290519081900360640190fd5b61331980620002266000396000f3fe6080604052600436106103035760003560e01c80638da5cb5b11610190578063d260529c116100dc578063d895951211610095578063ecbca55d1161006f578063ecbca55d14610b09578063f2fde38b14610b39578063f95e146c14610b6c578063fc0c546a14610b815761039a565b8063d895951214610a5d578063dc8de37914610a90578063e8dc12ff14610ac35761039a565b8063d260529c146109a3578063d3fb73b4146109b8578063d4ee1d90146109cd578063d55ec697146109e2578063d66bd524146109f7578063d79604c214610a2a5761039a565b8063bf75455811610149578063c9be579b11610123578063c9be579b14610907578063cdc91c6914610931578063d031370b14610946578063d146d31d146109705761039a565b8063bf754558146108ad578063c3e8dfa8146108c2578063c45d3d92146108f25761039a565b80638da5cb5b146107e657806394c275ad146107fb5780639b99a8e214610810578063ad16158214610825578063af94b8d814610855578063b4a176d3146108985761039a565b806349d10b641161024f57806367b6d57c1161020857806370b0aec5116101e257806370b0aec51461078057806371f52bf3146107a757806379ba5097146107bc5780637b103999146107d15761039a565b806367b6d57c146106db578063690d83201461070e5780636a49d2c4146107415761039a565b806349d10b64146106115780634af80f0e1461062657806354fd4d5014610659578063579cd3ca1461066e5780635e35359e1461068357806361cd756e146106c65761039a565b80631e1401f8116102bc5780632fe8a6ad116102965780632fe8a6ad146105a657806338a5e016146105bb5780633e8ff43f146105d057806340bf2fb7146105fc5761039a565b80631e1401f81461050257806321e6b53d1461055e57806322f3e2d4146105915761039a565b8063024c7ec71461039f5780630c7d5cd8146103cb5780630e53aae9146103f957806312c2aca41461046057806319b64015146104895780631cfab290146104cf5761039a565b3661039a5773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee60005260076020527fb2084a3e4595ccf007fb44245853374aaf0de960074375e8e0fb334712e94d0f54600160301b900460ff16610398576040805162461bcd60e51b81526020600482015260136024820152724552525f494e56414c49445f5245534552564560681b604482015290519081900360640190fd5b005b600080fd5b3480156103ab57600080fd5b50610398600480360360208110156103c257600080fd5b50351515610b96565b3480156103d757600080fd5b506103e0610bbc565b6040805163ffffffff9092168252519081900360200190f35b34801561040557600080fd5b5061042c6004803603602081101561041c57600080fd5b50356001600160a01b0316610bc8565b6040805195865263ffffffff9094166020860152911515848401521515606084015215156080830152519081900360a00190f35b34801561046c57600080fd5b50610475610c60565b604080519115158252519081900360200190f35b34801561049557600080fd5b506104b3600480360360208110156104ac57600080fd5b5035610cac565b604080516001600160a01b039092168252519081900360200190f35b3480156104db57600080fd5b506103e0600480360360208110156104f257600080fd5b50356001600160a01b0316610cd6565b34801561050e57600080fd5b506105456004803603606081101561052557600080fd5b506001600160a01b03813581169160208101359091169060400135610d08565b6040805192835260208301919091528051918290030190f35b34801561056a57600080fd5b506103986004803603602081101561058157600080fd5b50356001600160a01b0316610d23565b34801561059d57600080fd5b50610475610d37565b3480156105b257600080fd5b50610475610db6565b3480156105c757600080fd5b50610398610dc6565b3480156105dc57600080fd5b506105e5610dd8565b6040805161ffff9092168252519081900360200190f35b34801561060857600080fd5b506103e0610ddd565b34801561061d57600080fd5b50610398610df0565b34801561063257600080fd5b506103986004803603602081101561064957600080fd5b50356001600160a01b0316610ff8565b34801561066557600080fd5b506105e561102d565b34801561067a57600080fd5b506103e0611032565b34801561068f57600080fd5b50610398600480360360608110156106a657600080fd5b506001600160a01b03813581169160208101359091169060400135611045565b3480156106d257600080fd5b506104b36110b9565b3480156106e757600080fd5b50610398600480360360208110156106fe57600080fd5b50356001600160a01b03166110c8565b34801561071a57600080fd5b506103986004803603602081101561073157600080fd5b50356001600160a01b031661114f565b34801561074d57600080fd5b506103986004803603604081101561076457600080fd5b5080356001600160a01b0316906020013563ffffffff166111f4565b34801561078c57600080fd5b50610795611264565b60408051918252519081900360200190f35b3480156107b357600080fd5b506105e561126a565b3480156107c857600080fd5b50610398611279565b3480156107dd57600080fd5b506104b3611330565b3480156107f257600080fd5b506104b361133f565b34801561080757600080fd5b506103e061134e565b34801561081c57600080fd5b506105e5611362565b34801561083157600080fd5b506103986004803603602081101561084857600080fd5b503563ffffffff16611368565b34801561086157600080fd5b506105456004803603606081101561087857600080fd5b506001600160a01b0381358116916020810135909116906040013561139e565b3480156108a457600080fd5b50610398611487565b3480156108b957600080fd5b506104756114b3565b3480156108ce57600080fd5b50610398600480360360208110156108e557600080fd5b503563ffffffff166114b8565b3480156108fe57600080fd5b506104b36114ee565b34801561091357600080fd5b506103986004803603602081101561092a57600080fd5b50356114fd565b34801561093d57600080fd5b50610398611512565b34801561095257600080fd5b506104b36004803603602081101561096957600080fd5b503561156b565b34801561097c57600080fd5b506107956004803603602081101561099357600080fd5b50356001600160a01b0316611592565b3480156109af57600080fd5b506104756115dc565b3480156109c457600080fd5b506104b36115e1565b3480156109d957600080fd5b506104b36115f0565b3480156109ee57600080fd5b506103986115ff565b348015610a0357600080fd5b5061042c60048036036020811015610a1a57600080fd5b50356001600160a01b03166116ed565b348015610a3657600080fd5b5061039860048036036020811015610a4d57600080fd5b50356001600160a01b0316611730565b348015610a6957600080fd5b5061079560048036036020811015610a8057600080fd5b50356001600160a01b03166119a9565b348015610a9c57600080fd5b5061079560048036036020811015610ab357600080fd5b50356001600160a01b03166119ba565b610795600480360360a0811015610ad957600080fd5b506001600160a01b03813581169160208101358216916040820135916060810135821691608090910135166119e3565b348015610b1557600080fd5b5061039860048036036020811015610b2c57600080fd5b503563ffffffff16611bf3565b348015610b4557600080fd5b5061039860048036036020811015610b5c57600080fd5b50356001600160a01b0316611cdb565b348015610b7857600080fd5b506103e0611d59565b348015610b8d57600080fd5b506104b3611d6c565b610b9e611d7b565b60038054911515600160a01b0260ff60a01b19909216919091179055565b60085463ffffffff1681565b6000806000806000610bd86132b5565b505050506001600160a01b03929092166000908152600760209081526040808320815160a081018352815480825260019092015463ffffffff811694820185905260ff64010000000082048116151594830194909452650100000000008104841615156060830152600160301b90049092161515608090920182905295919450919250829190565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee60005260076020527fb2084a3e4595ccf007fb44245853374aaf0de960074375e8e0fb334712e94d0f54600160301b900460ff1690565b600060068281548110610cbb57fe5b6000918252602090912001546001600160a01b031692915050565b600081610ce281611dce565b50506001600160a01b031660009081526007602052604090206001015463ffffffff1690565b600080610d1685858561139e565b915091505b935093915050565b610d2b611d7b565b610d34816110c8565b50565b6004805460408051638da5cb5b60e01b8152905160009330936001600160a01b031692638da5cb5b9281830192602092829003018186803b158015610d7b57600080fd5b505afa158015610d8f573d6000803e3d6000fd5b505050506040513d6020811015610da557600080fd5b50516001600160a01b031614905090565b600354600160a01b900460ff1681565b610dce611d7b565b610dd6611512565b565b600090565b600854600160601b900463ffffffff1681565b6000546001600160a01b0316331480610e135750600354600160a01b900460ff16155b610e58576040805162461bcd60e51b815260206004820152601160248201527011549497d050d0d154d4d7d11153925151607a1b604482015290519081900360640190fd5b6000610e766f436f6e7472616374526567697374727960801b611e3b565b6002549091506001600160a01b03808316911614801590610e9f57506001600160a01b03811615155b610ee7576040805162461bcd60e51b81526020600482015260146024820152734552525f494e56414c49445f524547495354525960601b604482015290519081900360640190fd5b60006001600160a01b0316816001600160a01b031663bb34534c6f436f6e7472616374526567697374727960801b6040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015610f4957600080fd5b505afa158015610f5d573d6000803e3d6000fd5b505050506040513d6020811015610f7357600080fd5b50516001600160a01b03161415610fc8576040805162461bcd60e51b81526020600482015260146024820152734552525f494e56414c49445f524547495354525960601b604482015290519081900360640190fd5b60028054600380546001600160a01b038084166001600160a01b0319928316179092559091169216919091179055565b611000611d7b565b8061100a81611eb9565b50600580546001600160a01b0319166001600160a01b0392909216919091179055565b602881565b600854600160401b900463ffffffff1681565b61104d611f0d565b6003805460ff60a81b1916600160a81b179055611068611d7b565b611073838383611f5d565b6001600160a01b038316600090815260076020526040902060010154600160301b900460ff16156110a7576110a783611f96565b50506003805460ff60a81b1916905550565b6003546001600160a01b031681565b6110d0611d7b565b600460009054906101000a90046001600160a01b03166001600160a01b031663f2fde38b826040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b15801561113457600080fd5b505af1158015611148573d6000803e3d6000fd5b5050505050565b611157611f0d565b6003805460ff60a81b1916600160a81b179055611172611d7b565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee61119081611dce565b6040516001600160a01b038316904780156108fc02916000818181858888f193505050501580156111c5573d6000803e3d6000fd5b506111e373eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee611f96565b50506003805460ff60a81b19169055565b6111fc611d7b565b611204611362565b61ffff1615611256576040805162461bcd60e51b815260206004820152601960248201527811549497d253959053125117d49154d154959157d0d3d55395603a1b604482015290519081900360640190fd5b6112608282612074565b5050565b60095481565b6000611274611362565b905090565b6001546001600160a01b031633146112cc576040805162461bcd60e51b815260206004820152601160248201527011549497d050d0d154d4d7d11153925151607a1b604482015290519081900360640190fd5b600154600080546040516001600160a01b0393841693909116917f343765429aea5a34b3ff6a3785a98a5abb2597aca87bfbb58632c173d585373a91a360018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b6002546001600160a01b031681565b6000546001600160a01b031681565b600854640100000000900463ffffffff1681565b60065490565b611370611d7b565b611378612293565b6008805463ffffffff909216600160801b0263ffffffff60801b19909216919091179055565b60045460009081906001600160a01b0385811691161480156113e257506001600160a01b038516600090815260076020526040902060010154600160301b900460ff165b156113f9576113f0836122da565b91509150610d1b565b6004546001600160a01b03868116911614801561143857506001600160a01b038416600090815260076020526040902060010154600160301b900460ff165b15611446576113f0836124c6565b6040805162461bcd60e51b815260206004820152601160248201527022a9292fa4a72b20a624a22faa27a5a2a760791b604482015290519081900360640190fd5b61148f611d7b565b600354600280546001600160a01b0319166001600160a01b03909216919091179055565b600181565b6114c0611d7b565b6114c8612293565b6008805463ffffffff909216600160601b0263ffffffff60601b19909216919091179055565b6005546001600160a01b031681565b611505611d7b565b61150d612293565b600955565b61151a611d7b565b6115226125ba565b6004546001906001600160a01b0316611539610dd8565b61ffff167f6b08c2e2c9969e55a647a764db9b554d64dc42f1a704da11a6d5b129ad163f2c60405160405180910390a4565b6006818154811061157857fe5b6000918252602090912001546001600160a01b0316905081565b6001600160a01b038116600090815260076020526040812060018101546115d59063ffffffff166115cf620f42406115c9876119ba565b90612681565b906126df565b9392505050565b600190565b6004546001600160a01b031681565b6001546001600160a01b031681565b611607611d7b565b60006116327f42616e636f72436f6e7665727465725570677261646572000000000000000000611e3b565b6004549091506000906001600160a01b031661164c610dd8565b61ffff167f6b08c2e2c9969e55a647a764db9b554d64dc42f1a704da11a6d5b129ad163f2c60405160405180910390a461168581611cdb565b6040805163487ac64b60e11b81526028600482015290516001600160a01b038316916390f58c9691602480830192600092919082900301818387803b1580156116cd57600080fd5b505af11580156116e1573d6000803e3d6000fd5b50505050610d34611279565b6007602052600090815260409020805460019091015463ffffffff81169060ff6401000000008204811691650100000000008104821691600160301b9091041685565b8061173a81611dce565b611742611d7b565b600061174d83611592565b9050611766600954600a5461273e90919063ffffffff16565b81116117b9576040805162461bcd60e51b815260206004820152601e60248201527f4552525f4d41524b45545f4341505f42454c4f575f5448524553484f4c440000604482015290519081900360640190fd5b6001600160a01b038316600090815260076020526040812060085460018201549192916117fa9163ffffffff91821691600160801b90910481169061278716565b600183015460085491925063ffffffff90811691600160601b900416821015611867576040805162461bcd60e51b815260206004820152601a60248201527911549497d253959053125117d49154d154959157d5d15251d21560321b604482015290519081900360640190fd5b600183015460009061189b906118919063ffffffff908116906115cf908790620f42409061268116565b620f424090612787565b60018501805463ffffffff861663ffffffff19918216811790925560088054909116909117905590508260006118db620f42406115cf856115c98d6119ba565b90506001600160a01b03891673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141561193557604051339082156108fc029083906000818181858888f1935050505015801561192f573d6000803e3d6000fd5b50611940565b6119408933836127d4565b600a87905561194e89611f96565b85546040805163ffffffff8088168252851660208201528082018690526060810192909252517fdb546a099d5772cc83680ebd46cf464225ffd886eda63ba6c11095aa1422f75d9181900360800190a1505050505050505050565b60006119b4826119ba565b92915050565b6000816119c681611dce565b50506001600160a01b031660009081526007602052604090205490565b60006119ed611f0d565b6003805460ff60a81b1916600160a81b1790556c42616e636f724e6574776f726b60981b611a1a8161292d565b856001600160a01b0316876001600160a01b03161415611a7a576040805162461bcd60e51b815260206004820152601660248201527511549497d4d0535157d4d3d55490d157d5105491d15560521b604482015290519081900360640190fd5b6005546001600160a01b03161580611b87575060055460408051633af32abf60e01b81526001600160a01b03878116600483015291519190921691633af32abf916024808301926020929190829003018186803b158015611ada57600080fd5b505afa158015611aee573d6000803e3d6000fd5b505050506040513d6020811015611b0457600080fd5b50518015611b87575060055460408051633af32abf60e01b81526001600160a01b03868116600483015291519190921691633af32abf916024808301926020929190829003018186803b158015611b5a57600080fd5b505afa158015611b6e573d6000803e3d6000fd5b505050506040513d6020811015611b8457600080fd5b50515b611bce576040805162461bcd60e51b815260206004820152601360248201527211549497d393d517d5d2125511531254d51151606a1b604482015290519081900360640190fd5b611bdb878787878761298f565b6003805460ff60a81b19169055979650505050505050565b611bfb611d7b565b60085463ffffffff64010000000090910481169082161115611c64576040805162461bcd60e51b815260206004820152601a60248201527f4552525f494e56414c49445f434f4e56455253494f4e5f464545000000000000604482015290519081900360640190fd5b6008546040805163ffffffff600160401b90930483168152918316602083015280517f81cd2ffb37dd237c0e4e2a3de5265fcf9deb43d3e7801e80db9f1ccfba7ee6009281900390910190a16008805463ffffffff909216600160401b026bffffffff000000000000000019909216919091179055565b611ce3611d7b565b6000546001600160a01b0382811691161415611d37576040805162461bcd60e51b815260206004820152600e60248201526d22a9292fa9a0a6a2afa7aba722a960911b604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b600854600160801b900463ffffffff1681565b6004546001600160a01b031690565b6000546001600160a01b03163314610dd6576040805162461bcd60e51b815260206004820152601160248201527011549497d050d0d154d4d7d11153925151607a1b604482015290519081900360640190fd5b6001600160a01b038116600090815260076020526040902060010154600160301b900460ff16610d34576040805162461bcd60e51b81526020600482015260136024820152724552525f494e56414c49445f5245534552564560681b604482015290519081900360640190fd5b60025460408051632ecd14d360e21b81526004810184905290516000926001600160a01b03169163bb34534c916024808301926020929190829003018186803b158015611e8757600080fd5b505afa158015611e9b573d6000803e3d6000fd5b505050506040513d6020811015611eb157600080fd5b505192915050565b6001600160a01b038116301415610d34576040805162461bcd60e51b815260206004820152601360248201527222a9292fa0a2222922a9a9afa4a9afa9a2a62360691b604482015290519081900360640190fd5b600354600160a81b900460ff1615610dd6576040805162461bcd60e51b815260206004820152600e60248201526d4552525f5245454e5452414e435960901b604482015290519081900360640190fd5b611f65611d7b565b82611f6f81612b52565b82611f7981612b52565b83611f8381611eb9565b611f8e8686866127d4565b505050505050565b80611fa081611dce565b6001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415611fe5576001600160a01b0382166000908152600760205260409020479055611260565b604080516370a0823160e01b815230600482015290516001600160a01b038416916370a08231916024808301926020929190829003018186803b15801561202b57600080fd5b505afa15801561203f573d6000803e3d6000fd5b505050506040513d602081101561205557600080fd5b50516001600160a01b0383166000908152600760205260409020555050565b61207c611d7b565b612084612293565b8161208e81612b52565b8261209881611eb9565b826120a281612ba3565b6004546001600160a01b038681169116148015906120e357506001600160a01b038516600090815260076020526040902060010154600160301b900460ff16155b61212a576040805162461bcd60e51b81526020600482015260136024820152724552525f494e56414c49445f5245534552564560681b604482015290519081900360640190fd5b60085463ffffffff908116620f4240038116908516111561218f576040805162461bcd60e51b815260206004820152601a60248201527911549497d253959053125117d49154d154959157d5d15251d21560321b604482015290519081900360640190fd5b61ffff61219a611362565b61ffff16106121ec576040805162461bcd60e51b815260206004820152601960248201527811549497d253959053125117d49154d154959157d0d3d55395603a1b604482015290519081900360640190fd5b5050506001600160a01b0390911660008181526007602052604081208181556001908101805466ff0000000000001963ffffffff80881663ffffffff199384161791909116600160301b179092556006805493840181559093527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f90910180546001600160a01b031916909317909255600880548084169094019092169216919091179055565b61229b610d37565b15610dd6576040805162461bcd60e51b815260206004820152600a6024820152694552525f41435449564560b01b604482015290519081900360640190fd5b6000806122e5612c10565b6000600460009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561233557600080fd5b505afa158015612349573d6000803e3d6000fd5b505050506040513d602081101561235f57600080fd5b505160068054919250600091829061237357fe5b6000918252602090912001546001600160a01b03169050816123d6576001600160a01b0381166000908152600760205260409020600101546123c99063ffffffff908116906115cf908890620f42409061268116565b60009350935050506124c1565b60006123f16c42616e636f72466f726d756c6160981b611e3b565b6001600160a01b031663f3250fe284612409856119ba565b6001600160a01b0386166000908152600760209081526040918290206001015482516001600160e01b031960e088901b1681526004810195909552602485019390935263ffffffff9092166044840152606483018b905251608480840193829003018186803b15801561247b57600080fd5b505afa15801561248f573d6000803e3d6000fd5b505050506040513d60208110156124a557600080fd5b5051905060006124b482612c58565b9182900395509093505050505b915091565b6000806124d1612c10565b6000600460009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561252157600080fd5b505afa158015612535573d6000803e3d6000fd5b505050506040513d602081101561254b57600080fd5b505160068054919250600091829061255f57fe5b6000918252602090912001546001600160a01b0316905081851415612587576123c9816119ba565b60006125a26c42616e636f72466f726d756c6160981b611e3b565b6001600160a01b03166376cf0b5684612409856119ba565b6125c2611d7b565b60006125cc611362565b61ffff161161261e576040805162461bcd60e51b815260206004820152601960248201527811549497d253959053125117d49154d154959157d0d3d55395603a1b604482015290519081900360640190fd5b60048054604080516379ba509760e01b815290516001600160a01b03909216926379ba509792828201926000929082900301818387803b15801561266157600080fd5b505af1158015612675573d6000803e3d6000fd5b50505050610dd6612c83565b600082612690575060006119b4565b8282028284828161269d57fe5b04146115d5576040805162461bcd60e51b815260206004820152600c60248201526b4552525f4f564552464c4f5760a01b604482015290519081900360640190fd5b600080821161272a576040805162461bcd60e51b81526020600482015260126024820152714552525f4449564944455f42595f5a45524f60701b604482015290519081900360640190fd5b600082848161273557fe5b04949350505050565b6000828201838110156115d5576040805162461bcd60e51b815260206004820152600c60248201526b4552525f4f564552464c4f5760a01b604482015290519081900360640190fd5b6000818310156127ce576040805162461bcd60e51b815260206004820152600d60248201526c4552525f554e444552464c4f5760981b604482015290519081900360640190fd5b50900390565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b602083106128515780518252601f199092019160209182019101612832565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146128b3576040519150601f19603f3d011682016040523d82523d6000602084013e6128b8565b606091505b50915091508180156128e65750805115806128e657508080602001905160208110156128e357600080fd5b50515b611148576040805162461bcd60e51b815260206004820152601360248201527211549497d514905394d1915497d19052531151606a1b604482015290519081900360640190fd5b61293681611e3b565b6001600160a01b0316336001600160a01b031614610d34576040805162461bcd60e51b815260206004820152601160248201527011549497d050d0d154d4d7d11153925151607a1b604482015290519081900360640190fd5b600454600090819081906001600160a01b0388811691161480156129d557506001600160a01b038816600090815260076020526040902060010154600160301b900460ff165b156129ee5750866129e7868686612cc3565b9150612a3f565b6004546001600160a01b038981169116148015612a2d57506001600160a01b038716600090815260076020526040902060010154600160301b900460ff165b156114465750856129e7868686612f37565b6000600460009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015612a8f57600080fd5b505afa158015612aa3573d6000803e3d6000fd5b505050506040513d6020811015612ab957600080fd5b50516001600160a01b0380841660008181526007602052604090206001015460045493945063ffffffff16929091167f77f29993cf2c084e726f7e802da0719d6a0ade3e204badc7a3ffd57ecb768c24612b19620f42406115c9886119ba565b612b2c8663ffffffff8088169061268116565b6040805192835260208301919091528051918290030190a3509198975050505050505050565b6001600160a01b038116610d34576040805162461bcd60e51b81526020600482015260136024820152724552525f494e56414c49445f4144445245535360681b604482015290519081900360640190fd5b60008163ffffffff16118015612bc25750620f424063ffffffff821611155b610d34576040805162461bcd60e51b815260206004820152601a60248201527911549497d253959053125117d49154d154959157d5d15251d21560321b604482015290519081900360640190fd5b612c18610d37565b610dd6576040805162461bcd60e51b815260206004820152600c60248201526b4552525f494e41435449564560a01b604482015290519081900360640190fd5b6008546000906119b490620f4240906115cf908590600160401b900463ffffffff9081169061268116565b60065460005b8181101561126057612cbb60068281548110612ca157fe5b6000918252602090912001546001600160a01b0316611f96565b600101612c89565b6000806000612cd1866122da565b915091508160001415612d24576040805162461bcd60e51b815260206004820152601660248201527511549497d6915493d7d5105491d15517d05353d5539560521b604482015290519081900360640190fd5b60006006600081548110612d3457fe5b6000918252602090912001546001600160a01b0316905073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee811415612dc057863414612dbb576040805162461bcd60e51b815260206004820152601760248201527f4552525f4554485f414d4f554e545f4d49534d41544348000000000000000000604482015290519081900360640190fd5b612e97565b34158015612e51575086612e4e612dd6836119ba565b604080516370a0823160e01b815230600482015290516001600160a01b038616916370a08231916024808301926020929190829003018186803b158015612e1c57600080fd5b505afa158015612e30573d6000803e3d6000fd5b505050506040513d6020811015612e4657600080fd5b505190612787565b10155b612e97576040805162461bcd60e51b815260206004820152601260248201527111549497d253959053125117d05353d5539560721b604482015290519081900360640190fd5b612ea081611f96565b600480546040805163219e412d60e21b81526001600160a01b0389811694820194909452602481018790529051929091169163867904b49160448082019260009290919082900301818387803b158015612ef957600080fd5b505af1158015612f0d573d6000803e3d6000fd5b5050600454612f2c92508391506001600160a01b0316888a878761324c565b509095945050505050565b60048054604080516370a0823160e01b81523093810193909352516000926001600160a01b03909216916370a08231916024808301926020929190829003018186803b158015612f8657600080fd5b505afa158015612f9a573d6000803e3d6000fd5b505050506040513d6020811015612fb057600080fd5b5051841115612ffb576040805162461bcd60e51b815260206004820152601260248201527111549497d253959053125117d05353d5539560721b604482015290519081900360640190fd5b600080613007866124c6565b91509150816000141561305a576040805162461bcd60e51b815260206004820152601660248201527511549497d6915493d7d5105491d15517d05353d5539560521b604482015290519081900360640190fd5b6000600660008154811061306a57fe5b600091825260208083209091015460048054604080516318160ddd60e01b815290516001600160a01b03948516975091909316936318160ddd938084019391929190829003018186803b1580156130c057600080fd5b505afa1580156130d4573d6000803e3d6000fd5b505050506040513d60208110156130ea57600080fd5b5051905060006130f9836119ba565b9050808510806131125750808514801561311257508189145b61311857fe5b600480546040805163a24835d160e01b81523093810193909352602483018c9052516001600160a01b039091169163a24835d191604480830192600092919082900301818387803b15801561316c57600080fd5b505af1158015613180573d6000803e3d6000fd5b5050506001600160a01b0384166000908152600760205260409020546131a7915086612787565b6001600160a01b03841660008181526007602052604090209190915573eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141561321a576040516001600160a01b0388169086156108fc029087906000818181858888f19350505050158015613214573d6000803e3d6000fd5b50613225565b6132258388876127d4565b60045461323f906001600160a01b0316848a8c898961324c565b5092979650505050505050565b600160ff1b811061325957fe5b604080518481526020810184905280820183905290516001600160a01b038087169288821692918a16917f276856b36cbc45526a0ba64f44611557a2a8b68662c5388e9fe6d72e86e1c8cb9181900360600190a4505050505050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091529056fea2646970667358221220f8c1e0e2ec3950a0ca01ac003b4d767e4ea2e2eae30ec9a7a322bddc5ae37a1164736f6c634300060c0033000000000000000000000000f56efd691c64ef76d6a90d6b2852ce90fa8c2dcf00000000000000000000000052ae12abe5d8bd778bd5397f99ca900624cfadd40000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106103035760003560e01c80638da5cb5b11610190578063d260529c116100dc578063d895951211610095578063ecbca55d1161006f578063ecbca55d14610b09578063f2fde38b14610b39578063f95e146c14610b6c578063fc0c546a14610b815761039a565b8063d895951214610a5d578063dc8de37914610a90578063e8dc12ff14610ac35761039a565b8063d260529c146109a3578063d3fb73b4146109b8578063d4ee1d90146109cd578063d55ec697146109e2578063d66bd524146109f7578063d79604c214610a2a5761039a565b8063bf75455811610149578063c9be579b11610123578063c9be579b14610907578063cdc91c6914610931578063d031370b14610946578063d146d31d146109705761039a565b8063bf754558146108ad578063c3e8dfa8146108c2578063c45d3d92146108f25761039a565b80638da5cb5b146107e657806394c275ad146107fb5780639b99a8e214610810578063ad16158214610825578063af94b8d814610855578063b4a176d3146108985761039a565b806349d10b641161024f57806367b6d57c1161020857806370b0aec5116101e257806370b0aec51461078057806371f52bf3146107a757806379ba5097146107bc5780637b103999146107d15761039a565b806367b6d57c146106db578063690d83201461070e5780636a49d2c4146107415761039a565b806349d10b64146106115780634af80f0e1461062657806354fd4d5014610659578063579cd3ca1461066e5780635e35359e1461068357806361cd756e146106c65761039a565b80631e1401f8116102bc5780632fe8a6ad116102965780632fe8a6ad146105a657806338a5e016146105bb5780633e8ff43f146105d057806340bf2fb7146105fc5761039a565b80631e1401f81461050257806321e6b53d1461055e57806322f3e2d4146105915761039a565b8063024c7ec71461039f5780630c7d5cd8146103cb5780630e53aae9146103f957806312c2aca41461046057806319b64015146104895780631cfab290146104cf5761039a565b3661039a5773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee60005260076020527fb2084a3e4595ccf007fb44245853374aaf0de960074375e8e0fb334712e94d0f54600160301b900460ff16610398576040805162461bcd60e51b81526020600482015260136024820152724552525f494e56414c49445f5245534552564560681b604482015290519081900360640190fd5b005b600080fd5b3480156103ab57600080fd5b50610398600480360360208110156103c257600080fd5b50351515610b96565b3480156103d757600080fd5b506103e0610bbc565b6040805163ffffffff9092168252519081900360200190f35b34801561040557600080fd5b5061042c6004803603602081101561041c57600080fd5b50356001600160a01b0316610bc8565b6040805195865263ffffffff9094166020860152911515848401521515606084015215156080830152519081900360a00190f35b34801561046c57600080fd5b50610475610c60565b604080519115158252519081900360200190f35b34801561049557600080fd5b506104b3600480360360208110156104ac57600080fd5b5035610cac565b604080516001600160a01b039092168252519081900360200190f35b3480156104db57600080fd5b506103e0600480360360208110156104f257600080fd5b50356001600160a01b0316610cd6565b34801561050e57600080fd5b506105456004803603606081101561052557600080fd5b506001600160a01b03813581169160208101359091169060400135610d08565b6040805192835260208301919091528051918290030190f35b34801561056a57600080fd5b506103986004803603602081101561058157600080fd5b50356001600160a01b0316610d23565b34801561059d57600080fd5b50610475610d37565b3480156105b257600080fd5b50610475610db6565b3480156105c757600080fd5b50610398610dc6565b3480156105dc57600080fd5b506105e5610dd8565b6040805161ffff9092168252519081900360200190f35b34801561060857600080fd5b506103e0610ddd565b34801561061d57600080fd5b50610398610df0565b34801561063257600080fd5b506103986004803603602081101561064957600080fd5b50356001600160a01b0316610ff8565b34801561066557600080fd5b506105e561102d565b34801561067a57600080fd5b506103e0611032565b34801561068f57600080fd5b50610398600480360360608110156106a657600080fd5b506001600160a01b03813581169160208101359091169060400135611045565b3480156106d257600080fd5b506104b36110b9565b3480156106e757600080fd5b50610398600480360360208110156106fe57600080fd5b50356001600160a01b03166110c8565b34801561071a57600080fd5b506103986004803603602081101561073157600080fd5b50356001600160a01b031661114f565b34801561074d57600080fd5b506103986004803603604081101561076457600080fd5b5080356001600160a01b0316906020013563ffffffff166111f4565b34801561078c57600080fd5b50610795611264565b60408051918252519081900360200190f35b3480156107b357600080fd5b506105e561126a565b3480156107c857600080fd5b50610398611279565b3480156107dd57600080fd5b506104b3611330565b3480156107f257600080fd5b506104b361133f565b34801561080757600080fd5b506103e061134e565b34801561081c57600080fd5b506105e5611362565b34801561083157600080fd5b506103986004803603602081101561084857600080fd5b503563ffffffff16611368565b34801561086157600080fd5b506105456004803603606081101561087857600080fd5b506001600160a01b0381358116916020810135909116906040013561139e565b3480156108a457600080fd5b50610398611487565b3480156108b957600080fd5b506104756114b3565b3480156108ce57600080fd5b50610398600480360360208110156108e557600080fd5b503563ffffffff166114b8565b3480156108fe57600080fd5b506104b36114ee565b34801561091357600080fd5b506103986004803603602081101561092a57600080fd5b50356114fd565b34801561093d57600080fd5b50610398611512565b34801561095257600080fd5b506104b36004803603602081101561096957600080fd5b503561156b565b34801561097c57600080fd5b506107956004803603602081101561099357600080fd5b50356001600160a01b0316611592565b3480156109af57600080fd5b506104756115dc565b3480156109c457600080fd5b506104b36115e1565b3480156109d957600080fd5b506104b36115f0565b3480156109ee57600080fd5b506103986115ff565b348015610a0357600080fd5b5061042c60048036036020811015610a1a57600080fd5b50356001600160a01b03166116ed565b348015610a3657600080fd5b5061039860048036036020811015610a4d57600080fd5b50356001600160a01b0316611730565b348015610a6957600080fd5b5061079560048036036020811015610a8057600080fd5b50356001600160a01b03166119a9565b348015610a9c57600080fd5b5061079560048036036020811015610ab357600080fd5b50356001600160a01b03166119ba565b610795600480360360a0811015610ad957600080fd5b506001600160a01b03813581169160208101358216916040820135916060810135821691608090910135166119e3565b348015610b1557600080fd5b5061039860048036036020811015610b2c57600080fd5b503563ffffffff16611bf3565b348015610b4557600080fd5b5061039860048036036020811015610b5c57600080fd5b50356001600160a01b0316611cdb565b348015610b7857600080fd5b506103e0611d59565b348015610b8d57600080fd5b506104b3611d6c565b610b9e611d7b565b60038054911515600160a01b0260ff60a01b19909216919091179055565b60085463ffffffff1681565b6000806000806000610bd86132b5565b505050506001600160a01b03929092166000908152600760209081526040808320815160a081018352815480825260019092015463ffffffff811694820185905260ff64010000000082048116151594830194909452650100000000008104841615156060830152600160301b90049092161515608090920182905295919450919250829190565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee60005260076020527fb2084a3e4595ccf007fb44245853374aaf0de960074375e8e0fb334712e94d0f54600160301b900460ff1690565b600060068281548110610cbb57fe5b6000918252602090912001546001600160a01b031692915050565b600081610ce281611dce565b50506001600160a01b031660009081526007602052604090206001015463ffffffff1690565b600080610d1685858561139e565b915091505b935093915050565b610d2b611d7b565b610d34816110c8565b50565b6004805460408051638da5cb5b60e01b8152905160009330936001600160a01b031692638da5cb5b9281830192602092829003018186803b158015610d7b57600080fd5b505afa158015610d8f573d6000803e3d6000fd5b505050506040513d6020811015610da557600080fd5b50516001600160a01b031614905090565b600354600160a01b900460ff1681565b610dce611d7b565b610dd6611512565b565b600090565b600854600160601b900463ffffffff1681565b6000546001600160a01b0316331480610e135750600354600160a01b900460ff16155b610e58576040805162461bcd60e51b815260206004820152601160248201527011549497d050d0d154d4d7d11153925151607a1b604482015290519081900360640190fd5b6000610e766f436f6e7472616374526567697374727960801b611e3b565b6002549091506001600160a01b03808316911614801590610e9f57506001600160a01b03811615155b610ee7576040805162461bcd60e51b81526020600482015260146024820152734552525f494e56414c49445f524547495354525960601b604482015290519081900360640190fd5b60006001600160a01b0316816001600160a01b031663bb34534c6f436f6e7472616374526567697374727960801b6040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015610f4957600080fd5b505afa158015610f5d573d6000803e3d6000fd5b505050506040513d6020811015610f7357600080fd5b50516001600160a01b03161415610fc8576040805162461bcd60e51b81526020600482015260146024820152734552525f494e56414c49445f524547495354525960601b604482015290519081900360640190fd5b60028054600380546001600160a01b038084166001600160a01b0319928316179092559091169216919091179055565b611000611d7b565b8061100a81611eb9565b50600580546001600160a01b0319166001600160a01b0392909216919091179055565b602881565b600854600160401b900463ffffffff1681565b61104d611f0d565b6003805460ff60a81b1916600160a81b179055611068611d7b565b611073838383611f5d565b6001600160a01b038316600090815260076020526040902060010154600160301b900460ff16156110a7576110a783611f96565b50506003805460ff60a81b1916905550565b6003546001600160a01b031681565b6110d0611d7b565b600460009054906101000a90046001600160a01b03166001600160a01b031663f2fde38b826040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b15801561113457600080fd5b505af1158015611148573d6000803e3d6000fd5b5050505050565b611157611f0d565b6003805460ff60a81b1916600160a81b179055611172611d7b565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee61119081611dce565b6040516001600160a01b038316904780156108fc02916000818181858888f193505050501580156111c5573d6000803e3d6000fd5b506111e373eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee611f96565b50506003805460ff60a81b19169055565b6111fc611d7b565b611204611362565b61ffff1615611256576040805162461bcd60e51b815260206004820152601960248201527811549497d253959053125117d49154d154959157d0d3d55395603a1b604482015290519081900360640190fd5b6112608282612074565b5050565b60095481565b6000611274611362565b905090565b6001546001600160a01b031633146112cc576040805162461bcd60e51b815260206004820152601160248201527011549497d050d0d154d4d7d11153925151607a1b604482015290519081900360640190fd5b600154600080546040516001600160a01b0393841693909116917f343765429aea5a34b3ff6a3785a98a5abb2597aca87bfbb58632c173d585373a91a360018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b6002546001600160a01b031681565b6000546001600160a01b031681565b600854640100000000900463ffffffff1681565b60065490565b611370611d7b565b611378612293565b6008805463ffffffff909216600160801b0263ffffffff60801b19909216919091179055565b60045460009081906001600160a01b0385811691161480156113e257506001600160a01b038516600090815260076020526040902060010154600160301b900460ff165b156113f9576113f0836122da565b91509150610d1b565b6004546001600160a01b03868116911614801561143857506001600160a01b038416600090815260076020526040902060010154600160301b900460ff165b15611446576113f0836124c6565b6040805162461bcd60e51b815260206004820152601160248201527022a9292fa4a72b20a624a22faa27a5a2a760791b604482015290519081900360640190fd5b61148f611d7b565b600354600280546001600160a01b0319166001600160a01b03909216919091179055565b600181565b6114c0611d7b565b6114c8612293565b6008805463ffffffff909216600160601b0263ffffffff60601b19909216919091179055565b6005546001600160a01b031681565b611505611d7b565b61150d612293565b600955565b61151a611d7b565b6115226125ba565b6004546001906001600160a01b0316611539610dd8565b61ffff167f6b08c2e2c9969e55a647a764db9b554d64dc42f1a704da11a6d5b129ad163f2c60405160405180910390a4565b6006818154811061157857fe5b6000918252602090912001546001600160a01b0316905081565b6001600160a01b038116600090815260076020526040812060018101546115d59063ffffffff166115cf620f42406115c9876119ba565b90612681565b906126df565b9392505050565b600190565b6004546001600160a01b031681565b6001546001600160a01b031681565b611607611d7b565b60006116327f42616e636f72436f6e7665727465725570677261646572000000000000000000611e3b565b6004549091506000906001600160a01b031661164c610dd8565b61ffff167f6b08c2e2c9969e55a647a764db9b554d64dc42f1a704da11a6d5b129ad163f2c60405160405180910390a461168581611cdb565b6040805163487ac64b60e11b81526028600482015290516001600160a01b038316916390f58c9691602480830192600092919082900301818387803b1580156116cd57600080fd5b505af11580156116e1573d6000803e3d6000fd5b50505050610d34611279565b6007602052600090815260409020805460019091015463ffffffff81169060ff6401000000008204811691650100000000008104821691600160301b9091041685565b8061173a81611dce565b611742611d7b565b600061174d83611592565b9050611766600954600a5461273e90919063ffffffff16565b81116117b9576040805162461bcd60e51b815260206004820152601e60248201527f4552525f4d41524b45545f4341505f42454c4f575f5448524553484f4c440000604482015290519081900360640190fd5b6001600160a01b038316600090815260076020526040812060085460018201549192916117fa9163ffffffff91821691600160801b90910481169061278716565b600183015460085491925063ffffffff90811691600160601b900416821015611867576040805162461bcd60e51b815260206004820152601a60248201527911549497d253959053125117d49154d154959157d5d15251d21560321b604482015290519081900360640190fd5b600183015460009061189b906118919063ffffffff908116906115cf908790620f42409061268116565b620f424090612787565b60018501805463ffffffff861663ffffffff19918216811790925560088054909116909117905590508260006118db620f42406115cf856115c98d6119ba565b90506001600160a01b03891673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141561193557604051339082156108fc029083906000818181858888f1935050505015801561192f573d6000803e3d6000fd5b50611940565b6119408933836127d4565b600a87905561194e89611f96565b85546040805163ffffffff8088168252851660208201528082018690526060810192909252517fdb546a099d5772cc83680ebd46cf464225ffd886eda63ba6c11095aa1422f75d9181900360800190a1505050505050505050565b60006119b4826119ba565b92915050565b6000816119c681611dce565b50506001600160a01b031660009081526007602052604090205490565b60006119ed611f0d565b6003805460ff60a81b1916600160a81b1790556c42616e636f724e6574776f726b60981b611a1a8161292d565b856001600160a01b0316876001600160a01b03161415611a7a576040805162461bcd60e51b815260206004820152601660248201527511549497d4d0535157d4d3d55490d157d5105491d15560521b604482015290519081900360640190fd5b6005546001600160a01b03161580611b87575060055460408051633af32abf60e01b81526001600160a01b03878116600483015291519190921691633af32abf916024808301926020929190829003018186803b158015611ada57600080fd5b505afa158015611aee573d6000803e3d6000fd5b505050506040513d6020811015611b0457600080fd5b50518015611b87575060055460408051633af32abf60e01b81526001600160a01b03868116600483015291519190921691633af32abf916024808301926020929190829003018186803b158015611b5a57600080fd5b505afa158015611b6e573d6000803e3d6000fd5b505050506040513d6020811015611b8457600080fd5b50515b611bce576040805162461bcd60e51b815260206004820152601360248201527211549497d393d517d5d2125511531254d51151606a1b604482015290519081900360640190fd5b611bdb878787878761298f565b6003805460ff60a81b19169055979650505050505050565b611bfb611d7b565b60085463ffffffff64010000000090910481169082161115611c64576040805162461bcd60e51b815260206004820152601a60248201527f4552525f494e56414c49445f434f4e56455253494f4e5f464545000000000000604482015290519081900360640190fd5b6008546040805163ffffffff600160401b90930483168152918316602083015280517f81cd2ffb37dd237c0e4e2a3de5265fcf9deb43d3e7801e80db9f1ccfba7ee6009281900390910190a16008805463ffffffff909216600160401b026bffffffff000000000000000019909216919091179055565b611ce3611d7b565b6000546001600160a01b0382811691161415611d37576040805162461bcd60e51b815260206004820152600e60248201526d22a9292fa9a0a6a2afa7aba722a960911b604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b600854600160801b900463ffffffff1681565b6004546001600160a01b031690565b6000546001600160a01b03163314610dd6576040805162461bcd60e51b815260206004820152601160248201527011549497d050d0d154d4d7d11153925151607a1b604482015290519081900360640190fd5b6001600160a01b038116600090815260076020526040902060010154600160301b900460ff16610d34576040805162461bcd60e51b81526020600482015260136024820152724552525f494e56414c49445f5245534552564560681b604482015290519081900360640190fd5b60025460408051632ecd14d360e21b81526004810184905290516000926001600160a01b03169163bb34534c916024808301926020929190829003018186803b158015611e8757600080fd5b505afa158015611e9b573d6000803e3d6000fd5b505050506040513d6020811015611eb157600080fd5b505192915050565b6001600160a01b038116301415610d34576040805162461bcd60e51b815260206004820152601360248201527222a9292fa0a2222922a9a9afa4a9afa9a2a62360691b604482015290519081900360640190fd5b600354600160a81b900460ff1615610dd6576040805162461bcd60e51b815260206004820152600e60248201526d4552525f5245454e5452414e435960901b604482015290519081900360640190fd5b611f65611d7b565b82611f6f81612b52565b82611f7981612b52565b83611f8381611eb9565b611f8e8686866127d4565b505050505050565b80611fa081611dce565b6001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415611fe5576001600160a01b0382166000908152600760205260409020479055611260565b604080516370a0823160e01b815230600482015290516001600160a01b038416916370a08231916024808301926020929190829003018186803b15801561202b57600080fd5b505afa15801561203f573d6000803e3d6000fd5b505050506040513d602081101561205557600080fd5b50516001600160a01b0383166000908152600760205260409020555050565b61207c611d7b565b612084612293565b8161208e81612b52565b8261209881611eb9565b826120a281612ba3565b6004546001600160a01b038681169116148015906120e357506001600160a01b038516600090815260076020526040902060010154600160301b900460ff16155b61212a576040805162461bcd60e51b81526020600482015260136024820152724552525f494e56414c49445f5245534552564560681b604482015290519081900360640190fd5b60085463ffffffff908116620f4240038116908516111561218f576040805162461bcd60e51b815260206004820152601a60248201527911549497d253959053125117d49154d154959157d5d15251d21560321b604482015290519081900360640190fd5b61ffff61219a611362565b61ffff16106121ec576040805162461bcd60e51b815260206004820152601960248201527811549497d253959053125117d49154d154959157d0d3d55395603a1b604482015290519081900360640190fd5b5050506001600160a01b0390911660008181526007602052604081208181556001908101805466ff0000000000001963ffffffff80881663ffffffff199384161791909116600160301b179092556006805493840181559093527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f90910180546001600160a01b031916909317909255600880548084169094019092169216919091179055565b61229b610d37565b15610dd6576040805162461bcd60e51b815260206004820152600a6024820152694552525f41435449564560b01b604482015290519081900360640190fd5b6000806122e5612c10565b6000600460009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561233557600080fd5b505afa158015612349573d6000803e3d6000fd5b505050506040513d602081101561235f57600080fd5b505160068054919250600091829061237357fe5b6000918252602090912001546001600160a01b03169050816123d6576001600160a01b0381166000908152600760205260409020600101546123c99063ffffffff908116906115cf908890620f42409061268116565b60009350935050506124c1565b60006123f16c42616e636f72466f726d756c6160981b611e3b565b6001600160a01b031663f3250fe284612409856119ba565b6001600160a01b0386166000908152600760209081526040918290206001015482516001600160e01b031960e088901b1681526004810195909552602485019390935263ffffffff9092166044840152606483018b905251608480840193829003018186803b15801561247b57600080fd5b505afa15801561248f573d6000803e3d6000fd5b505050506040513d60208110156124a557600080fd5b5051905060006124b482612c58565b9182900395509093505050505b915091565b6000806124d1612c10565b6000600460009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561252157600080fd5b505afa158015612535573d6000803e3d6000fd5b505050506040513d602081101561254b57600080fd5b505160068054919250600091829061255f57fe5b6000918252602090912001546001600160a01b0316905081851415612587576123c9816119ba565b60006125a26c42616e636f72466f726d756c6160981b611e3b565b6001600160a01b03166376cf0b5684612409856119ba565b6125c2611d7b565b60006125cc611362565b61ffff161161261e576040805162461bcd60e51b815260206004820152601960248201527811549497d253959053125117d49154d154959157d0d3d55395603a1b604482015290519081900360640190fd5b60048054604080516379ba509760e01b815290516001600160a01b03909216926379ba509792828201926000929082900301818387803b15801561266157600080fd5b505af1158015612675573d6000803e3d6000fd5b50505050610dd6612c83565b600082612690575060006119b4565b8282028284828161269d57fe5b04146115d5576040805162461bcd60e51b815260206004820152600c60248201526b4552525f4f564552464c4f5760a01b604482015290519081900360640190fd5b600080821161272a576040805162461bcd60e51b81526020600482015260126024820152714552525f4449564944455f42595f5a45524f60701b604482015290519081900360640190fd5b600082848161273557fe5b04949350505050565b6000828201838110156115d5576040805162461bcd60e51b815260206004820152600c60248201526b4552525f4f564552464c4f5760a01b604482015290519081900360640190fd5b6000818310156127ce576040805162461bcd60e51b815260206004820152600d60248201526c4552525f554e444552464c4f5760981b604482015290519081900360640190fd5b50900390565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b602083106128515780518252601f199092019160209182019101612832565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146128b3576040519150601f19603f3d011682016040523d82523d6000602084013e6128b8565b606091505b50915091508180156128e65750805115806128e657508080602001905160208110156128e357600080fd5b50515b611148576040805162461bcd60e51b815260206004820152601360248201527211549497d514905394d1915497d19052531151606a1b604482015290519081900360640190fd5b61293681611e3b565b6001600160a01b0316336001600160a01b031614610d34576040805162461bcd60e51b815260206004820152601160248201527011549497d050d0d154d4d7d11153925151607a1b604482015290519081900360640190fd5b600454600090819081906001600160a01b0388811691161480156129d557506001600160a01b038816600090815260076020526040902060010154600160301b900460ff165b156129ee5750866129e7868686612cc3565b9150612a3f565b6004546001600160a01b038981169116148015612a2d57506001600160a01b038716600090815260076020526040902060010154600160301b900460ff165b156114465750856129e7868686612f37565b6000600460009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015612a8f57600080fd5b505afa158015612aa3573d6000803e3d6000fd5b505050506040513d6020811015612ab957600080fd5b50516001600160a01b0380841660008181526007602052604090206001015460045493945063ffffffff16929091167f77f29993cf2c084e726f7e802da0719d6a0ade3e204badc7a3ffd57ecb768c24612b19620f42406115c9886119ba565b612b2c8663ffffffff8088169061268116565b6040805192835260208301919091528051918290030190a3509198975050505050505050565b6001600160a01b038116610d34576040805162461bcd60e51b81526020600482015260136024820152724552525f494e56414c49445f4144445245535360681b604482015290519081900360640190fd5b60008163ffffffff16118015612bc25750620f424063ffffffff821611155b610d34576040805162461bcd60e51b815260206004820152601a60248201527911549497d253959053125117d49154d154959157d5d15251d21560321b604482015290519081900360640190fd5b612c18610d37565b610dd6576040805162461bcd60e51b815260206004820152600c60248201526b4552525f494e41435449564560a01b604482015290519081900360640190fd5b6008546000906119b490620f4240906115cf908590600160401b900463ffffffff9081169061268116565b60065460005b8181101561126057612cbb60068281548110612ca157fe5b6000918252602090912001546001600160a01b0316611f96565b600101612c89565b6000806000612cd1866122da565b915091508160001415612d24576040805162461bcd60e51b815260206004820152601660248201527511549497d6915493d7d5105491d15517d05353d5539560521b604482015290519081900360640190fd5b60006006600081548110612d3457fe5b6000918252602090912001546001600160a01b0316905073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee811415612dc057863414612dbb576040805162461bcd60e51b815260206004820152601760248201527f4552525f4554485f414d4f554e545f4d49534d41544348000000000000000000604482015290519081900360640190fd5b612e97565b34158015612e51575086612e4e612dd6836119ba565b604080516370a0823160e01b815230600482015290516001600160a01b038616916370a08231916024808301926020929190829003018186803b158015612e1c57600080fd5b505afa158015612e30573d6000803e3d6000fd5b505050506040513d6020811015612e4657600080fd5b505190612787565b10155b612e97576040805162461bcd60e51b815260206004820152601260248201527111549497d253959053125117d05353d5539560721b604482015290519081900360640190fd5b612ea081611f96565b600480546040805163219e412d60e21b81526001600160a01b0389811694820194909452602481018790529051929091169163867904b49160448082019260009290919082900301818387803b158015612ef957600080fd5b505af1158015612f0d573d6000803e3d6000fd5b5050600454612f2c92508391506001600160a01b0316888a878761324c565b509095945050505050565b60048054604080516370a0823160e01b81523093810193909352516000926001600160a01b03909216916370a08231916024808301926020929190829003018186803b158015612f8657600080fd5b505afa158015612f9a573d6000803e3d6000fd5b505050506040513d6020811015612fb057600080fd5b5051841115612ffb576040805162461bcd60e51b815260206004820152601260248201527111549497d253959053125117d05353d5539560721b604482015290519081900360640190fd5b600080613007866124c6565b91509150816000141561305a576040805162461bcd60e51b815260206004820152601660248201527511549497d6915493d7d5105491d15517d05353d5539560521b604482015290519081900360640190fd5b6000600660008154811061306a57fe5b600091825260208083209091015460048054604080516318160ddd60e01b815290516001600160a01b03948516975091909316936318160ddd938084019391929190829003018186803b1580156130c057600080fd5b505afa1580156130d4573d6000803e3d6000fd5b505050506040513d60208110156130ea57600080fd5b5051905060006130f9836119ba565b9050808510806131125750808514801561311257508189145b61311857fe5b600480546040805163a24835d160e01b81523093810193909352602483018c9052516001600160a01b039091169163a24835d191604480830192600092919082900301818387803b15801561316c57600080fd5b505af1158015613180573d6000803e3d6000fd5b5050506001600160a01b0384166000908152600760205260409020546131a7915086612787565b6001600160a01b03841660008181526007602052604090209190915573eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141561321a576040516001600160a01b0388169086156108fc029087906000818181858888f19350505050158015613214573d6000803e3d6000fd5b50613225565b6132258388876127d4565b60045461323f906001600160a01b0316848a8c898961324c565b5092979650505050505050565b600160ff1b811061325957fe5b604080518481526020810184905280820183905290516001600160a01b038087169288821692918a16917f276856b36cbc45526a0ba64f44611557a2a8b68662c5388e9fe6d72e86e1c8cb9181900360600190a4505050505050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091529056fea2646970667358221220f8c1e0e2ec3950a0ca01ac003b4d767e4ea2e2eae30ec9a7a322bddc5ae37a1164736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000f56efd691c64ef76d6a90d6b2852ce90fa8c2dcf00000000000000000000000052ae12abe5d8bd778bd5397f99ca900624cfadd40000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _token (address): 0xF56efd691C64Ef76d6a90D6b2852CE90FA8c2DCf
Arg [1] : _registry (address): 0x52Ae12ABe5D8BD778BD5397F99cA900624CfADD4
Arg [2] : _maxConversionFee (uint32): 0
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000f56efd691c64ef76d6a90d6b2852ce90fa8c2dcf
Arg [1] : 00000000000000000000000052ae12abe5d8bd778bd5397f99ca900624cfadd4
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
55846:5317:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22683:42;29213:29;;:8;:29;;:35;;-1:-1:-1;;;29213:35:0;;;;29205:67;;;;;-1:-1:-1;;;29205:67:0;;;;;;;;;;;;-1:-1:-1;;;29205:67:0;;;;;;;;;;;;;;;55846:5317;;;;;13082:224;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13082:224:0;;;;:::i;23658:30::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;42856:248;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42856:248:0;-1:-1:-1;;;;;42856:248:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37518:113;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;43178:145;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43178:145:0;;:::i;:::-;;;;-1:-1:-1;;;;;43178:145:0;;;;;;;;;;;;;;36642:204;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36642:204:0;-1:-1:-1;;;;;36642:204:0;;:::i;43813:208::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;43813:208:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;42478:130;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42478:130:0;-1:-1:-1;;;;;42478:130:0;;:::i;31417:121::-;;;;;;;;;;;;;:::i;10760:38::-;;;;;;;;;;;;;:::i;42682:100::-;;;;;;;;;;;;;:::i;45513:90::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;55914:35;;;;;;;;;;;;;:::i;11727:925::-;;;;;;;;;;;;;:::i;31044:202::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31044:202:0;-1:-1:-1;;;;;31044:202:0;;:::i;23102:35::-;;;;;;;;;;;;;:::i;24051:40::-;;;;;;;;;;;;;:::i;60790:368::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;60790:368:0;;;;;;;;;;;;;;;;;:::i;10670:37::-;;;;;;;;;;;;;:::i;60312:164::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60312:164:0;-1:-1:-1;;;;;60312:164:0;;:::i;59827:309::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59827:309:0;-1:-1:-1;;;;;59827:309:0;;:::i;46376:272::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46376:272:0;;-1:-1:-1;;;;;46376:272:0;;;;;;;;:::i;55995:47::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;43397:114;;;;;;;;;;;;;:::i;7850:217::-;;;;;;;;;;;;;:::i;10581:33::-;;;;;;;;;;;;;:::i;6647:29::-;;;;;;;;;;;;;:::i;23800:43::-;;;;;;;;;;;;;:::i;35224:112::-;;;;;;;;;;;;;:::i;57690:144::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57690:144:0;;;;:::i;47090:493::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;47090:493:0;;;;;;;;;;;;;;;;;:::i;12731:137::-;;;;;;;;;;;;;:::i;24176:46::-;;;;;;;;;;;;;:::i;57333:156::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57333:156:0;;;;:::i;23232:46::-;;;;;;;;;;;;;:::i;56946:177::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56946:177:0;;:::i;45876:166::-;;;;;;;;;;;;;:::i;23372:34::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23372:34:0;;:::i;59270:254::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59270:254:0;-1:-1:-1;;;;;59270:254:0;;:::i;30591:82::-;;;;;;;;;;;;;:::i;23146:39::-;;;;;;;;;;;;;:::i;6683:23::-;;;;;;;;;;;;;:::i;34630:374::-;;;;;;;;;;;;;:::i;23513:48::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23513:48:0;-1:-1:-1;;;;;23513:48:0;;:::i;58019:1243::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58019:1243:0;-1:-1:-1;;;;;58019:1243:0;;:::i;43585:154::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43585:154:0;-1:-1:-1;;;;;43585:154:0;;:::i;37115:225::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37115:225:0;-1:-1:-1;;;;;37115:225:0;;:::i;38214:782::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;38214:782:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;32905:274::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32905:274:0;;;;:::i;7592:167::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7592:167:0;-1:-1:-1;;;;;7592:167:0;;:::i;55956:32::-;;;;;;;;;;;;;:::i;42307:97::-;;;;;;;;;;;;;:::i;13082:224::-;7154:12;:10;:12::i;:::-;13242:26:::1;:56:::0;;;::::1;;-1:-1:-1::0;;;13242:56:0::1;-1:-1:-1::0;;;;13242:56:0;;::::1;::::0;;;::::1;::::0;;13082:224::o;23658:30::-;;;;;;:::o;42856:248::-;42928:7;42937:6;42945:4;42951;42957;42974:22;;:::i;:::-;-1:-1:-1;;;;;;;;;42999:18:0;;;;;;;;:8;:18;;;;;;;;42974:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42974:43:0;;;;;;;;;;;;;;;;;-1:-1:-1;42999:18:0;;-1:-1:-1;42999:18:0;;42974:43;42856:248::o;37518:113::-;22683:42;37564:4;37588:29;:8;:29;;:35;;-1:-1:-1;;;37588:35:0;;;;;37518:113::o;43178:145::-;43249:11;43280:27;43308:6;43280:35;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;43280:35:0;;43178:145;-1:-1:-1;;43178:145:0:o;36642:204::-;36777:6;36744:13;27718:23;27732:8;27718:13;:23::i;:::-;-1:-1:-1;;;;;;;36808:23:0::1;;::::0;;;:8:::1;:23;::::0;;;;:30:::1;;::::0;::::1;;::::0;36642:204::o;43813:208::-;43922:7;43931;43958:55;43977:12;43991;44005:7;43958:18;:55::i;:::-;43951:62;;;;43813:208;;;;;;;:::o;42478:130::-;7154:12;:10;:12::i;:::-;42566:34:::1;42590:9;42566:23;:34::i;:::-;42478:130:::0;:::o;31417:121::-;31499:6;;;:14;;;-1:-1:-1;;;31499:14:0;;;;31475:4;;31525;;-1:-1:-1;;;;;31499:6:0;;:12;;:14;;;;;;;;;;;:6;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31499:14:0;-1:-1:-1;;;;;31499:31:0;;;-1:-1:-1;31417:121:0;:::o;10760:38::-;;;-1:-1:-1;;;10760:38:0;;;;;:::o;42682:100::-;7154:12;:10;:12::i;:::-;42751:23:::1;:21;:23::i;:::-;42682:100::o:0;45513:90::-;45568:6;45513:90;:::o;55914:35::-;;;-1:-1:-1;;;55914:35:0;;;;;:::o;11727:925::-;11844:5;;-1:-1:-1;;;;;11844:5:0;11830:10;:19;;:50;;-1:-1:-1;11854:26:0;;-1:-1:-1;;;11854:26:0;;;;11853:27;11830:50;11822:80;;;;;-1:-1:-1;;;11822:80:0;;;;;;;;;;;;-1:-1:-1;;;11822:80:0;;;;;;;;;;;;;;;11957:29;12007:28;-1:-1:-1;;;12007:9:0;:28::i;:::-;12148:8;;11957:79;;-1:-1:-1;;;;;;12133:23:0;;;12148:8;;12133:23;;;;:61;;-1:-1:-1;;;;;;12160:34:0;;;;12133:61;12125:94;;;;;-1:-1:-1;;;12125:94:0;;;;;;;;;;;;-1:-1:-1;;;12125:94:0;;;;;;;;;;;;;;;12386:1;-1:-1:-1;;;;;12334:54:0;:11;-1:-1:-1;;;;;12334:21:0;;-1:-1:-1;;;12334:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12334:40:0;-1:-1:-1;;;;;12334:54:0;;;12326:87;;;;;-1:-1:-1;;;12326:87:0;;;;;;;;;;;;-1:-1:-1;;;12326:87:0;;;;;;;;;;;;;;;12520:8;;;12505:12;:23;;-1:-1:-1;;;;;12520:8:0;;;-1:-1:-1;;;;;;12505:23:0;;;;;;;12622:22;;;;;;;;;;;11727:925::o;31044:202::-;7154:12;:10;:12::i;:::-;31177:10:::1;9019:18;9028:8;9019;:18::i;:::-;-1:-1:-1::0;31206:19:0::2;:32:::0;;-1:-1:-1;;;;;;31206:32:0::2;-1:-1:-1::0;;;;;31206:32:0;;;::::2;::::0;;;::::2;::::0;;31044:202::o;23102:35::-;23135:2;23102:35;:::o;24051:40::-;;;-1:-1:-1;;;24051:40:0;;;;;:::o;60790:368::-;14231:12;:10;:12::i;:::-;14254:6;:13;;-1:-1:-1;;;;14254:13:0;-1:-1:-1;;;14254:13:0;;;7154:12:::1;:10;:12::i;:::-;60952:48:::2;60979:6;60987:3;60992:7;60952:26;:48::i;:::-;-1:-1:-1::0;;;;;61087:16:0;::::2;;::::0;;;:8:::2;:16;::::0;;;;:22:::2;;::::0;-1:-1:-1;;;61087:22:0;::::2;;;61083:67;;;61124:26;61143:6;61124:18;:26::i;:::-;-1:-1:-1::0;;14290:6:0;:14;;-1:-1:-1;;;;14290:14:0;;;-1:-1:-1;60790:368:0:o;10670:37::-;;;-1:-1:-1;;;;;10670:37:0;;:::o;60312:164::-;7154:12;:10;:12::i;:::-;60433:6:::1;;;;;;;;;-1:-1:-1::0;;;;;60433:6:0::1;-1:-1:-1::0;;;;;60433:24:0::1;;60458:9;60433:35;;;;;;;;;;;;;-1:-1:-1::0;;;;;60433:35:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;60312:164:::0;:::o;59827:309::-;14231:12;:10;:12::i;:::-;14254:6;:13;;-1:-1:-1;;;;14254:13:0;-1:-1:-1;;;14254:13:0;;;7154:12:::1;:10;:12::i;:::-;22683:42:::2;27718:23;27732:8;27718:13;:23::i;:::-;60000:35:::3;::::0;-1:-1:-1;;;;;60000:12:0;::::3;::::0;60013:21:::3;60000:35:::0;::::3;;;::::0;::::3;::::0;;;60013:21;60000:12;:35;::::3;;;;;;;;;;;;;::::0;::::3;;;;;;60089:39;22683:42;60089:18;:39::i;:::-;-1:-1:-1::0;;14290:6:0;:14;;-1:-1:-1;;;;14290:14:0;;;59827:309::o;46376:272::-;7154:12;:10;:12::i;:::-;46542:19:::1;:17;:19::i;:::-;:24;;::::0;46534:62:::1;;;::::0;;-1:-1:-1;;;46534:62:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;46534:62:0;;;;;;;;;;;;;::::1;;46607:33;46624:6;46632:7;46607:16;:33::i;:::-;46376:272:::0;;:::o;55995:47::-;;;;:::o;43397:114::-;43458:6;43484:19;:17;:19::i;:::-;43477:26;;43397:114;:::o;7850:217::-;7926:8;;-1:-1:-1;;;;;7926:8:0;7912:10;:22;7904:52;;;;;-1:-1:-1;;;7904:52:0;;;;;;;;;;;;-1:-1:-1;;;7904:52:0;;;;;;;;;;;;;;;7991:8;;;7984:5;;7972:28;;-1:-1:-1;;;;;7991:8:0;;;;7984:5;;;;7972:28;;;8019:8;;;;8011:16;;-1:-1:-1;;;;;;8011:16:0;;;-1:-1:-1;;;;;8019:8:0;;8011:16;;;;8038:21;;;7850:217::o;10581:33::-;;;-1:-1:-1;;;;;10581:33:0;;:::o;6647:29::-;;;-1:-1:-1;;;;;6647:29:0;;:::o;23800:43::-;;;;;;;;;:::o;35224:112::-;35307:13;:20;35224:112;:::o;57690:144::-;7154:12;:10;:12::i;:::-;27374:11:::1;:9;:11::i;:::-;57802:10:::2;:24:::0;;::::2;::::0;;::::2;-1:-1:-1::0;;;57802:24:0::2;-1:-1:-1::0;;;;57802:24:0;;::::2;::::0;;;::::2;::::0;;57690:144::o;47090:493::-;47283:6;;47217:7;;;;-1:-1:-1;;;;;47250:41:0;;;47283:6;;47250:41;:73;;;;-1:-1:-1;;;;;;47295:22:0;;;;;;:8;:22;;;;;:28;;;-1:-1:-1;;;47295:28:0;;;;47250:73;47246:128;;;47345:29;47366:7;47345:20;:29::i;:::-;47338:36;;;;;;47246:128;47422:6;;-1:-1:-1;;;;;47389:41:0;;;47422:6;;47389:41;:73;;;;-1:-1:-1;;;;;;47434:22:0;;;;;;:8;:22;;;;;:28;;;-1:-1:-1;;;47434:28:0;;;;47389:73;47385:124;;;47484:25;47501:7;47484:16;:25::i;47385:124::-;47548:27;;;-1:-1:-1;;;47548:27:0;;;;;;;;;;;;-1:-1:-1;;;47548:27:0;;;;;;;;;;;;;;12731:137;7154:12;:10;:12::i;:::-;12848::::1;::::0;12837:8:::1;:23:::0;;-1:-1:-1;;;;;;12837:23:0::1;-1:-1:-1::0;;;;;12848:12:0;;::::1;12837:23:::0;;;::::1;::::0;;12731:137::o;24176:46::-;24218:4;24176:46;:::o;57333:156::-;7154:12;:10;:12::i;:::-;27374:11:::1;:9;:11::i;:::-;57451:13:::2;:30:::0;;::::2;::::0;;::::2;-1:-1:-1::0;;;57451:30:0::2;-1:-1:-1::0;;;;57451:30:0;;::::2;::::0;;;::::2;::::0;;57333:156::o;23232:46::-;;;-1:-1:-1;;;;;23232:46:0;;:::o;56946:177::-;7154:12;:10;:12::i;:::-;27374:11:::1;:9;:11::i;:::-;57075:18:::2;:40:::0;56946:177::o;45876:166::-;7154:12;:10;:12::i;:::-;45946:29:::1;:27;:29::i;:::-;46021:6;::::0;46029:4:::1;::::0;-1:-1:-1;;;;;46021:6:0::1;46004:15;:13;:15::i;:::-;45993:41;;;;;;;;;;;;45876:166::o:0;23372:34::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23372:34:0;;-1:-1:-1;23372:34:0;:::o;59270:254::-;-1:-1:-1;;;;;59417:23:0;;59366:7;59417:23;;;:8;:23;;;;;59501:14;;;;59458:58;;59501:14;;59458:38;59492:3;59458:29;59426:13;59458:14;:29::i;:::-;:33;;:38::i;:::-;:42;;:58::i;:::-;59451:65;59270:254;-1:-1:-1;;;59270:254:0:o;30591:82::-;30661:4;30591:82;:::o;23146:39::-;;;-1:-1:-1;;;;;23146:39:0;;:::o;6683:23::-;;;-1:-1:-1;;;;;6683:23:0;;:::o;34630:374::-;7154:12;:10;:12::i;:::-;34677:36:::1;34735:29;34745:18;34735:9;:29::i;:::-;34851:6;::::0;34677:88;;-1:-1:-1;34859:5:0::1;::::0;-1:-1:-1;;;;;34851:6:0::1;34834:15;:13;:15::i;:::-;34823:42;;;;;;;;;;;;34878:45;34904:17;34878;:45::i;:::-;34934:34;::::0;;-1:-1:-1;;;34934:34:0;;23135:2:::1;34934:34;::::0;::::1;::::0;;;-1:-1:-1;;;;;34934:25:0;::::1;::::0;::::1;::::0;:34;;;;;-1:-1:-1;;34934:34:0;;;;;;;-1:-1:-1;34934:25:0;:34;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;34979:17;:15;:17::i;23513:48::-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;23513:48:0;;;;;:::o;58019:1243::-;58106:13;27718:23;27732:8;27718:13;:23::i;:::-;7154:12:::1;:10;:12::i;:::-;58156:24:::2;58183:27;58196:13;58183:12;:27::i;:::-;58156:54;;58249:53;58283:18;;58249:29;;:33;;:53;;;;:::i;:::-;58229:16;:74;58221:117;;;::::0;;-1:-1:-1;;;58221:117:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;58377:23:0;::::2;58351;58377::::0;;;:8:::2;:23;::::0;;;;58459:10:::2;::::0;58439:14:::2;::::0;::::2;::::0;58377:23;;58351;58431:39:::2;::::0;58459:10:::2;58439:14:::0;;::::2;::::0;-1:-1:-1;;;58459:10:0;;::::2;::::0;::::2;::::0;58431:27:::2;:39;:::i;:::-;58500:14;::::0;::::2;::::0;58546:13:::2;::::0;58411:59;;-1:-1:-1;58500:14:0::2;::::0;;::::2;::::0;-1:-1:-1;;;58546:13:0;::::2;;58533:26:::0;::::2;;58525:65;;;::::0;;-1:-1:-1;;;58525:65:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;58525:65:0;;;;;;;;;;;;;::::2;;58675:14;::::0;::::2;::::0;58603:18:::2;::::0;58624:67:::2;::::0;58652:38:::2;::::0;58675:14:::2;::::0;;::::2;::::0;58652:18:::2;::::0;:9;;58666:3:::2;::::0;58652:13:::2;:18;:::i;:38::-;22605:7;::::0;58624:27:::2;:67::i;:::-;58748:14;::::0;::::2;:23:::0;;::::2;::::0;::::2;-1:-1:-1::0;;58748:23:0;;::::2;::::0;::::2;::::0;;;58782:12:::2;:21:::0;;;;::::2;::::0;;::::2;::::0;;58603:88;-1:-1:-1;58727:9:0;58704:13:::2;58834:54;58884:3;58834:45;58603:88:::0;58834:29:::2;58849:13:::0;58834:14:::2;:29::i;:54::-;58816:72:::0;-1:-1:-1;;;;;;58905:36:0;::::2;22683:42;58905:36;58901:156;;;58954:28;::::0;:10:::2;::::0;:28;::::2;;;::::0;58974:7;;58954:28:::2;::::0;;;58974:7;58954:10;:28;::::2;;;;;;;;;;;;;::::0;::::2;;;;;;58901:156;;;59009:48;59022:13;59037:10;59049:7;59009:12;:48::i;:::-;59070:29;:48:::0;;;59131:33:::2;59150:13:::0;59131:18:::2;:33::i;:::-;59238:15:::0;;59182:72:::2;::::0;;::::2;::::0;;::::2;::::0;;;::::2;;::::0;::::2;::::0;;;;;;;;;;;;;;;::::2;::::0;;;;;;;::::2;7177:1;;;;;;;58019:1243:::0;;:::o;43585:154::-;43673:7;43700:31;43715:15;43700:14;:31::i;:::-;43693:38;43585:154;-1:-1:-1;;43585:154:0:o;37115:225::-;37269:7;37236:13;27718:23;27732:8;27718:13;:23::i;:::-;-1:-1:-1;;;;;;;37301:23:0::1;;::::0;;;:8:::1;:23;::::0;;;;:31;;37115:225::o;38214:782::-;38465:7;14231:12;:10;:12::i;:::-;14254:6;:13;;-1:-1:-1;;;;14254:13:0;-1:-1:-1;;;14254:13:0;;;-1:-1:-1;;;11054:20:0::1;38431:14:::0;11054:5:::1;:20::i;:::-;38541:12:::2;-1:-1:-1::0;;;;;38525:28:0::2;:12;-1:-1:-1::0;;;;;38525:28:0::2;;;38517:63;;;::::0;;-1:-1:-1;;;38517:63:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;38517:63:0;;;;;;;;;;;;;::::2;;38708:19;::::0;-1:-1:-1;;;;;38708:19:0::2;38700:42:::0;;:158:::2;;-1:-1:-1::0;38764:19:0::2;::::0;:42:::2;::::0;;-1:-1:-1;;;38764:42:0;;-1:-1:-1;;;;;38764:42:0;;::::2;;::::0;::::2;::::0;;;:19;;;::::2;::::0;:33:::2;::::0;:42;;;;;::::2;::::0;;;;;;;;:19;:42;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;38764:42:0;:93;::::2;;;-1:-1:-1::0;38810:19:0::2;::::0;:47:::2;::::0;;-1:-1:-1;;;38810:47:0;;-1:-1:-1;;;;;38810:47:0;;::::2;;::::0;::::2;::::0;;;:19;;;::::2;::::0;:33:::2;::::0;:47;;;;;::::2;::::0;;;;;;;;:19;:47;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;38810:47:0;38764:93:::2;38692:207;;;::::0;;-1:-1:-1;;;38692:207:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;38692:207:0;;;;;;;;;;;;;::::2;;38919:69;38929:12;38943;38957:7;38966;38975:12;38919:9;:69::i;:::-;14290:6:::0;:14;;-1:-1:-1;;;;14290:14:0;;;38912:76;38214:782;-1:-1:-1;;;;;;;38214:782:0:o;32905:274::-;7154:12;:10;:12::i;:::-;33017:16:::1;::::0;::::1;::::0;;;::::1;::::0;::::1;32999:34:::0;;::::1;;;32991:73;;;::::0;;-1:-1:-1;;;32991:73:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;33100:13;::::0;33080:50:::1;::::0;;33100:13:::1;-1:-1:-1::0;;;33100:13:0;;::::1;::::0;::::1;33080:50:::0;;;;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;::::1;33141:13;:30:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;33141:30:0::1;-1:-1:-1::0;;33141:30:0;;::::1;::::0;;;::::1;::::0;;32905:274::o;7592:167::-;7154:12;:10;:12::i;:::-;7696:5:::1;::::0;-1:-1:-1;;;;;7683:18:0;;::::1;7696:5:::0;::::1;7683:18;;7675:45;;;::::0;;-1:-1:-1;;;7675:45:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;7675:45:0;;;;;;;;;;;;;::::1;;7731:8;:20:::0;;-1:-1:-1;;;;;;7731:20:0::1;-1:-1:-1::0;;;;;7731:20:0;;;::::1;::::0;;;::::1;::::0;;7592:167::o;55956:32::-;;;-1:-1:-1;;;55956:32:0;;;;;:::o;42307:97::-;42390:6;;-1:-1:-1;;;;;42390:6:0;42307:97;:::o;7241:104::-;7310:5;;-1:-1:-1;;;;;7310:5:0;7296:10;:19;7288:49;;;;;-1:-1:-1;;;7288:49:0;;;;;;;;;;;;-1:-1:-1;;;7288:49:0;;;;;;;;;;;;;;27816:134;-1:-1:-1;;;;;27894:18:0;;;;;;:8;:18;;;;;:24;;;-1:-1:-1;;;27894:24:0;;;;27886:56;;;;;-1:-1:-1;;;27886:56:0;;;;;;;;;;;;-1:-1:-1;;;27886:56:0;;;;;;;;;;;;;;13504:133;13596:8;;:33;;;-1:-1:-1;;;13596:33:0;;;;;;;;;;13569:7;;-1:-1:-1;;;;;13596:8:0;;:18;;:33;;;;;;;;;;;;;;:8;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13596:33:0;;13504:133;-1:-1:-1;;13504:133:0:o;9112:126::-;-1:-1:-1;;;;;9181:25:0;;9201:4;9181:25;;9173:57;;;;;-1:-1:-1;;;9173:57:0;;;;;;;;;;;;-1:-1:-1;;;9173:57:0;;;;;;;;;;;;;;14367:89;14423:6;;-1:-1:-1;;;14423:6:0;;;;14422:7;14414:34;;;;;-1:-1:-1;;;14414:34:0;;;;;;;;;;;;-1:-1:-1;;;14414:34:0;;;;;;;;;;;;;;20132:290;7154:12;:10;:12::i;:::-;20306:6:::1;8665:23;8679:8;8665:13;:23::i;:::-;20337:3:::2;8665:23;8679:8;8665:13;:23::i;:::-;20359:3:::3;9019:18;9028:8;9019;:18::i;:::-;20380:34:::4;20393:6;20401:3;20406:7;20380:12;:34::i;:::-;8699:1:::3;::::2;7177::::1;20132:290:::0;;;:::o;40403:322::-;40480:13;27718:23;27732:8;27718:13;:23::i;:::-;-1:-1:-1;;;;;40510:36:0;::::1;22683:42;40510:36;40506:211;;;-1:-1:-1::0;;;;;40561:23:0;::::1;;::::0;;;:8:::1;:23;::::0;;;;40595:21:::1;40561:55:::0;;40506:211:::1;;;40679:38;::::0;;-1:-1:-1;;;40679:38:0;;40711:4:::1;40679:38;::::0;::::1;::::0;;;-1:-1:-1;;;;;40679:23:0;::::1;::::0;::::1;::::0;:38;;;;;::::1;::::0;;;;;;;;:23;:38;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;40679:38:0;-1:-1:-1;;;;;40645:23:0;::::1;;::::0;;;:8:::1;40679:38;40645:23:::0;;;;:72;40403:322;;:::o;35628:803::-;7154:12;:10;:12::i;:::-;27374:11:::1;:9;:11::i;:::-;35802:6:::2;8665:23;8679:8;8665:13;:23::i;:::-;35836:6:::3;9019:18;9028:8;9019;:18::i;:::-;35873:7:::4;28415:28;28435:7;28415:19;:28::i;:::-;35960:6:::5;::::0;-1:-1:-1;;;;;35933:34:0;;::::5;35960:6:::0;::::5;35933:34;::::0;::::5;::::0;:61:::5;;-1:-1:-1::0;;;;;;35972:16:0;::::5;;::::0;;;:8:::5;:16;::::0;;;;:22:::5;;::::0;-1:-1:-1;;;35972:22:0;::::5;;;35971:23;35933:61;35925:93;;;::::0;;-1:-1:-1;;;35925:93:0;;::::5;;::::0;::::5;::::0;::::5;::::0;;;;-1:-1:-1;;;35925:93:0;;;;;;;;;;;;;::::5;;36065:12;::::0;::::5;::::0;;::::5;22605:7;36048:29;36037:40:::0;::::5;::::0;;::::5;;;36029:79;;;::::0;;-1:-1:-1;;;36029:79:0;;::::5;;::::0;::::5;::::0;::::5;::::0;;;;-1:-1:-1;;;36029:79:0;;;;;;;;;;;;;::::5;;36127:32;:19;:17;:19::i;:::-;:32;;;36119:70;;;::::0;;-1:-1:-1;;;36119:70:0;;::::5;;::::0;::::5;::::0;::::5;::::0;;;;-1:-1:-1;;;36119:70:0;;;;;;;;;;;;;::::5;;-1:-1:-1::0;;;;;;;;36231:16:0;;::::5;36202:26;36231:16:::0;;;:8:::5;:16;::::0;;;;36258:22;;;36291:17:::5;::::0;;::::5;:27:::0;;-1:-1:-1;;36291:27:0::5;::::0;;::::5;-1:-1:-1::0;;36291:27:0;;::::5;;36329:23:::0;;;::::5;-1:-1:-1::0;;;36329:23:0::5;::::0;;;:16:::5;36363:26:::0;;;;::::5;::::0;;;;;;;;::::5;::::0;;-1:-1:-1;;;;;;36363:26:0::5;::::0;;::::5;::::0;;;36400:12:::5;:23:::0;;;;::::5;::::0;;::::5;::::0;;::::5;::::0;::::5;::::0;;;::::5;::::0;;35628:803::o;27460:88::-;27515:10;:8;:10::i;:::-;27514:11;27506:34;;;;;-1:-1:-1;;;27506:34:0;;;;;;;;;;;;-1:-1:-1;;;27506:34:0;;;;;;;;;;;;;;49682:905;49795:7;49804;27115:9;:7;:9::i;:::-;49829:19:::1;49868:6;;;;;;;;;-1:-1:-1::0;;;;;49868:6:0::1;-1:-1:-1::0;;;;;49851:37:0::1;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;49851:39:0;49928:13:::1;:16:::0;;49851:39;;-1:-1:-1;49901:24:0::1;::::0;;;49928:16:::1;;;;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;49928:16:0::1;::::0;-1:-1:-1;50074:16:0;50070:109:::1;;-1:-1:-1::0;;;;;50145:22:0;::::1;;::::0;;;:8:::1;:22;::::0;;;;:29:::1;;::::0;50113:62:::1;::::0;50145:29:::1;::::0;;::::1;::::0;50113:27:::1;::::0;:7;;22605::::1;::::0;50113:11:::1;:27;:::i;:62::-;50177:1;50105:74;;;;;;;;50070:109;50192:14;50224:25;-1:-1:-1::0;;;50224:9:0::1;:25::i;:::-;-1:-1:-1::0;;;;;50209:62:0::1;;50286:11;50312:28;50327:12;50312:14;:28::i;:::-;-1:-1:-1::0;;;;;50355:22:0;::::1;;::::0;;;:8:::1;:22;::::0;;;;;;;;:29:::1;;::::0;50209:208;;-1:-1:-1;;;;;;50209:208:0::1;::::0;;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;50355:29:::1;::::0;;::::1;50209:208:::0;;;;;;;;;;;;;;;;;;;;;;;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;50209:208:0;;-1:-1:-1;50508:11:0::1;50522:20;50209:208:::0;50522:12:::1;:20::i;:::-;50561:12:::0;;;::::1;::::0;-1:-1:-1;50508:34:0;;-1:-1:-1;;;;27135:1:0::1;49682:905:::0;;;:::o;50864:831::-;50973:7;50982;27115:9;:7;:9::i;:::-;51007:19:::1;51046:6;;;;;;;;;-1:-1:-1::0;;;;;51046:6:0::1;-1:-1:-1::0;;;;;51029:37:0::1;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;51029:39:0;51108:13:::1;:16:::0;;51029:39;;-1:-1:-1;51081:24:0::1;::::0;;;51108:16:::1;;;;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;51108:16:0::1;::::0;-1:-1:-1;51214:22:0;;::::1;51210:81;;;51259:28;51274:12;51259:14;:28::i;51210:81::-;51304:14;51336:25;-1:-1:-1::0;;;51336:9:0::1;:25::i;:::-;-1:-1:-1::0;;;;;51321:58:0::1;;51394:11;51420:28;51435:12;51420:14;:28::i;32426:276::-:0;7154:12;:10;:12::i;:::-;32596:1:::1;32574:19;:17;:19::i;:::-;:23;;;32566:61;;;::::0;;-1:-1:-1;;;32566:61:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;32566:61:0;;;;;;;;;;;;;::::1;;32638:6;::::0;;:24:::1;::::0;;-1:-1:-1;;;32638:24:0;;;;-1:-1:-1;;;;;32638:6:0;;::::1;::::0;:22:::1;::::0;:24;;::::1;::::0;:6:::1;::::0;:24;;;;;;:6;;:24;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;32673:21;:19;:21::i;15612:250::-:0;15672:7;15725;15721:34;;-1:-1:-1;15754:1:0;15747:8;;15721:34;15780:7;;;15785:2;15780;:7;:2;15806:6;;;;;:12;15798:37;;;;;-1:-1:-1;;;15798:37:0;;;;;;;;;;;;-1:-1:-1;;;15798:37:0;;;;;;;;;;;;;;16090:174;16150:7;16183:1;16178:2;:6;16170:37;;;;;-1:-1:-1;;;16170:37:0;;;;;;;;;;;;-1:-1:-1;;;16170:37:0;;;;;;;;;;;;;;;16218:9;16235:2;16230;:7;;;;;;;16090:174;-1:-1:-1;;;;16090:174:0:o;14849:169::-;14909:7;14941;;;14967;;;;14959:32;;;;;-1:-1:-1;;;14959:32:0;;;;;;;;;;;;-1:-1:-1;;;14959:32:0;;;;;;;;;;;;;;15241:147;15301:7;15335:2;15329;:8;;15321:34;;;;;-1:-1:-1;;;15321:34:0;;;;;;;;;;;;-1:-1:-1;;;15321:34:0;;;;;;;;;;;;;;;-1:-1:-1;15373:7:0;;;15241:147::o;17747:315::-;17894:59;;;-1:-1:-1;;;;;17894:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17894:59:0;-1:-1:-1;;;17894:59:0;;;17873:81;;;;17838:12;;17852:17;;17873:20;;;;17894:59;17873:81;;;17894:59;17873:81;;17894:59;17873:81;;;;;;;;;;-1:-1:-1;;17873:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17837:117;;;;17973:7;:57;;;;-1:-1:-1;17985:11:0;;:16;;:44;;;18016:4;18005:24;;;;;;;;;;;;;;;-1:-1:-1;18005:24:0;17985:44;17965:89;;;;;-1:-1:-1;;;17965:89:0;;;;;;;;;;;;-1:-1:-1;;;17965:89:0;;;;;;;;;;;;;;11149:139;11234:24;11244:13;11234:9;:24::i;:::-;-1:-1:-1;;;;;11220:38:0;:10;-1:-1:-1;;;;;11220:38:0;;11212:68;;;;;-1:-1:-1;;;11212:68:0;;;;;;;;;;;;-1:-1:-1;;;11212:68:0;;;;;;;;;;;;;;48155:1177;48474:6;;48344:7;;;;;;-1:-1:-1;;;;;48441:41:0;;;48474:6;;48441:41;:73;;;;-1:-1:-1;;;;;;48486:22:0;;;;;;:8;:22;;;;;:28;;;-1:-1:-1;;;48486:28:0;;;;48441:73;48437:511;;;-1:-1:-1;48546:12:0;48588:35;48592:7;48601;48610:12;48588:3;:35::i;:::-;48573:50;;48437:511;;;48687:6;;-1:-1:-1;;;;;48654:41:0;;;48687:6;;48654:41;:73;;;;-1:-1:-1;;;;;;48699:22:0;;;;;;:8;:22;;;;;:28;;;-1:-1:-1;;;48699:28:0;;;;48654:73;48650:298;;;-1:-1:-1;48759:12:0;48801:36;48806:7;48815;48824:12;48801:4;:36::i;48650:298::-;49014:19;49053:6;;;;;;;;;-1:-1:-1;;;;;49053:6:0;-1:-1:-1;;;;;49036:37:0;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49036:39:0;-1:-1:-1;;;;;49109:22:0;;;49086:20;49109:22;;;:8;49036:39;49109:22;;;;:29;;;49187:6;;49036:39;;-1:-1:-1;49109:29:0;;;:22;;49187:6;49154:138;49211:48;22605:7;49211:28;49118:12;49211:14;:28::i;:48::-;49261:30;:11;:30;;;;;:15;:30;:::i;:::-;49154:138;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49312:12:0;;48155:1177;-1:-1:-1;;;;;;;;48155:1177:0:o;8763:128::-;-1:-1:-1;;;;;8837:22:0;;8829:54;;;;;-1:-1:-1;;;8829:54:0;;;;;;;;;;;;-1:-1:-1;;;8829:54:0;;;;;;;;;;;;;;28518:157;28606:1;28596:7;:11;;;:40;;;;-1:-1:-1;22605:7:0;28611:25;;;;;28596:40;28588:79;;;;;-1:-1:-1;;;28588:79:0;;;;;;;;;;;;-1:-1:-1;;;28588:79:0;;;;;;;;;;;;;;27199:87;27251:10;:8;:10::i;:::-;27243:35;;;;;-1:-1:-1;;;27243:35:0;;;;;;;;;;;;-1:-1:-1;;;27243:35:0;;;;;;;;;;;;;;40055:155;40168:13;;40123:7;;40150:52;;22605:7;;40150:32;;:13;;-1:-1:-1;;;40168:13:0;;40150:52;40168:13;;;;40150:17;:32;:::i;40798:205::-;40872:13;:20;40849;40903:92;40927:12;40923:1;:16;40903:92;;;40959:36;40978:13;40992:1;40978:16;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40978:16:0;40959:18;:36::i;:::-;40941:3;;40903:92;;52075:1130;52162:7;52230:14;52246:11;52261:29;52282:7;52261:20;:29::i;:::-;52229:61;;;;52366:6;52376:1;52366:11;;52358:46;;;;;-1:-1:-1;;;52358:46:0;;;;;;;;;;;;-1:-1:-1;;;52358:46:0;;;;;;;;;;;;;;;52417:24;52444:13;52458:1;52444:16;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52444:16:0;;-1:-1:-1;22683:42:0;52540:35;;52536:270;;;52611:7;52598:9;:20;52590:56;;;;;-1:-1:-1;;;52590:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;52536:270;;;52683:9;:14;:100;;;;;52776:7;52701:71;52743:28;52758:12;52743:14;:28::i;:::-;52701:37;;;-1:-1:-1;;;52701:37:0;;52732:4;52701:37;;;;;;-1:-1:-1;;;;;52701:22:0;;;;;:37;;;;;;;;;;;;;;:22;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52701:37:0;;:41;:71::i;:::-;:82;;52683:100;52675:131;;;;;-1:-1:-1;;;52675:131:0;;;;;;;;;;;;-1:-1:-1;;;52675:131:0;;;;;;;;;;;;;;;52856:32;52875:12;52856:18;:32::i;:::-;52985:6;;;52968:53;;;-1:-1:-1;;;52968:53:0;;-1:-1:-1;;;;;52968:53:0;;;;;;;;;;;;;;;;;;52985:6;;;;;52968:31;;:53;;;;;52985:6;;52968:53;;;;;;;;52985:6;;52968:53;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;53131:6:0;;53076:95;;-1:-1:-1;53100:12:0;;-1:-1:-1;;;;;;53131:6:0;53141:7;53150;53159:6;53167:3;53076:23;:95::i;:::-;-1:-1:-1;53191:6:0;;52075:1130;-1:-1:-1;;;;;52075:1130:0:o;53577:1593::-;53792:6;;;53775:50;;;-1:-1:-1;;;53775:50:0;;53819:4;53775:50;;;;;;;;53673:7;;-1:-1:-1;;;;;53792:6:0;;;;53775:35;;:50;;;;;;;;;;;;;;53792:6;53775:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53775:50:0;53764:61;;;53756:92;;;;;-1:-1:-1;;;53756:92:0;;;;;;;;;;;;-1:-1:-1;;;53756:92:0;;;;;;;;;;;;;;;53909:14;53925:11;53940:25;53957:7;53940:16;:25::i;:::-;53908:57;;;;54041:6;54051:1;54041:11;;54033:46;;;;;-1:-1:-1;;;54033:46:0;;;;;;;;;;;;-1:-1:-1;;;54033:46:0;;;;;;;;;;;;;;;54092:24;54119:13;54133:1;54119:16;;;;;;;;;;;;;;;;;;;;54299:6;;;54282:39;;;-1:-1:-1;;;54282:39:0;;;;-1:-1:-1;;;;;54119:16:0;;;;-1:-1:-1;54299:6:0;;;;;54282:37;;:39;;;;54119:16;;54282:39;;;;;;;54299:6;54282:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54282:39:0;;-1:-1:-1;54332:18:0;54353:28;54368:12;54353:14;:28::i;:::-;54332:49;;54408:10;54399:6;:19;:71;;;;54433:10;54423:6;:20;:46;;;;;54458:11;54447:7;:22;54423:46;54392:79;;;;54579:6;;;54562:57;;;-1:-1:-1;;;54562:57:0;;54604:4;54562:57;;;;;;;;;;;;;;-1:-1:-1;;;;;54579:6:0;;;;54562:33;;:57;;;;;54579:6;;54562:57;;;;;;;54579:6;;54562:57;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;54704:22:0;;;;;;:8;:22;;;;;:30;:42;;-1:-1:-1;54739:6:0;54704:34;:42::i;:::-;-1:-1:-1;;;;;54671:22:0;;;;;;:8;:22;;;;;:75;;;;22683:42;54830:35;54826:160;;;54880:29;;-1:-1:-1;;;;;54880:21:0;;;:29;;;;;54902:6;;54880:29;;;;54902:6;54880:21;:29;;;;;;;;;;;;;;;;;;;;;54826:160;;;54938:48;54951:12;54965;54979:6;54938:12;:48::i;:::-;55082:6;;55041:95;;-1:-1:-1;;;;;55082:6:0;55092:12;55106:7;55115;55124:6;55132:3;55041:23;:95::i;:::-;-1:-1:-1;55156:6:0;;53577:1593;-1:-1:-1;;;;;;;53577:1593:0:o;41426:758::-;-1:-1:-1;;;42047:10:0;:21;42040:29;;;;42085:91;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42085:91:0;;;;;;;;;;;;;;;;;;;;;41426:758;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
ipfs://f8c1e0e2ec3950a0ca01ac003b4d767e4ea2e2eae30ec9a7a322bddc5ae37a11
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | Ether (ETH) | 100.00% | $3,133.89 | 83.7748 | $262,540.82 |
Loading...
Loading
[ Download: CSV Export ]
[ 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.