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 29 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Safe Transfer Fr... | 10297039 | 1822 days ago | IN | 0 ETH | 0.00153832 | ||||
Safe Transfer Fr... | 10297038 | 1822 days ago | IN | 0 ETH | 0.00153832 | ||||
Safe Transfer Fr... | 10297037 | 1822 days ago | IN | 0 ETH | 0.00153832 | ||||
Safe Transfer Fr... | 10297032 | 1822 days ago | IN | 0 ETH | 0.00153832 | ||||
Safe Transfer Fr... | 10289673 | 1823 days ago | IN | 0 ETH | 0.00251727 | ||||
Safe Transfer Fr... | 10289049 | 1823 days ago | IN | 0 ETH | 0.004265 | ||||
Safe Transfer Fr... | 10289038 | 1823 days ago | IN | 0 ETH | 0.00280552 | ||||
Claim And Conver... | 10277024 | 1825 days ago | IN | 0 ETH | 0.00588077 | ||||
Convert2 | 10277023 | 1825 days ago | IN | 10 ETH | 0.00321068 | ||||
Claim And Conver... | 10276940 | 1825 days ago | IN | 0 ETH | 0.01793304 | ||||
Convert2 | 10276916 | 1825 days ago | IN | 19 ETH | 0.00682002 | ||||
Convert2 | 10276891 | 1825 days ago | IN | 0.196 ETH | 0.00449604 | ||||
Convert2 | 10276885 | 1825 days ago | IN | 0.09772399 ETH | 0.00851952 | ||||
Convert2 | 10276885 | 1825 days ago | IN | 4.85419038 ETH | 0.00785835 | ||||
Convert2 | 10276845 | 1825 days ago | IN | 0.01 ETH | 0.00651484 | ||||
Claim And Conver... | 10276829 | 1825 days ago | IN | 0 ETH | 0.01903991 | ||||
Claim And Conver... | 10276812 | 1825 days ago | IN | 0 ETH | 0.02364234 | ||||
Convert2 | 10276807 | 1825 days ago | IN | 0.01 ETH | 0.01685004 | ||||
Claim And Conver... | 10276800 | 1825 days ago | IN | 0 ETH | 0.00656261 | ||||
Claim And Conver... | 10276761 | 1825 days ago | IN | 0 ETH | 0.0225427 | ||||
Convert2 | 10276751 | 1825 days ago | IN | 0.06952545 ETH | 0.01541386 | ||||
Claim And Conver... | 10276739 | 1825 days ago | IN | 0 ETH | 0.00806289 | ||||
Convert2 | 10276739 | 1825 days ago | IN | 19 ETH | 0.01246599 | ||||
Convert By Path | 10276716 | 1825 days ago | IN | 0.01 ETH | 0.00955054 | ||||
Claim And Conver... | 10276677 | 1825 days ago | IN | 0 ETH | 0.00929347 |
Latest 16 internal transactions
Advanced mode:
Parent Transaction Hash | Method | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|---|
- | 10277023 | 1825 days ago | 10 ETH | ||||
- | 10276916 | 1825 days ago | 19 ETH | ||||
- | 10276891 | 1825 days ago | 0.196 ETH | ||||
- | 10276885 | 1825 days ago | 0.02 ETH | ||||
- | 10276885 | 1825 days ago | 0.02 ETH | ||||
- | 10276885 | 1825 days ago | 0.09772399 ETH | ||||
- | 10276885 | 1825 days ago | 4.85419038 ETH | ||||
- | 10276845 | 1825 days ago | 0.01 ETH | ||||
- | 10276807 | 1825 days ago | 0.01 ETH | ||||
- | 10276751 | 1825 days ago | 0.06952545 ETH | ||||
- | 10276739 | 1825 days ago | 19 ETH | ||||
- | 10276716 | 1825 days ago | 0.01 ETH | ||||
- | 10276447 | 1825 days ago | 0.1 ETH | ||||
- | 10276447 | 1825 days ago | 0.1 ETH | ||||
- | 10276114 | 1825 days ago | 0.1 ETH | ||||
- | 10276114 | 1825 days ago | 0.1 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-15 */ // 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]; 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(); converter = IConverter(IConverterAnchor(anchor).owner()); } // 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(); converter = IConverter(IConverterAnchor(anchor).owner()); } // 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 // check if the current smart token has changed if (i < 3 || anchor != _path[i - 3]) { converter = IConverter(IConverterAnchor(anchor).owner()); } (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; } 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( gas, // gas remaining _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; } /** * @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
60806040526003805460a860020a60ff02191690556175306004553480156200002757600080fd5b5060405160208062003903833981016040525160008054600160a060020a0319163317905580806200006281640100000000620000dd810204565b5060028054600160a060020a03909216600160a060020a03199283168117909155600380549092161790555073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee60005260056020527fa1829a9003092132f585b6ccdd167c19fe9774dbdea4260287e8a8e8ca8185d7805460ff1916600117905562000158565b600160a060020a03811615156200015557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4552525f494e56414c49445f4144445245535300000000000000000000000000604482015290519081900360640190fd5b50565b61379b80620001686000396000f3006080604052600436106101875763ffffffff60e060020a600035041663024c7ec7811461018c57806302ef521e146101a85780630c8496cc146101ce5780632978c10e1461023e5780632fe8a6ad146102c757806349d10b64146102f0578063569706eb146103055780635d732ff2146103685780635e35359e1461037d57806361cd756e146103a757806379ba5097146103d85780637b103999146103ed5780637f9c0ecd146104025780638077ccf71461045957806389f9cc611461047a5780638da5cb5b146104ed578063ab6214ce14610502578063b1e9932b1461056c578063b4a176d3146105d7578063b77d239b146105ec578063c52173de14610656578063c7ba24bc146106b5578063c98fefed14610713578063cb32564e14610771578063d1660f99146107e5578063d4ee1d901461080f578063d734fa1914610824578063d9fc4b611461089b578063e57738e5146108cb578063eb5625d91461093b578063f2fde38b14610965578063f3898a9714610986578063f3bc7d2a146109d7575b600080fd5b34801561019857600080fd5b506101a660043515156109ef565b005b3480156101b457600080fd5b506101a6600160a060020a03600435166024351515610a37565b3480156101da57600080fd5b5060408051602060048035808201358381028086018501909652808552610225953695939460249493850192918291850190849080828437509497505093359450610a809350505050565b6040805192835260208301919091528051918290030190f35b34801561024a57600080fd5b50604080516020600480358082013583810280860185019096528085526102b59536959394602494938501929182918501908490808284375094975050843595505050602083013592600160a060020a03604082013581169350606082013516915060800135610a98565b60408051918252519081900360200190f35b3480156102d357600080fd5b506102dc610ab3565b604080519115158252519081900360200190f35b3480156102fc57600080fd5b506101a6610ad4565b604080516020600480358082013583810280860185019096528085526102b59536959394602494938501929182918501908490808284375094975050843595505050602083013592600160a060020a036040820135169250606001359050610d53565b34801561037457600080fd5b506102b5610d6e565b34801561038957600080fd5b506101a6600160a060020a0360043581169060243516604435610d74565b3480156103b357600080fd5b506103bc610dad565b60408051600160a060020a039092168252519081900360200190f35b3480156103e457600080fd5b506101a6610dbc565b3480156103f957600080fd5b506103bc610e8f565b34801561040e57600080fd5b50604080516020600480358082013583810280860185019096528085526102b5953695939460249493850192918291850190849080828437509497505093359450610e9e9350505050565b34801561046557600080fd5b506102dc600160a060020a036004351661180c565b34801561048657600080fd5b50604080516020600480358082013583810280860185019096528085526102b59536959394602494938501929182918501908490808284375094975050600160a060020a038535811696506020860135956040810135955060600135169250611821915050565b3480156104f957600080fd5b506103bc6119b6565b604080516020600480358082013583810280860185019096528085526102b59536959394602494938501929182918501908490808284375094975050843595505050602083013592600160a060020a036040820135811693506060820135169150608001356119c5565b34801561057857600080fd5b50604080516020600480358082013583810280860185019096528085526102b5953695939460249493850192918291850190849080828437509497505084359550505060208301359260400135600160a060020a031691506119eb9050565b3480156105e357600080fd5b506101a6611a05565b604080516020600480358082013583810280860185019096528085526102b59536959394602494938501929182918501908490808284375094975050843595505050602083013592600160a060020a03604082013581169350606082013516915060800135611a3e565b604080516020600480358082013583810280860185019096528085526102b59536959394602494938501929182918501908490808284375094975050843595505050602083013592604081013592506060810135915060800135611c7e565b3480156106c157600080fd5b50604080516020600480358082013583810280860185019096528085526102b595369593946024949385019291829185019084908082843750949750508435955050506020909201359150611c919050565b604080516020600480358082013583810280860185019096528085526102b5953695939460249493850192918291850190849080828437509497505084359550505060208301359260400135600160a060020a031691506119eb9050565b604080516020600480358082013583810280860185019096528085526102b595369593946024949385019291829185019084908082843750949750508435955050506020830135926040810135925060608101359150608081013590600160a060020a0360a0820135169060c00135611cab565b3480156107f157600080fd5b506101a6600160a060020a0360043581169060243516604435611e49565b34801561081b57600080fd5b506103bc611ed6565b34801561083057600080fd5b5061084b600160a060020a0360043581169060243516611ee5565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561088757818101518382015260200161086f565b505050509050019250505060405180910390f35b3480156108a757600080fd5b506101a6600160a060020a0360043581169060243581169060443516606435612016565b3480156108d757600080fd5b50604080516020600480358082013583810280860185019096528085526102b59536959394602494938501929182918501908490808284375094975050843595505050602083013592600160a060020a036040820135169250606001359050610d53565b34801561094757600080fd5b506101a6600160a060020a03600435811690602435166044356120d4565b34801561097157600080fd5b506101a6600160a060020a036004351661215c565b604080516020600480358082013583810280860185019096528085526102b595369593946024949385019291829185019084908082843750949750508435955050506020909201359150611c919050565b3480156109e357600080fd5b506101a66004356121f9565b6109f7612261565b60038054911515740100000000000000000000000000000000000000000274ff000000000000000000000000000000000000000019909216919091179055565b610a3f612261565b81610a49816122c5565b82610a5381612328565b5050600160a060020a03919091166000908152600560205260409020805460ff1916911515919091179055565b600080610a8d8484610e9e565b946000945092505050565b6000610aa8878787878787611a3e565b979650505050505050565b60035474010000000000000000000000000000000000000000900460ff1681565b60008054600160a060020a0316331480610b09575060035474010000000000000000000000000000000000000000900460ff16155b1515610b5f576040805160e560020a62461bcd02815260206004820152601160248201527f4552525f4143434553535f44454e494544000000000000000000000000000000604482015290519081900360640190fd5b610b887f436f6e7472616374526567697374727900000000000000000000000000000000612389565b600254909150600160a060020a03808316911614801590610bb15750600160a060020a03811615155b1515610c07576040805160e560020a62461bcd02815260206004820152601460248201527f4552525f494e56414c49445f5245474953545259000000000000000000000000604482015290519081900360640190fd5b604080517fbb34534c0000000000000000000000000000000000000000000000000000000081527f436f6e747261637452656769737472790000000000000000000000000000000060048201529051600091600160a060020a0384169163bb34534c9160248082019260209290919082900301818787803b158015610c8b57600080fd5b505af1158015610c9f573d6000803e3d6000fd5b505050506040513d6020811015610cb557600080fd5b5051600160a060020a03161415610d16576040805160e560020a62461bcd02815260206004820152601460248201527f4552525f494e56414c49445f5245474953545259000000000000000000000000604482015290519081900360640190fd5b6002805460038054600160a060020a0380841673ffffffffffffffffffffffffffffffffffffffff19928316179092559091169216919091179055565b6000610d6486868660008787611a3e565b9695505050505050565b60045481565b610d7c612261565b82610d86816122c5565b82610d90816122c5565b83610d9a81612328565b610da5868686611e49565b505050505050565b600354600160a060020a031681565b600154600160a060020a03163314610e1e576040805160e560020a62461bcd02815260206004820152601160248201527f4552525f4143434553535f44454e494544000000000000000000000000000000604482015290519081900360640190fd5b60015460008054604051600160a060020a0393841693909116917f343765429aea5a34b3ff6a3785a98a5abb2597aca87bfbb58632c173d585373a91a3600180546000805473ffffffffffffffffffffffffffffffffffffffff19908116600160a060020a03841617909155169055565b600254600160a060020a031681565b600080600080600080600080600080600080610ed97f42616e636f72466f726d756c6100000000000000000000000000000000000000612389565b94508c9a5060028e51118015610ef457508d51600290066001145b1515610f4a576040805160e560020a62461bcd02815260206004820152601060248201527f4552525f494e56414c49445f5041544800000000000000000000000000000000604482015290519081900360640190fd5b600293505b8d518410156117fa578d60028503815181101515610f6957fe5b9060200190602002015192508d60018503815181101515610f8657fe5b9060200190602002015191508d84815181101515610fa057fe5b90602001906020020151905081600160a060020a031681600160a060020a0316141561139657600384108061100157508d60038503815181101515610fe157fe5b90602001906020020151600160a060020a031682600160a060020a031614155b156110fe5781600160a060020a03166318160ddd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561104457600080fd5b505af1158015611058573d6000803e3d6000fd5b505050506040513d602081101561106e57600080fd5b5051604080517f8da5cb5b0000000000000000000000000000000000000000000000000000000081529051919a50600160a060020a03841691638da5cb5b916004808201926020929091908290030181600087803b1580156110cf57600080fd5b505af11580156110e3573d6000803e3d6000fd5b505050506040513d60208110156110f957600080fd5b505195505b85600160a060020a031663d8959512846040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b15801561115957600080fd5b505af115801561116d573d6000803e3d6000fd5b505050506040513d602081101561118357600080fd5b5051604080517f0e53aae9000000000000000000000000000000000000000000000000000000008152600160a060020a0386811660048301529151929a5090881691630e53aae99160248082019260a0929091908290030181600087803b1580156111ed57600080fd5b505af1158015611201573d6000803e3d6000fd5b505050506040513d60a081101561121757600080fd5b50602090810151604080517f48d73fed000000000000000000000000000000000000000000000000000000008152600481018d9052602481018c905263ffffffff83166044820152606481018f90529051919950600160a060020a038816926348d73fed926084808401938290030181600087803b15801561129857600080fd5b505af11580156112ac573d6000803e3d6000fd5b505050506040513d60208110156112c257600080fd5b5051604080517f579cd3ca0000000000000000000000000000000000000000000000000000000081529051919c5061137891620f42409161136c91600160a060020a038b169163579cd3ca9160048083019260209291908290030181600087803b15801561132f57600080fd5b505af1158015611343573d6000803e3d6000fd5b505050506040513d602081101561135957600080fd5b50518e9063ffffffff9081169061242116565b9063ffffffff6124a116565b9a8b90039a995061138f898c63ffffffff61250f16565b98506117ef565b81600160a060020a031683600160a060020a031614156117305760038410806113eb57508d600385038151811015156113cb57fe5b90602001906020020151600160a060020a031682600160a060020a031614155b156114e85781600160a060020a03166318160ddd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561142e57600080fd5b505af1158015611442573d6000803e3d6000fd5b505050506040513d602081101561145857600080fd5b5051604080517f8da5cb5b0000000000000000000000000000000000000000000000000000000081529051919a50600160a060020a03841691638da5cb5b916004808201926020929091908290030181600087803b1580156114b957600080fd5b505af11580156114cd573d6000803e3d6000fd5b505050506040513d60208110156114e357600080fd5b505195505b85600160a060020a031663d8959512826040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b15801561154357600080fd5b505af1158015611557573d6000803e3d6000fd5b505050506040513d602081101561156d57600080fd5b5051604080517f0e53aae9000000000000000000000000000000000000000000000000000000008152600160a060020a0384811660048301529151929a5090881691630e53aae99160248082019260a0929091908290030181600087803b1580156115d757600080fd5b505af11580156115eb573d6000803e3d6000fd5b505050506040513d60a081101561160157600080fd5b50602090810151604080517ff732f1c9000000000000000000000000000000000000000000000000000000008152600481018d9052602481018c905263ffffffff83166044820152606481018f90529051919950600160a060020a0388169263f732f1c9926084808401938290030181600087803b15801561168257600080fd5b505af1158015611696573d6000803e3d6000fd5b505050506040513d60208110156116ac57600080fd5b5051604080517f579cd3ca0000000000000000000000000000000000000000000000000000000081529051919c5061171991620f42409161136c91600160a060020a038b169163579cd3ca9160048083019260209291908290030181600087803b15801561132f57600080fd5b9a8b90039a995061138f898c63ffffffff61256c16565b600384108061176b57508d6003850381518110151561174b57fe5b90602001906020020151600160a060020a031682600160a060020a031614155b156117dd5781600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156117ae57600080fd5b505af11580156117c2573d6000803e3d6000fd5b505050506040513d60208110156117d857600080fd5b505195505b6117e98684838e6125cc565b909b5099505b600284019350610f4f565b50989c9b505050505050505050505050565b60056020526000908152604090205460ff1681565b60008085600160a060020a031663fc0c546a6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561186257600080fd5b505af1158015611876573d6000803e3d6000fd5b505050506040513d602081101561188c57600080fd5b50518751600160a060020a0390911690889060009081106118a957fe5b60209081029091010151600160a060020a031614611911576040805160e560020a62461bcd02815260206004820152601860248201527f4552525f494e56414c49445f534f555243455f544f4b454e0000000000000000604482015290519081900360640190fd5b604080517faafd6b76000000000000000000000000000000000000000000000000000000008152600481018790523360248201529051600160a060020a0388169163aafd6b769160448083019260209291908290030181600087803b15801561197957600080fd5b505af115801561198d573d6000803e3d6000fd5b505050506040513d60208110156119a357600080fd5b50519050610aa887828686600080611a3e565b600054600160a060020a031681565b6000846119d1816126b0565b6119df888888888888611a3e565b98975050505050505050565b60006119fc85858585600080611a3e565b95945050505050565b611a0d612261565b6003546002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03909216919091179055565b600080600060606000611a4f612708565b6003805475ff0000000000000000000000000000000000000000001916750100000000000000000000000000000000000000000017905588611a90816126b0565b60028c51118015611aa657508b51600290066001145b1515611afc576040805160e560020a62461bcd02815260206004820152601060248201527f4552525f494e56414c49445f5041544800000000000000000000000000000000604482015290519081900360640190fd5b611b378c6000815181101515611b0e57fe5b906020019060200201518d6001815181101515611b2757fe5b906020019060200201518d61277c565b60009450600160a060020a0388161515611ba6578615611ba1576040805160e560020a62461bcd02815260206004820152601960248201527f4552525f494e56414c49445f414646494c494154455f46454500000000000000604482015290519081900360640190fd5b611c13565b866000108015611bb857506004548711155b1515611c0e576040805160e560020a62461bcd02815260206004820152601960248201527f4552525f494e56414c49445f414646494c494154455f46454500000000000000604482015290519081900360640190fd5b600194505b339350600160a060020a03891615611c29578893505b611c348c8587612980565b9250611c43838c8c8b8b612d97565b9150611c508383866132f7565b506003805475ff000000000000000000000000000000000000000000191690559a9950505050505050505050565b6000610aa8878787878787600080611cab565b6000611ca38484846000806000611a3e565b949350505050565b60008060008089611cbb816126b0565b8c518d906000198101908110611ccd57fe5b906020019060200201519350611d027f42616e636f725800000000000000000000000000000000000000000000000000612389565b9250611d2d7f424e54546f6b656e000000000000000000000000000000000000000000000000612389565b600160a060020a03858116911614611d8f576040805160e560020a62461bcd02815260206004820152601860248201527f4552525f494e56414c49445f5441524745545f544f4b454e0000000000000000604482015290519081900360640190fd5b611d9d8d8d8d308b8b611a3e565b9150611daa8484846133da565b604080517f427c0374000000000000000000000000000000000000000000000000000000008152600481018c9052602481018b905260448101849052606481018a90529051600160a060020a0385169163427c037491608480830192600092919082900301818387803b158015611e2057600080fd5b505af1158015611e34573d6000803e3d6000fd5b50939f9e505050505050505050505050505050565b604080517f7472616e7366657228616464726573732c75696e74323536290000000000000081528151908190036019018120600160a060020a03851660248301526044808301859052835180840390910181526064909201909252602081018051600160e060020a0316600160e060020a031990931692909217909152611ed190849061349b565b505050565b600154600160a060020a031681565b60606000611f127f436f6e76657273696f6e5061746846696e646572000000000000000000000000612389565b604080517fa1c421cd000000000000000000000000000000000000000000000000000000008152600160a060020a038781166004830152868116602483015291519293509083169163a1c421cd9160448082019260009290919082900301818387803b158015611f8157600080fd5b505af1158015611f95573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015611fbe57600080fd5b810190808051640100000000811115611fd657600080fd5b82016020810184811115611fe957600080fd5b815185602082028301116401000000008211171561200657600080fd5b50909550505050505b5092915050565b604080517f7472616e7366657246726f6d28616464726573732c616464726573732c75696e81527f74323536290000000000000000000000000000000000000000000000000000006020808301919091528251918290036025018220600160a060020a03808816602485015286166044840152606480840186905284518085039091018152608490930190935281018051600160e060020a0316600160e060020a0319909316929092179091526120ce90859061349b565b50505050565b604080517f617070726f766528616464726573732c75696e7432353629000000000000000081528151908190036018018120600160a060020a03851660248301526044808301859052835180840390910181526064909201909252602081018051600160e060020a0316600160e060020a031990931692909217909152611ed190849061349b565b612164612261565b600054600160a060020a03828116911614156121ca576040805160e560020a62461bcd02815260206004820152600e60248201527f4552525f53414d455f4f574e4552000000000000000000000000000000000000604482015290519081900360640190fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b612201612261565b620f424081111561225c576040805160e560020a62461bcd02815260206004820152601960248201527f4552525f494e56414c49445f414646494c494154455f46454500000000000000604482015290519081900360640190fd5b600455565b600054600160a060020a031633146122c3576040805160e560020a62461bcd02815260206004820152601160248201527f4552525f4143434553535f44454e494544000000000000000000000000000000604482015290519081900360640190fd5b565b600160a060020a0381161515612325576040805160e560020a62461bcd02815260206004820152601360248201527f4552525f494e56414c49445f4144445245535300000000000000000000000000604482015290519081900360640190fd5b50565b600160a060020a038116301415612325576040805160e560020a62461bcd02815260206004820152601360248201527f4552525f414444524553535f49535f53454c4600000000000000000000000000604482015290519081900360640190fd5b600254604080517fbb34534c000000000000000000000000000000000000000000000000000000008152600481018490529051600092600160a060020a03169163bb34534c91602480830192602092919082900301818787803b1580156123ef57600080fd5b505af1158015612403573d6000803e3d6000fd5b505050506040513d602081101561241957600080fd5b505192915050565b600080831515612434576000915061200f565b5082820282848281151561244457fe5b041461249a576040805160e560020a62461bcd02815260206004820152600c60248201527f4552525f4f564552464c4f570000000000000000000000000000000000000000604482015290519081900360640190fd5b9392505050565b6000808083116124fb576040805160e560020a62461bcd02815260206004820152601260248201527f4552525f4449564944455f42595f5a45524f0000000000000000000000000000604482015290519081900360640190fd5b828481151561250657fe5b04949350505050565b60008282018381101561249a576040805160e560020a62461bcd02815260206004820152600c60248201527f4552525f4f564552464c4f570000000000000000000000000000000000000000604482015290519081900360640190fd5b6000818310156125c6576040805160e560020a62461bcd02815260206004820152600d60248201527f4552525f554e444552464c4f5700000000000000000000000000000000000000604482015290519081900360640190fd5b50900390565b6000806125d76136f9565b604080517f67657452657475726e28616464726573732c616464726573732c75696e74323581527f36290000000000000000000000000000000000000000000000000000000000006020808301919091528251918290036022018220600160a060020a03808b16602485015289166044840152606480840189905284518085039091018152608490930184529082018051600160e060020a0316600160e060020a0319909216919091178152815191929184918b5afa80151561269957600080fd5b505080516020909101519097909650945050505050565b60008111612325576040805160e560020a62461bcd02815260206004820152600e60248201527f4552525f5a45524f5f56414c5545000000000000000000000000000000000000604482015290519081900360640190fd5b6003547501000000000000000000000000000000000000000000900460ff16156122c3576040805160e560020a62461bcd02815260206004820152600e60248201527f4552525f5245454e5452414e4359000000000000000000000000000000000000604482015290519081900360640190fd5b60008083600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156127bd57600080fd5b505af11580156127d1573d6000803e3d6000fd5b505050506040513d60208110156127e757600080fd5b505191506127f482613529565b905060003411156128c257348314612856576040805160e560020a62461bcd02815260206004820152601760248201527f4552525f4554485f414d4f554e545f4d49534d41544348000000000000000000604482015290519081900360640190fd5b8015156128bd57612866826135ac565b600160a060020a031663d0e30db0346040518263ffffffff1660e060020a0281526004016000604051808303818588803b1580156128a357600080fd5b505af11580156128b7573d6000803e3d6000fd5b50505050505b612979565b600160a060020a03851660009081526005602052604090205460ff161561295b576128ef85333086612016565b80156128bd5784600160a060020a0316632e1a7d4d846040518263ffffffff1660e060020a02815260040180828152602001915050600060405180830381600087803b15801561293e57600080fd5b505af1158015612952573d6000803e3d6000fd5b50505050612979565b801561296d576128bd85338486612016565b61297985333086612016565b5050505050565b6060806000806000806000806000612996613714565b8c51600290046040519080825280602002602001820160405280156129d557816020015b6129c2613714565b8152602001906001900390816129ba5790505b50985060009750612a057f424e54546f6b656e000000000000000000000000000000000000000000000000612389565b9650600095505b60018d5103861015612ba0578c86600101815181101515612a2957fe5b90602001906020020151945084600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015612a7357600080fd5b505af1158015612a87573d6000803e3d6000fd5b505050506040513d6020811015612a9d57600080fd5b50518d519094508d9060028801908110612ab357fe5b9060200190602002015192508a8015612aca575087155b8015612ae7575086600160a060020a031683600160a060020a0316145b91508115612af457600197505b60e06040519081016040528085600160a060020a0316815260200186600160a060020a031681526020018e88815181101515612b2c57fe5b90602001906020020151600160a060020a0316815260200184600160a060020a031681526020016000600160a060020a03168152602001612b6c86613529565b151581528315156020909101528960028804815181101515612b8a57fe5b6020908102909101015260029590950194612a0c565b886000815181101515612baf57fe5b6020908102909101810151604080820151600160a060020a0316600090815260059093529091205490915060ff1615612c25578060a0015115612c0b5773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6040820152612c25565b8051612c16906135ac565b600160a060020a031660408201525b885189906000198101908110612c3757fe5b60209081029091018101516060810151600160a060020a03166000908152600590925260409091205490915060ff1615612cae578060a0015115612c945773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6060820152612cae565b8051612c9f906135ac565b600160a060020a031660608201525b600095505b8851861015612d86578886815181101515612cca57fe5b9060200190602002015190508060a0015115612d74578060c0015115612cf557306080820152612d6f565b6001895103861415612d1557600160a060020a038c166080820152612d6f565b8886600101815181101515612d2657fe5b9060200190602002015160a0015115612d68578886600101815181101515612d4a57fe5b6020908102909101015151600160a060020a03166080820152612d6f565b3060808201525b612d7b565b3060808201525b600190950194612cb3565b50969b9a5050505050505050505050565b600080600080612da5613714565b6000899350600092505b8a51831015613290578a83815181101515612dc657fe5b9060200190602002015191508160a0015115612e57578215801590612e1357508a5130908c906000198601908110612dfa57fe5b9060200190602002015160800151600160a060020a0316145b8015612e3a5750604080830151600160a060020a031660009081526005602052205460ff16155b15612e5257612e528260400151836000015186611e49565b612e8d565b8160200151600160a060020a03168260400151600160a060020a0316141515612e8d57612e8d82604001518360000151866133da565b8160a001511515612f50578151604080840151606085015182517f5e5144eb000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152908216602482015260448101889052600160648201529151921691635e5144eb916084808201926020929091908290030181600087803b158015612f1d57600080fd5b505af1158015612f31573d6000803e3d6000fd5b505050506040513d6020811015612f4757600080fd5b505194506130ed565b604080830151600160a060020a031660009081526005602052205460ff161561302e5781516040808401516060850151608086015183517fe8dc12ff000000000000000000000000000000000000000000000000000000008152600160a060020a03938416600482015291831660248301526044820189905233606483015282166084820152915192169163e8dc12ff91349160a480830192602092919082900301818588803b15801561300357600080fd5b505af1158015613017573d6000803e3d6000fd5b50505050506040513d6020811015612f4757600080fd5b81516040808401516060850151608086015183517fe8dc12ff000000000000000000000000000000000000000000000000000000008152600160a060020a03938416600482015291831660248301526044820189905233606483015282166084820152915192169163e8dc12ff9160a4808201926020929091908290030181600087803b1580156130be57600080fd5b505af11580156130d2573d6000803e3d6000fd5b505050506040513d60208110156130e857600080fd5b505194505b8160c00151156131ff5761310e620f424061136c878a63ffffffff61242116565b90508160600151600160a060020a031663a9059cbb89836040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b15801561317757600080fd5b505af115801561318b573d6000803e3d6000fd5b505050506040513d60208110156131a157600080fd5b505115156131f9576040805160e560020a62461bcd02815260206004820152601760248201527f4552525f4645455f5452414e534645525f4641494c4544000000000000000000604482015290519081900360640190fd5b80850394505b8160600151600160a060020a03168260400151600160a060020a03168360200151600160a060020a03167f7154b38b5dd31bb3122436a96d4e09aba5b323ae1fd580025fab55074334c0958789336040518084815260200183815260200182600160a060020a0316600160a060020a03168152602001935050505060405180910390a4849350600190920191612daf565b888510156132e8576040805160e560020a62461bcd02815260206004820152601260248201527f4552525f52455455524e5f544f4f5f4c4f570000000000000000000000000000604482015290519081900360640190fd5b50929998505050505050505050565b6132ff613714565b600084600186510381518110151561331357fe5b602090810290910101516080810151909250600160a060020a0316301461333957612979565b506060810151600160a060020a03811660009081526005602052604090205460ff16156133cf5760a08201511561336c57fe5b80600160a060020a031663205c287884866040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050600060405180830381600087803b15801561293e57600080fd5b612979818486611e49565b604080517fdd62ed3e000000000000000000000000000000000000000000000000000000008152306004820152600160a060020a038481166024830152915160009286169163dd62ed3e91604480830192602092919082900301818787803b15801561344557600080fd5b505af1158015613459573d6000803e3d6000fd5b505050506040513d602081101561346f57600080fd5b50519050818110156120ce57600081111561349057613490848460006120d4565b6120ce8484846120d4565b6134a3613750565b602060405190810160405280600181525090506020818351602085016000875af18015156134d057600080fd5b5080511515611ed1576040805160e560020a62461bcd02815260206004820152601360248201527f4552525f5452414e534645525f4641494c454400000000000000000000000000604482015290519081900360640190fd5b600080613534613750565b604080517f69735632384f72486967686572282900000000000000000000000000000000008152815190819003600f018120600482526024820190925260208082018051600160e060020a0316600160e060020a03199094169390931783528151919290918491885afa92508293505b505050919050565b60008060008084600160a060020a03166371f52bf36040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156135f057600080fd5b505af1158015613604573d6000803e3d6000fd5b505050506040513d602081101561361a57600080fd5b505161ffff169250600091505b828210156136db5784600160a060020a03166319b64015836040518263ffffffff1660e060020a02815260040180828152602001915050602060405180830381600087803b15801561367857600080fd5b505af115801561368c573d6000803e3d6000fd5b505050506040513d60208110156136a257600080fd5b5051600160a060020a03811660009081526005602052604090205490915060ff16156136d0578093506135a4565b600190910190613627565b5073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee949350505050565b60408051808201825290600290829080388339509192915050565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b60206040519081016040528060019060208202803883395091929150505600a165627a7a72305820d88f3ac021a9aa4df260d5e6deb758ddaac9b6f0cdf1851d84c328c2f2195abb002900000000000000000000000052ae12abe5d8bd778bd5397f99ca900624cfadd4
Deployed Bytecode
0x6080604052600436106101875763ffffffff60e060020a600035041663024c7ec7811461018c57806302ef521e146101a85780630c8496cc146101ce5780632978c10e1461023e5780632fe8a6ad146102c757806349d10b64146102f0578063569706eb146103055780635d732ff2146103685780635e35359e1461037d57806361cd756e146103a757806379ba5097146103d85780637b103999146103ed5780637f9c0ecd146104025780638077ccf71461045957806389f9cc611461047a5780638da5cb5b146104ed578063ab6214ce14610502578063b1e9932b1461056c578063b4a176d3146105d7578063b77d239b146105ec578063c52173de14610656578063c7ba24bc146106b5578063c98fefed14610713578063cb32564e14610771578063d1660f99146107e5578063d4ee1d901461080f578063d734fa1914610824578063d9fc4b611461089b578063e57738e5146108cb578063eb5625d91461093b578063f2fde38b14610965578063f3898a9714610986578063f3bc7d2a146109d7575b600080fd5b34801561019857600080fd5b506101a660043515156109ef565b005b3480156101b457600080fd5b506101a6600160a060020a03600435166024351515610a37565b3480156101da57600080fd5b5060408051602060048035808201358381028086018501909652808552610225953695939460249493850192918291850190849080828437509497505093359450610a809350505050565b6040805192835260208301919091528051918290030190f35b34801561024a57600080fd5b50604080516020600480358082013583810280860185019096528085526102b59536959394602494938501929182918501908490808284375094975050843595505050602083013592600160a060020a03604082013581169350606082013516915060800135610a98565b60408051918252519081900360200190f35b3480156102d357600080fd5b506102dc610ab3565b604080519115158252519081900360200190f35b3480156102fc57600080fd5b506101a6610ad4565b604080516020600480358082013583810280860185019096528085526102b59536959394602494938501929182918501908490808284375094975050843595505050602083013592600160a060020a036040820135169250606001359050610d53565b34801561037457600080fd5b506102b5610d6e565b34801561038957600080fd5b506101a6600160a060020a0360043581169060243516604435610d74565b3480156103b357600080fd5b506103bc610dad565b60408051600160a060020a039092168252519081900360200190f35b3480156103e457600080fd5b506101a6610dbc565b3480156103f957600080fd5b506103bc610e8f565b34801561040e57600080fd5b50604080516020600480358082013583810280860185019096528085526102b5953695939460249493850192918291850190849080828437509497505093359450610e9e9350505050565b34801561046557600080fd5b506102dc600160a060020a036004351661180c565b34801561048657600080fd5b50604080516020600480358082013583810280860185019096528085526102b59536959394602494938501929182918501908490808284375094975050600160a060020a038535811696506020860135956040810135955060600135169250611821915050565b3480156104f957600080fd5b506103bc6119b6565b604080516020600480358082013583810280860185019096528085526102b59536959394602494938501929182918501908490808284375094975050843595505050602083013592600160a060020a036040820135811693506060820135169150608001356119c5565b34801561057857600080fd5b50604080516020600480358082013583810280860185019096528085526102b5953695939460249493850192918291850190849080828437509497505084359550505060208301359260400135600160a060020a031691506119eb9050565b3480156105e357600080fd5b506101a6611a05565b604080516020600480358082013583810280860185019096528085526102b59536959394602494938501929182918501908490808284375094975050843595505050602083013592600160a060020a03604082013581169350606082013516915060800135611a3e565b604080516020600480358082013583810280860185019096528085526102b59536959394602494938501929182918501908490808284375094975050843595505050602083013592604081013592506060810135915060800135611c7e565b3480156106c157600080fd5b50604080516020600480358082013583810280860185019096528085526102b595369593946024949385019291829185019084908082843750949750508435955050506020909201359150611c919050565b604080516020600480358082013583810280860185019096528085526102b5953695939460249493850192918291850190849080828437509497505084359550505060208301359260400135600160a060020a031691506119eb9050565b604080516020600480358082013583810280860185019096528085526102b595369593946024949385019291829185019084908082843750949750508435955050506020830135926040810135925060608101359150608081013590600160a060020a0360a0820135169060c00135611cab565b3480156107f157600080fd5b506101a6600160a060020a0360043581169060243516604435611e49565b34801561081b57600080fd5b506103bc611ed6565b34801561083057600080fd5b5061084b600160a060020a0360043581169060243516611ee5565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561088757818101518382015260200161086f565b505050509050019250505060405180910390f35b3480156108a757600080fd5b506101a6600160a060020a0360043581169060243581169060443516606435612016565b3480156108d757600080fd5b50604080516020600480358082013583810280860185019096528085526102b59536959394602494938501929182918501908490808284375094975050843595505050602083013592600160a060020a036040820135169250606001359050610d53565b34801561094757600080fd5b506101a6600160a060020a03600435811690602435166044356120d4565b34801561097157600080fd5b506101a6600160a060020a036004351661215c565b604080516020600480358082013583810280860185019096528085526102b595369593946024949385019291829185019084908082843750949750508435955050506020909201359150611c919050565b3480156109e357600080fd5b506101a66004356121f9565b6109f7612261565b60038054911515740100000000000000000000000000000000000000000274ff000000000000000000000000000000000000000019909216919091179055565b610a3f612261565b81610a49816122c5565b82610a5381612328565b5050600160a060020a03919091166000908152600560205260409020805460ff1916911515919091179055565b600080610a8d8484610e9e565b946000945092505050565b6000610aa8878787878787611a3e565b979650505050505050565b60035474010000000000000000000000000000000000000000900460ff1681565b60008054600160a060020a0316331480610b09575060035474010000000000000000000000000000000000000000900460ff16155b1515610b5f576040805160e560020a62461bcd02815260206004820152601160248201527f4552525f4143434553535f44454e494544000000000000000000000000000000604482015290519081900360640190fd5b610b887f436f6e7472616374526567697374727900000000000000000000000000000000612389565b600254909150600160a060020a03808316911614801590610bb15750600160a060020a03811615155b1515610c07576040805160e560020a62461bcd02815260206004820152601460248201527f4552525f494e56414c49445f5245474953545259000000000000000000000000604482015290519081900360640190fd5b604080517fbb34534c0000000000000000000000000000000000000000000000000000000081527f436f6e747261637452656769737472790000000000000000000000000000000060048201529051600091600160a060020a0384169163bb34534c9160248082019260209290919082900301818787803b158015610c8b57600080fd5b505af1158015610c9f573d6000803e3d6000fd5b505050506040513d6020811015610cb557600080fd5b5051600160a060020a03161415610d16576040805160e560020a62461bcd02815260206004820152601460248201527f4552525f494e56414c49445f5245474953545259000000000000000000000000604482015290519081900360640190fd5b6002805460038054600160a060020a0380841673ffffffffffffffffffffffffffffffffffffffff19928316179092559091169216919091179055565b6000610d6486868660008787611a3e565b9695505050505050565b60045481565b610d7c612261565b82610d86816122c5565b82610d90816122c5565b83610d9a81612328565b610da5868686611e49565b505050505050565b600354600160a060020a031681565b600154600160a060020a03163314610e1e576040805160e560020a62461bcd02815260206004820152601160248201527f4552525f4143434553535f44454e494544000000000000000000000000000000604482015290519081900360640190fd5b60015460008054604051600160a060020a0393841693909116917f343765429aea5a34b3ff6a3785a98a5abb2597aca87bfbb58632c173d585373a91a3600180546000805473ffffffffffffffffffffffffffffffffffffffff19908116600160a060020a03841617909155169055565b600254600160a060020a031681565b600080600080600080600080600080600080610ed97f42616e636f72466f726d756c6100000000000000000000000000000000000000612389565b94508c9a5060028e51118015610ef457508d51600290066001145b1515610f4a576040805160e560020a62461bcd02815260206004820152601060248201527f4552525f494e56414c49445f5041544800000000000000000000000000000000604482015290519081900360640190fd5b600293505b8d518410156117fa578d60028503815181101515610f6957fe5b9060200190602002015192508d60018503815181101515610f8657fe5b9060200190602002015191508d84815181101515610fa057fe5b90602001906020020151905081600160a060020a031681600160a060020a0316141561139657600384108061100157508d60038503815181101515610fe157fe5b90602001906020020151600160a060020a031682600160a060020a031614155b156110fe5781600160a060020a03166318160ddd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561104457600080fd5b505af1158015611058573d6000803e3d6000fd5b505050506040513d602081101561106e57600080fd5b5051604080517f8da5cb5b0000000000000000000000000000000000000000000000000000000081529051919a50600160a060020a03841691638da5cb5b916004808201926020929091908290030181600087803b1580156110cf57600080fd5b505af11580156110e3573d6000803e3d6000fd5b505050506040513d60208110156110f957600080fd5b505195505b85600160a060020a031663d8959512846040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b15801561115957600080fd5b505af115801561116d573d6000803e3d6000fd5b505050506040513d602081101561118357600080fd5b5051604080517f0e53aae9000000000000000000000000000000000000000000000000000000008152600160a060020a0386811660048301529151929a5090881691630e53aae99160248082019260a0929091908290030181600087803b1580156111ed57600080fd5b505af1158015611201573d6000803e3d6000fd5b505050506040513d60a081101561121757600080fd5b50602090810151604080517f48d73fed000000000000000000000000000000000000000000000000000000008152600481018d9052602481018c905263ffffffff83166044820152606481018f90529051919950600160a060020a038816926348d73fed926084808401938290030181600087803b15801561129857600080fd5b505af11580156112ac573d6000803e3d6000fd5b505050506040513d60208110156112c257600080fd5b5051604080517f579cd3ca0000000000000000000000000000000000000000000000000000000081529051919c5061137891620f42409161136c91600160a060020a038b169163579cd3ca9160048083019260209291908290030181600087803b15801561132f57600080fd5b505af1158015611343573d6000803e3d6000fd5b505050506040513d602081101561135957600080fd5b50518e9063ffffffff9081169061242116565b9063ffffffff6124a116565b9a8b90039a995061138f898c63ffffffff61250f16565b98506117ef565b81600160a060020a031683600160a060020a031614156117305760038410806113eb57508d600385038151811015156113cb57fe5b90602001906020020151600160a060020a031682600160a060020a031614155b156114e85781600160a060020a03166318160ddd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561142e57600080fd5b505af1158015611442573d6000803e3d6000fd5b505050506040513d602081101561145857600080fd5b5051604080517f8da5cb5b0000000000000000000000000000000000000000000000000000000081529051919a50600160a060020a03841691638da5cb5b916004808201926020929091908290030181600087803b1580156114b957600080fd5b505af11580156114cd573d6000803e3d6000fd5b505050506040513d60208110156114e357600080fd5b505195505b85600160a060020a031663d8959512826040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b15801561154357600080fd5b505af1158015611557573d6000803e3d6000fd5b505050506040513d602081101561156d57600080fd5b5051604080517f0e53aae9000000000000000000000000000000000000000000000000000000008152600160a060020a0384811660048301529151929a5090881691630e53aae99160248082019260a0929091908290030181600087803b1580156115d757600080fd5b505af11580156115eb573d6000803e3d6000fd5b505050506040513d60a081101561160157600080fd5b50602090810151604080517ff732f1c9000000000000000000000000000000000000000000000000000000008152600481018d9052602481018c905263ffffffff83166044820152606481018f90529051919950600160a060020a0388169263f732f1c9926084808401938290030181600087803b15801561168257600080fd5b505af1158015611696573d6000803e3d6000fd5b505050506040513d60208110156116ac57600080fd5b5051604080517f579cd3ca0000000000000000000000000000000000000000000000000000000081529051919c5061171991620f42409161136c91600160a060020a038b169163579cd3ca9160048083019260209291908290030181600087803b15801561132f57600080fd5b9a8b90039a995061138f898c63ffffffff61256c16565b600384108061176b57508d6003850381518110151561174b57fe5b90602001906020020151600160a060020a031682600160a060020a031614155b156117dd5781600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156117ae57600080fd5b505af11580156117c2573d6000803e3d6000fd5b505050506040513d60208110156117d857600080fd5b505195505b6117e98684838e6125cc565b909b5099505b600284019350610f4f565b50989c9b505050505050505050505050565b60056020526000908152604090205460ff1681565b60008085600160a060020a031663fc0c546a6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561186257600080fd5b505af1158015611876573d6000803e3d6000fd5b505050506040513d602081101561188c57600080fd5b50518751600160a060020a0390911690889060009081106118a957fe5b60209081029091010151600160a060020a031614611911576040805160e560020a62461bcd02815260206004820152601860248201527f4552525f494e56414c49445f534f555243455f544f4b454e0000000000000000604482015290519081900360640190fd5b604080517faafd6b76000000000000000000000000000000000000000000000000000000008152600481018790523360248201529051600160a060020a0388169163aafd6b769160448083019260209291908290030181600087803b15801561197957600080fd5b505af115801561198d573d6000803e3d6000fd5b505050506040513d60208110156119a357600080fd5b50519050610aa887828686600080611a3e565b600054600160a060020a031681565b6000846119d1816126b0565b6119df888888888888611a3e565b98975050505050505050565b60006119fc85858585600080611a3e565b95945050505050565b611a0d612261565b6003546002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03909216919091179055565b600080600060606000611a4f612708565b6003805475ff0000000000000000000000000000000000000000001916750100000000000000000000000000000000000000000017905588611a90816126b0565b60028c51118015611aa657508b51600290066001145b1515611afc576040805160e560020a62461bcd02815260206004820152601060248201527f4552525f494e56414c49445f5041544800000000000000000000000000000000604482015290519081900360640190fd5b611b378c6000815181101515611b0e57fe5b906020019060200201518d6001815181101515611b2757fe5b906020019060200201518d61277c565b60009450600160a060020a0388161515611ba6578615611ba1576040805160e560020a62461bcd02815260206004820152601960248201527f4552525f494e56414c49445f414646494c494154455f46454500000000000000604482015290519081900360640190fd5b611c13565b866000108015611bb857506004548711155b1515611c0e576040805160e560020a62461bcd02815260206004820152601960248201527f4552525f494e56414c49445f414646494c494154455f46454500000000000000604482015290519081900360640190fd5b600194505b339350600160a060020a03891615611c29578893505b611c348c8587612980565b9250611c43838c8c8b8b612d97565b9150611c508383866132f7565b506003805475ff000000000000000000000000000000000000000000191690559a9950505050505050505050565b6000610aa8878787878787600080611cab565b6000611ca38484846000806000611a3e565b949350505050565b60008060008089611cbb816126b0565b8c518d906000198101908110611ccd57fe5b906020019060200201519350611d027f42616e636f725800000000000000000000000000000000000000000000000000612389565b9250611d2d7f424e54546f6b656e000000000000000000000000000000000000000000000000612389565b600160a060020a03858116911614611d8f576040805160e560020a62461bcd02815260206004820152601860248201527f4552525f494e56414c49445f5441524745545f544f4b454e0000000000000000604482015290519081900360640190fd5b611d9d8d8d8d308b8b611a3e565b9150611daa8484846133da565b604080517f427c0374000000000000000000000000000000000000000000000000000000008152600481018c9052602481018b905260448101849052606481018a90529051600160a060020a0385169163427c037491608480830192600092919082900301818387803b158015611e2057600080fd5b505af1158015611e34573d6000803e3d6000fd5b50939f9e505050505050505050505050505050565b604080517f7472616e7366657228616464726573732c75696e74323536290000000000000081528151908190036019018120600160a060020a03851660248301526044808301859052835180840390910181526064909201909252602081018051600160e060020a0316600160e060020a031990931692909217909152611ed190849061349b565b505050565b600154600160a060020a031681565b60606000611f127f436f6e76657273696f6e5061746846696e646572000000000000000000000000612389565b604080517fa1c421cd000000000000000000000000000000000000000000000000000000008152600160a060020a038781166004830152868116602483015291519293509083169163a1c421cd9160448082019260009290919082900301818387803b158015611f8157600080fd5b505af1158015611f95573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015611fbe57600080fd5b810190808051640100000000811115611fd657600080fd5b82016020810184811115611fe957600080fd5b815185602082028301116401000000008211171561200657600080fd5b50909550505050505b5092915050565b604080517f7472616e7366657246726f6d28616464726573732c616464726573732c75696e81527f74323536290000000000000000000000000000000000000000000000000000006020808301919091528251918290036025018220600160a060020a03808816602485015286166044840152606480840186905284518085039091018152608490930190935281018051600160e060020a0316600160e060020a0319909316929092179091526120ce90859061349b565b50505050565b604080517f617070726f766528616464726573732c75696e7432353629000000000000000081528151908190036018018120600160a060020a03851660248301526044808301859052835180840390910181526064909201909252602081018051600160e060020a0316600160e060020a031990931692909217909152611ed190849061349b565b612164612261565b600054600160a060020a03828116911614156121ca576040805160e560020a62461bcd02815260206004820152600e60248201527f4552525f53414d455f4f574e4552000000000000000000000000000000000000604482015290519081900360640190fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b612201612261565b620f424081111561225c576040805160e560020a62461bcd02815260206004820152601960248201527f4552525f494e56414c49445f414646494c494154455f46454500000000000000604482015290519081900360640190fd5b600455565b600054600160a060020a031633146122c3576040805160e560020a62461bcd02815260206004820152601160248201527f4552525f4143434553535f44454e494544000000000000000000000000000000604482015290519081900360640190fd5b565b600160a060020a0381161515612325576040805160e560020a62461bcd02815260206004820152601360248201527f4552525f494e56414c49445f4144445245535300000000000000000000000000604482015290519081900360640190fd5b50565b600160a060020a038116301415612325576040805160e560020a62461bcd02815260206004820152601360248201527f4552525f414444524553535f49535f53454c4600000000000000000000000000604482015290519081900360640190fd5b600254604080517fbb34534c000000000000000000000000000000000000000000000000000000008152600481018490529051600092600160a060020a03169163bb34534c91602480830192602092919082900301818787803b1580156123ef57600080fd5b505af1158015612403573d6000803e3d6000fd5b505050506040513d602081101561241957600080fd5b505192915050565b600080831515612434576000915061200f565b5082820282848281151561244457fe5b041461249a576040805160e560020a62461bcd02815260206004820152600c60248201527f4552525f4f564552464c4f570000000000000000000000000000000000000000604482015290519081900360640190fd5b9392505050565b6000808083116124fb576040805160e560020a62461bcd02815260206004820152601260248201527f4552525f4449564944455f42595f5a45524f0000000000000000000000000000604482015290519081900360640190fd5b828481151561250657fe5b04949350505050565b60008282018381101561249a576040805160e560020a62461bcd02815260206004820152600c60248201527f4552525f4f564552464c4f570000000000000000000000000000000000000000604482015290519081900360640190fd5b6000818310156125c6576040805160e560020a62461bcd02815260206004820152600d60248201527f4552525f554e444552464c4f5700000000000000000000000000000000000000604482015290519081900360640190fd5b50900390565b6000806125d76136f9565b604080517f67657452657475726e28616464726573732c616464726573732c75696e74323581527f36290000000000000000000000000000000000000000000000000000000000006020808301919091528251918290036022018220600160a060020a03808b16602485015289166044840152606480840189905284518085039091018152608490930184529082018051600160e060020a0316600160e060020a0319909216919091178152815191929184918b5afa80151561269957600080fd5b505080516020909101519097909650945050505050565b60008111612325576040805160e560020a62461bcd02815260206004820152600e60248201527f4552525f5a45524f5f56414c5545000000000000000000000000000000000000604482015290519081900360640190fd5b6003547501000000000000000000000000000000000000000000900460ff16156122c3576040805160e560020a62461bcd02815260206004820152600e60248201527f4552525f5245454e5452414e4359000000000000000000000000000000000000604482015290519081900360640190fd5b60008083600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156127bd57600080fd5b505af11580156127d1573d6000803e3d6000fd5b505050506040513d60208110156127e757600080fd5b505191506127f482613529565b905060003411156128c257348314612856576040805160e560020a62461bcd02815260206004820152601760248201527f4552525f4554485f414d4f554e545f4d49534d41544348000000000000000000604482015290519081900360640190fd5b8015156128bd57612866826135ac565b600160a060020a031663d0e30db0346040518263ffffffff1660e060020a0281526004016000604051808303818588803b1580156128a357600080fd5b505af11580156128b7573d6000803e3d6000fd5b50505050505b612979565b600160a060020a03851660009081526005602052604090205460ff161561295b576128ef85333086612016565b80156128bd5784600160a060020a0316632e1a7d4d846040518263ffffffff1660e060020a02815260040180828152602001915050600060405180830381600087803b15801561293e57600080fd5b505af1158015612952573d6000803e3d6000fd5b50505050612979565b801561296d576128bd85338486612016565b61297985333086612016565b5050505050565b6060806000806000806000806000612996613714565b8c51600290046040519080825280602002602001820160405280156129d557816020015b6129c2613714565b8152602001906001900390816129ba5790505b50985060009750612a057f424e54546f6b656e000000000000000000000000000000000000000000000000612389565b9650600095505b60018d5103861015612ba0578c86600101815181101515612a2957fe5b90602001906020020151945084600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015612a7357600080fd5b505af1158015612a87573d6000803e3d6000fd5b505050506040513d6020811015612a9d57600080fd5b50518d519094508d9060028801908110612ab357fe5b9060200190602002015192508a8015612aca575087155b8015612ae7575086600160a060020a031683600160a060020a0316145b91508115612af457600197505b60e06040519081016040528085600160a060020a0316815260200186600160a060020a031681526020018e88815181101515612b2c57fe5b90602001906020020151600160a060020a0316815260200184600160a060020a031681526020016000600160a060020a03168152602001612b6c86613529565b151581528315156020909101528960028804815181101515612b8a57fe5b6020908102909101015260029590950194612a0c565b886000815181101515612baf57fe5b6020908102909101810151604080820151600160a060020a0316600090815260059093529091205490915060ff1615612c25578060a0015115612c0b5773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6040820152612c25565b8051612c16906135ac565b600160a060020a031660408201525b885189906000198101908110612c3757fe5b60209081029091018101516060810151600160a060020a03166000908152600590925260409091205490915060ff1615612cae578060a0015115612c945773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6060820152612cae565b8051612c9f906135ac565b600160a060020a031660608201525b600095505b8851861015612d86578886815181101515612cca57fe5b9060200190602002015190508060a0015115612d74578060c0015115612cf557306080820152612d6f565b6001895103861415612d1557600160a060020a038c166080820152612d6f565b8886600101815181101515612d2657fe5b9060200190602002015160a0015115612d68578886600101815181101515612d4a57fe5b6020908102909101015151600160a060020a03166080820152612d6f565b3060808201525b612d7b565b3060808201525b600190950194612cb3565b50969b9a5050505050505050505050565b600080600080612da5613714565b6000899350600092505b8a51831015613290578a83815181101515612dc657fe5b9060200190602002015191508160a0015115612e57578215801590612e1357508a5130908c906000198601908110612dfa57fe5b9060200190602002015160800151600160a060020a0316145b8015612e3a5750604080830151600160a060020a031660009081526005602052205460ff16155b15612e5257612e528260400151836000015186611e49565b612e8d565b8160200151600160a060020a03168260400151600160a060020a0316141515612e8d57612e8d82604001518360000151866133da565b8160a001511515612f50578151604080840151606085015182517f5e5144eb000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152908216602482015260448101889052600160648201529151921691635e5144eb916084808201926020929091908290030181600087803b158015612f1d57600080fd5b505af1158015612f31573d6000803e3d6000fd5b505050506040513d6020811015612f4757600080fd5b505194506130ed565b604080830151600160a060020a031660009081526005602052205460ff161561302e5781516040808401516060850151608086015183517fe8dc12ff000000000000000000000000000000000000000000000000000000008152600160a060020a03938416600482015291831660248301526044820189905233606483015282166084820152915192169163e8dc12ff91349160a480830192602092919082900301818588803b15801561300357600080fd5b505af1158015613017573d6000803e3d6000fd5b50505050506040513d6020811015612f4757600080fd5b81516040808401516060850151608086015183517fe8dc12ff000000000000000000000000000000000000000000000000000000008152600160a060020a03938416600482015291831660248301526044820189905233606483015282166084820152915192169163e8dc12ff9160a4808201926020929091908290030181600087803b1580156130be57600080fd5b505af11580156130d2573d6000803e3d6000fd5b505050506040513d60208110156130e857600080fd5b505194505b8160c00151156131ff5761310e620f424061136c878a63ffffffff61242116565b90508160600151600160a060020a031663a9059cbb89836040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b15801561317757600080fd5b505af115801561318b573d6000803e3d6000fd5b505050506040513d60208110156131a157600080fd5b505115156131f9576040805160e560020a62461bcd02815260206004820152601760248201527f4552525f4645455f5452414e534645525f4641494c4544000000000000000000604482015290519081900360640190fd5b80850394505b8160600151600160a060020a03168260400151600160a060020a03168360200151600160a060020a03167f7154b38b5dd31bb3122436a96d4e09aba5b323ae1fd580025fab55074334c0958789336040518084815260200183815260200182600160a060020a0316600160a060020a03168152602001935050505060405180910390a4849350600190920191612daf565b888510156132e8576040805160e560020a62461bcd02815260206004820152601260248201527f4552525f52455455524e5f544f4f5f4c4f570000000000000000000000000000604482015290519081900360640190fd5b50929998505050505050505050565b6132ff613714565b600084600186510381518110151561331357fe5b602090810290910101516080810151909250600160a060020a0316301461333957612979565b506060810151600160a060020a03811660009081526005602052604090205460ff16156133cf5760a08201511561336c57fe5b80600160a060020a031663205c287884866040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050600060405180830381600087803b15801561293e57600080fd5b612979818486611e49565b604080517fdd62ed3e000000000000000000000000000000000000000000000000000000008152306004820152600160a060020a038481166024830152915160009286169163dd62ed3e91604480830192602092919082900301818787803b15801561344557600080fd5b505af1158015613459573d6000803e3d6000fd5b505050506040513d602081101561346f57600080fd5b50519050818110156120ce57600081111561349057613490848460006120d4565b6120ce8484846120d4565b6134a3613750565b602060405190810160405280600181525090506020818351602085016000875af18015156134d057600080fd5b5080511515611ed1576040805160e560020a62461bcd02815260206004820152601360248201527f4552525f5452414e534645525f4641494c454400000000000000000000000000604482015290519081900360640190fd5b600080613534613750565b604080517f69735632384f72486967686572282900000000000000000000000000000000008152815190819003600f018120600482526024820190925260208082018051600160e060020a0316600160e060020a03199094169390931783528151919290918491885afa92508293505b505050919050565b60008060008084600160a060020a03166371f52bf36040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156135f057600080fd5b505af1158015613604573d6000803e3d6000fd5b505050506040513d602081101561361a57600080fd5b505161ffff169250600091505b828210156136db5784600160a060020a03166319b64015836040518263ffffffff1660e060020a02815260040180828152602001915050602060405180830381600087803b15801561367857600080fd5b505af115801561368c573d6000803e3d6000fd5b505050506040513d60208110156136a257600080fd5b5051600160a060020a03811660009081526005602052604090205490915060ff16156136d0578093506135a4565b600190910190613627565b5073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee949350505050565b60408051808201825290600290829080388339509192915050565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b60206040519081016040528060019060208202803883395091929150505600a165627a7a72305820d88f3ac021a9aa4df260d5e6deb758ddaac9b6f0cdf1851d84c328c2f2195abb0029
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:32334:0:-;;;;;;;;;-1:-1:-1;;;24646:32334: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;;;;;;;;;53849:159;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;53849:159:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53849:159:0;;-1:-1:-1;;53849:159:0;;;-1:-1:-1;53849:159:0;;-1:-1:-1;;;;53849:159:0;;;;;;;;;;;;;;;;;;;;;;;;56594:383;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;56594:383:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56594:383:0;;-1:-1:-1;;56594:383:0;;;-1:-1:-1;;;56594:383:0;;;;;-1:-1:-1;;;;;56594:383:0;;;;;;;-1:-1:-1;56594:383:0;;;;;;-1:-1:-1;56594: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;;;;54358:356;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54358:356:0;;-1:-1:-1;;54358:356:0;;;-1:-1:-1;;;54358:356:0;;;;;-1:-1:-1;;;;;54358:356:0;;;;;;-1:-1:-1;54358:356:0;;;;-1:-1:-1;54358: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:2960;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;28299:2960:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28299:2960:0;;-1:-1:-1;;28299:2960:0;;;-1:-1:-1;28299:2960:0;;-1:-1:-1;;;;28299:2960: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;;;;;38516:583;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;38516:583:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38516:583:0;;-1:-1:-1;;;;;;;38516:583:0;;;;;-1:-1:-1;38516:583:0;;;;;;;;;;-1:-1:-1;38516:583:0;;;;;-1:-1:-1;38516:583:0;;-1:-1:-1;;38516:583:0;7955:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7955:20:0;;;;55091:429;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55091:429:0;;-1:-1:-1;;55091:429:0;;;-1:-1:-1;;;55091:429:0;;;;;-1:-1:-1;;;;;55091:429:0;;;;;;;-1:-1:-1;55091:429:0;;;;;;-1:-1:-1;55091:429:0;;;;;56291:229;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;56291:229:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56291:229:0;;-1:-1:-1;;56291:229:0;;;-1:-1:-1;;;56291:229:0;;;;;;;;-1:-1:-1;;;;;56291:229:0;;-1:-1:-1;56291:229:0;;-1:-1:-1;56291:229:0;14011:137;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14011:137:0;;;;32423:1573;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32423:1573:0;;-1:-1:-1;;32423:1573:0;;;-1:-1:-1;;;32423:1573:0;;;;;-1:-1:-1;;;;;32423:1573:0;;;;;;;-1:-1:-1;32423:1573:0;;;;;;-1:-1:-1;32423:1573:0;;;;;34988:404;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34988:404:0;;-1:-1:-1;;34988:404:0;;;-1:-1:-1;;;34988:404:0;;;;;;;;;;-1:-1:-1;34988:404:0;;;;;-1:-1:-1;34988:404:0;;;;;55594:202;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;55594:202:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55594:202:0;;-1:-1:-1;;55594:202:0;;;-1:-1:-1;;;55594:202:0;;;;;;-1:-1:-1;55594:202:0;;-1:-1:-1;55594:202:0;54788:229;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54788:229:0;;-1:-1:-1;;54788:229:0;;;-1:-1:-1;;;54788:229:0;;;;;;;;-1:-1:-1;;;;;54788:229:0;;-1:-1:-1;54788:229:0;;-1:-1:-1;54788:229:0;36497:1068;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36497:1068:0;;-1:-1:-1;;36497:1068:0;;;-1:-1:-1;;;36497:1068:0;;;;;;;;;;-1:-1:-1;36497:1068:0;;;;;-1:-1:-1;36497:1068:0;;;;;-1:-1:-1;;;;;36497: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;;;;;;;;;;;;;;;;;55870:347;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;55870:347:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55870:347:0;;-1:-1:-1;;55870:347:0;;;-1:-1:-1;;;55870:347:0;;;;;-1:-1:-1;;;;;55870:347:0;;;;;;-1:-1:-1;55870:347:0;;;;-1:-1:-1;55870: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;;;;;54082:202;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54082:202:0;;-1:-1:-1;;54082:202:0;;;-1:-1:-1;;;54082:202:0;;;;;;-1:-1:-1;54082:202:0;;-1:-1:-1;54082: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;53849:159::-;53933:7;53942;53970:26;53981:5;53988:7;53970:10;:26::i;:::-;53962:38;53998:1;;-1:-1:-1;53849:159:0;-1:-1:-1;;;53849:159:0:o;56594:383::-;56848:7;56880:89;56894:5;56901:7;56910:10;56922:12;56936:17;56955:13;56880;:89::i;:::-;56873:96;56594:383;-1:-1:-1;;;;;;;56594: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;54358:356::-;54587:7;54619:87;54633:5;54640:7;54649:10;54669:1;54673:17;54692:13;54619;:87::i;:::-;54612:94;54358:356;-1:-1:-1;;;;;;54358: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:2960::-;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:2367;28883:5;:12;28879:1;:16;28859:2367;;;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;;29091:6;-1:-1:-1;;;;;29076:21:0;:11;-1:-1:-1;;;;;29076:21:0;;29072:2143;;;29214:1;29210;:5;:31;;;;29229:5;29239:1;29235;:5;29229:12;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29219:22:0;:6;-1:-1:-1;;;;;29219:22:0;;;29210:31;29206:201;;;29287:6;-1:-1:-1;;;;;29275:31:0;;:33;;;;;-1:-1:-1;;;29275:33:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29275:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29275:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29275:33:0;29354:32;;;;;;;;29275:33;;-1:-1:-1;;;;;;29354:30:0;;;;;:32;;;;;29275:33;;29354:32;;;;;;;;;:30;:32;;;5:2:-1;;;;30:1;27;20:12;5:2;29354:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29354:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29354:32:0;;-1:-1:-1;29206:201:0;29493:9;-1:-1:-1;;;;;29493:29:0;;29523:11;29493:42;;;;;-1:-1:-1;;;29493:42:0;;;;;;;-1:-1:-1;;;;;29493:42:0;-1:-1:-1;;;;;29493:42:0;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29493:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29493:42:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29493:42:0;29573:33;;;;;;-1:-1:-1;;;;;29573:33:0;;;;;;;;;29493:42;;-1:-1:-1;29573:20:0;;;;;;:33;;;;;;;;;;;;;;;-1:-1:-1;29573:20:0;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;29573:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29573:33:0;;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;29573:33:0;;;;;;29634:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29573:33;;-1:-1:-1;;;;;;29634:20:0;;;;;:53;;;;;;;;;;-1:-1:-1;29634:20:0;:53;;;5:2:-1;;;;30:1;27;20:12;5:2;29634:53:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29634:53:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29634:53:0;29723:25;;;;;;;;29634:53;;-1:-1:-1;29712:68:0;;24836:7;;29712:37;;-1:-1:-1;;;;;29723:23:0;;;;;:25;;;;;29634:53;;29723:25;;;;;;;;:23;:25;;;5:2:-1;;;;30:1;27;20:12;5:2;29723:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29723:25:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29723:25:0;29712:6;;:37;;;;;:10;:37;:::i;:::-;:41;:68;:41;:68;:::i;:::-;29799:13;;;;;29706:74;-1:-1:-1;29915:18:0;:6;29799:13;29915:18;:10;:18;:::i;:::-;29906:27;;29072:2143;;;29987:6;-1:-1:-1;;;;;29972:21:0;:11;-1:-1:-1;;;;;29972:21:0;;29968:1247;;;30111:1;30107;:5;:31;;;;30126:5;30136:1;30132;:5;30126:12;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30116:22:0;:6;-1:-1:-1;;;;;30116:22:0;;;30107:31;30103:201;;;30184:6;-1:-1:-1;;;;;30172:31:0;;:33;;;;;-1:-1:-1;;;30172:33:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30172:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30172:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30172:33:0;30251:32;;;;;;;;30172:33;;-1:-1:-1;;;;;;30251:30:0;;;;;:32;;;;;30172:33;;30251:32;;;;;;;;;:30;:32;;;5:2:-1;;;;30:1;27;20:12;5:2;30251:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30251:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30251:32:0;;-1:-1:-1;30103:201:0;30390:9;-1:-1:-1;;;;;30390:29:0;;30420:11;30390:42;;;;;-1:-1:-1;;;30390:42:0;;;;;;;-1:-1:-1;;;;;30390:42:0;-1:-1:-1;;;;;30390:42:0;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30390:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30390:42:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30390:42:0;30470:33;;;;;;-1:-1:-1;;;;;30470:33:0;;;;;;;;;30390:42;;-1:-1:-1;30470:20:0;;;;;;:33;;;;;;;;;;;;;;;-1:-1:-1;30470:20:0;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;30470:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30470:33:0;;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;30470:33:0;;;;;;30531:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30470:33;;-1:-1:-1;;;;;;30531:16:0;;;;;:49;;;;;;;;;;-1:-1:-1;30531:16:0;:49;;;5:2:-1;;;;30:1;27;20:12;5:2;30531:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30531:49:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30531:49:0;30616:25;;;;;;;;30531:49;;-1:-1:-1;30605:68:0;;24836:7;;30605:37;;-1:-1:-1;;;;;30616:23:0;;;;;:25;;;;;30531:49;;30616:25;;;;;;;;:23;:25;;;5:2:-1;;;;30:1;27;20:12;30605:68:0;30692:13;;;;;30599:74;-1:-1:-1;30808:18:0;:6;30692:13;30808:18;:10;:18;:::i;29968:1247::-;30981:1;30977;:5;:31;;;;30996:5;31006:1;31002;:5;30996:12;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30986:22:0;:6;-1:-1:-1;;;;;30986:22:0;;;30977:31;30973:136;;;31073:6;-1:-1:-1;;;;;31056:30:0;;:32;;;;;-1:-1:-1;;;31056:32:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31056:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31056:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31056:32:0;;-1:-1:-1;30973:136:0;31145:54;31155:9;31166:11;31179;31192:6;31145:9;:54::i;:::-;31129:70;;-1:-1:-1;31129:70:0;-1:-1:-1;29968:1247:0;28902:1;28897:6;;;;28859:2367;;;-1:-1:-1;31245:6:0;;28299:2960;-1:-1:-1;;;;;;;;;;;;28299:2960:0:o;25364:44::-;;;;;;;;;;;;;;;:::o;38516:583::-;38675:7;38896:14;38782:8;-1:-1:-1;;;;;38782:14:0;;:16;;;;;-1:-1:-1;;;38782:16:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38782:16:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38782:16:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38782:16:0;38770:8;;-1:-1:-1;;;;;38770:28:0;;;;:5;;38776:1;;38770:8;;;;;;;;;;;;;;;-1:-1:-1;;;;;38770:28:0;;38762:65;;;;;-1:-1:-1;;;;;38762:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;38913:54;;;;;;;;;;;;38956:10;38913:54;;;;;;-1:-1:-1;;;;;38913:27:0;;;;;:54;;;;;;;;;;;;;;-1:-1:-1;38913:27:0;:54;;;5:2:-1;;;;30:1;27;20:12;5:2;38913:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38913:54:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38913:54:0;;-1:-1:-1;39022:69:0;39036:5;38913:54;39051:10;39063:12;39085:1;;39022:13;:69::i;7955:20::-;;;-1:-1:-1;;;;;7955:20:0;;:::o;55091:429::-;55391:7;55361:10;9595:24;9612:6;9595:16;:24::i;:::-;55423:89;55437:5;55444:7;55453:10;55465:12;55479:17;55498:13;55423;:89::i;:::-;55416:96;55091:429;-1:-1:-1;;;;;;;;55091:429:0:o;56291:229::-;56415:7;56442:70;56456:5;56463:7;56472:10;56484:12;56506:1;56510;56442:13;:70::i;:::-;56435:77;56291:229;-1:-1:-1;;;;;56291: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;32423:1573::-;32683:7;33099:24;33488:19;33664:28;33767:14;15502:12;:10;:12::i;:::-;15525:6;:13;;-1:-1:-1;;15525:13:0;;;;;32653:10;9595:24;32653:10;9595:16;:24::i;:::-;32837:1;32822:5;:12;:16;:41;;;;-1:-1:-1;32842:12:0;;32857:1;;32842:16;32862:1;32842:21;32822:41;32814:70;;;;;;;-1:-1:-1;;;;;32814:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;32976:64;32994:5;33000:1;32994:8;;;;;;;;;;;;;;;;;;33021:5;33027:1;33021:8;;;;;;;;;;;;;;;;;;33032:7;32976:17;:64::i;:::-;33126:5;;-1:-1:-1;;;;;;33146:31:0;;;33142:294;;;33202:18;;33194:56;;;;;-1:-1:-1;;;;;33194:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;33142:294;;;33304:13;33300:1;:17;:53;;;;;33338:15;;33321:13;:32;;33300:53;33292:91;;;;;;;-1:-1:-1;;;;;33292:91:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;33420:4;33398:26;;33142:294;33510:10;;-1:-1:-1;;;;;;33535:26:0;;;33531:71;;33590:12;33576:26;;33531:71;33695:61;33716:5;33723:11;33736:19;33695:20;:61::i;:::-;33664:92;;33784:73;33797:4;33803:7;33812:10;33824:17;33843:13;33784:12;:73::i;:::-;33767:90;;33918:44;33936:4;33942:6;33950:11;33918:17;:44::i;:::-;-1:-1:-1;15561:6:0;:14;;-1:-1:-1;;15561:14:0;;;33982:6;32423:1573;-1:-1:-1;;;;;;;;;;32423:1573:0:o;34988:404::-;35250:7;35282:102;35292:5;35299:7;35308:10;35320:17;35339:14;35355:13;35378:1;35382;35282:9;:102::i;55594:202::-;55693:7;55720:68;55734:5;55741:7;55750:10;55770:1;55782;55786;55720:13;:68::i;:::-;55713:75;55594:202;-1:-1:-1;;;;55594:202:0:o;36497:1068::-;36865:7;36890:23;36950:16;37198:14;36835:10;9595:24;9612:6;9595:16;:24::i;:::-;36922:12;;36916:5;;-1:-1:-1;;36922:16:0;;;36916:23;;;;;;;;;;;;;;36890:49;;36978:19;36988:8;36978:9;:19::i;:::-;36950:48;;37087:20;37097:9;37087;:20::i;:::-;-1:-1:-1;;;;;37072:35:0;;;;;;37064:72;;;;;-1:-1:-1;;;;;37064:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;37215:81;37229:5;37236:7;37245:10;37257:4;37263:17;37282:13;37215;:81::i;:::-;37198:98;;37345:45;37361:11;37374:7;37383:6;37345:15;:45::i;:::-;37456:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37456:17:0;;;;;:75;;;;;;;;;;;;;;;:17;:75;;;5:2:-1;;;;30:1;27;20:12;5:2;37456:75:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;37551:6:0;;36497:1068;-1:-1:-1;;;;;;;;;;;;;;;36497: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;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;51853:900::-;51971:7;51980;52000:21;;:::i;:::-;51708:47;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52052:85:0;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;52052:85:0;;;;;;25:18:-1;;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;;52052:85:0;;;179:29:-1;;;;160:49;;52424:11:0;;52052:85;;51708:47;52525:3;;52267:5;52218:3;52189:431;52644:7;52637:15;52634:2;;;52682:1;52679;52672:12;52634:2;-1:-1:-1;;52730:6:0;;;52738;;;;52730;;52738;;-1:-1:-1;51853:900:0;-1:-1:-1;;;;;51853: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;;;;;;;;;;;;;;;;;;;;;;;;;;;42728:1653;42843:25;42909:21;42882:7;-1:-1:-1;;;;;42882:13:0;;:15;;;;;-1:-1:-1;;;42882:15:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42882:15:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42882:15:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42882:15:0;;-1:-1:-1;42933:38:0;42882:15;42933:22;:38::i;:::-;42909:62;;43016:1;43004:9;:13;43000:1374;;;43077:9;:20;;43069:56;;;;;-1:-1:-1;;;;;43069:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;43360:16;43359:17;43355:125;;;43407:45;43437:14;43407:29;:45::i;:::-;-1:-1:-1;;;;;43395:66:0;;43468:9;43395:85;;;;;-1:-1:-1;;;43395:85:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43395:85:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43395:85:0;;;;;43355:125;43000:1374;;;-1:-1:-1;;;;;43534:25:0;;;;;;:11;:25;;;;;;;;43530:844;;;43746:57;43763:12;43777:10;43789:4;43795:7;43746:16;:57::i;:::-;43873:16;43869:82;;;43920:12;-1:-1:-1;;;;;43908:34:0;;43943:7;43908:43;;;;;-1:-1:-1;;;43908:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43908:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43908:43:0;;;;43530:844;;;44166:16;44162:200;;;44201:67;44218:12;44232:10;44244:14;44260:7;44201:16;:67::i;44162:200::-;44305:57;44322:12;44336:10;44348:4;44354:7;44305:16;:57::i;:::-;42728:1653;;;;;:::o;46132:4180::-;46264:16;46293:28;46385:26;46430:16;46565:9;46652:23;46733:20;46797:23;46938:24;47863:30;;:::i;:::-;46345:22;;46370:1;;46345:26;46324:48;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;46293:79;;46414:5;46385:34;;46449:20;46459:9;46449;:20::i;:::-;46430:39;;46594:1;46590:5;;46585:1216;46626:1;46601:15;:22;:26;46597:1;:30;46585:1216;;;46695:15;46711:1;46715;46711:5;46695:22;;;;;;;;;;;;;;;;;;46652:66;;46767:6;-1:-1:-1;;;;;46767:12:0;;:14;;;;;-1:-1:-1;;;46767:14:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46767:14:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46767:14:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;46767:14:0;46823:22;;46767:14;;-1:-1:-1;46823:15:0;;46843:1;46839:5;;;46823:22;;;;;;;;;;;;;;46797:48;;46965:20;:46;;;;;46990:21;46989:22;46965:46;:73;;;;;47030:8;-1:-1:-1;;;;;47015:23:0;:11;-1:-1:-1;;;;;47015:23:0;;46965:73;46938:100;;47057:19;47053:70;;;47119:4;47095:28;;47053:70;47154:635;;;;;;;;;47317:9;-1:-1:-1;;;;;47154:635:0;;;;;47241:6;-1:-1:-1;;;;;47154:635:0;;;;;47409:15;47425:1;47409:18;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47154:635:0;;;;;47459:11;-1:-1:-1;;;;;47154:635:0;;;;;47604:1;-1:-1:-1;;;;;47154:635:0;;;;;47681:33;47704:9;47681:22;:33::i;:::-;47154:635;;;;;;;;;;;;47140:4;47149:1;47145;:5;47140:11;;;;;;;;;;;;;;;;;;:649;46634:1;46629:6;;;;;46585:1216;;;47896:4;47901:1;47896:7;;;;;;;;;;;;;;;;;;;;47930:20;;;;;-1:-1:-1;;;;;47918:33:0;;;;;:11;:33;;;;;;;47896:7;;-1:-1:-1;47918:33:0;;47914:498;;;48064:8;:31;;;48060:340;;;24963:42;48114:20;;;:55;48060:340;;;48380:18;;48350:49;;:29;:49::i;:::-;-1:-1:-1;;;;;48315:85:0;:20;;;:85;48060:340;48466:11;;48461:4;;-1:-1:-1;;48466:15:0;;;48461:21;;;;;;;;;;;;;;;;48509:20;;;;-1:-1:-1;;;;;48497:33:0;;;;;:11;:33;;;;;;;;48461:21;;-1:-1:-1;48497:33:0;;48493:498;;;48643:8;:31;;;48639:340;;;24963:42;48693:20;;;:55;48639:340;;;48959:18;;48929:49;;:29;:49::i;:::-;-1:-1:-1;;;;;48894:85:0;:20;;;:85;48639:340;49058:1;49054:5;;49049:1232;49065:4;:11;49061:1;:15;49049:1232;;;49109:4;49114:1;49109:7;;;;;;;;;;;;;;;;;;49098:18;;49268:8;:31;;;49264:1006;;;49424:8;:28;;;49420:664;;;49498:4;49475:20;;;:27;49420:664;;;49629:1;49615:4;:11;:15;49610:1;:20;49606:478;;;-1:-1:-1;;;;;49653:35:0;;:20;;;:35;49606:478;;;49814:4;49819:1;49823;49819:5;49814:11;;;;;;;;;;;;;;;;;;:34;;;49810:274;;;49894:4;49899:1;49903;49899:5;49894:11;;;;;;;;;;;;;;;;;;;:21;-1:-1:-1;;;;;49871:44:0;:20;;;:44;49810:274;;;50080:4;50057:20;;;:27;49810:274;49264:1006;;;50250:4;50227:20;;;:27;49264:1006;49078:3;;;;;49049:1232;;;-1:-1:-1;50300:4:0;;46132:4180;-1:-1:-1;;;;;;;;;;;46132:4180:0:o;39716:2665::-;39918:7;39938:16;39965:18;40056:9;40109:30;;:::i;:::-;41777:23;39986:7;39965:28;;40068:1;40056:13;;40051:2165;40075:5;:12;40071:1;:16;40051:2165;;;40142:5;40148:1;40142:8;;;;;;;;;;;;;;;;;;40109:41;;40203:8;:31;;;40199:862;;;40449:6;;;;;:51;;-1:-1:-1;40459:12:0;;40495:4;;40459:5;;-1:-1:-1;;40465:5:0;;;40459:12;;;;;;;;;;;;;;:24;;;-1:-1:-1;;;;;40459:41:0;;40449:51;:89;;;;-1:-1:-1;40517:20:0;;;;;-1:-1:-1;;;;;40505:33:0;;;;;:11;:33;;;;;;40504:34;40449:89;40445:182;;;40561:66;40574:8;:20;;;40596:8;:18;;;40616:10;40561:12;:66::i;:::-;40199:862;;;40847:8;:15;;;-1:-1:-1;;;;;40811:52:0;:8;:20;;;-1:-1:-1;;;;;40811:52:0;;;40807:254;;;40976:69;40992:8;:20;;;41014:8;:18;;;41034:10;40976:15;:69::i;:::-;41116:8;:31;;;41115:32;41111:552;;;41194:18;;41221:20;;;;;41243;;;;41177:102;;;;;-1:-1:-1;;;;;41177:102:0;;;;;;;;;;;;;;;;;;;;41277:1;41177:102;;;;;;:43;;;;;:102;;;;;;;;;;;;;;;41194:18;41177:43;:102;;;5:2:-1;;;;30:1;27;20:12;5:2;41177:102:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41177:102:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41177:102:0;;-1:-1:-1;41111:552:0;;;41315:20;;;;;-1:-1:-1;;;;;41303:33:0;;;;;:11;:33;;;;;;41299:364;;;41366:18;;41410:20;;;;;41432;;;;41478;;;;41366:133;;;;;-1:-1:-1;;;;;41366:133:0;;;;;;;;;;;;;;;;;;;;41466:10;41366:133;;;;;;;;;;;;:26;;;;;41399:9;;41366:133;;;;;;;;;;;;;;41399:9;41366:26;:133;;;5:2:-1;;;;30:1;27;20:12;5:2;41366:133:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41366:133:0;;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;41299:364:0;41547:18;;41574:20;;;;;41596;;;;41642;;;;41547:116;;;;;-1:-1:-1;;;;;41547:116:0;;;;;;;;;;;;;;;;;;;;41630:10;41547:116;;;;;;;;;;;;:26;;;;;:116;;;;;;;;;;;;;;;:18;:26;:116;;;5:2:-1;;;;30:1;27;20:12;5:2;41547:116:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41547:116:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41547:116:0;;-1:-1:-1;41299:364:0;41728:8;:28;;;41724:318;;;41803:57;24902:7;41803:27;:8;41816:13;41803:27;:12;:27;:::i;:57::-;41777:83;;41887:8;:20;;;-1:-1:-1;;;;;41887:29:0;;41917:17;41936:15;41887:65;;;;;-1:-1:-1;;;41887:65:0;;;;;;;-1:-1:-1;;;;;41887:65:0;-1:-1:-1;;;;;41887:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41887:65:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41887:65:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41887:65:0;41879:101;;;;;;;-1:-1:-1;;;;;41879:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;42011:15;41999:27;;;;41724:318;42113:8;:20;;;-1:-1:-1;;;;;42063:105:0;42091:8;:20;;;-1:-1:-1;;;;;42063:105:0;42074:8;:15;;;-1:-1:-1;;;;;42063:105:0;;42135:10;42147:8;42157:10;42063:105;;;;;;;;;;;;;;-1:-1:-1;;;;;42063:105:0;-1:-1:-1;;;;;42063:105:0;;;;;;;;;;;;;;;;;42196:8;;-1:-1:-1;40089:3:0;;;;;40051:2165;;;42300:22;;;;42292:53;;;;;-1:-1:-1;;;;;42292:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42365:8:0;;39716:2665;-1:-1:-1;;;;;;;;;39716:2665:0:o;44746:869::-;44855:30;;:::i;:::-;45064:23;44888:5;44909:1;44894:5;:12;:16;44888:23;;;;;;;;;;;;;;;;;;;44993:20;;;;44888:23;;-1:-1:-1;;;;;;44993:37:0;45025:4;44993:37;44989:63;;45045:7;;44989:63;-1:-1:-1;45090:20:0;;;;-1:-1:-1;;;;;45156:24:0;;;;;;:11;:24;;;;;;;;45152:456;;;45281:31;;;;45280:32;45273:40;;;;45430:11;-1:-1:-1;;;;;45418:35:0;;45454:12;45468:7;45418:58;;;;;-1:-1:-1;;;45418:58:0;;;;;;;-1:-1:-1;;;;;45418:58:0;-1:-1:-1;;;;;45418:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;45152:456:0;45548:48;45561:11;45574:12;45588:7;45548:12;:48::i;50778:339::-;50896:32;;;;;;50913:4;50896:32;;;;-1:-1:-1;;;;;50896:32:0;;;;;;;;;50876:17;;50896:16;;;;;:32;;;;;;;;;;;;;;50876:17;50896:16;:32;;;5:2:-1;;;;30:1;27;20:12;5:2;50896:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50896:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;50896:32:0;;-1:-1:-1;50943:18:0;;;50939:171;;;50994:1;50982:9;:13;50978:68;;;51014:32;51026:6;51034:8;51044:1;51014:11;:32::i;:::-;51061:37;51073:6;51081:8;51091:6;51061: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;;;;;;;;;;;;;;;;;;;;;;;;;;;53027:748;53105:4;53122:12;53145:21;;:::i;:::-;52825:28;;;;;;;;;;;;;;;;22:32:-1;6:49;;53197:54:0;;;;;;49:4:-1;25:18;;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;;53197:54:0;;;179:29:-1;;;;160:49;;53534:11:0;;52825:28;;49:4:-1;;53635:3:0;;53377:10;53328:3;53299:431;53288:442;;53760:7;53753:14;;53027:748;;;;;;;:::o;51201:441::-;51285:7;51305:20;51376:9;51429:27;51328:10;-1:-1:-1;;;;;51328:30:0;;:32;;;;;-1:-1:-1;;;51328:32:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51328:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51328:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;51328:32:0;51305:55;;;-1:-1:-1;51388:1:0;;-1:-1:-1;51371:225:0;51395:12;51391:1;:16;51371:225;;;51459:10;-1:-1:-1;;;;;51459:26:0;;51486:1;51459:29;;;;;-1:-1:-1;;;51459:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51459:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51459:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;51459:29:0;-1:-1:-1;;;;;51507:32:0;;;;;;:11;51459:29;51507:32;;;;;51459:29;;-1:-1:-1;51507:32:0;;51503:81;;;51565:19;51558:26;;;;51503:81;51409:3;;;;;51371:225;;;-1:-1:-1;24963:42:0;;51201:441;-1:-1:-1;;;;51201:441:0:o;24646:32334::-;;;;;;;;;;;;;;;105:10:-1;24646:32334:0;88:34:-1;-1:-1;24646:32334:0;;;-1:-1:-1;;24646:32334:0:o;:::-;;;;;;;;;-1:-1:-1;24646:32334:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;-1:-1;24646:32334:0;;;-1:-1:-1;;24646:32334:0:o
Swarm Source
bzzr://d88f3ac021a9aa4df260d5e6deb758ddaac9b6f0cdf1851d84c328c2f2195abb
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.