Bancor contract vulnerability: A critical bug in three recently deployed versions of the Bancor Network smart contract has led to a loss of user funds.
Overview
ETH Balance
0 ETH
Eth Value
$0.00Latest 25 from a total of 438 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Safe Transfer Fr... | 14535864 | 1171 days ago | IN | 0 ETH | 0.01384733 | ||||
Safe Transfer Fr... | 10347761 | 1820 days ago | IN | 0 ETH | 0.00086212 | ||||
Safe Transfer Fr... | 10335523 | 1821 days ago | IN | 0 ETH | 0.0049426 | ||||
Safe Transfer Fr... | 10300772 | 1827 days ago | IN | 0 ETH | 0.00233655 | ||||
Convert2 | 10298486 | 1827 days ago | IN | 0.1 ETH | 0.00202582 | ||||
Safe Transfer Fr... | 10293947 | 1828 days ago | IN | 0 ETH | 0.0024624 | ||||
Safe Transfer Fr... | 10290395 | 1828 days ago | IN | 0 ETH | 0.0015872 | ||||
Safe Transfer Fr... | 10290068 | 1829 days ago | IN | 0 ETH | 0.00159435 | ||||
Safe Transfer Fr... | 10289851 | 1829 days ago | IN | 0 ETH | 0.0015846 | ||||
Safe Transfer Fr... | 10289805 | 1829 days ago | IN | 0 ETH | 0.0015852 | ||||
Safe Transfer Fr... | 10289796 | 1829 days ago | IN | 0 ETH | 0.0023352 | ||||
Safe Transfer Fr... | 10289763 | 1829 days ago | IN | 0 ETH | 0.00744355 | ||||
Safe Transfer Fr... | 10289558 | 1829 days ago | IN | 0 ETH | 0.0015852 | ||||
Safe Transfer Fr... | 10289509 | 1829 days ago | IN | 0 ETH | 0.0049426 | ||||
Safe Transfer Fr... | 10289473 | 1829 days ago | IN | 0 ETH | 0.00204246 | ||||
Claim And Conver... | 10289323 | 1829 days ago | IN | 0 ETH | 0.01655299 | ||||
Safe Transfer Fr... | 10288893 | 1829 days ago | IN | 0 ETH | 0.00159435 | ||||
Safe Transfer Fr... | 10288650 | 1829 days ago | IN | 0 ETH | 0.00594372 | ||||
Safe Transfer Fr... | 10288628 | 1829 days ago | IN | 0 ETH | 0.00408153 | ||||
Safe Transfer Fr... | 10288364 | 1829 days ago | IN | 0 ETH | 0.00234435 | ||||
Safe Transfer Fr... | 10288113 | 1829 days ago | IN | 0 ETH | 0.00874804 | ||||
Safe Transfer Fr... | 10287755 | 1829 days ago | IN | 0 ETH | 0.00592609 | ||||
Claim And Conver... | 10287579 | 1829 days ago | IN | 0 ETH | 0.00253056 | ||||
Claim And Conver... | 10287430 | 1829 days ago | IN | 0 ETH | 0.00308464 | ||||
Convert2 | 10287408 | 1829 days ago | IN | 1 ETH | 0.00986634 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Method | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|---|
- | 10378502 | 1815 days ago | 0.0025 ETH | ||||
- | 10378502 | 1815 days ago | 0.0025 ETH | ||||
- | 10298486 | 1827 days ago | 0.1 ETH | ||||
- | 10288575 | 1829 days ago | 0.31 ETH | ||||
- | 10288575 | 1829 days ago | 0.31 ETH | ||||
- | 10288378 | 1829 days ago | 13.99972091 ETH | ||||
- | 10288378 | 1829 days ago | 13.99972091 ETH | ||||
- | 10288378 | 1829 days ago | 6.49982016 ETH | ||||
- | 10288378 | 1829 days ago | 6.49982016 ETH | ||||
- | 10288377 | 1829 days ago | 4.8442936 ETH | ||||
- | 10288377 | 1829 days ago | 4.8442936 ETH | ||||
- | 10288377 | 1829 days ago | 7.60852531 ETH | ||||
- | 10288377 | 1829 days ago | 7.60852531 ETH | ||||
- | 10288377 | 1829 days ago | 6.99971972 ETH | ||||
- | 10288377 | 1829 days ago | 6.99971972 ETH | ||||
- | 10288377 | 1829 days ago | 10.47852454 ETH | ||||
- | 10288377 | 1829 days ago | 10.47852454 ETH | ||||
- | 10288377 | 1829 days ago | 6.99971972 ETH | ||||
- | 10288377 | 1829 days ago | 6.99971972 ETH | ||||
- | 10288377 | 1829 days ago | 4.32731612 ETH | ||||
- | 10288377 | 1829 days ago | 4.32731612 ETH | ||||
- | 10288105 | 1829 days ago | 35.65 ETH | ||||
- | 10288105 | 1829 days ago | 35.65 ETH | ||||
- | 10288098 | 1829 days ago | 35.65 ETH | ||||
- | 10288098 | 1829 days ago | 35.65 ETH |
Loading...
Loading
Contract Name:
BancorNetwork
Compiler Version
v0.4.26+commit.4563c3fc
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-06-17 */ // File: contracts/token/interfaces/IERC20Token.sol pragma solidity 0.4.26; /* ERC20 Standard Token interface */ contract IERC20Token { // these functions aren't abstract since the compiler emits automatically generated getter functions as external function name() public view returns (string) {this;} function symbol() public view returns (string) {this;} function decimals() public view returns (uint8) {this;} function totalSupply() public view returns (uint256) {this;} function balanceOf(address _owner) public view returns (uint256) {_owner; this;} function allowance(address _owner, address _spender) public view returns (uint256) {_owner; _spender; this;} function transfer(address _to, uint256 _value) public returns (bool success); function transferFrom(address _from, address _to, uint256 _value) public returns (bool success); function approve(address _spender, uint256 _value) public returns (bool success); } // File: contracts/IBancorNetwork.sol pragma solidity 0.4.26; /* Bancor Network interface */ contract IBancorNetwork { function convert2( IERC20Token[] _path, uint256 _amount, uint256 _minReturn, address _affiliateAccount, uint256 _affiliateFee ) public payable returns (uint256); function claimAndConvert2( IERC20Token[] _path, uint256 _amount, uint256 _minReturn, address _affiliateAccount, uint256 _affiliateFee ) public returns (uint256); function convertFor2( IERC20Token[] _path, uint256 _amount, uint256 _minReturn, address _for, address _affiliateAccount, uint256 _affiliateFee ) public payable returns (uint256); function claimAndConvertFor2( IERC20Token[] _path, uint256 _amount, uint256 _minReturn, address _for, address _affiliateAccount, uint256 _affiliateFee ) public returns (uint256); // deprecated, backward compatibility function convert( IERC20Token[] _path, uint256 _amount, uint256 _minReturn ) public payable returns (uint256); // deprecated, backward compatibility function claimAndConvert( IERC20Token[] _path, uint256 _amount, uint256 _minReturn ) public returns (uint256); // deprecated, backward compatibility function convertFor( IERC20Token[] _path, uint256 _amount, uint256 _minReturn, address _for ) public payable returns (uint256); // deprecated, backward compatibility function claimAndConvertFor( IERC20Token[] _path, uint256 _amount, uint256 _minReturn, address _for ) public returns (uint256); } // File: contracts/IConversionPathFinder.sol pragma solidity 0.4.26; /* Conversion Path Finder interface */ contract IConversionPathFinder { function findPath(address _sourceToken, address _targetToken) public view returns (address[] memory); } // File: contracts/utility/interfaces/IOwned.sol pragma solidity 0.4.26; /* Owned contract interface */ contract IOwned { // this function isn't abstract since the compiler emits automatically generated getter functions as external function owner() public view returns (address) {this;} function transferOwnership(address _newOwner) public; function acceptOwnership() public; } // File: contracts/utility/interfaces/ITokenHolder.sol pragma solidity 0.4.26; /* Token Holder interface */ contract ITokenHolder is IOwned { function withdrawTokens(IERC20Token _token, address _to, uint256 _amount) public; } // File: contracts/converter/interfaces/IConverterAnchor.sol pragma solidity 0.4.26; /* Converter Anchor interface */ contract IConverterAnchor is IOwned, ITokenHolder { } // File: contracts/utility/interfaces/IWhitelist.sol pragma solidity 0.4.26; /* Whitelist interface */ contract IWhitelist { function isWhitelisted(address _address) public view returns (bool); } // File: contracts/converter/interfaces/IConverter.sol pragma solidity 0.4.26; /* Converter interface */ contract IConverter is IOwned { function converterType() public pure returns (uint16); function anchor() public view returns (IConverterAnchor) {this;} function isActive() public view returns (bool); function rateAndFee(IERC20Token _sourceToken, IERC20Token _targetToken, uint256 _amount) public view returns (uint256, uint256); function convert(IERC20Token _sourceToken, IERC20Token _targetToken, uint256 _amount, address _trader, address _beneficiary) public payable returns (uint256); function conversionWhitelist() public view returns (IWhitelist) {this;} function conversionFee() public view returns (uint32) {this;} function maxConversionFee() public view returns (uint32) {this;} function reserveBalance(IERC20Token _reserveToken) public view returns (uint256); function() external payable; function transferAnchorOwnership(address _newOwner) public; function acceptAnchorOwnership() public; function setConversionFee(uint32 _conversionFee) public; function setConversionWhitelist(IWhitelist _whitelist) public; function withdrawTokens(IERC20Token _token, address _to, uint256 _amount) public; function withdrawETH(address _to) public; function addReserve(IERC20Token _token, uint32 _ratio) public; // deprecated, backward compatibility function token() public view returns (IConverterAnchor); function transferTokenOwnership(address _newOwner) public; function acceptTokenOwnership() public; function connectors(address _address) public view returns (uint256, uint32, bool, bool, bool); function getConnectorBalance(IERC20Token _connectorToken) public view returns (uint256); function connectorTokens(uint256 _index) public view returns (IERC20Token); function connectorTokenCount() public view returns (uint16); } // File: contracts/converter/interfaces/IBancorFormula.sol pragma solidity 0.4.26; /* Bancor Formula interface */ contract IBancorFormula { function purchaseRate(uint256 _supply, uint256 _reserveBalance, uint32 _reserveWeight, uint256 _amount) public view returns (uint256); function saleRate(uint256 _supply, uint256 _reserveBalance, uint32 _reserveWeight, uint256 _amount) public view returns (uint256); function crossReserveRate(uint256 _sourceReserveBalance, uint32 _sourceReserveWeight, uint256 _targetReserveBalance, uint32 _targetReserveWeight, uint256 _amount) public view returns (uint256); function fundCost(uint256 _supply, uint256 _reserveBalance, uint32 _reserveRatio, uint256 _amount) public view returns (uint256); function liquidateRate(uint256 _supply, uint256 _reserveBalance, uint32 _reserveRatio, uint256 _amount) public view returns (uint256); } // File: contracts/utility/Owned.sol pragma solidity 0.4.26; /** * @dev Provides support and utilities for contract ownership */ contract Owned is IOwned { address public 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 ownerOnly { require(_newOwner != owner, "ERR_SAME_OWNER"); newOwner = _newOwner; } /** * @dev used by a new owner to accept an ownership transfer */ function acceptOwnership() public { require(msg.sender == newOwner, "ERR_ACCESS_DENIED"); emit OwnerUpdate(owner, newOwner); owner = newOwner; newOwner = address(0); } } // File: contracts/utility/Utils.sol pragma solidity 0.4.26; /** * @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: contracts/utility/interfaces/IContractRegistry.sol pragma solidity 0.4.26; /* Contract Registry interface */ contract IContractRegistry { function addressOf(bytes32 _contractName) public view returns (address); // deprecated, backward compatibility function getAddress(bytes32 _contractName) public view returns (address); } // File: contracts/utility/ContractRegistryClient.sol pragma solidity 0.4.26; /** * @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"; 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(_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 != address(registry) && 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: contracts/utility/ReentrancyGuard.sol pragma solidity 0.4.26; /** * @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: contracts/utility/TokenHandler.sol pragma solidity 0.4.26; 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) public { execute(_token, abi.encodeWithSelector(APPROVE_FUNC_SELECTOR, _spender, _value)); } /** * @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) public { execute(_token, abi.encodeWithSelector(TRANSFER_FUNC_SELECTOR, _to, _value)); } /** * @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) public { execute(_token, abi.encodeWithSelector(TRANSFER_FROM_FUNC_SELECTOR, _from, _to, _value)); } /** * @dev executes a function on the ERC20 token 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 _data data to pass in to the token's contract for execution */ function execute(IERC20Token _token, bytes memory _data) private { uint256[1] memory ret = [uint256(1)]; assembly { let success := call( gas, // gas remaining _token, // destination address 0, // no ether add(_data, 32), // input buffer (starts after the first 32 bytes in the `data` array) mload(_data), // input length (loaded from the first 32 bytes in the `data` array) ret, // output buffer 32 // output length ) if iszero(success) { revert(0, 0) } } require(ret[0] != 0, "ERR_TRANSFER_FAILED"); } } // File: contracts/utility/TokenHolder.sol pragma solidity 0.4.26; /** * @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 ownerOnly validAddress(_token) validAddress(_to) notThis(_to) { safeTransfer(_token, _to, _amount); } } // File: contracts/utility/SafeMath.sol pragma solidity 0.4.26; /** * @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: contracts/token/interfaces/IEtherToken.sol pragma solidity 0.4.26; /* Ether Token interface */ contract IEtherToken is IERC20Token { function deposit() public payable; function withdraw(uint256 _amount) public; function depositTo(address _to) public payable; function withdrawTo(address _to, uint256 _amount) public; } // File: contracts/token/interfaces/ISmartToken.sol pragma solidity 0.4.26; /* Smart Token interface */ contract ISmartToken is IConverterAnchor, IERC20Token { function disableTransfers(bool _disable) public; function issue(address _to, uint256 _amount) public; function destroy(address _from, uint256 _amount) public; } // File: contracts/bancorx/interfaces/IBancorX.sol pragma solidity 0.4.26; contract IBancorX { function token() public view returns (IERC20Token) {this;} function xTransfer(bytes32 _toBlockchain, bytes32 _to, uint256 _amount, uint256 _id) public; function getXTransferAmount(uint256 _xTransferId, address _for) public view returns (uint256); } // File: contracts/BancorNetwork.sol pragma solidity 0.4.26; // interface of older converters for backward compatibility contract ILegacyConverter { function change(IERC20Token _sourceToken, IERC20Token _targetToken, uint256 _amount, uint256 _minReturn) public returns (uint256); } /** * @dev The BancorNetwork contract is the main entry point for Bancor token conversions. * It also allows for the conversion of any token in the Bancor Network to any other token in a single * transaction by providing a conversion path. * * A note on Conversion Path: Conversion path is a data structure that is used when converting a token * to another token in the Bancor Network, when the conversion cannot necessarily be done by a single * converter and might require multiple 'hops'. * The path defines which converters should be used and what kind of conversion should be done in each step. * * The path format doesn't include complex structure; instead, it is represented by a single array * in which each 'hop' is represented by a 2-tuple - converter anchor & target token. * In addition, the first element is always the source token. * The converter anchor is only used as a pointer to a converter (since converter addresses are more * likely to change as opposed to anchor addresses). * * Format: * [source token, converter anchor, target token, converter anchor, target token...] */ contract BancorNetwork is IBancorNetwork, TokenHolder, ContractRegistryClient, ReentrancyGuard { using SafeMath for uint256; uint256 private constant CONVERSION_FEE_RESOLUTION = 1000000; uint256 private constant AFFILIATE_FEE_RESOLUTION = 1000000; address private constant ETH_RESERVE_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; struct ConversionStep { IConverter converter; IConverterAnchor anchor; IERC20Token sourceToken; IERC20Token targetToken; address beneficiary; bool isV28OrHigherConverter; bool processAffiliateFee; } uint256 public maxAffiliateFee = 30000; // maximum affiliate-fee mapping (address => bool) public etherTokens; // list of all supported ether tokens /** * @dev triggered when a conversion between two tokens occurs * * @param _smartToken anchor governed by the converter * @param _fromToken source ERC20 token * @param _toToken target ERC20 token * @param _fromAmount amount converted, in the source token * @param _toAmount amount returned, minus conversion fee * @param _trader wallet that initiated the trade */ event Conversion( address indexed _smartToken, address indexed _fromToken, address indexed _toToken, uint256 _fromAmount, uint256 _toAmount, address _trader ); /** * @dev initializes a new BancorNetwork instance * * @param _registry address of a contract registry contract */ constructor(IContractRegistry _registry) ContractRegistryClient(_registry) public { etherTokens[ETH_RESERVE_ADDRESS] = true; } /** * @dev allows the owner to update the maximum affiliate-fee * * @param _maxAffiliateFee maximum affiliate-fee */ function setMaxAffiliateFee(uint256 _maxAffiliateFee) public ownerOnly { require(_maxAffiliateFee <= AFFILIATE_FEE_RESOLUTION, "ERR_INVALID_AFFILIATE_FEE"); maxAffiliateFee = _maxAffiliateFee; } /** * @dev allows the owner to register/unregister ether tokens * * @param _token ether token contract address * @param _register true to register, false to unregister */ function registerEtherToken(IEtherToken _token, bool _register) public ownerOnly validAddress(_token) notThis(_token) { etherTokens[_token] = _register; } /** * @dev returns the conversion path between two tokens in the network * note that this method is quite expensive in terms of gas and should generally be called off-chain * * @param _sourceToken source token address * @param _targetToken target token address * * @return conversion path between the two tokens */ function conversionPath(IERC20Token _sourceToken, IERC20Token _targetToken) public view returns (address[]) { IConversionPathFinder pathFinder = IConversionPathFinder(addressOf(CONVERSION_PATH_FINDER)); return pathFinder.findPath(_sourceToken, _targetToken); } /** * @dev returns the expected rate of converting a given amount on a given path * note that there is no support for circular paths * * @param _path conversion path (see conversion path format above) * @param _amount amount of _path[0] tokens received from the sender * * @return expected rate */ function rateByPath(IERC20Token[] _path, uint256 _amount) public view returns (uint256) { uint256 amount; uint256 fee; uint256 supply; uint256 balance; uint32 weight; IConverter converter; IBancorFormula formula = IBancorFormula(addressOf(BANCOR_FORMULA)); amount = _amount; // verify that the number of elements is larger than 2 and odd require(_path.length > 2 && _path.length % 2 == 1, "ERR_INVALID_PATH"); // iterate over the conversion path for (uint256 i = 2; i < _path.length; i += 2) { IERC20Token sourceToken = _path[i - 2]; IERC20Token anchor = _path[i - 1]; IERC20Token targetToken = _path[i]; converter = IConverter(IConverterAnchor(anchor).owner()); // backward compatibility sourceToken = getConverterTokenAddress(converter, sourceToken); targetToken = getConverterTokenAddress(converter, targetToken); if (targetToken == anchor) { // buy the smart token // check if the current smart token has changed if (i < 3 || anchor != _path[i - 3]) supply = ISmartToken(anchor).totalSupply(); // get the amount & the conversion fee balance = converter.getConnectorBalance(sourceToken); (, weight, , , ) = converter.connectors(sourceToken); amount = formula.purchaseRate(supply, balance, weight, amount); fee = amount.mul(converter.conversionFee()).div(CONVERSION_FEE_RESOLUTION); amount -= fee; // update the smart token supply for the next iteration supply = supply.add(amount); } else if (sourceToken == anchor) { // sell the smart token // check if the current smart token has changed if (i < 3 || anchor != _path[i - 3]) supply = ISmartToken(anchor).totalSupply(); // get the amount & the conversion fee balance = converter.getConnectorBalance(targetToken); (, weight, , , ) = converter.connectors(targetToken); amount = formula.saleRate(supply, balance, weight, amount); fee = amount.mul(converter.conversionFee()).div(CONVERSION_FEE_RESOLUTION); amount -= fee; // update the smart token supply for the next iteration supply = supply.sub(amount); } else { // cross reserve conversion (amount, fee) = getReturn(converter, sourceToken, targetToken, amount); } } return amount; } /** * @dev converts the token to any other token in the bancor network by following * a predefined conversion path and transfers the result tokens to a target account * affiliate account/fee can also be passed in to receive a conversion fee (on top of the liquidity provider fees) * note that the network should already have been given allowance of the source token (if not ETH) * * @param _path conversion path, see conversion path format above * @param _amount amount to convert from, in the source token * @param _minReturn if the conversion results in an amount smaller than the minimum return - it is cancelled, must be greater than zero * @param _beneficiary account that will receive the conversion result or 0x0 to send the result to the sender account * @param _affiliateAccount wallet address to receive the affiliate fee or 0x0 to disable affiliate fee * @param _affiliateFee affiliate fee in PPM or 0 to disable affiliate fee * * @return amount of tokens received from the conversion */ function convertByPath(IERC20Token[] _path, uint256 _amount, uint256 _minReturn, address _beneficiary, address _affiliateAccount, uint256 _affiliateFee) public payable protected greaterThanZero(_minReturn) returns (uint256) { // verify that the path contrains at least a single 'hop' and that the number of elements is odd require(_path.length > 2 && _path.length % 2 == 1, "ERR_INVALID_PATH"); // validate msg.value and prepare the source token for the conversion handleSourceToken(_path[0], IConverterAnchor(_path[1]), _amount); // check if affiliate fee is enabled bool affiliateFeeEnabled = false; if (address(_affiliateAccount) == 0) { require(_affiliateFee == 0, "ERR_INVALID_AFFILIATE_FEE"); } else { require(0 < _affiliateFee && _affiliateFee <= maxAffiliateFee, "ERR_INVALID_AFFILIATE_FEE"); affiliateFeeEnabled = true; } // check if beneficiary is set address beneficiary = msg.sender; if (_beneficiary != address(0)) beneficiary = _beneficiary; // convert and get the resulting amount ConversionStep[] memory data = createConversionData(_path, beneficiary, affiliateFeeEnabled); uint256 amount = doConversion(data, _amount, _minReturn, _affiliateAccount, _affiliateFee); // handle the conversion target tokens handleTargetToken(data, amount, beneficiary); return amount; } /** * @dev converts any other token to BNT in the bancor network by following a predefined conversion path and transfers the result to an account on a different blockchain * note that the network should already have been given allowance of the source token (if not ETH) * * @param _path conversion path, see conversion path format above * @param _amount amount to convert from, in the source token * @param _minReturn if the conversion results in an amount smaller than the minimum return - it is cancelled, must be greater than zero * @param _targetBlockchain blockchain BNT will be issued on * @param _targetAccount address/account on the target blockchain to send the BNT to * @param _conversionId pre-determined unique (if non zero) id which refers to this transaction * * @return the amount of BNT received from this conversion */ function xConvert( IERC20Token[] _path, uint256 _amount, uint256 _minReturn, bytes32 _targetBlockchain, bytes32 _targetAccount, uint256 _conversionId ) public payable returns (uint256) { return xConvert2(_path, _amount, _minReturn, _targetBlockchain, _targetAccount, _conversionId, address(0), 0); } /** * @dev converts any other token to BNT in the bancor network by following a predefined conversion path and transfers the result to an account on a different blockchain * note that the network should already have been given allowance of the source token (if not ETH) * * @param _path conversion path, see conversion path format above * @param _amount amount to convert from, in the source token * @param _minReturn if the conversion results in an amount smaller than the minimum return - it is cancelled, must be greater than zero * @param _targetBlockchain blockchain BNT will be issued on * @param _targetAccount address/account on the target blockchain to send the BNT to * @param _conversionId pre-determined unique (if non zero) id which refers to this transaction * @param _affiliateAccount affiliate account * @param _affiliateFee affiliate fee in PPM * * @return the amount of BNT received from this conversion */ function xConvert2( IERC20Token[] _path, uint256 _amount, uint256 _minReturn, bytes32 _targetBlockchain, bytes32 _targetAccount, uint256 _conversionId, address _affiliateAccount, uint256 _affiliateFee ) public payable greaterThanZero(_minReturn) returns (uint256) { IERC20Token targetToken = _path[_path.length - 1]; IBancorX bancorX = IBancorX(addressOf(BANCOR_X)); // verify that the destination token is BNT require(targetToken == addressOf(BNT_TOKEN), "ERR_INVALID_TARGET_TOKEN"); // convert and get the resulting amount uint256 amount = convertByPath(_path, _amount, _minReturn, this, _affiliateAccount, _affiliateFee); // grant BancorX allowance ensureAllowance(targetToken, bancorX, amount); // transfer the resulting amount to BancorX bancorX.xTransfer(_targetBlockchain, _targetAccount, amount, _conversionId); return amount; } /** * @dev allows a user to convert a token that was sent from another blockchain into any other * token on the BancorNetwork * ideally this transaction is created before the previous conversion is even complete, so * so the input amount isn't known at that point - the amount is actually take from the * BancorX contract directly by specifying the conversion id * * @param _path conversion path * @param _bancorX address of the BancorX contract for the source token * @param _conversionId pre-determined unique (if non zero) id which refers to this conversion * @param _minReturn if the conversion results in an amount smaller than the minimum return - it is cancelled, must be nonzero * @param _beneficiary wallet to receive the conversion result * * @return amount of tokens received from the conversion */ function completeXConversion(IERC20Token[] _path, IBancorX _bancorX, uint256 _conversionId, uint256 _minReturn, address _beneficiary) public returns (uint256) { // verify that the source token is the BancorX token require(_path[0] == _bancorX.token(), "ERR_INVALID_SOURCE_TOKEN"); // get conversion amount from BancorX contract uint256 amount = _bancorX.getXTransferAmount(_conversionId, msg.sender); // perform the conversion return convertByPath(_path, amount, _minReturn, _beneficiary, address(0), 0); } /** * @dev executes the actual conversion by following the conversion path * * @param _data conversion data, see ConversionStep struct above * @param _amount amount to convert from, in the source token * @param _minReturn if the conversion results in an amount smaller than the minimum return - it is cancelled, must be greater than zero * @param _affiliateAccount affiliate account * @param _affiliateFee affiliate fee in PPM * * @return amount of tokens received from the conversion */ function doConversion( ConversionStep[] _data, uint256 _amount, uint256 _minReturn, address _affiliateAccount, uint256 _affiliateFee ) private returns (uint256) { uint256 toAmount; uint256 fromAmount = _amount; // iterate over the conversion data for (uint256 i = 0; i < _data.length; i++) { ConversionStep memory stepData = _data[i]; // newer converter if (stepData.isV28OrHigherConverter) { // transfer the tokens to the converter only if the network contract currently holds the tokens // not needed with ETH or if it's the first conversion step if (i != 0 && _data[i - 1].beneficiary == address(this) && !etherTokens[stepData.sourceToken]) safeTransfer(stepData.sourceToken, stepData.converter, fromAmount); } // older converter // if the source token is the smart token, no need to do any transfers as the converter controls it else if (stepData.sourceToken != ISmartToken(stepData.anchor)) { // grant allowance for it to transfer the tokens from the network contract ensureAllowance(stepData.sourceToken, stepData.converter, fromAmount); } // do the conversion if (!stepData.isV28OrHigherConverter) toAmount = ILegacyConverter(stepData.converter).change(stepData.sourceToken, stepData.targetToken, fromAmount, 1); else if (etherTokens[stepData.sourceToken]) toAmount = stepData.converter.convert.value(msg.value)(stepData.sourceToken, stepData.targetToken, fromAmount, msg.sender, stepData.beneficiary); else toAmount = stepData.converter.convert(stepData.sourceToken, stepData.targetToken, fromAmount, msg.sender, stepData.beneficiary); // pay affiliate-fee if needed if (stepData.processAffiliateFee) { uint256 affiliateAmount = toAmount.mul(_affiliateFee).div(AFFILIATE_FEE_RESOLUTION); require(stepData.targetToken.transfer(_affiliateAccount, affiliateAmount), "ERR_FEE_TRANSFER_FAILED"); toAmount -= affiliateAmount; } emit Conversion(stepData.anchor, stepData.sourceToken, stepData.targetToken, fromAmount, toAmount, msg.sender); fromAmount = toAmount; } // ensure the trade meets the minimum requested amount require(toAmount >= _minReturn, "ERR_RETURN_TOO_LOW"); return toAmount; } /** * @dev validates msg.value and prepares the conversion source token for the conversion * * @param _sourceToken source token of the first conversion step * @param _anchor converter anchor of the first conversion step * @param _amount amount to convert from, in the source token */ function handleSourceToken(IERC20Token _sourceToken, IConverterAnchor _anchor, uint256 _amount) private { IConverter firstConverter = IConverter(_anchor.owner()); bool isNewerConverter = isV28OrHigherConverter(firstConverter); // ETH if (msg.value > 0) { // validate msg.value require(msg.value == _amount, "ERR_ETH_AMOUNT_MISMATCH"); // EtherToken converter - deposit the ETH into the EtherToken // note that it can still be a non ETH converter if the path is wrong // but such conversion will simply revert if (!isNewerConverter) IEtherToken(getConverterEtherTokenAddress(firstConverter)).deposit.value(msg.value)(); } // EtherToken else if (etherTokens[_sourceToken]) { // claim the tokens - if the source token is ETH reserve, this call will fail // since in that case the transaction must be sent with msg.value safeTransferFrom(_sourceToken, msg.sender, this, _amount); // ETH converter - withdraw the ETH if (isNewerConverter) IEtherToken(_sourceToken).withdraw(_amount); } // other ERC20 token else { // newer converter - transfer the tokens from the sender directly to the converter // otherwise claim the tokens if (isNewerConverter) safeTransferFrom(_sourceToken, msg.sender, firstConverter, _amount); else safeTransferFrom(_sourceToken, msg.sender, this, _amount); } } /** * @dev handles the conversion target token if the network still holds it at the end of the conversion * * @param _data conversion data, see ConversionStep struct above * @param _amount conversion return amount, in the target token * @param _beneficiary wallet to receive the conversion result */ function handleTargetToken(ConversionStep[] _data, uint256 _amount, address _beneficiary) private { ConversionStep memory stepData = _data[_data.length - 1]; // network contract doesn't hold the tokens, do nothing if (stepData.beneficiary != address(this)) return; IERC20Token targetToken = stepData.targetToken; // ETH / EtherToken if (etherTokens[targetToken]) { // newer converter should send ETH directly to the beneficiary assert(!stepData.isV28OrHigherConverter); // EtherToken converter - withdraw the ETH and transfer to the beneficiary IEtherToken(targetToken).withdrawTo(_beneficiary, _amount); } // other ERC20 token else { safeTransfer(targetToken, _beneficiary, _amount); } } /** * @dev creates a memory cache of all conversion steps data to minimize logic and external calls during conversions * * @param _conversionPath conversion path, see conversion path format above * @param _beneficiary wallet to receive the conversion result * @param _affiliateFeeEnabled true if affiliate fee was requested by the sender, false if not * * @return cached conversion data to be ingested later on by the conversion flow */ function createConversionData(IERC20Token[] _conversionPath, address _beneficiary, bool _affiliateFeeEnabled) private view returns (ConversionStep[]) { ConversionStep[] memory data = new ConversionStep[](_conversionPath.length / 2); bool affiliateFeeProcessed = false; address bntToken = addressOf(BNT_TOKEN); // iterate the conversion path and create the conversion data for each step uint256 i; for (i = 0; i < _conversionPath.length - 1; i += 2) { IConverterAnchor anchor = IConverterAnchor(_conversionPath[i + 1]); IConverter converter = IConverter(anchor.owner()); IERC20Token targetToken = _conversionPath[i + 2]; // check if the affiliate fee should be processed in this step bool processAffiliateFee = _affiliateFeeEnabled && !affiliateFeeProcessed && targetToken == bntToken; if (processAffiliateFee) affiliateFeeProcessed = true; data[i / 2] = ConversionStep({ // set the converter anchor anchor: anchor, // set the converter converter: converter, // set the source/target tokens sourceToken: _conversionPath[i], targetToken: targetToken, // requires knowledge about the next step, so initialize in the next phase beneficiary: address(0), // set flags isV28OrHigherConverter: isV28OrHigherConverter(converter), processAffiliateFee: processAffiliateFee }); } // ETH support // source is ETH ConversionStep memory stepData = data[0]; if (etherTokens[stepData.sourceToken]) { // newer converter - replace the source token address with ETH reserve address if (stepData.isV28OrHigherConverter) stepData.sourceToken = IERC20Token(ETH_RESERVE_ADDRESS); // older converter - replace the source token with the EtherToken address used by the converter else stepData.sourceToken = IERC20Token(getConverterEtherTokenAddress(stepData.converter)); } // target is ETH stepData = data[data.length - 1]; if (etherTokens[stepData.targetToken]) { // newer converter - replace the target token address with ETH reserve address if (stepData.isV28OrHigherConverter) stepData.targetToken = IERC20Token(ETH_RESERVE_ADDRESS); // older converter - replace the target token with the EtherToken address used by the converter else stepData.targetToken = IERC20Token(getConverterEtherTokenAddress(stepData.converter)); } // set the beneficiary for each step for (i = 0; i < data.length; i++) { stepData = data[i]; // first check if the converter in this step is newer as older converters don't even support the beneficiary argument if (stepData.isV28OrHigherConverter) { // if affiliate fee is processed in this step, beneficiary is the network contract if (stepData.processAffiliateFee) stepData.beneficiary = this; // if it's the last step, beneficiary is the final beneficiary else if (i == data.length - 1) stepData.beneficiary = _beneficiary; // if the converter in the next step is newer, beneficiary is the next converter else if (data[i + 1].isV28OrHigherConverter) stepData.beneficiary = data[i + 1].converter; // the converter in the next step is older, beneficiary is the network contract else stepData.beneficiary = this; } else { // converter in this step is older, beneficiary is the network contract stepData.beneficiary = this; } } return data; } /** * @dev utility, checks whether allowance for the given spender exists and approves one if it doesn't. * Note that we use the non standard erc-20 interface in which `approve` has no return value so that * this function will work for both standard and non standard tokens * * @param _token token to check the allowance in * @param _spender approved address * @param _value allowance amount */ function ensureAllowance(IERC20Token _token, address _spender, uint256 _value) private { uint256 allowance = _token.allowance(this, _spender); if (allowance < _value) { if (allowance > 0) safeApprove(_token, _spender, 0); safeApprove(_token, _spender, _value); } } // legacy - returns the address of an EtherToken used by the converter function getConverterEtherTokenAddress(IConverter _converter) private view returns (address) { uint256 reserveCount = _converter.connectorTokenCount(); for (uint256 i = 0; i < reserveCount; i++) { address reserveTokenAddress = _converter.connectorTokens(i); if (etherTokens[reserveTokenAddress]) return reserveTokenAddress; } return ETH_RESERVE_ADDRESS; } // legacy - if the token is an ether token, returns the ETH reserve address // used by the converter, otherwise returns the input token address function getConverterTokenAddress(IConverter _converter, IERC20Token _token) private view returns (IERC20Token) { if (!etherTokens[_token]) return _token; if (isV28OrHigherConverter(_converter)) return IERC20Token(ETH_RESERVE_ADDRESS); return IERC20Token(getConverterEtherTokenAddress(_converter)); } bytes4 private constant GET_RETURN_FUNC_SELECTOR = bytes4(keccak256("getReturn(address,address,uint256)")); // using assembly code since older converter versions have different return values function getReturn(address _dest, address _sourceToken, address _targetToken, uint256 _amount) internal view returns (uint256, uint256) { uint256[2] memory ret; bytes memory data = abi.encodeWithSelector(GET_RETURN_FUNC_SELECTOR, _sourceToken, _targetToken, _amount); assembly { let success := staticcall( gas, // gas remaining _dest, // destination address add(data, 32), // input buffer (starts after the first 32 bytes in the `data` array) mload(data), // input length (loaded from the first 32 bytes in the `data` array) ret, // output buffer 64 // output length ) if iszero(success) { revert(0, 0) } } return (ret[0], ret[1]); } bytes4 private constant IS_V28_OR_HIGHER_FUNC_SELECTOR = bytes4(keccak256("isV28OrHigher()")); // using assembly code to identify converter version // can't rely on the version number since the function had a different signature in older converters function isV28OrHigherConverter(IConverter _converter) internal view returns (bool) { bool success; uint256[1] memory ret; bytes memory data = abi.encodeWithSelector(IS_V28_OR_HIGHER_FUNC_SELECTOR); assembly { success := staticcall( 5000, // isV28OrHigher consumes 190 gas, but just for extra safety _converter, // destination address add(data, 32), // input buffer (starts after the first 32 bytes in the `data` array) mload(data), // input length (loaded from the first 32 bytes in the `data` array) ret, // output buffer 32 // output length ) } return success && ret[0] != 0; } /** * @dev deprecated, backward compatibility */ function getReturnByPath(IERC20Token[] _path, uint256 _amount) public view returns (uint256, uint256) { return (rateByPath(_path, _amount), 0); } /** * @dev deprecated, backward compatibility */ function convert(IERC20Token[] _path, uint256 _amount, uint256 _minReturn) public payable returns (uint256) { return convertByPath(_path, _amount, _minReturn, address(0), address(0), 0); } /** * @dev deprecated, backward compatibility */ function convert2( IERC20Token[] _path, uint256 _amount, uint256 _minReturn, address _affiliateAccount, uint256 _affiliateFee ) public payable returns (uint256) { return convertByPath(_path, _amount, _minReturn, address(0), _affiliateAccount, _affiliateFee); } /** * @dev deprecated, backward compatibility */ function convertFor(IERC20Token[] _path, uint256 _amount, uint256 _minReturn, address _beneficiary) public payable returns (uint256) { return convertByPath(_path, _amount, _minReturn, _beneficiary, address(0), 0); } /** * @dev deprecated, backward compatibility */ function convertFor2( IERC20Token[] _path, uint256 _amount, uint256 _minReturn, address _beneficiary, address _affiliateAccount, uint256 _affiliateFee ) public payable greaterThanZero(_minReturn) returns (uint256) { return convertByPath(_path, _amount, _minReturn, _beneficiary, _affiliateAccount, _affiliateFee); } /** * @dev deprecated, backward compatibility */ function claimAndConvert(IERC20Token[] _path, uint256 _amount, uint256 _minReturn) public returns (uint256) { return convertByPath(_path, _amount, _minReturn, address(0), address(0), 0); } /** * @dev deprecated, backward compatibility */ function claimAndConvert2( IERC20Token[] _path, uint256 _amount, uint256 _minReturn, address _affiliateAccount, uint256 _affiliateFee ) public returns (uint256) { return convertByPath(_path, _amount, _minReturn, address(0), _affiliateAccount, _affiliateFee); } /** * @dev deprecated, backward compatibility */ function claimAndConvertFor(IERC20Token[] _path, uint256 _amount, uint256 _minReturn, address _beneficiary) public returns (uint256) { return convertByPath(_path, _amount, _minReturn, _beneficiary, address(0), 0); } /** * @dev deprecated, backward compatibility */ function claimAndConvertFor2( IERC20Token[] _path, uint256 _amount, uint256 _minReturn, address _beneficiary, address _affiliateAccount, uint256 _affiliateFee ) public returns (uint256) { return convertByPath(_path, _amount, _minReturn, _beneficiary, _affiliateAccount, _affiliateFee); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"constant":false,"inputs":[{"name":"_onlyOwnerCanUpdateRegistry","type":"bool"}],"name":"restrictRegistryUpdate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"},{"name":"_register","type":"bool"}],"name":"registerEtherToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"}],"name":"getReturnByPath","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"},{"name":"_minReturn","type":"uint256"},{"name":"_beneficiary","type":"address"},{"name":"_affiliateAccount","type":"address"},{"name":"_affiliateFee","type":"uint256"}],"name":"claimAndConvertFor2","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"onlyOwnerCanUpdateRegistry","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"updateRegistry","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"},{"name":"_minReturn","type":"uint256"},{"name":"_affiliateAccount","type":"address"},{"name":"_affiliateFee","type":"uint256"}],"name":"convert2","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"maxAffiliateFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"},{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"}],"name":"withdrawTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"prevRegistry","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"acceptOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"registry","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"}],"name":"rateByPath","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"etherTokens","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_bancorX","type":"address"},{"name":"_conversionId","type":"uint256"},{"name":"_minReturn","type":"uint256"},{"name":"_beneficiary","type":"address"}],"name":"completeXConversion","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"},{"name":"_minReturn","type":"uint256"},{"name":"_beneficiary","type":"address"},{"name":"_affiliateAccount","type":"address"},{"name":"_affiliateFee","type":"uint256"}],"name":"convertFor2","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"},{"name":"_minReturn","type":"uint256"},{"name":"_beneficiary","type":"address"}],"name":"claimAndConvertFor","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"restoreRegistry","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"},{"name":"_minReturn","type":"uint256"},{"name":"_beneficiary","type":"address"},{"name":"_affiliateAccount","type":"address"},{"name":"_affiliateFee","type":"uint256"}],"name":"convertByPath","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"},{"name":"_minReturn","type":"uint256"},{"name":"_targetBlockchain","type":"bytes32"},{"name":"_targetAccount","type":"bytes32"},{"name":"_conversionId","type":"uint256"}],"name":"xConvert","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"},{"name":"_minReturn","type":"uint256"}],"name":"claimAndConvert","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"},{"name":"_minReturn","type":"uint256"},{"name":"_beneficiary","type":"address"}],"name":"convertFor","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"},{"name":"_minReturn","type":"uint256"},{"name":"_targetBlockchain","type":"bytes32"},{"name":"_targetAccount","type":"bytes32"},{"name":"_conversionId","type":"uint256"},{"name":"_affiliateAccount","type":"address"},{"name":"_affiliateFee","type":"uint256"}],"name":"xConvert2","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"safeTransfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"newOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_sourceToken","type":"address"},{"name":"_targetToken","type":"address"}],"name":"conversionPath","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"},{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"},{"name":"_minReturn","type":"uint256"},{"name":"_affiliateAccount","type":"address"},{"name":"_affiliateFee","type":"uint256"}],"name":"claimAndConvert2","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"},{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"safeApprove","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"},{"name":"_minReturn","type":"uint256"}],"name":"convert","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_maxAffiliateFee","type":"uint256"}],"name":"setMaxAffiliateFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_registry","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_smartToken","type":"address"},{"indexed":true,"name":"_fromToken","type":"address"},{"indexed":true,"name":"_toToken","type":"address"},{"indexed":false,"name":"_fromAmount","type":"uint256"},{"indexed":false,"name":"_toAmount","type":"uint256"},{"indexed":false,"name":"_trader","type":"address"}],"name":"Conversion","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_prevOwner","type":"address"},{"indexed":true,"name":"_newOwner","type":"address"}],"name":"OwnerUpdate","type":"event"}]
Contract Creation Code
60806040526003805460a860020a60ff02191690556175306004553480156200002757600080fd5b5060405160208062003836833981016040525160008054600160a060020a0319163317905580806200006281640100000000620000dd810204565b5060028054600160a060020a03909216600160a060020a03199283168117909155600380549092161790555073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee60005260056020527fa1829a9003092132f585b6ccdd167c19fe9774dbdea4260287e8a8e8ca8185d7805460ff1916600117905562000158565b600160a060020a03811615156200015557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4552525f494e56414c49445f4144445245535300000000000000000000000000604482015290519081900360640190fd5b50565b6136ce80620001686000396000f3006080604052600436106101875763ffffffff60e060020a600035041663024c7ec7811461018c57806302ef521e146101a85780630c8496cc146101ce5780632978c10e1461023e5780632fe8a6ad146102c757806349d10b64146102f0578063569706eb146103055780635d732ff2146103685780635e35359e1461037d57806361cd756e146103a757806379ba5097146103d85780637b103999146103ed5780637f9c0ecd146104025780638077ccf71461045957806389f9cc611461047a5780638da5cb5b146104ed578063ab6214ce14610502578063b1e9932b1461056c578063b4a176d3146105d7578063b77d239b146105ec578063c52173de14610656578063c7ba24bc146106b5578063c98fefed14610713578063cb32564e14610771578063d1660f99146107e5578063d4ee1d901461080f578063d734fa1914610824578063d9fc4b611461089b578063e57738e5146108cb578063eb5625d91461093b578063f2fde38b14610965578063f3898a9714610986578063f3bc7d2a146109d7575b600080fd5b34801561019857600080fd5b506101a660043515156109ef565b005b3480156101b457600080fd5b506101a6600160a060020a03600435166024351515610a37565b3480156101da57600080fd5b5060408051602060048035808201358381028086018501909652808552610225953695939460249493850192918291850190849080828437509497505093359450610a809350505050565b6040805192835260208301919091528051918290030190f35b34801561024a57600080fd5b50604080516020600480358082013583810280860185019096528085526102b59536959394602494938501929182918501908490808284375094975050843595505050602083013592600160a060020a03604082013581169350606082013516915060800135610a98565b60408051918252519081900360200190f35b3480156102d357600080fd5b506102dc610ab3565b604080519115158252519081900360200190f35b3480156102fc57600080fd5b506101a6610ad4565b604080516020600480358082013583810280860185019096528085526102b59536959394602494938501929182918501908490808284375094975050843595505050602083013592600160a060020a036040820135169250606001359050610d53565b34801561037457600080fd5b506102b5610d6e565b34801561038957600080fd5b506101a6600160a060020a0360043581169060243516604435610d74565b3480156103b357600080fd5b506103bc610dad565b60408051600160a060020a039092168252519081900360200190f35b3480156103e457600080fd5b506101a6610dbc565b3480156103f957600080fd5b506103bc610e8f565b34801561040e57600080fd5b50604080516020600480358082013583810280860185019096528085526102b5953695939460249493850192918291850190849080828437509497505093359450610e9e9350505050565b34801561046557600080fd5b506102dc600160a060020a03600435166116cd565b34801561048657600080fd5b50604080516020600480358082013583810280860185019096528085526102b59536959394602494938501929182918501908490808284375094975050600160a060020a0385358116965060208601359560408101359550606001351692506116e2915050565b3480156104f957600080fd5b506103bc611877565b604080516020600480358082013583810280860185019096528085526102b59536959394602494938501929182918501908490808284375094975050843595505050602083013592600160a060020a03604082013581169350606082013516915060800135611886565b34801561057857600080fd5b50604080516020600480358082013583810280860185019096528085526102b5953695939460249493850192918291850190849080828437509497505084359550505060208301359260400135600160a060020a031691506118ac9050565b3480156105e357600080fd5b506101a66118c6565b604080516020600480358082013583810280860185019096528085526102b59536959394602494938501929182918501908490808284375094975050843595505050602083013592600160a060020a036040820135811693506060820135169150608001356118ff565b604080516020600480358082013583810280860185019096528085526102b59536959394602494938501929182918501908490808284375094975050843595505050602083013592604081013592506060810135915060800135611b3f565b3480156106c157600080fd5b50604080516020600480358082013583810280860185019096528085526102b595369593946024949385019291829185019084908082843750949750508435955050506020909201359150611b529050565b604080516020600480358082013583810280860185019096528085526102b5953695939460249493850192918291850190849080828437509497505084359550505060208301359260400135600160a060020a031691506118ac9050565b604080516020600480358082013583810280860185019096528085526102b595369593946024949385019291829185019084908082843750949750508435955050506020830135926040810135925060608101359150608081013590600160a060020a0360a0820135169060c00135611b6c565b3480156107f157600080fd5b506101a6600160a060020a0360043581169060243516604435611d0a565b34801561081b57600080fd5b506103bc611d97565b34801561083057600080fd5b5061084b600160a060020a0360043581169060243516611da6565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561088757818101518382015260200161086f565b505050509050019250505060405180910390f35b3480156108a757600080fd5b506101a6600160a060020a0360043581169060243581169060443516606435611ed7565b3480156108d757600080fd5b50604080516020600480358082013583810280860185019096528085526102b59536959394602494938501929182918501908490808284375094975050843595505050602083013592600160a060020a036040820135169250606001359050610d53565b34801561094757600080fd5b506101a6600160a060020a0360043581169060243516604435611f95565b34801561097157600080fd5b506101a6600160a060020a036004351661201d565b604080516020600480358082013583810280860185019096528085526102b595369593946024949385019291829185019084908082843750949750508435955050506020909201359150611b529050565b3480156109e357600080fd5b506101a66004356120ba565b6109f7612122565b60038054911515740100000000000000000000000000000000000000000274ff000000000000000000000000000000000000000019909216919091179055565b610a3f612122565b81610a4981612186565b82610a53816121e9565b5050600160a060020a03919091166000908152600560205260409020805460ff1916911515919091179055565b600080610a8d8484610e9e565b946000945092505050565b6000610aa88787878787876118ff565b979650505050505050565b60035474010000000000000000000000000000000000000000900460ff1681565b60008054600160a060020a0316331480610b09575060035474010000000000000000000000000000000000000000900460ff16155b1515610b5f576040805160e560020a62461bcd02815260206004820152601160248201527f4552525f4143434553535f44454e494544000000000000000000000000000000604482015290519081900360640190fd5b610b887f436f6e747261637452656769737472790000000000000000000000000000000061224a565b600254909150600160a060020a03808316911614801590610bb15750600160a060020a03811615155b1515610c07576040805160e560020a62461bcd02815260206004820152601460248201527f4552525f494e56414c49445f5245474953545259000000000000000000000000604482015290519081900360640190fd5b604080517fbb34534c0000000000000000000000000000000000000000000000000000000081527f436f6e747261637452656769737472790000000000000000000000000000000060048201529051600091600160a060020a0384169163bb34534c9160248082019260209290919082900301818787803b158015610c8b57600080fd5b505af1158015610c9f573d6000803e3d6000fd5b505050506040513d6020811015610cb557600080fd5b5051600160a060020a03161415610d16576040805160e560020a62461bcd02815260206004820152601460248201527f4552525f494e56414c49445f5245474953545259000000000000000000000000604482015290519081900360640190fd5b6002805460038054600160a060020a0380841673ffffffffffffffffffffffffffffffffffffffff19928316179092559091169216919091179055565b6000610d64868686600087876118ff565b9695505050505050565b60045481565b610d7c612122565b82610d8681612186565b82610d9081612186565b83610d9a816121e9565b610da5868686611d0a565b505050505050565b600354600160a060020a031681565b600154600160a060020a03163314610e1e576040805160e560020a62461bcd02815260206004820152601160248201527f4552525f4143434553535f44454e494544000000000000000000000000000000604482015290519081900360640190fd5b60015460008054604051600160a060020a0393841693909116917f343765429aea5a34b3ff6a3785a98a5abb2597aca87bfbb58632c173d585373a91a3600180546000805473ffffffffffffffffffffffffffffffffffffffff19908116600160a060020a03841617909155169055565b600254600160a060020a031681565b600080600080600080600080600080600080610ed97f42616e636f72466f726d756c610000000000000000000000000000000000000061224a565b94508c9a5060028e51118015610ef457508d51600290066001145b1515610f4a576040805160e560020a62461bcd02815260206004820152601060248201527f4552525f494e56414c49445f5041544800000000000000000000000000000000604482015290519081900360640190fd5b600293505b8d518410156116bb578d60028503815181101515610f6957fe5b9060200190602002015192508d60018503815181101515610f8657fe5b9060200190602002015191508d84815181101515610fa057fe5b90602001906020020151905081600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610fea57600080fd5b505af1158015610ffe573d6000803e3d6000fd5b505050506040513d602081101561101457600080fd5b5051955061102286846122e2565b925061102e86826122e2565b905081600160a060020a031681600160a060020a0316141561138f57600384108061108557508d6003850381518110151561106557fe5b90602001906020020151600160a060020a031682600160a060020a031614155b156110f75781600160a060020a03166318160ddd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156110c857600080fd5b505af11580156110dc573d6000803e3d6000fd5b505050506040513d60208110156110f257600080fd5b505198505b85600160a060020a031663d8959512846040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b15801561115257600080fd5b505af1158015611166573d6000803e3d6000fd5b505050506040513d602081101561117c57600080fd5b5051604080517f0e53aae9000000000000000000000000000000000000000000000000000000008152600160a060020a0386811660048301529151929a5090881691630e53aae99160248082019260a0929091908290030181600087803b1580156111e657600080fd5b505af11580156111fa573d6000803e3d6000fd5b505050506040513d60a081101561121057600080fd5b50602090810151604080517f48d73fed000000000000000000000000000000000000000000000000000000008152600481018d9052602481018c905263ffffffff83166044820152606481018f90529051919950600160a060020a038816926348d73fed926084808401938290030181600087803b15801561129157600080fd5b505af11580156112a5573d6000803e3d6000fd5b505050506040513d60208110156112bb57600080fd5b5051604080517f579cd3ca0000000000000000000000000000000000000000000000000000000081529051919c5061137191620f42409161136591600160a060020a038b169163579cd3ca9160048083019260209291908290030181600087803b15801561132857600080fd5b505af115801561133c573d6000803e3d6000fd5b505050506040513d602081101561135257600080fd5b50518e9063ffffffff9081169061234616565b9063ffffffff6123c616565b9a8b90039a9950611388898c63ffffffff61243416565b98506116b0565b81600160a060020a031683600160a060020a0316141561169e5760038410806113e457508d600385038151811015156113c457fe5b90602001906020020151600160a060020a031682600160a060020a031614155b156114565781600160a060020a03166318160ddd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561142757600080fd5b505af115801561143b573d6000803e3d6000fd5b505050506040513d602081101561145157600080fd5b505198505b85600160a060020a031663d8959512826040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b1580156114b157600080fd5b505af11580156114c5573d6000803e3d6000fd5b505050506040513d60208110156114db57600080fd5b5051604080517f0e53aae9000000000000000000000000000000000000000000000000000000008152600160a060020a0384811660048301529151929a5090881691630e53aae99160248082019260a0929091908290030181600087803b15801561154557600080fd5b505af1158015611559573d6000803e3d6000fd5b505050506040513d60a081101561156f57600080fd5b50602090810151604080517ff732f1c9000000000000000000000000000000000000000000000000000000008152600481018d9052602481018c905263ffffffff83166044820152606481018f90529051919950600160a060020a0388169263f732f1c9926084808401938290030181600087803b1580156115f057600080fd5b505af1158015611604573d6000803e3d6000fd5b505050506040513d602081101561161a57600080fd5b5051604080517f579cd3ca0000000000000000000000000000000000000000000000000000000081529051919c5061168791620f42409161136591600160a060020a038b169163579cd3ca9160048083019260209291908290030181600087803b15801561132857600080fd5b9a8b90039a9950611388898c63ffffffff61249116565b6116aa8684838e6124f1565b909b5099505b600284019350610f4f565b50989c9b505050505050505050505050565b60056020526000908152604090205460ff1681565b60008085600160a060020a031663fc0c546a6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561172357600080fd5b505af1158015611737573d6000803e3d6000fd5b505050506040513d602081101561174d57600080fd5b50518751600160a060020a03909116908890600090811061176a57fe5b60209081029091010151600160a060020a0316146117d2576040805160e560020a62461bcd02815260206004820152601860248201527f4552525f494e56414c49445f534f555243455f544f4b454e0000000000000000604482015290519081900360640190fd5b604080517faafd6b76000000000000000000000000000000000000000000000000000000008152600481018790523360248201529051600160a060020a0388169163aafd6b769160448083019260209291908290030181600087803b15801561183a57600080fd5b505af115801561184e573d6000803e3d6000fd5b505050506040513d602081101561186457600080fd5b50519050610aa8878286866000806118ff565b600054600160a060020a031681565b600084611892816125d5565b6118a08888888888886118ff565b98975050505050505050565b60006118bd858585856000806118ff565b95945050505050565b6118ce612122565b6003546002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03909216919091179055565b60008060006060600061191061262d565b6003805475ff0000000000000000000000000000000000000000001916750100000000000000000000000000000000000000000017905588611951816125d5565b60028c5111801561196757508b51600290066001145b15156119bd576040805160e560020a62461bcd02815260206004820152601060248201527f4552525f494e56414c49445f5041544800000000000000000000000000000000604482015290519081900360640190fd5b6119f88c60008151811015156119cf57fe5b906020019060200201518d60018151811015156119e857fe5b906020019060200201518d6126a1565b60009450600160a060020a0388161515611a67578615611a62576040805160e560020a62461bcd02815260206004820152601960248201527f4552525f494e56414c49445f414646494c494154455f46454500000000000000604482015290519081900360640190fd5b611ad4565b866000108015611a7957506004548711155b1515611acf576040805160e560020a62461bcd02815260206004820152601960248201527f4552525f494e56414c49445f414646494c494154455f46454500000000000000604482015290519081900360640190fd5b600194505b339350600160a060020a03891615611aea578893505b611af58c85876128a5565b9250611b04838c8c8b8b612cbc565b9150611b1183838661321c565b506003805475ff000000000000000000000000000000000000000000191690559a9950505050505050505050565b6000610aa8878787878787600080611b6c565b6000611b6484848460008060006118ff565b949350505050565b60008060008089611b7c816125d5565b8c518d906000198101908110611b8e57fe5b906020019060200201519350611bc37f42616e636f72580000000000000000000000000000000000000000000000000061224a565b9250611bee7f424e54546f6b656e00000000000000000000000000000000000000000000000061224a565b600160a060020a03858116911614611c50576040805160e560020a62461bcd02815260206004820152601860248201527f4552525f494e56414c49445f5441524745545f544f4b454e0000000000000000604482015290519081900360640190fd5b611c5e8d8d8d308b8b6118ff565b9150611c6b8484846132ff565b604080517f427c0374000000000000000000000000000000000000000000000000000000008152600481018c9052602481018b905260448101849052606481018a90529051600160a060020a0385169163427c037491608480830192600092919082900301818387803b158015611ce157600080fd5b505af1158015611cf5573d6000803e3d6000fd5b50939f9e505050505050505050505050505050565b604080517f7472616e7366657228616464726573732c75696e74323536290000000000000081528151908190036019018120600160a060020a03851660248301526044808301859052835180840390910181526064909201909252602081018051600160e060020a0316600160e060020a031990931692909217909152611d929084906133c0565b505050565b600154600160a060020a031681565b60606000611dd37f436f6e76657273696f6e5061746846696e64657200000000000000000000000061224a565b604080517fa1c421cd000000000000000000000000000000000000000000000000000000008152600160a060020a038781166004830152868116602483015291519293509083169163a1c421cd9160448082019260009290919082900301818387803b158015611e4257600080fd5b505af1158015611e56573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015611e7f57600080fd5b810190808051640100000000811115611e9757600080fd5b82016020810184811115611eaa57600080fd5b8151856020820283011164010000000082111715611ec757600080fd5b50909550505050505b5092915050565b604080517f7472616e7366657246726f6d28616464726573732c616464726573732c75696e81527f74323536290000000000000000000000000000000000000000000000000000006020808301919091528251918290036025018220600160a060020a03808816602485015286166044840152606480840186905284518085039091018152608490930190935281018051600160e060020a0316600160e060020a031990931692909217909152611f8f9085906133c0565b50505050565b604080517f617070726f766528616464726573732c75696e7432353629000000000000000081528151908190036018018120600160a060020a03851660248301526044808301859052835180840390910181526064909201909252602081018051600160e060020a0316600160e060020a031990931692909217909152611d929084906133c0565b612025612122565b600054600160a060020a038281169116141561208b576040805160e560020a62461bcd02815260206004820152600e60248201527f4552525f53414d455f4f574e4552000000000000000000000000000000000000604482015290519081900360640190fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b6120c2612122565b620f424081111561211d576040805160e560020a62461bcd02815260206004820152601960248201527f4552525f494e56414c49445f414646494c494154455f46454500000000000000604482015290519081900360640190fd5b600455565b600054600160a060020a03163314612184576040805160e560020a62461bcd02815260206004820152601160248201527f4552525f4143434553535f44454e494544000000000000000000000000000000604482015290519081900360640190fd5b565b600160a060020a03811615156121e6576040805160e560020a62461bcd02815260206004820152601360248201527f4552525f494e56414c49445f4144445245535300000000000000000000000000604482015290519081900360640190fd5b50565b600160a060020a0381163014156121e6576040805160e560020a62461bcd02815260206004820152601360248201527f4552525f414444524553535f49535f53454c4600000000000000000000000000604482015290519081900360640190fd5b600254604080517fbb34534c000000000000000000000000000000000000000000000000000000008152600481018490529051600092600160a060020a03169163bb34534c91602480830192602092919082900301818787803b1580156122b057600080fd5b505af11580156122c4573d6000803e3d6000fd5b505050506040513d60208110156122da57600080fd5b505192915050565b600160a060020a03811660009081526005602052604081205460ff16151561230b575080612340565b6123148361344e565b15612334575073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee612340565b61233d836134df565b90505b92915050565b6000808315156123595760009150611ed0565b5082820282848281151561236957fe5b04146123bf576040805160e560020a62461bcd02815260206004820152600c60248201527f4552525f4f564552464c4f570000000000000000000000000000000000000000604482015290519081900360640190fd5b9392505050565b600080808311612420576040805160e560020a62461bcd02815260206004820152601260248201527f4552525f4449564944455f42595f5a45524f0000000000000000000000000000604482015290519081900360640190fd5b828481151561242b57fe5b04949350505050565b6000828201838110156123bf576040805160e560020a62461bcd02815260206004820152600c60248201527f4552525f4f564552464c4f570000000000000000000000000000000000000000604482015290519081900360640190fd5b6000818310156124eb576040805160e560020a62461bcd02815260206004820152600d60248201527f4552525f554e444552464c4f5700000000000000000000000000000000000000604482015290519081900360640190fd5b50900390565b6000806124fc61362c565b604080517f67657452657475726e28616464726573732c616464726573732c75696e74323581527f36290000000000000000000000000000000000000000000000000000000000006020808301919091528251918290036022018220600160a060020a03808b16602485015289166044840152606480840189905284518085039091018152608490930184529082018051600160e060020a0316600160e060020a0319909216919091178152815191929184918b5afa8015156125be57600080fd5b505080516020909101519097909650945050505050565b600081116121e6576040805160e560020a62461bcd02815260206004820152600e60248201527f4552525f5a45524f5f56414c5545000000000000000000000000000000000000604482015290519081900360640190fd5b6003547501000000000000000000000000000000000000000000900460ff1615612184576040805160e560020a62461bcd02815260206004820152600e60248201527f4552525f5245454e5452414e4359000000000000000000000000000000000000604482015290519081900360640190fd5b60008083600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156126e257600080fd5b505af11580156126f6573d6000803e3d6000fd5b505050506040513d602081101561270c57600080fd5b505191506127198261344e565b905060003411156127e75734831461277b576040805160e560020a62461bcd02815260206004820152601760248201527f4552525f4554485f414d4f554e545f4d49534d41544348000000000000000000604482015290519081900360640190fd5b8015156127e25761278b826134df565b600160a060020a031663d0e30db0346040518263ffffffff1660e060020a0281526004016000604051808303818588803b1580156127c857600080fd5b505af11580156127dc573d6000803e3d6000fd5b50505050505b61289e565b600160a060020a03851660009081526005602052604090205460ff16156128805761281485333086611ed7565b80156127e25784600160a060020a0316632e1a7d4d846040518263ffffffff1660e060020a02815260040180828152602001915050600060405180830381600087803b15801561286357600080fd5b505af1158015612877573d6000803e3d6000fd5b5050505061289e565b8015612892576127e285338486611ed7565b61289e85333086611ed7565b5050505050565b60608060008060008060008060006128bb613647565b8c51600290046040519080825280602002602001820160405280156128fa57816020015b6128e7613647565b8152602001906001900390816128df5790505b5098506000975061292a7f424e54546f6b656e00000000000000000000000000000000000000000000000061224a565b9650600095505b60018d5103861015612ac5578c8660010181518110151561294e57fe5b90602001906020020151945084600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561299857600080fd5b505af11580156129ac573d6000803e3d6000fd5b505050506040513d60208110156129c257600080fd5b50518d519094508d90600288019081106129d857fe5b9060200190602002015192508a80156129ef575087155b8015612a0c575086600160a060020a031683600160a060020a0316145b91508115612a1957600197505b60e06040519081016040528085600160a060020a0316815260200186600160a060020a031681526020018e88815181101515612a5157fe5b90602001906020020151600160a060020a0316815260200184600160a060020a031681526020016000600160a060020a03168152602001612a918661344e565b151581528315156020909101528960028804815181101515612aaf57fe5b6020908102909101015260029590950194612931565b886000815181101515612ad457fe5b6020908102909101810151604080820151600160a060020a0316600090815260059093529091205490915060ff1615612b4a578060a0015115612b305773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6040820152612b4a565b8051612b3b906134df565b600160a060020a031660408201525b885189906000198101908110612b5c57fe5b60209081029091018101516060810151600160a060020a03166000908152600590925260409091205490915060ff1615612bd3578060a0015115612bb95773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6060820152612bd3565b8051612bc4906134df565b600160a060020a031660608201525b600095505b8851861015612cab578886815181101515612bef57fe5b9060200190602002015190508060a0015115612c99578060c0015115612c1a57306080820152612c94565b6001895103861415612c3a57600160a060020a038c166080820152612c94565b8886600101815181101515612c4b57fe5b9060200190602002015160a0015115612c8d578886600101815181101515612c6f57fe5b6020908102909101015151600160a060020a03166080820152612c94565b3060808201525b612ca0565b3060808201525b600190950194612bd8565b50969b9a5050505050505050505050565b600080600080612cca613647565b6000899350600092505b8a518310156131b5578a83815181101515612ceb57fe5b9060200190602002015191508160a0015115612d7c578215801590612d3857508a5130908c906000198601908110612d1f57fe5b9060200190602002015160800151600160a060020a0316145b8015612d5f5750604080830151600160a060020a031660009081526005602052205460ff16155b15612d7757612d778260400151836000015186611d0a565b612db2565b8160200151600160a060020a03168260400151600160a060020a0316141515612db257612db282604001518360000151866132ff565b8160a001511515612e75578151604080840151606085015182517f5e5144eb000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152908216602482015260448101889052600160648201529151921691635e5144eb916084808201926020929091908290030181600087803b158015612e4257600080fd5b505af1158015612e56573d6000803e3d6000fd5b505050506040513d6020811015612e6c57600080fd5b50519450613012565b604080830151600160a060020a031660009081526005602052205460ff1615612f535781516040808401516060850151608086015183517fe8dc12ff000000000000000000000000000000000000000000000000000000008152600160a060020a03938416600482015291831660248301526044820189905233606483015282166084820152915192169163e8dc12ff91349160a480830192602092919082900301818588803b158015612f2857600080fd5b505af1158015612f3c573d6000803e3d6000fd5b50505050506040513d6020811015612e6c57600080fd5b81516040808401516060850151608086015183517fe8dc12ff000000000000000000000000000000000000000000000000000000008152600160a060020a03938416600482015291831660248301526044820189905233606483015282166084820152915192169163e8dc12ff9160a4808201926020929091908290030181600087803b158015612fe357600080fd5b505af1158015612ff7573d6000803e3d6000fd5b505050506040513d602081101561300d57600080fd5b505194505b8160c001511561312457613033620f4240611365878a63ffffffff61234616565b90508160600151600160a060020a031663a9059cbb89836040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b15801561309c57600080fd5b505af11580156130b0573d6000803e3d6000fd5b505050506040513d60208110156130c657600080fd5b5051151561311e576040805160e560020a62461bcd02815260206004820152601760248201527f4552525f4645455f5452414e534645525f4641494c4544000000000000000000604482015290519081900360640190fd5b80850394505b8160600151600160a060020a03168260400151600160a060020a03168360200151600160a060020a03167f7154b38b5dd31bb3122436a96d4e09aba5b323ae1fd580025fab55074334c0958789336040518084815260200183815260200182600160a060020a0316600160a060020a03168152602001935050505060405180910390a4849350600190920191612cd4565b8885101561320d576040805160e560020a62461bcd02815260206004820152601260248201527f4552525f52455455524e5f544f4f5f4c4f570000000000000000000000000000604482015290519081900360640190fd5b50929998505050505050505050565b613224613647565b600084600186510381518110151561323857fe5b602090810290910101516080810151909250600160a060020a0316301461325e5761289e565b506060810151600160a060020a03811660009081526005602052604090205460ff16156132f45760a08201511561329157fe5b80600160a060020a031663205c287884866040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050600060405180830381600087803b15801561286357600080fd5b61289e818486611d0a565b604080517fdd62ed3e000000000000000000000000000000000000000000000000000000008152306004820152600160a060020a038481166024830152915160009286169163dd62ed3e91604480830192602092919082900301818787803b15801561336a57600080fd5b505af115801561337e573d6000803e3d6000fd5b505050506040513d602081101561339457600080fd5b5051905081811015611f8f5760008111156133b5576133b584846000611f95565b611f8f848484611f95565b6133c8613683565b602060405190810160405280600181525090506020818351602085016000875af18015156133f557600080fd5b5080511515611d92576040805160e560020a62461bcd02815260206004820152601360248201527f4552525f5452414e534645525f4641494c454400000000000000000000000000604482015290519081900360640190fd5b600080613459613683565b604080517f69735632384f72486967686572282900000000000000000000000000000000008152815190819003600f018120600482526024820190925260208082018051600160e060020a0316600160e060020a0319909416939093178352815191929091849188611388fa92508280156134d45750815115155b93505b505050919050565b60008060008084600160a060020a03166371f52bf36040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561352357600080fd5b505af1158015613537573d6000803e3d6000fd5b505050506040513d602081101561354d57600080fd5b505161ffff169250600091505b8282101561360e5784600160a060020a03166319b64015836040518263ffffffff1660e060020a02815260040180828152602001915050602060405180830381600087803b1580156135ab57600080fd5b505af11580156135bf573d6000803e3d6000fd5b505050506040513d60208110156135d557600080fd5b5051600160a060020a03811660009081526005602052604090205490915060ff1615613603578093506134d7565b60019091019061355a565b5073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee949350505050565b60408051808201825290600290829080388339509192915050565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b60206040519081016040528060019060208202803883395091929150505600a165627a7a7230582016b24f79c4fe1c069bea4cf72fb3dfa4d8cac156f0b9dc171b1522dc9472ed87002900000000000000000000000052ae12abe5d8bd778bd5397f99ca900624cfadd4
Deployed Bytecode
0x6080604052600436106101875763ffffffff60e060020a600035041663024c7ec7811461018c57806302ef521e146101a85780630c8496cc146101ce5780632978c10e1461023e5780632fe8a6ad146102c757806349d10b64146102f0578063569706eb146103055780635d732ff2146103685780635e35359e1461037d57806361cd756e146103a757806379ba5097146103d85780637b103999146103ed5780637f9c0ecd146104025780638077ccf71461045957806389f9cc611461047a5780638da5cb5b146104ed578063ab6214ce14610502578063b1e9932b1461056c578063b4a176d3146105d7578063b77d239b146105ec578063c52173de14610656578063c7ba24bc146106b5578063c98fefed14610713578063cb32564e14610771578063d1660f99146107e5578063d4ee1d901461080f578063d734fa1914610824578063d9fc4b611461089b578063e57738e5146108cb578063eb5625d91461093b578063f2fde38b14610965578063f3898a9714610986578063f3bc7d2a146109d7575b600080fd5b34801561019857600080fd5b506101a660043515156109ef565b005b3480156101b457600080fd5b506101a6600160a060020a03600435166024351515610a37565b3480156101da57600080fd5b5060408051602060048035808201358381028086018501909652808552610225953695939460249493850192918291850190849080828437509497505093359450610a809350505050565b6040805192835260208301919091528051918290030190f35b34801561024a57600080fd5b50604080516020600480358082013583810280860185019096528085526102b59536959394602494938501929182918501908490808284375094975050843595505050602083013592600160a060020a03604082013581169350606082013516915060800135610a98565b60408051918252519081900360200190f35b3480156102d357600080fd5b506102dc610ab3565b604080519115158252519081900360200190f35b3480156102fc57600080fd5b506101a6610ad4565b604080516020600480358082013583810280860185019096528085526102b59536959394602494938501929182918501908490808284375094975050843595505050602083013592600160a060020a036040820135169250606001359050610d53565b34801561037457600080fd5b506102b5610d6e565b34801561038957600080fd5b506101a6600160a060020a0360043581169060243516604435610d74565b3480156103b357600080fd5b506103bc610dad565b60408051600160a060020a039092168252519081900360200190f35b3480156103e457600080fd5b506101a6610dbc565b3480156103f957600080fd5b506103bc610e8f565b34801561040e57600080fd5b50604080516020600480358082013583810280860185019096528085526102b5953695939460249493850192918291850190849080828437509497505093359450610e9e9350505050565b34801561046557600080fd5b506102dc600160a060020a03600435166116cd565b34801561048657600080fd5b50604080516020600480358082013583810280860185019096528085526102b59536959394602494938501929182918501908490808284375094975050600160a060020a0385358116965060208601359560408101359550606001351692506116e2915050565b3480156104f957600080fd5b506103bc611877565b604080516020600480358082013583810280860185019096528085526102b59536959394602494938501929182918501908490808284375094975050843595505050602083013592600160a060020a03604082013581169350606082013516915060800135611886565b34801561057857600080fd5b50604080516020600480358082013583810280860185019096528085526102b5953695939460249493850192918291850190849080828437509497505084359550505060208301359260400135600160a060020a031691506118ac9050565b3480156105e357600080fd5b506101a66118c6565b604080516020600480358082013583810280860185019096528085526102b59536959394602494938501929182918501908490808284375094975050843595505050602083013592600160a060020a036040820135811693506060820135169150608001356118ff565b604080516020600480358082013583810280860185019096528085526102b59536959394602494938501929182918501908490808284375094975050843595505050602083013592604081013592506060810135915060800135611b3f565b3480156106c157600080fd5b50604080516020600480358082013583810280860185019096528085526102b595369593946024949385019291829185019084908082843750949750508435955050506020909201359150611b529050565b604080516020600480358082013583810280860185019096528085526102b5953695939460249493850192918291850190849080828437509497505084359550505060208301359260400135600160a060020a031691506118ac9050565b604080516020600480358082013583810280860185019096528085526102b595369593946024949385019291829185019084908082843750949750508435955050506020830135926040810135925060608101359150608081013590600160a060020a0360a0820135169060c00135611b6c565b3480156107f157600080fd5b506101a6600160a060020a0360043581169060243516604435611d0a565b34801561081b57600080fd5b506103bc611d97565b34801561083057600080fd5b5061084b600160a060020a0360043581169060243516611da6565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561088757818101518382015260200161086f565b505050509050019250505060405180910390f35b3480156108a757600080fd5b506101a6600160a060020a0360043581169060243581169060443516606435611ed7565b3480156108d757600080fd5b50604080516020600480358082013583810280860185019096528085526102b59536959394602494938501929182918501908490808284375094975050843595505050602083013592600160a060020a036040820135169250606001359050610d53565b34801561094757600080fd5b506101a6600160a060020a0360043581169060243516604435611f95565b34801561097157600080fd5b506101a6600160a060020a036004351661201d565b604080516020600480358082013583810280860185019096528085526102b595369593946024949385019291829185019084908082843750949750508435955050506020909201359150611b529050565b3480156109e357600080fd5b506101a66004356120ba565b6109f7612122565b60038054911515740100000000000000000000000000000000000000000274ff000000000000000000000000000000000000000019909216919091179055565b610a3f612122565b81610a4981612186565b82610a53816121e9565b5050600160a060020a03919091166000908152600560205260409020805460ff1916911515919091179055565b600080610a8d8484610e9e565b946000945092505050565b6000610aa88787878787876118ff565b979650505050505050565b60035474010000000000000000000000000000000000000000900460ff1681565b60008054600160a060020a0316331480610b09575060035474010000000000000000000000000000000000000000900460ff16155b1515610b5f576040805160e560020a62461bcd02815260206004820152601160248201527f4552525f4143434553535f44454e494544000000000000000000000000000000604482015290519081900360640190fd5b610b887f436f6e747261637452656769737472790000000000000000000000000000000061224a565b600254909150600160a060020a03808316911614801590610bb15750600160a060020a03811615155b1515610c07576040805160e560020a62461bcd02815260206004820152601460248201527f4552525f494e56414c49445f5245474953545259000000000000000000000000604482015290519081900360640190fd5b604080517fbb34534c0000000000000000000000000000000000000000000000000000000081527f436f6e747261637452656769737472790000000000000000000000000000000060048201529051600091600160a060020a0384169163bb34534c9160248082019260209290919082900301818787803b158015610c8b57600080fd5b505af1158015610c9f573d6000803e3d6000fd5b505050506040513d6020811015610cb557600080fd5b5051600160a060020a03161415610d16576040805160e560020a62461bcd02815260206004820152601460248201527f4552525f494e56414c49445f5245474953545259000000000000000000000000604482015290519081900360640190fd5b6002805460038054600160a060020a0380841673ffffffffffffffffffffffffffffffffffffffff19928316179092559091169216919091179055565b6000610d64868686600087876118ff565b9695505050505050565b60045481565b610d7c612122565b82610d8681612186565b82610d9081612186565b83610d9a816121e9565b610da5868686611d0a565b505050505050565b600354600160a060020a031681565b600154600160a060020a03163314610e1e576040805160e560020a62461bcd02815260206004820152601160248201527f4552525f4143434553535f44454e494544000000000000000000000000000000604482015290519081900360640190fd5b60015460008054604051600160a060020a0393841693909116917f343765429aea5a34b3ff6a3785a98a5abb2597aca87bfbb58632c173d585373a91a3600180546000805473ffffffffffffffffffffffffffffffffffffffff19908116600160a060020a03841617909155169055565b600254600160a060020a031681565b600080600080600080600080600080600080610ed97f42616e636f72466f726d756c610000000000000000000000000000000000000061224a565b94508c9a5060028e51118015610ef457508d51600290066001145b1515610f4a576040805160e560020a62461bcd02815260206004820152601060248201527f4552525f494e56414c49445f5041544800000000000000000000000000000000604482015290519081900360640190fd5b600293505b8d518410156116bb578d60028503815181101515610f6957fe5b9060200190602002015192508d60018503815181101515610f8657fe5b9060200190602002015191508d84815181101515610fa057fe5b90602001906020020151905081600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610fea57600080fd5b505af1158015610ffe573d6000803e3d6000fd5b505050506040513d602081101561101457600080fd5b5051955061102286846122e2565b925061102e86826122e2565b905081600160a060020a031681600160a060020a0316141561138f57600384108061108557508d6003850381518110151561106557fe5b90602001906020020151600160a060020a031682600160a060020a031614155b156110f75781600160a060020a03166318160ddd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156110c857600080fd5b505af11580156110dc573d6000803e3d6000fd5b505050506040513d60208110156110f257600080fd5b505198505b85600160a060020a031663d8959512846040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b15801561115257600080fd5b505af1158015611166573d6000803e3d6000fd5b505050506040513d602081101561117c57600080fd5b5051604080517f0e53aae9000000000000000000000000000000000000000000000000000000008152600160a060020a0386811660048301529151929a5090881691630e53aae99160248082019260a0929091908290030181600087803b1580156111e657600080fd5b505af11580156111fa573d6000803e3d6000fd5b505050506040513d60a081101561121057600080fd5b50602090810151604080517f48d73fed000000000000000000000000000000000000000000000000000000008152600481018d9052602481018c905263ffffffff83166044820152606481018f90529051919950600160a060020a038816926348d73fed926084808401938290030181600087803b15801561129157600080fd5b505af11580156112a5573d6000803e3d6000fd5b505050506040513d60208110156112bb57600080fd5b5051604080517f579cd3ca0000000000000000000000000000000000000000000000000000000081529051919c5061137191620f42409161136591600160a060020a038b169163579cd3ca9160048083019260209291908290030181600087803b15801561132857600080fd5b505af115801561133c573d6000803e3d6000fd5b505050506040513d602081101561135257600080fd5b50518e9063ffffffff9081169061234616565b9063ffffffff6123c616565b9a8b90039a9950611388898c63ffffffff61243416565b98506116b0565b81600160a060020a031683600160a060020a0316141561169e5760038410806113e457508d600385038151811015156113c457fe5b90602001906020020151600160a060020a031682600160a060020a031614155b156114565781600160a060020a03166318160ddd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561142757600080fd5b505af115801561143b573d6000803e3d6000fd5b505050506040513d602081101561145157600080fd5b505198505b85600160a060020a031663d8959512826040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b1580156114b157600080fd5b505af11580156114c5573d6000803e3d6000fd5b505050506040513d60208110156114db57600080fd5b5051604080517f0e53aae9000000000000000000000000000000000000000000000000000000008152600160a060020a0384811660048301529151929a5090881691630e53aae99160248082019260a0929091908290030181600087803b15801561154557600080fd5b505af1158015611559573d6000803e3d6000fd5b505050506040513d60a081101561156f57600080fd5b50602090810151604080517ff732f1c9000000000000000000000000000000000000000000000000000000008152600481018d9052602481018c905263ffffffff83166044820152606481018f90529051919950600160a060020a0388169263f732f1c9926084808401938290030181600087803b1580156115f057600080fd5b505af1158015611604573d6000803e3d6000fd5b505050506040513d602081101561161a57600080fd5b5051604080517f579cd3ca0000000000000000000000000000000000000000000000000000000081529051919c5061168791620f42409161136591600160a060020a038b169163579cd3ca9160048083019260209291908290030181600087803b15801561132857600080fd5b9a8b90039a9950611388898c63ffffffff61249116565b6116aa8684838e6124f1565b909b5099505b600284019350610f4f565b50989c9b505050505050505050505050565b60056020526000908152604090205460ff1681565b60008085600160a060020a031663fc0c546a6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561172357600080fd5b505af1158015611737573d6000803e3d6000fd5b505050506040513d602081101561174d57600080fd5b50518751600160a060020a03909116908890600090811061176a57fe5b60209081029091010151600160a060020a0316146117d2576040805160e560020a62461bcd02815260206004820152601860248201527f4552525f494e56414c49445f534f555243455f544f4b454e0000000000000000604482015290519081900360640190fd5b604080517faafd6b76000000000000000000000000000000000000000000000000000000008152600481018790523360248201529051600160a060020a0388169163aafd6b769160448083019260209291908290030181600087803b15801561183a57600080fd5b505af115801561184e573d6000803e3d6000fd5b505050506040513d602081101561186457600080fd5b50519050610aa8878286866000806118ff565b600054600160a060020a031681565b600084611892816125d5565b6118a08888888888886118ff565b98975050505050505050565b60006118bd858585856000806118ff565b95945050505050565b6118ce612122565b6003546002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03909216919091179055565b60008060006060600061191061262d565b6003805475ff0000000000000000000000000000000000000000001916750100000000000000000000000000000000000000000017905588611951816125d5565b60028c5111801561196757508b51600290066001145b15156119bd576040805160e560020a62461bcd02815260206004820152601060248201527f4552525f494e56414c49445f5041544800000000000000000000000000000000604482015290519081900360640190fd5b6119f88c60008151811015156119cf57fe5b906020019060200201518d60018151811015156119e857fe5b906020019060200201518d6126a1565b60009450600160a060020a0388161515611a67578615611a62576040805160e560020a62461bcd02815260206004820152601960248201527f4552525f494e56414c49445f414646494c494154455f46454500000000000000604482015290519081900360640190fd5b611ad4565b866000108015611a7957506004548711155b1515611acf576040805160e560020a62461bcd02815260206004820152601960248201527f4552525f494e56414c49445f414646494c494154455f46454500000000000000604482015290519081900360640190fd5b600194505b339350600160a060020a03891615611aea578893505b611af58c85876128a5565b9250611b04838c8c8b8b612cbc565b9150611b1183838661321c565b506003805475ff000000000000000000000000000000000000000000191690559a9950505050505050505050565b6000610aa8878787878787600080611b6c565b6000611b6484848460008060006118ff565b949350505050565b60008060008089611b7c816125d5565b8c518d906000198101908110611b8e57fe5b906020019060200201519350611bc37f42616e636f72580000000000000000000000000000000000000000000000000061224a565b9250611bee7f424e54546f6b656e00000000000000000000000000000000000000000000000061224a565b600160a060020a03858116911614611c50576040805160e560020a62461bcd02815260206004820152601860248201527f4552525f494e56414c49445f5441524745545f544f4b454e0000000000000000604482015290519081900360640190fd5b611c5e8d8d8d308b8b6118ff565b9150611c6b8484846132ff565b604080517f427c0374000000000000000000000000000000000000000000000000000000008152600481018c9052602481018b905260448101849052606481018a90529051600160a060020a0385169163427c037491608480830192600092919082900301818387803b158015611ce157600080fd5b505af1158015611cf5573d6000803e3d6000fd5b50939f9e505050505050505050505050505050565b604080517f7472616e7366657228616464726573732c75696e74323536290000000000000081528151908190036019018120600160a060020a03851660248301526044808301859052835180840390910181526064909201909252602081018051600160e060020a0316600160e060020a031990931692909217909152611d929084906133c0565b505050565b600154600160a060020a031681565b60606000611dd37f436f6e76657273696f6e5061746846696e64657200000000000000000000000061224a565b604080517fa1c421cd000000000000000000000000000000000000000000000000000000008152600160a060020a038781166004830152868116602483015291519293509083169163a1c421cd9160448082019260009290919082900301818387803b158015611e4257600080fd5b505af1158015611e56573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015611e7f57600080fd5b810190808051640100000000811115611e9757600080fd5b82016020810184811115611eaa57600080fd5b8151856020820283011164010000000082111715611ec757600080fd5b50909550505050505b5092915050565b604080517f7472616e7366657246726f6d28616464726573732c616464726573732c75696e81527f74323536290000000000000000000000000000000000000000000000000000006020808301919091528251918290036025018220600160a060020a03808816602485015286166044840152606480840186905284518085039091018152608490930190935281018051600160e060020a0316600160e060020a031990931692909217909152611f8f9085906133c0565b50505050565b604080517f617070726f766528616464726573732c75696e7432353629000000000000000081528151908190036018018120600160a060020a03851660248301526044808301859052835180840390910181526064909201909252602081018051600160e060020a0316600160e060020a031990931692909217909152611d929084906133c0565b612025612122565b600054600160a060020a038281169116141561208b576040805160e560020a62461bcd02815260206004820152600e60248201527f4552525f53414d455f4f574e4552000000000000000000000000000000000000604482015290519081900360640190fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b6120c2612122565b620f424081111561211d576040805160e560020a62461bcd02815260206004820152601960248201527f4552525f494e56414c49445f414646494c494154455f46454500000000000000604482015290519081900360640190fd5b600455565b600054600160a060020a03163314612184576040805160e560020a62461bcd02815260206004820152601160248201527f4552525f4143434553535f44454e494544000000000000000000000000000000604482015290519081900360640190fd5b565b600160a060020a03811615156121e6576040805160e560020a62461bcd02815260206004820152601360248201527f4552525f494e56414c49445f4144445245535300000000000000000000000000604482015290519081900360640190fd5b50565b600160a060020a0381163014156121e6576040805160e560020a62461bcd02815260206004820152601360248201527f4552525f414444524553535f49535f53454c4600000000000000000000000000604482015290519081900360640190fd5b600254604080517fbb34534c000000000000000000000000000000000000000000000000000000008152600481018490529051600092600160a060020a03169163bb34534c91602480830192602092919082900301818787803b1580156122b057600080fd5b505af11580156122c4573d6000803e3d6000fd5b505050506040513d60208110156122da57600080fd5b505192915050565b600160a060020a03811660009081526005602052604081205460ff16151561230b575080612340565b6123148361344e565b15612334575073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee612340565b61233d836134df565b90505b92915050565b6000808315156123595760009150611ed0565b5082820282848281151561236957fe5b04146123bf576040805160e560020a62461bcd02815260206004820152600c60248201527f4552525f4f564552464c4f570000000000000000000000000000000000000000604482015290519081900360640190fd5b9392505050565b600080808311612420576040805160e560020a62461bcd02815260206004820152601260248201527f4552525f4449564944455f42595f5a45524f0000000000000000000000000000604482015290519081900360640190fd5b828481151561242b57fe5b04949350505050565b6000828201838110156123bf576040805160e560020a62461bcd02815260206004820152600c60248201527f4552525f4f564552464c4f570000000000000000000000000000000000000000604482015290519081900360640190fd5b6000818310156124eb576040805160e560020a62461bcd02815260206004820152600d60248201527f4552525f554e444552464c4f5700000000000000000000000000000000000000604482015290519081900360640190fd5b50900390565b6000806124fc61362c565b604080517f67657452657475726e28616464726573732c616464726573732c75696e74323581527f36290000000000000000000000000000000000000000000000000000000000006020808301919091528251918290036022018220600160a060020a03808b16602485015289166044840152606480840189905284518085039091018152608490930184529082018051600160e060020a0316600160e060020a0319909216919091178152815191929184918b5afa8015156125be57600080fd5b505080516020909101519097909650945050505050565b600081116121e6576040805160e560020a62461bcd02815260206004820152600e60248201527f4552525f5a45524f5f56414c5545000000000000000000000000000000000000604482015290519081900360640190fd5b6003547501000000000000000000000000000000000000000000900460ff1615612184576040805160e560020a62461bcd02815260206004820152600e60248201527f4552525f5245454e5452414e4359000000000000000000000000000000000000604482015290519081900360640190fd5b60008083600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156126e257600080fd5b505af11580156126f6573d6000803e3d6000fd5b505050506040513d602081101561270c57600080fd5b505191506127198261344e565b905060003411156127e75734831461277b576040805160e560020a62461bcd02815260206004820152601760248201527f4552525f4554485f414d4f554e545f4d49534d41544348000000000000000000604482015290519081900360640190fd5b8015156127e25761278b826134df565b600160a060020a031663d0e30db0346040518263ffffffff1660e060020a0281526004016000604051808303818588803b1580156127c857600080fd5b505af11580156127dc573d6000803e3d6000fd5b50505050505b61289e565b600160a060020a03851660009081526005602052604090205460ff16156128805761281485333086611ed7565b80156127e25784600160a060020a0316632e1a7d4d846040518263ffffffff1660e060020a02815260040180828152602001915050600060405180830381600087803b15801561286357600080fd5b505af1158015612877573d6000803e3d6000fd5b5050505061289e565b8015612892576127e285338486611ed7565b61289e85333086611ed7565b5050505050565b60608060008060008060008060006128bb613647565b8c51600290046040519080825280602002602001820160405280156128fa57816020015b6128e7613647565b8152602001906001900390816128df5790505b5098506000975061292a7f424e54546f6b656e00000000000000000000000000000000000000000000000061224a565b9650600095505b60018d5103861015612ac5578c8660010181518110151561294e57fe5b90602001906020020151945084600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561299857600080fd5b505af11580156129ac573d6000803e3d6000fd5b505050506040513d60208110156129c257600080fd5b50518d519094508d90600288019081106129d857fe5b9060200190602002015192508a80156129ef575087155b8015612a0c575086600160a060020a031683600160a060020a0316145b91508115612a1957600197505b60e06040519081016040528085600160a060020a0316815260200186600160a060020a031681526020018e88815181101515612a5157fe5b90602001906020020151600160a060020a0316815260200184600160a060020a031681526020016000600160a060020a03168152602001612a918661344e565b151581528315156020909101528960028804815181101515612aaf57fe5b6020908102909101015260029590950194612931565b886000815181101515612ad457fe5b6020908102909101810151604080820151600160a060020a0316600090815260059093529091205490915060ff1615612b4a578060a0015115612b305773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6040820152612b4a565b8051612b3b906134df565b600160a060020a031660408201525b885189906000198101908110612b5c57fe5b60209081029091018101516060810151600160a060020a03166000908152600590925260409091205490915060ff1615612bd3578060a0015115612bb95773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6060820152612bd3565b8051612bc4906134df565b600160a060020a031660608201525b600095505b8851861015612cab578886815181101515612bef57fe5b9060200190602002015190508060a0015115612c99578060c0015115612c1a57306080820152612c94565b6001895103861415612c3a57600160a060020a038c166080820152612c94565b8886600101815181101515612c4b57fe5b9060200190602002015160a0015115612c8d578886600101815181101515612c6f57fe5b6020908102909101015151600160a060020a03166080820152612c94565b3060808201525b612ca0565b3060808201525b600190950194612bd8565b50969b9a5050505050505050505050565b600080600080612cca613647565b6000899350600092505b8a518310156131b5578a83815181101515612ceb57fe5b9060200190602002015191508160a0015115612d7c578215801590612d3857508a5130908c906000198601908110612d1f57fe5b9060200190602002015160800151600160a060020a0316145b8015612d5f5750604080830151600160a060020a031660009081526005602052205460ff16155b15612d7757612d778260400151836000015186611d0a565b612db2565b8160200151600160a060020a03168260400151600160a060020a0316141515612db257612db282604001518360000151866132ff565b8160a001511515612e75578151604080840151606085015182517f5e5144eb000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152908216602482015260448101889052600160648201529151921691635e5144eb916084808201926020929091908290030181600087803b158015612e4257600080fd5b505af1158015612e56573d6000803e3d6000fd5b505050506040513d6020811015612e6c57600080fd5b50519450613012565b604080830151600160a060020a031660009081526005602052205460ff1615612f535781516040808401516060850151608086015183517fe8dc12ff000000000000000000000000000000000000000000000000000000008152600160a060020a03938416600482015291831660248301526044820189905233606483015282166084820152915192169163e8dc12ff91349160a480830192602092919082900301818588803b158015612f2857600080fd5b505af1158015612f3c573d6000803e3d6000fd5b50505050506040513d6020811015612e6c57600080fd5b81516040808401516060850151608086015183517fe8dc12ff000000000000000000000000000000000000000000000000000000008152600160a060020a03938416600482015291831660248301526044820189905233606483015282166084820152915192169163e8dc12ff9160a4808201926020929091908290030181600087803b158015612fe357600080fd5b505af1158015612ff7573d6000803e3d6000fd5b505050506040513d602081101561300d57600080fd5b505194505b8160c001511561312457613033620f4240611365878a63ffffffff61234616565b90508160600151600160a060020a031663a9059cbb89836040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b15801561309c57600080fd5b505af11580156130b0573d6000803e3d6000fd5b505050506040513d60208110156130c657600080fd5b5051151561311e576040805160e560020a62461bcd02815260206004820152601760248201527f4552525f4645455f5452414e534645525f4641494c4544000000000000000000604482015290519081900360640190fd5b80850394505b8160600151600160a060020a03168260400151600160a060020a03168360200151600160a060020a03167f7154b38b5dd31bb3122436a96d4e09aba5b323ae1fd580025fab55074334c0958789336040518084815260200183815260200182600160a060020a0316600160a060020a03168152602001935050505060405180910390a4849350600190920191612cd4565b8885101561320d576040805160e560020a62461bcd02815260206004820152601260248201527f4552525f52455455524e5f544f4f5f4c4f570000000000000000000000000000604482015290519081900360640190fd5b50929998505050505050505050565b613224613647565b600084600186510381518110151561323857fe5b602090810290910101516080810151909250600160a060020a0316301461325e5761289e565b506060810151600160a060020a03811660009081526005602052604090205460ff16156132f45760a08201511561329157fe5b80600160a060020a031663205c287884866040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050600060405180830381600087803b15801561286357600080fd5b61289e818486611d0a565b604080517fdd62ed3e000000000000000000000000000000000000000000000000000000008152306004820152600160a060020a038481166024830152915160009286169163dd62ed3e91604480830192602092919082900301818787803b15801561336a57600080fd5b505af115801561337e573d6000803e3d6000fd5b505050506040513d602081101561339457600080fd5b5051905081811015611f8f5760008111156133b5576133b584846000611f95565b611f8f848484611f95565b6133c8613683565b602060405190810160405280600181525090506020818351602085016000875af18015156133f557600080fd5b5080511515611d92576040805160e560020a62461bcd02815260206004820152601360248201527f4552525f5452414e534645525f4641494c454400000000000000000000000000604482015290519081900360640190fd5b600080613459613683565b604080517f69735632384f72486967686572282900000000000000000000000000000000008152815190819003600f018120600482526024820190925260208082018051600160e060020a0316600160e060020a0319909416939093178352815191929091849188611388fa92508280156134d45750815115155b93505b505050919050565b60008060008084600160a060020a03166371f52bf36040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561352357600080fd5b505af1158015613537573d6000803e3d6000fd5b505050506040513d602081101561354d57600080fd5b505161ffff169250600091505b8282101561360e5784600160a060020a03166319b64015836040518263ffffffff1660e060020a02815260040180828152602001915050602060405180830381600087803b1580156135ab57600080fd5b505af11580156135bf573d6000803e3d6000fd5b505050506040513d60208110156135d557600080fd5b5051600160a060020a03811660009081526005602052604090205490915060ff1615613603578093506134d7565b60019091019061355a565b5073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee949350505050565b60408051808201825290600290829080388339509192915050565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b60206040519081016040528060019060208202803883395091929150505600a165627a7a7230582016b24f79c4fe1c069bea4cf72fb3dfa4d8cac156f0b9dc171b1522dc9472ed870029
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000052ae12abe5d8bd778bd5397f99ca900624cfadd4
-----Decoded View---------------
Arg [0] : _registry (address): 0x52Ae12ABe5D8BD778BD5397F99cA900624CfADD4
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000052ae12abe5d8bd778bd5397f99ca900624cfadd4
Deployed Bytecode Sourcemap
24646:32764:0:-;;;;;;;;;-1:-1:-1;;;24646:32764:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14362:224;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;14362:224:0;;;;;;;;;27048:209;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;27048:209:0;-1:-1:-1;;;;;27048:209:0;;;;;;;;;54279:159;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;54279:159:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54279:159:0;;-1:-1:-1;;54279:159:0;;;-1:-1:-1;54279:159:0;;-1:-1:-1;;;;54279:159:0;;;;;;;;;;;;;;;;;;;;;;;;57024:383;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;57024:383:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57024:383:0;;-1:-1:-1;;57024:383:0;;;-1:-1:-1;;;57024:383:0;;;;;-1:-1:-1;;;;;57024:383:0;;;;;;;-1:-1:-1;57024:383:0;;;;;;-1:-1:-1;57024:383:0;;;;;;;;;;;;;;;;;;;;;12049:38;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12049:38:0;;;;;;;;;;;;;;;;;;;;;;13007:925;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13007:925:0;;;;54788:356;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54788:356:0;;-1:-1:-1;;54788:356:0;;;-1:-1:-1;;;54788:356:0;;;;;-1:-1:-1;;;;;54788:356:0;;;;;;-1:-1:-1;54788:356:0;;;;-1:-1:-1;54788:356:0;;25288:38;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25288:38:0;;;;20025:246;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;20025:246:0;-1:-1:-1;;;;;20025:246:0;;;;;;;;;;;;11959:37;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11959:37:0;;;;;;;;-1:-1:-1;;;;;11959:37:0;;;;;;;;;;;;;;9140:208;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9140:208:0;;;;11870:33;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11870:33:0;;;;28299:2807;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;28299:2807:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28299:2807:0;;-1:-1:-1;;28299:2807:0;;;-1:-1:-1;28299:2807:0;;-1:-1:-1;;;;28299:2807:0;25364:44;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;25364:44:0;-1:-1:-1;;;;;25364:44:0;;;;;38363:583;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;38363:583:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38363:583:0;;-1:-1:-1;;;;;;;38363:583:0;;;;;-1:-1:-1;38363:583:0;;;;;;;;;;-1:-1:-1;38363:583:0;;;;;-1:-1:-1;38363:583:0;;-1:-1:-1;;38363:583:0;7955:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7955:20:0;;;;55521:429;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55521:429:0;;-1:-1:-1;;55521:429:0;;;-1:-1:-1;;;55521:429:0;;;;;-1:-1:-1;;;;;55521:429:0;;;;;;;-1:-1:-1;55521:429:0;;;;;;-1:-1:-1;55521:429:0;;;;;56721:229;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;56721:229:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56721:229:0;;-1:-1:-1;;56721:229:0;;;-1:-1:-1;;;56721:229:0;;;;;;;;-1:-1:-1;;;;;56721:229:0;;-1:-1:-1;56721:229:0;;-1:-1:-1;56721:229:0;14011:137;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14011:137:0;;;;32270:1573;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32270:1573:0;;-1:-1:-1;;32270:1573:0;;;-1:-1:-1;;;32270:1573:0;;;;;-1:-1:-1;;;;;32270:1573:0;;;;;;;-1:-1:-1;32270:1573:0;;;;;;-1:-1:-1;32270:1573:0;;;;;34835:404;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34835:404:0;;-1:-1:-1;;34835:404:0;;;-1:-1:-1;;;34835:404:0;;;;;;;;;;-1:-1:-1;34835:404:0;;;;;-1:-1:-1;34835:404:0;;;;;56024:202;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;56024:202:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56024:202:0;;-1:-1:-1;;56024:202:0;;;-1:-1:-1;;;56024:202:0;;;;;;-1:-1:-1;56024:202:0;;-1:-1:-1;56024:202:0;55218:229;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55218:229:0;;-1:-1:-1;;55218:229:0;;;-1:-1:-1;;;55218:229:0;;;;;;;;-1:-1:-1;;;;;55218:229:0;;-1:-1:-1;55218:229:0;;-1:-1:-1;55218:229:0;36344:1068;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36344:1068:0;;-1:-1:-1;;36344:1068:0;;;-1:-1:-1;;;36344:1068:0;;;;;;;;;;-1:-1:-1;36344:1068:0;;;;;-1:-1:-1;36344:1068:0;;;;;-1:-1:-1;;;;;36344:1068:0;;;;;;;;;;;17058:172;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;17058:172:0;-1:-1:-1;;;;;17058:172:0;;;;;;;;;;;;7982:23;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7982:23:0;;;;27639:283;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;27639:283:0;-1:-1:-1;;;;;27639:283:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;27639:283:0;;;;;;;;;;;;;;;;;17635:203;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;17635:203:0;-1:-1:-1;;;;;17635:203:0;;;;;;;;;;;;;;;;;56300:347;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;56300:347:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56300:347:0;;-1:-1:-1;;56300:347:0;;;-1:-1:-1;;;56300:347:0;;;;;-1:-1:-1;;;;;56300:347:0;;;;;;-1:-1:-1;56300:347:0;;;;-1:-1:-1;56300:347:0;;16517:180;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;16517:180:0;-1:-1:-1;;;;;16517:180:0;;;;;;;;;;;;8891:158;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;8891:158:0;-1:-1:-1;;;;;8891:158:0;;;;;54512:202;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54512:202:0;;-1:-1:-1;;54512:202:0;;;-1:-1:-1;;;54512:202:0;;;;;;-1:-1:-1;54512:202:0;;-1:-1:-1;54512:202:0;26582:240;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;26582:240:0;;;;;14362:224;8453:12;:10;:12::i;:::-;14522:26;:56;;;;;;;-1:-1:-1;;14522:56:0;;;;;;;;;14362:224::o;27048:209::-;8453:12;:10;:12::i;:::-;27169:6;9937:23;9951:8;9937:13;:23::i;:::-;27194:6;10291:18;10300:8;10291;:18::i;:::-;-1:-1:-1;;;;;;;27218:19:0;;;;;;;;:11;:19;;;;;:31;;-1:-1:-1;;27218:31:0;;;;;;;;;;27048:209::o;54279:159::-;54363:7;54372;54400:26;54411:5;54418:7;54400:10;:26::i;:::-;54392:38;54428:1;;-1:-1:-1;54279:159:0;-1:-1:-1;;;54279:159:0:o;57024:383::-;57278:7;57310:89;57324:5;57331:7;57340:10;57352:12;57366:17;57385:13;57310;:89::i;:::-;57303:96;57024:383;-1:-1:-1;;;;;;;57024:383:0:o;12049:38::-;;;;;;;;;:::o;13007:925::-;13237:29;13124:5;;-1:-1:-1;;;;;13124:5:0;13110:10;:19;;:50;;-1:-1:-1;13134:26:0;;;;;;;13133:27;13110:50;13102:80;;;;;;;-1:-1:-1;;;;;13102:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;13287:28;13297:17;13287:9;:28::i;:::-;13436:8;;13237:79;;-1:-1:-1;;;;;;13413:32:0;;;13436:8;;13413:32;;;;:61;;-1:-1:-1;;;;;;13449:25:0;;;;13413:61;13405:94;;;;;;;-1:-1:-1;;;;;13405:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;13614:40;;;;;;13636:17;13614:40;;;;;;13666:1;;-1:-1:-1;;;;;13614:21:0;;;;;:40;;;;;;;;;;;;;;;13666:1;13614:21;:40;;;5:2:-1;;;;30:1;27;20:12;5:2;13614:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;13614:40:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13614:40:0;-1:-1:-1;;;;;13614:54:0;;;13606:87;;;;;-1:-1:-1;;;;;13606:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;13800:8;;;13785:12;:23;;-1:-1:-1;;;;;13800:8:0;;;-1:-1:-1;;13785:23:0;;;;;;;13902:22;;;;;;;;;;;13007:925::o;54788:356::-;55017:7;55049:87;55063:5;55070:7;55079:10;55099:1;55103:17;55122:13;55049;:87::i;:::-;55042:94;54788:356;-1:-1:-1;;;;;;54788:356:0:o;25288:38::-;;;;:::o;20025:246::-;8453:12;:10;:12::i;:::-;20156:6;9937:23;9951:8;9937:13;:23::i;:::-;20186:3;9937:23;9951:8;9937:13;:23::i;:::-;20208:3;10291:18;10300:8;10291;:18::i;:::-;20229:34;20242:6;20250:3;20255:7;20229:12;:34::i;:::-;9971:1;;8476;20025:246;;;:::o;11959:37::-;;;-1:-1:-1;;;;;11959:37:0;;:::o;9140:208::-;9207:8;;-1:-1:-1;;;;;9207:8:0;9193:10;:22;9185:52;;;;;-1:-1:-1;;;;;9185:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;9272:8;;;9265:5;;9253:28;;-1:-1:-1;;;;;9272:8:0;;;;9265:5;;;;9253:28;;;9300:8;;;;9292:16;;-1:-1:-1;;9292:16:0;;;-1:-1:-1;;;;;9300:8:0;;9292:16;;;;9319:21;;;9140:208::o;11870:33::-;;;-1:-1:-1;;;;;11870:33:0;;:::o;28299:2807::-;28378:7;28398:14;28423:11;28445:14;28470:15;28496:13;28520:20;28551:22;28864:9;28920:23;28973:18;29021:23;28591:25;28601:14;28591:9;:25::i;:::-;28551:66;;28639:7;28630:16;;28754:1;28739:5;:12;:16;:41;;;;-1:-1:-1;28759:12:0;;28774:1;;28759:16;28779:1;28759:21;28739:41;28731:70;;;;;;;-1:-1:-1;;;;;28731:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;28876:1;28864:13;;28859:2214;28883:5;:12;28879:1;:16;28859:2214;;;28946:5;28956:1;28952;:5;28946:12;;;;;;;;;;;;;;;;;;28920:38;;28994:5;29004:1;29000;:5;28994:12;;;;;;;;;;;;;;;;;;28973:33;;29047:5;29053:1;29047:8;;;;;;;;;;;;;;;;;;29021:34;;29112:6;-1:-1:-1;;;;;29095:30:0;;:32;;;;;-1:-1:-1;;;29095:32:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29095:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29095:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29095:32:0;;-1:-1:-1;29198:48:0;29095:32;29234:11;29198:24;:48::i;:::-;29184:62;;29275:48;29300:9;29311:11;29275:24;:48::i;:::-;29261:62;;29359:6;-1:-1:-1;;;;;29344:21:0;:11;-1:-1:-1;;;;;29344:21:0;;29340:1722;;;29482:1;29478;:5;:31;;;;29497:5;29507:1;29503;:5;29497:12;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29487:22:0;:6;-1:-1:-1;;;;;29487:22:0;;;29478:31;29474:100;;;29553:6;-1:-1:-1;;;;;29541:31:0;;:33;;;;;-1:-1:-1;;;29541:33:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29541:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29541:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29541:33:0;;-1:-1:-1;29474:100:0;29661:9;-1:-1:-1;;;;;29661:29:0;;29691:11;29661:42;;;;;-1:-1:-1;;;29661:42:0;;;;;;;-1:-1:-1;;;;;29661:42:0;-1:-1:-1;;;;;29661:42:0;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29661:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29661:42:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29661:42:0;29741:33;;;;;;-1:-1:-1;;;;;29741:33:0;;;;;;;;;29661:42;;-1:-1:-1;29741:20:0;;;;;;:33;;;;;;;;;;;;;;;-1:-1:-1;29741:20:0;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;29741:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29741:33:0;;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;29741:33:0;;;;;;29802:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29741:33;;-1:-1:-1;;;;;;29802:20:0;;;;;:53;;;;;;;;;;-1:-1:-1;29802:20:0;:53;;;5:2:-1;;;;30:1;27;20:12;5:2;29802:53:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29802:53:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29802:53:0;29891:25;;;;;;;;29802:53;;-1:-1:-1;29880:68:0;;24836:7;;29880:37;;-1:-1:-1;;;;;29891:23:0;;;;;:25;;;;;29802:53;;29891:25;;;;;;;;:23;:25;;;5:2:-1;;;;30:1;27;20:12;5:2;29891:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29891:25:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29891:25:0;29880:6;;:37;;;;;:10;:37;:::i;:::-;:41;:68;:41;:68;:::i;:::-;29967:13;;;;;29874:74;-1:-1:-1;30083:18:0;:6;29967:13;30083:18;:10;:18;:::i;:::-;30074:27;;29340:1722;;;30155:6;-1:-1:-1;;;;;30140:21:0;:11;-1:-1:-1;;;;;30140:21:0;;30136:926;;;30279:1;30275;:5;:31;;;;30294:5;30304:1;30300;:5;30294:12;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30284:22:0;:6;-1:-1:-1;;;;;30284:22:0;;;30275:31;30271:100;;;30350:6;-1:-1:-1;;;;;30338:31:0;;:33;;;;;-1:-1:-1;;;30338:33:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30338:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30338:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30338:33:0;;-1:-1:-1;30271:100:0;30458:9;-1:-1:-1;;;;;30458:29:0;;30488:11;30458:42;;;;;-1:-1:-1;;;30458:42:0;;;;;;;-1:-1:-1;;;;;30458:42:0;-1:-1:-1;;;;;30458:42:0;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30458:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30458:42:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30458:42:0;30538:33;;;;;;-1:-1:-1;;;;;30538:33:0;;;;;;;;;30458:42;;-1:-1:-1;30538:20:0;;;;;;:33;;;;;;;;;;;;;;;-1:-1:-1;30538:20:0;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;30538:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30538:33:0;;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;30538:33:0;;;;;;30599:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30538:33;;-1:-1:-1;;;;;;30599:16:0;;;;;:49;;;;;;;;;;-1:-1:-1;30599:16:0;:49;;;5:2:-1;;;;30:1;27;20:12;5:2;30599:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30599:49:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30599:49:0;30684:25;;;;;;;;30599:49;;-1:-1:-1;30673:68:0;;24836:7;;30673:37;;-1:-1:-1;;;;;30684:23:0;;;;;:25;;;;;30599:49;;30684:25;;;;;;;;:23;:25;;;5:2:-1;;;;30:1;27;20:12;30673:68:0;30760:13;;;;;30667:74;-1:-1:-1;30876:18:0;:6;30760:13;30876:18;:10;:18;:::i;30136:926::-;30992:54;31002:9;31013:11;31026;31039:6;30992:9;:54::i;:::-;30976:70;;-1:-1:-1;30976:70:0;-1:-1:-1;30136:926:0;28902:1;28897:6;;;;28859:2214;;;-1:-1:-1;31092:6:0;;28299:2807;-1:-1:-1;;;;;;;;;;;;28299:2807:0:o;25364:44::-;;;;;;;;;;;;;;;:::o;38363:583::-;38522:7;38743:14;38629:8;-1:-1:-1;;;;;38629:14:0;;:16;;;;;-1:-1:-1;;;38629:16:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38629:16:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38629:16:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38629:16:0;38617:8;;-1:-1:-1;;;;;38617:28:0;;;;:5;;38623:1;;38617:8;;;;;;;;;;;;;;;-1:-1:-1;;;;;38617:28:0;;38609:65;;;;;-1:-1:-1;;;;;38609:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;38760:54;;;;;;;;;;;;38803:10;38760:54;;;;;;-1:-1:-1;;;;;38760:27:0;;;;;:54;;;;;;;;;;;;;;-1:-1:-1;38760:27:0;:54;;;5:2:-1;;;;30:1;27;20:12;5:2;38760:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38760:54:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38760:54:0;;-1:-1:-1;38869:69:0;38883:5;38760:54;38898:10;38910:12;38932:1;;38869:13;:69::i;7955:20::-;;;-1:-1:-1;;;;;7955:20:0;;:::o;55521:429::-;55821:7;55791:10;9595:24;9612:6;9595:16;:24::i;:::-;55853:89;55867:5;55874:7;55883:10;55895:12;55909:17;55928:13;55853;:89::i;:::-;55846:96;55521:429;-1:-1:-1;;;;;;;;55521:429:0:o;56721:229::-;56845:7;56872:70;56886:5;56893:7;56902:10;56914:12;56936:1;56940;56872:13;:70::i;:::-;56865:77;56721:229;-1:-1:-1;;;;;56721:229:0:o;14011:137::-;8453:12;:10;:12::i;:::-;14128;;14117:8;:23;;-1:-1:-1;;14117:23:0;-1:-1:-1;;;;;14128:12:0;;;14117:23;;;;;;14011:137::o;32270:1573::-;32530:7;32946:24;33335:19;33511:28;33614:14;15502:12;:10;:12::i;:::-;15525:6;:13;;-1:-1:-1;;15525:13:0;;;;;32500:10;9595:24;32500:10;9595:16;:24::i;:::-;32684:1;32669:5;:12;:16;:41;;;;-1:-1:-1;32689:12:0;;32704:1;;32689:16;32709:1;32689:21;32669:41;32661:70;;;;;;;-1:-1:-1;;;;;32661:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;32823:64;32841:5;32847:1;32841:8;;;;;;;;;;;;;;;;;;32868:5;32874:1;32868:8;;;;;;;;;;;;;;;;;;32879:7;32823:17;:64::i;:::-;32973:5;;-1:-1:-1;;;;;;32993:31:0;;;32989:294;;;33049:18;;33041:56;;;;;-1:-1:-1;;;;;33041:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;32989:294;;;33151:13;33147:1;:17;:53;;;;;33185:15;;33168:13;:32;;33147:53;33139:91;;;;;;;-1:-1:-1;;;;;33139:91:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;33267:4;33245:26;;32989:294;33357:10;;-1:-1:-1;;;;;;33382:26:0;;;33378:71;;33437:12;33423:26;;33378:71;33542:61;33563:5;33570:11;33583:19;33542:20;:61::i;:::-;33511:92;;33631:73;33644:4;33650:7;33659:10;33671:17;33690:13;33631:12;:73::i;:::-;33614:90;;33765:44;33783:4;33789:6;33797:11;33765:17;:44::i;:::-;-1:-1:-1;15561:6:0;:14;;-1:-1:-1;;15561:14:0;;;33829:6;32270:1573;-1:-1:-1;;;;;;;;;;32270:1573:0:o;34835:404::-;35097:7;35129:102;35139:5;35146:7;35155:10;35167:17;35186:14;35202:13;35225:1;35229;35129:9;:102::i;56024:202::-;56123:7;56150:68;56164:5;56171:7;56180:10;56200:1;56212;56216;56150:13;:68::i;:::-;56143:75;56024:202;-1:-1:-1;;;;56024:202:0:o;36344:1068::-;36712:7;36737:23;36797:16;37045:14;36682:10;9595:24;9612:6;9595:16;:24::i;:::-;36769:12;;36763:5;;-1:-1:-1;;36769:16:0;;;36763:23;;;;;;;;;;;;;;36737:49;;36825:19;36835:8;36825:9;:19::i;:::-;36797:48;;36934:20;36944:9;36934;:20::i;:::-;-1:-1:-1;;;;;36919:35:0;;;;;;36911:72;;;;;-1:-1:-1;;;;;36911:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;37062:81;37076:5;37083:7;37092:10;37104:4;37110:17;37129:13;37062;:81::i;:::-;37045:98;;37192:45;37208:11;37221:7;37230:6;37192:15;:45::i;:::-;37303:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37303:17:0;;;;;:75;;;;;;;;;;;;;;;:17;:75;;;5:2:-1;;;;30:1;27;20:12;5:2;37303:75:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;37398:6:0;;36344:1068;-1:-1:-1;;;;;;;;;;;;;;;36344:1068:0:o;17058:172::-;15995:38;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17162:59:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;17162:59:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;;17162:59:0;;;179:29:-1;;;;160:49;;;17146:76:0;;17154:6;;17146:7;:76::i;:::-;17058:172;;;:::o;7982:23::-;;;-1:-1:-1;;;;;7982:23:0;;:::o;27639:283::-;27736:9;27758:32;27815:33;27825:22;27815:9;:33::i;:::-;27867:47;;;;;;-1:-1:-1;;;;;27867:47:0;;;;;;;;;;;;;;;;27758:91;;-1:-1:-1;27867:19:0;;;;;;:47;;;;;-1:-1:-1;;27867:47:0;;;;;;;;-1:-1:-1;27867:19:0;:47;;;5:2:-1;;;;30:1;27;20:12;5:2;27867:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27867:47:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;27867:47:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;27867:47:0;;;;;;20:11:-1;15:3;12:20;9:2;;;45:1;42;35:12;9:2;64:21;;126:4;117:14;;142:31;;;139:2;;;186:1;183;176:12;139:2;224:3;218:10;339:9;333:2;319:12;315:21;297:16;293:44;290:59;268:11;254:12;251:29;239:119;236:2;;;371:1;368;361:12;236:2;-1:-1;27867:47:0;;-1:-1:-1;;;;;27639:283:0;;;;;;:::o;17635:203::-;16102:50;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17758:71:0;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;17758:71:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;;17758:71:0;;;179:29:-1;;;;160:49;;;17742:88:0;;17750:6;;17742:7;:88::i;:::-;17635:203;;;;:::o;16517:180::-;15894:37;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16625:63:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;16625:63:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;;16625:63:0;;;179:29:-1;;;;160:49;;;16609:80:0;;16617:6;;16609:7;:80::i;8891:158::-;8453:12;:10;:12::i;:::-;8986:5;;-1:-1:-1;;;;;8973:18:0;;;8986:5;;8973:18;;8965:45;;;;;-1:-1:-1;;;;;8965:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;9021:8;:20;;-1:-1:-1;;9021:20:0;-1:-1:-1;;;;;9021:20:0;;;;;;;;;;8891:158::o;26582:240::-;8453:12;:10;:12::i;:::-;24902:7;26695:44;;;26687:82;;;;;-1:-1:-1;;;;;26687:82:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;26780:15;:34;26582:240::o;8540:104::-;8609:5;;-1:-1:-1;;;;;8609:5:0;8595:10;:19;8587:49;;;;;-1:-1:-1;;;;;8587:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;8540:104::o;10035:128::-;-1:-1:-1;;;;;10109:22:0;;;;10101:54;;;;;-1:-1:-1;;;;;10101:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;10035:128;:::o;10384:126::-;-1:-1:-1;;;;;10453:25:0;;10473:4;10453:25;;10445:57;;;;;-1:-1:-1;;;;;10445:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;14784:133;14876:8;;:33;;;;;;;;;;;;;;14849:7;;-1:-1:-1;;;;;14876:8:0;;:18;;:33;;;;;;;;;;;;;;14849:7;14876:8;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;14876:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14876:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14876:33:0;;14784:133;-1:-1:-1;;14784:133:0:o;51651:362::-;-1:-1:-1;;;;;51779:19:0;;51750:11;51779:19;;;:11;:19;;;;;;;;51778:20;51774:52;;;-1:-1:-1;51820:6:0;51813:13;;51774:52;51843:34;51866:10;51843:22;:34::i;:::-;51839:92;;;-1:-1:-1;24963:42:0;51892:39;;51839:92;51963:41;51993:10;51963:29;:41::i;:::-;51944:61;;51651:362;;;;;:::o;21418:250::-;21478:7;;21531;;21527:34;;;21560:1;21553:8;;;;21527:34;-1:-1:-1;21586:7:0;;;21591:2;21586;:7;21612:6;;;;;;;;:12;21604:37;;;;;-1:-1:-1;;;;;21604:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;21659:1;21418:250;-1:-1:-1;;;21418:250:0:o;21896:174::-;21956:7;;21984:6;;;21976:37;;;;;-1:-1:-1;;;;;21976:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;22041:2;22036;:7;;;;;;;;;21896:174;-1:-1:-1;;;;21896:174:0:o;20655:169::-;20715:7;20747;;;20773;;;;20765:32;;;;;-1:-1:-1;;;;;20765:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;21047:147;21107:7;21135:8;;;;21127:34;;;;;-1:-1:-1;;;;;21127:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21179:7:0;;;21047:147::o;52224:900::-;52342:7;52351;52371:21;;:::i;:::-;52079:47;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52423:85:0;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;52423:85:0;;;;;;25:18:-1;;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;;52423:85:0;;;179:29:-1;;;;160:49;;52795:11:0;;52423:85;;52079:47;52896:3;;52638:5;52589:3;52560:431;53015:7;53008:15;53005:2;;;53053:1;53050;53043:12;53005:2;-1:-1:-1;;53101:6:0;;;53109;;;;53101;;53109;;-1:-1:-1;52224:900:0;-1:-1:-1;;;;;52224:900:0:o;9694:112::-;9778:1;9769:10;;9761:37;;;;;-1:-1:-1;;;;;9761:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;15638:89;15694:6;;;;;;;15693:7;15685:34;;;;;-1:-1:-1;;;;;15685:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;42575:1653;42690:25;42756:21;42729:7;-1:-1:-1;;;;;42729:13:0;;:15;;;;;-1:-1:-1;;;42729:15:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42729:15:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42729:15:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42729:15:0;;-1:-1:-1;42780:38:0;42729:15;42780:22;:38::i;:::-;42756:62;;42863:1;42851:9;:13;42847:1374;;;42924:9;:20;;42916:56;;;;;-1:-1:-1;;;;;42916:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;43207:16;43206:17;43202:125;;;43254:45;43284:14;43254:29;:45::i;:::-;-1:-1:-1;;;;;43242:66:0;;43315:9;43242:85;;;;;-1:-1:-1;;;43242:85:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43242:85:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43242:85:0;;;;;43202:125;42847:1374;;;-1:-1:-1;;;;;43381:25:0;;;;;;:11;:25;;;;;;;;43377:844;;;43593:57;43610:12;43624:10;43636:4;43642:7;43593:16;:57::i;:::-;43720:16;43716:82;;;43767:12;-1:-1:-1;;;;;43755:34:0;;43790:7;43755:43;;;;;-1:-1:-1;;;43755:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43755:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43755:43:0;;;;43377:844;;;44013:16;44009:200;;;44048:67;44065:12;44079:10;44091:14;44107:7;44048:16;:67::i;44009:200::-;44152:57;44169:12;44183:10;44195:4;44201:7;44152:16;:57::i;:::-;42575:1653;;;;;:::o;45979:4180::-;46111:16;46140:28;46232:26;46277:16;46412:9;46499:23;46580:20;46644:23;46785:24;47710:30;;:::i;:::-;46192:22;;46217:1;;46192:26;46171:48;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;46140:79;;46261:5;46232:34;;46296:20;46306:9;46296;:20::i;:::-;46277:39;;46441:1;46437:5;;46432:1216;46473:1;46448:15;:22;:26;46444:1;:30;46432:1216;;;46542:15;46558:1;46562;46558:5;46542:22;;;;;;;;;;;;;;;;;;46499:66;;46614:6;-1:-1:-1;;;;;46614:12:0;;:14;;;;;-1:-1:-1;;;46614:14:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46614:14:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46614:14:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;46614:14:0;46670:22;;46614:14;;-1:-1:-1;46670:15:0;;46690:1;46686:5;;;46670:22;;;;;;;;;;;;;;46644:48;;46812:20;:46;;;;;46837:21;46836:22;46812:46;:73;;;;;46877:8;-1:-1:-1;;;;;46862:23:0;:11;-1:-1:-1;;;;;46862:23:0;;46812:73;46785:100;;46904:19;46900:70;;;46966:4;46942:28;;46900:70;47001:635;;;;;;;;;47164:9;-1:-1:-1;;;;;47001:635:0;;;;;47088:6;-1:-1:-1;;;;;47001:635:0;;;;;47256:15;47272:1;47256:18;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47001:635:0;;;;;47306:11;-1:-1:-1;;;;;47001:635:0;;;;;47451:1;-1:-1:-1;;;;;47001:635:0;;;;;47528:33;47551:9;47528:22;:33::i;:::-;47001:635;;;;;;;;;;;;46987:4;46996:1;46992;:5;46987:11;;;;;;;;;;;;;;;;;;:649;46481:1;46476:6;;;;;46432:1216;;;47743:4;47748:1;47743:7;;;;;;;;;;;;;;;;;;;;47777:20;;;;;-1:-1:-1;;;;;47765:33:0;;;;;:11;:33;;;;;;;47743:7;;-1:-1:-1;47765:33:0;;47761:498;;;47911:8;:31;;;47907:340;;;24963:42;47961:20;;;:55;47907:340;;;48227:18;;48197:49;;:29;:49::i;:::-;-1:-1:-1;;;;;48162:85:0;:20;;;:85;47907:340;48313:11;;48308:4;;-1:-1:-1;;48313:15:0;;;48308:21;;;;;;;;;;;;;;;;48356:20;;;;-1:-1:-1;;;;;48344:33:0;;;;;:11;:33;;;;;;;;48308:21;;-1:-1:-1;48344:33:0;;48340:498;;;48490:8;:31;;;48486:340;;;24963:42;48540:20;;;:55;48486:340;;;48806:18;;48776:49;;:29;:49::i;:::-;-1:-1:-1;;;;;48741:85:0;:20;;;:85;48486:340;48905:1;48901:5;;48896:1232;48912:4;:11;48908:1;:15;48896:1232;;;48956:4;48961:1;48956:7;;;;;;;;;;;;;;;;;;48945:18;;49115:8;:31;;;49111:1006;;;49271:8;:28;;;49267:664;;;49345:4;49322:20;;;:27;49267:664;;;49476:1;49462:4;:11;:15;49457:1;:20;49453:478;;;-1:-1:-1;;;;;49500:35:0;;:20;;;:35;49453:478;;;49661:4;49666:1;49670;49666:5;49661:11;;;;;;;;;;;;;;;;;;:34;;;49657:274;;;49741:4;49746:1;49750;49746:5;49741:11;;;;;;;;;;;;;;;;;;;:21;-1:-1:-1;;;;;49718:44:0;:20;;;:44;49657:274;;;49927:4;49904:20;;;:27;49657:274;49111:1006;;;50097:4;50074:20;;;:27;49111:1006;48925:3;;;;;48896:1232;;;-1:-1:-1;50147:4:0;;45979:4180;-1:-1:-1;;;;;;;;;;;45979:4180:0:o;39563:2665::-;39765:7;39785:16;39812:18;39903:9;39956:30;;:::i;:::-;41624:23;39833:7;39812:28;;39915:1;39903:13;;39898:2165;39922:5;:12;39918:1;:16;39898:2165;;;39989:5;39995:1;39989:8;;;;;;;;;;;;;;;;;;39956:41;;40050:8;:31;;;40046:862;;;40296:6;;;;;:51;;-1:-1:-1;40306:12:0;;40342:4;;40306:5;;-1:-1:-1;;40312:5:0;;;40306:12;;;;;;;;;;;;;;:24;;;-1:-1:-1;;;;;40306:41:0;;40296:51;:89;;;;-1:-1:-1;40364:20:0;;;;;-1:-1:-1;;;;;40352:33:0;;;;;:11;:33;;;;;;40351:34;40296:89;40292:182;;;40408:66;40421:8;:20;;;40443:8;:18;;;40463:10;40408:12;:66::i;:::-;40046:862;;;40694:8;:15;;;-1:-1:-1;;;;;40658:52:0;:8;:20;;;-1:-1:-1;;;;;40658:52:0;;;40654:254;;;40823:69;40839:8;:20;;;40861:8;:18;;;40881:10;40823:15;:69::i;:::-;40963:8;:31;;;40962:32;40958:552;;;41041:18;;41068:20;;;;;41090;;;;41024:102;;;;;-1:-1:-1;;;;;41024:102:0;;;;;;;;;;;;;;;;;;;;41124:1;41024:102;;;;;;:43;;;;;:102;;;;;;;;;;;;;;;41041:18;41024:43;:102;;;5:2:-1;;;;30:1;27;20:12;5:2;41024:102:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41024:102:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41024:102:0;;-1:-1:-1;40958:552:0;;;41162:20;;;;;-1:-1:-1;;;;;41150:33:0;;;;;:11;:33;;;;;;41146:364;;;41213:18;;41257:20;;;;;41279;;;;41325;;;;41213:133;;;;;-1:-1:-1;;;;;41213:133:0;;;;;;;;;;;;;;;;;;;;41313:10;41213:133;;;;;;;;;;;;:26;;;;;41246:9;;41213:133;;;;;;;;;;;;;;41246:9;41213:26;:133;;;5:2:-1;;;;30:1;27;20:12;5:2;41213:133:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41213:133:0;;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;41146:364:0;41394:18;;41421:20;;;;;41443;;;;41489;;;;41394:116;;;;;-1:-1:-1;;;;;41394:116:0;;;;;;;;;;;;;;;;;;;;41477:10;41394:116;;;;;;;;;;;;:26;;;;;:116;;;;;;;;;;;;;;;:18;:26;:116;;;5:2:-1;;;;30:1;27;20:12;5:2;41394:116:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41394:116:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41394:116:0;;-1:-1:-1;41146:364:0;41575:8;:28;;;41571:318;;;41650:57;24902:7;41650:27;:8;41663:13;41650:27;:12;:27;:::i;:57::-;41624:83;;41734:8;:20;;;-1:-1:-1;;;;;41734:29:0;;41764:17;41783:15;41734:65;;;;;-1:-1:-1;;;41734:65:0;;;;;;;-1:-1:-1;;;;;41734:65:0;-1:-1:-1;;;;;41734:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41734:65:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41734:65:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41734:65:0;41726:101;;;;;;;-1:-1:-1;;;;;41726:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;41858:15;41846:27;;;;41571:318;41960:8;:20;;;-1:-1:-1;;;;;41910:105:0;41938:8;:20;;;-1:-1:-1;;;;;41910:105:0;41921:8;:15;;;-1:-1:-1;;;;;41910:105:0;;41982:10;41994:8;42004:10;41910:105;;;;;;;;;;;;;;-1:-1:-1;;;;;41910:105:0;-1:-1:-1;;;;;41910:105:0;;;;;;;;;;;;;;;;;42043:8;;-1:-1:-1;39936:3:0;;;;;39898:2165;;;42147:22;;;;42139:53;;;;;-1:-1:-1;;;;;42139:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42212:8:0;;39563:2665;-1:-1:-1;;;;;;;;;39563:2665:0:o;44593:869::-;44702:30;;:::i;:::-;44911:23;44735:5;44756:1;44741:5;:12;:16;44735:23;;;;;;;;;;;;;;;;;;;44840:20;;;;44735:23;;-1:-1:-1;;;;;;44840:37:0;44872:4;44840:37;44836:63;;44892:7;;44836:63;-1:-1:-1;44937:20:0;;;;-1:-1:-1;;;;;45003:24:0;;;;;;:11;:24;;;;;;;;44999:456;;;45128:31;;;;45127:32;45120:40;;;;45277:11;-1:-1:-1;;;;;45265:35:0;;45301:12;45315:7;45265:58;;;;;-1:-1:-1;;;45265:58:0;;;;;;;-1:-1:-1;;;;;45265:58:0;-1:-1:-1;;;;;45265:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;44999:456:0;45395:48;45408:11;45421:12;45435:7;45395:12;:48::i;50625:339::-;50743:32;;;;;;50760:4;50743:32;;;;-1:-1:-1;;;;;50743:32:0;;;;;;;;;50723:17;;50743:16;;;;;:32;;;;;;;;;;;;;;50723:17;50743:16;:32;;;5:2:-1;;;;30:1;27;20:12;5:2;50743:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50743:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;50743:32:0;;-1:-1:-1;50790:18:0;;;50786:171;;;50841:1;50829:9;:13;50825:68;;;50861:32;50873:6;50881:8;50891:1;50861:11;:32::i;:::-;50908:37;50920:6;50928:8;50938:6;50908:11;:37::i;18189:793::-;18265:21;;:::i;:::-;:36;;;;;;;;;18298:1;18265:36;;;;;18782:2;18732:3;18636:5;18630:12;18538:2;18531:5;18527:14;18482:1;18426:6;18376:3;18353:476;18853:7;18846:15;18843:2;;;18891:1;18888;18881:12;18843:2;-1:-1:-1;18939:6:0;;:11;;18931:43;;;;;-1:-1:-1;;;;;18931:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;53398:807;53476:4;53493:12;53516:21;;:::i;:::-;53196:28;;;;;;;;;;;;;;;;22:32:-1;6:49;;53568:54:0;;;;;;49:4:-1;25:18;;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;;53568:54:0;;;179:29:-1;;;;160:49;;53949:11:0;;53196:28;;49:4:-1;;54050:3:0;;53792:10;53699:4;53670:475;53659:486;;54175:7;:22;;;;-1:-1:-1;54186:6:0;;:11;;54175:22;54168:29;;53398:807;;;;;;;:::o;51048:441::-;51132:7;51152:20;51223:9;51276:27;51175:10;-1:-1:-1;;;;;51175:30:0;;:32;;;;;-1:-1:-1;;;51175:32:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51175:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51175:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;51175:32:0;51152:55;;;-1:-1:-1;51235:1:0;;-1:-1:-1;51218:225:0;51242:12;51238:1;:16;51218:225;;;51306:10;-1:-1:-1;;;;;51306:26:0;;51333:1;51306:29;;;;;-1:-1:-1;;;51306:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51306:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51306:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;51306:29:0;-1:-1:-1;;;;;51354:32:0;;;;;;:11;51306:29;51354:32;;;;;51306:29;;-1:-1:-1;51354:32:0;;51350:81;;;51412:19;51405:26;;;;51350:81;51256:3;;;;;51218:225;;;-1:-1:-1;24963:42:0;;51048:441;-1:-1:-1;;;;51048:441:0:o;24646:32764::-;;;;;;;;;;;;;;;105:10:-1;24646:32764:0;88:34:-1;-1:-1;24646:32764:0;;;-1:-1:-1;;24646:32764:0:o;:::-;;;;;;;;;-1:-1:-1;24646:32764:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;-1:-1;24646:32764:0;;;-1:-1:-1;;24646:32764:0:o
Swarm Source
bzzr://16b24f79c4fe1c069bea4cf72fb3dfa4d8cac156f0b9dc171b1522dc9472ed87
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 35 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
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.