Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 87 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Remove Converter | 11451086 | 1362 days ago | IN | 0 ETH | 0.0093669 | ||||
New Converter | 11448219 | 1363 days ago | IN | 0 ETH | 0.19504274 | ||||
New Converter | 11437411 | 1365 days ago | IN | 0 ETH | 0.19137241 | ||||
New Converter | 11425482 | 1366 days ago | IN | 0 ETH | 0.22256431 | ||||
Remove Converter | 11425237 | 1366 days ago | IN | 0 ETH | 0.00924156 | ||||
New Converter | 11424650 | 1367 days ago | IN | 0 ETH | 0.13337493 | ||||
New Converter | 11386229 | 1372 days ago | IN | 0 ETH | 0.1160074 | ||||
Remove Converter | 11385251 | 1373 days ago | IN | 0 ETH | 0.00616351 | ||||
New Converter | 11368489 | 1375 days ago | IN | 0 ETH | 0.19716515 | ||||
New Converter | 11328319 | 1381 days ago | IN | 0 ETH | 0.48711297 | ||||
New Converter | 11261021 | 1392 days ago | IN | 0 ETH | 0.07538748 | ||||
New Converter | 11235203 | 1396 days ago | IN | 0 ETH | 0.09278349 | ||||
Remove Converter | 11177188 | 1404 days ago | IN | 0 ETH | 0.01068968 | ||||
New Converter | 11107175 | 1415 days ago | IN | 0 ETH | 0.13849455 | ||||
New Converter | 11105545 | 1415 days ago | IN | 0 ETH | 0.00306546 | ||||
New Converter | 11094615 | 1417 days ago | IN | 0 ETH | 0.14613596 | ||||
New Converter | 11085406 | 1419 days ago | IN | 0 ETH | 0.26913187 | ||||
Remove Converter | 11078446 | 1420 days ago | IN | 0 ETH | 0.00262184 | ||||
New Converter | 11062013 | 1422 days ago | IN | 0 ETH | 0.20876332 | ||||
Remove Converter | 11049424 | 1424 days ago | IN | 0 ETH | 0.008316 | ||||
Add Converter | 11049372 | 1424 days ago | IN | 0 ETH | 0.03014323 | ||||
New Converter | 11048845 | 1424 days ago | IN | 0 ETH | 0.31083485 | ||||
New Converter | 11048076 | 1424 days ago | IN | 0 ETH | 0.5791373 | ||||
Remove Converter | 11047340 | 1424 days ago | IN | 0 ETH | 0.01056602 | ||||
New Converter | 11046123 | 1425 days ago | IN | 0 ETH | 0.28942305 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
ConverterRegistry
Compiler Version
v0.6.12+commit.27d51765
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-09-25 */ // File: solidity/contracts/token/interfaces/IERC20Token.sol // SPDX-License-Identifier: SEE LICENSE IN LICENSE pragma solidity 0.6.12; /* ERC20 Standard Token interface */ interface IERC20Token { function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); function totalSupply() external view returns (uint256); function balanceOf(address _owner) external view returns (uint256); function allowance(address _owner, address _spender) external view returns (uint256); function transfer(address _to, uint256 _value) external returns (bool); function transferFrom(address _from, address _to, uint256 _value) external returns (bool); function approve(address _spender, uint256 _value) external returns (bool); } // File: solidity/contracts/utility/TokenHandler.sol pragma solidity 0.6.12; contract TokenHandler { bytes4 private constant APPROVE_FUNC_SELECTOR = bytes4(keccak256("approve(address,uint256)")); bytes4 private constant TRANSFER_FUNC_SELECTOR = bytes4(keccak256("transfer(address,uint256)")); bytes4 private constant TRANSFER_FROM_FUNC_SELECTOR = bytes4(keccak256("transferFrom(address,address,uint256)")); /** * @dev executes the ERC20 token's `approve` function and reverts upon failure * the main purpose of this function is to prevent a non standard ERC20 token * from failing silently * * @param _token ERC20 token address * @param _spender approved address * @param _value allowance amount */ function safeApprove(IERC20Token _token, address _spender, uint256 _value) internal { (bool success, bytes memory data) = address(_token).call(abi.encodeWithSelector(APPROVE_FUNC_SELECTOR, _spender, _value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'ERR_APPROVE_FAILED'); } /** * @dev executes the ERC20 token's `transfer` function and reverts upon failure * the main purpose of this function is to prevent a non standard ERC20 token * from failing silently * * @param _token ERC20 token address * @param _to target address * @param _value transfer amount */ function safeTransfer(IERC20Token _token, address _to, uint256 _value) internal { (bool success, bytes memory data) = address(_token).call(abi.encodeWithSelector(TRANSFER_FUNC_SELECTOR, _to, _value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'ERR_TRANSFER_FAILED'); } /** * @dev executes the ERC20 token's `transferFrom` function and reverts upon failure * the main purpose of this function is to prevent a non standard ERC20 token * from failing silently * * @param _token ERC20 token address * @param _from source address * @param _to target address * @param _value transfer amount */ function safeTransferFrom(IERC20Token _token, address _from, address _to, uint256 _value) internal { (bool success, bytes memory data) = address(_token).call(abi.encodeWithSelector(TRANSFER_FROM_FUNC_SELECTOR, _from, _to, _value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'ERR_TRANSFER_FROM_FAILED'); } } // File: solidity/contracts/utility/interfaces/IOwned.sol pragma solidity 0.6.12; /* Owned contract interface */ interface IOwned { // this function isn't since the compiler emits automatically generated getter functions as external function owner() external view returns (address); function transferOwnership(address _newOwner) external; function acceptOwnership() external; } // File: solidity/contracts/utility/Owned.sol pragma solidity 0.6.12; /** * @dev Provides support and utilities for contract ownership */ contract Owned is IOwned { address public override owner; address public newOwner; /** * @dev triggered when the owner is updated * * @param _prevOwner previous owner * @param _newOwner new owner */ event OwnerUpdate(address indexed _prevOwner, address indexed _newOwner); /** * @dev initializes a new Owned instance */ constructor() public { owner = msg.sender; } // allows execution by the owner only modifier ownerOnly { _ownerOnly(); _; } // error message binary size optimization function _ownerOnly() internal view { require(msg.sender == owner, "ERR_ACCESS_DENIED"); } /** * @dev allows transferring the contract ownership * the new owner still needs to accept the transfer * can only be called by the contract owner * * @param _newOwner new contract owner */ function transferOwnership(address _newOwner) public override ownerOnly { require(_newOwner != owner, "ERR_SAME_OWNER"); newOwner = _newOwner; } /** * @dev used by a new owner to accept an ownership transfer */ function acceptOwnership() override public { require(msg.sender == newOwner, "ERR_ACCESS_DENIED"); emit OwnerUpdate(owner, newOwner); owner = newOwner; newOwner = address(0); } } // File: solidity/contracts/utility/Utils.sol pragma solidity 0.6.12; /** * @dev Utilities & Common Modifiers */ contract Utils { // verifies that a value is greater than zero modifier greaterThanZero(uint256 _value) { _greaterThanZero(_value); _; } // error message binary size optimization function _greaterThanZero(uint256 _value) internal pure { require(_value > 0, "ERR_ZERO_VALUE"); } // validates an address - currently only checks that it isn't null modifier validAddress(address _address) { _validAddress(_address); _; } // error message binary size optimization function _validAddress(address _address) internal pure { require(_address != address(0), "ERR_INVALID_ADDRESS"); } // verifies that the address is different than this contract address modifier notThis(address _address) { _notThis(_address); _; } // error message binary size optimization function _notThis(address _address) internal view { require(_address != address(this), "ERR_ADDRESS_IS_SELF"); } } // File: solidity/contracts/utility/interfaces/IContractRegistry.sol pragma solidity 0.6.12; /* Contract Registry interface */ interface IContractRegistry { function addressOf(bytes32 _contractName) external view returns (address); } // File: solidity/contracts/utility/ContractRegistryClient.sol pragma solidity 0.6.12; /** * @dev Base contract for ContractRegistry clients */ contract ContractRegistryClient is Owned, Utils { bytes32 internal constant CONTRACT_REGISTRY = "ContractRegistry"; bytes32 internal constant BANCOR_NETWORK = "BancorNetwork"; bytes32 internal constant BANCOR_FORMULA = "BancorFormula"; bytes32 internal constant CONVERTER_FACTORY = "ConverterFactory"; bytes32 internal constant CONVERSION_PATH_FINDER = "ConversionPathFinder"; bytes32 internal constant CONVERTER_UPGRADER = "BancorConverterUpgrader"; bytes32 internal constant CONVERTER_REGISTRY = "BancorConverterRegistry"; bytes32 internal constant CONVERTER_REGISTRY_DATA = "BancorConverterRegistryData"; bytes32 internal constant BNT_TOKEN = "BNTToken"; bytes32 internal constant BANCOR_X = "BancorX"; bytes32 internal constant BANCOR_X_UPGRADER = "BancorXUpgrader"; bytes32 internal constant CHAINLINK_ORACLE_WHITELIST = "ChainlinkOracleWhitelist"; IContractRegistry public registry; // address of the current contract-registry IContractRegistry public prevRegistry; // address of the previous contract-registry bool public onlyOwnerCanUpdateRegistry; // only an owner can update the contract-registry /** * @dev verifies that the caller is mapped to the given contract name * * @param _contractName contract name */ modifier only(bytes32 _contractName) { _only(_contractName); _; } // error message binary size optimization function _only(bytes32 _contractName) internal view { require(msg.sender == addressOf(_contractName), "ERR_ACCESS_DENIED"); } /** * @dev initializes a new ContractRegistryClient instance * * @param _registry address of a contract-registry contract */ constructor(IContractRegistry _registry) internal validAddress(address(_registry)) { registry = IContractRegistry(_registry); prevRegistry = IContractRegistry(_registry); } /** * @dev updates to the new contract-registry */ function updateRegistry() public { // verify that this function is permitted require(msg.sender == owner || !onlyOwnerCanUpdateRegistry, "ERR_ACCESS_DENIED"); // get the new contract-registry IContractRegistry newRegistry = IContractRegistry(addressOf(CONTRACT_REGISTRY)); // verify that the new contract-registry is different and not zero require(newRegistry != registry && address(newRegistry) != address(0), "ERR_INVALID_REGISTRY"); // verify that the new contract-registry is pointing to a non-zero contract-registry require(newRegistry.addressOf(CONTRACT_REGISTRY) != address(0), "ERR_INVALID_REGISTRY"); // save a backup of the current contract-registry before replacing it prevRegistry = registry; // replace the current contract-registry with the new contract-registry registry = newRegistry; } /** * @dev restores the previous contract-registry */ function restoreRegistry() public ownerOnly { // restore the previous contract-registry registry = prevRegistry; } /** * @dev restricts the permission to update the contract-registry * * @param _onlyOwnerCanUpdateRegistry indicates whether or not permission is restricted to owner only */ function restrictRegistryUpdate(bool _onlyOwnerCanUpdateRegistry) public ownerOnly { // change the permission to update the contract-registry onlyOwnerCanUpdateRegistry = _onlyOwnerCanUpdateRegistry; } /** * @dev returns the address associated with the given contract name * * @param _contractName contract name * * @return contract address */ function addressOf(bytes32 _contractName) internal view returns (address) { return registry.addressOf(_contractName); } } // File: solidity/contracts/utility/interfaces/ITokenHolder.sol pragma solidity 0.6.12; /* Token Holder interface */ interface ITokenHolder is IOwned { function withdrawTokens(IERC20Token _token, address _to, uint256 _amount) external; } // File: solidity/contracts/converter/interfaces/IConverterAnchor.sol pragma solidity 0.6.12; /* Converter Anchor interface */ interface IConverterAnchor is IOwned, ITokenHolder { } // File: solidity/contracts/utility/interfaces/IWhitelist.sol pragma solidity 0.6.12; /* Whitelist interface */ interface IWhitelist { function isWhitelisted(address _address) external view returns (bool); } // File: solidity/contracts/converter/interfaces/IConverter.sol pragma solidity 0.6.12; /* Converter interface */ interface IConverter is IOwned { function converterType() external pure returns (uint16); function anchor() external view returns (IConverterAnchor); function isActive() external view returns (bool); function targetAmountAndFee(IERC20Token _sourceToken, IERC20Token _targetToken, uint256 _amount) external view returns (uint256, uint256); function convert(IERC20Token _sourceToken, IERC20Token _targetToken, uint256 _amount, address _trader, address payable _beneficiary) external payable returns (uint256); function conversionWhitelist() external view returns (IWhitelist); function conversionFee() external view returns (uint32); function maxConversionFee() external view returns (uint32); function reserveBalance(IERC20Token _reserveToken) external view returns (uint256); receive() external payable; function transferAnchorOwnership(address _newOwner) external; function acceptAnchorOwnership() external; function setConversionFee(uint32 _conversionFee) external; function setConversionWhitelist(IWhitelist _whitelist) external; function withdrawTokens(IERC20Token _token, address _to, uint256 _amount) external; function withdrawETH(address payable _to) external; function addReserve(IERC20Token _token, uint32 _ratio) external; // deprecated, backward compatibility function token() external view returns (IConverterAnchor); function transferTokenOwnership(address _newOwner) external; function acceptTokenOwnership() external; function connectors(IERC20Token _address) external view returns (uint256, uint32, bool, bool, bool); function getConnectorBalance(IERC20Token _connectorToken) external view returns (uint256); function connectorTokens(uint256 _index) external view returns (IERC20Token); function connectorTokenCount() external view returns (uint16); } // File: solidity/contracts/converter/interfaces/ITypedConverterCustomFactory.sol pragma solidity 0.6.12; /* Typed Converter Custom Factory interface */ interface ITypedConverterCustomFactory { function converterType() external pure returns (uint16); } // File: solidity/contracts/converter/interfaces/IConverterFactory.sol pragma solidity 0.6.12; /* Converter Factory interface */ interface IConverterFactory { function createAnchor(uint16 _type, string memory _name, string memory _symbol, uint8 _decimals) external returns (IConverterAnchor); function createConverter(uint16 _type, IConverterAnchor _anchor, IContractRegistry _registry, uint32 _maxConversionFee) external returns (IConverter); function customFactories(uint16 _type) external view returns (ITypedConverterCustomFactory); } // File: solidity/contracts/converter/interfaces/IConverterRegistry.sol pragma solidity 0.6.12; interface IConverterRegistry { function getAnchorCount() external view returns (uint256); function getAnchors() external view returns (address[] memory); function getAnchor(uint256 _index) external view returns (IConverterAnchor); function isAnchor(address _value) external view returns (bool); function getLiquidityPoolCount() external view returns (uint256); function getLiquidityPools() external view returns (address[] memory); function getLiquidityPool(uint256 _index) external view returns (IConverterAnchor); function isLiquidityPool(address _value) external view returns (bool); function getConvertibleTokenCount() external view returns (uint256); function getConvertibleTokens() external view returns (address[] memory); function getConvertibleToken(uint256 _index) external view returns (IERC20Token); function isConvertibleToken(address _value) external view returns (bool); function getConvertibleTokenAnchorCount(IERC20Token _convertibleToken) external view returns (uint256); function getConvertibleTokenAnchors(IERC20Token _convertibleToken) external view returns (address[] memory); function getConvertibleTokenAnchor(IERC20Token _convertibleToken, uint256 _index) external view returns (IConverterAnchor); function isConvertibleTokenAnchor(IERC20Token _convertibleToken, address _value) external view returns (bool); } // File: solidity/contracts/converter/interfaces/IConverterRegistryData.sol pragma solidity 0.6.12; interface IConverterRegistryData { function addSmartToken(IConverterAnchor _anchor) external; function removeSmartToken(IConverterAnchor _anchor) external; function addLiquidityPool(IConverterAnchor _liquidityPoolAnchor) external; function removeLiquidityPool(IConverterAnchor _liquidityPoolAnchor) external; function addConvertibleToken(IERC20Token _convertibleToken, IConverterAnchor _anchor) external; function removeConvertibleToken(IERC20Token _convertibleToken, IConverterAnchor _anchor) external; function getSmartTokenCount() external view returns (uint256); function getSmartTokens() external view returns (address[] memory); function getSmartToken(uint256 _index) external view returns (IConverterAnchor); function isSmartToken(address _value) external view returns (bool); function getLiquidityPoolCount() external view returns (uint256); function getLiquidityPools() external view returns (address[] memory); function getLiquidityPool(uint256 _index) external view returns (IConverterAnchor); function isLiquidityPool(address _value) external view returns (bool); function getConvertibleTokenCount() external view returns (uint256); function getConvertibleTokens() external view returns (address[] memory); function getConvertibleToken(uint256 _index) external view returns (IERC20Token); function isConvertibleToken(address _value) external view returns (bool); function getConvertibleTokenSmartTokenCount(IERC20Token _convertibleToken) external view returns (uint256); function getConvertibleTokenSmartTokens(IERC20Token _convertibleToken) external view returns (address[] memory); function getConvertibleTokenSmartToken(IERC20Token _convertibleToken, uint256 _index) external view returns (IConverterAnchor); function isConvertibleTokenSmartToken(IERC20Token _convertibleToken, address _value) external view returns (bool); } // File: solidity/contracts/token/interfaces/ISmartToken.sol pragma solidity 0.6.12; /* Smart Token interface */ interface ISmartToken is IConverterAnchor, IERC20Token { function disableTransfers(bool _disable) external; function issue(address _to, uint256 _amount) external; function destroy(address _from, uint256 _amount) external; } // File: solidity/contracts/converter/ConverterRegistry.sol pragma solidity 0.6.12; /** * @dev The ConverterRegistry maintains a list of all active converters in the Bancor Network. * * Since converters can be upgraded and thus their address can change, the registry actually keeps * converter anchors internally and not the converters themselves. * The active converter for each anchor can be easily accessed by querying the anchor's owner. * * The registry exposes 3 differnet lists that can be accessed and iterated, based on the use-case of the caller: * - Anchors - can be used to get all the latest / historical data in the network * - Liquidity pools - can be used to get all liquidity pools for funding, liquidation etc. * - Convertible tokens - can be used to get all tokens that can be converted in the network (excluding pool * tokens), and for each one - all anchors that hold it in their reserves * * * The contract fires events whenever one of the primitives is added to or removed from the registry * * The contract is upgradable. */ contract ConverterRegistry is IConverterRegistry, ContractRegistryClient, TokenHandler { /** * @dev triggered when a converter anchor is added to the registry * * @param _anchor smart token */ event ConverterAnchorAdded(IConverterAnchor indexed _anchor); /** * @dev triggered when a converter anchor is removed from the registry * * @param _anchor smart token */ event ConverterAnchorRemoved(IConverterAnchor indexed _anchor); /** * @dev triggered when a liquidity pool is added to the registry * * @param _liquidityPool liquidity pool */ event LiquidityPoolAdded(IConverterAnchor indexed _liquidityPool); /** * @dev triggered when a liquidity pool is removed from the registry * * @param _liquidityPool liquidity pool */ event LiquidityPoolRemoved(IConverterAnchor indexed _liquidityPool); /** * @dev triggered when a convertible token is added to the registry * * @param _convertibleToken convertible token * @param _smartToken associated smart token */ event ConvertibleTokenAdded(IERC20Token indexed _convertibleToken, IConverterAnchor indexed _smartToken); /** * @dev triggered when a convertible token is removed from the registry * * @param _convertibleToken convertible token * @param _smartToken associated smart token */ event ConvertibleTokenRemoved(IERC20Token indexed _convertibleToken, IConverterAnchor indexed _smartToken); /** * @dev deprecated, backward compatibility, use `ConverterAnchorAdded` */ event SmartTokenAdded(IConverterAnchor indexed _smartToken); /** * @dev deprecated, backward compatibility, use `ConverterAnchorRemoved` */ event SmartTokenRemoved(IConverterAnchor indexed _smartToken); /** * @dev initializes a new ConverterRegistry instance * * @param _registry address of a contract registry contract */ constructor(IContractRegistry _registry) ContractRegistryClient(_registry) public { } /** * @dev creates a zero supply liquid token / empty liquidity pool and adds its converter to the registry * * @param _type converter type, see ConverterBase contract main doc * @param _name token / pool name * @param _symbol token / pool symbol * @param _decimals token / pool decimals * @param _maxConversionFee maximum conversion-fee * @param _reserveTokens reserve tokens * @param _reserveWeights reserve weights * * @return new converter */ function newConverter( uint16 _type, string memory _name, string memory _symbol, uint8 _decimals, uint32 _maxConversionFee, IERC20Token[] memory _reserveTokens, uint32[] memory _reserveWeights ) public virtual returns (IConverter) { uint256 length = _reserveTokens.length; require(length == _reserveWeights.length, "ERR_INVALID_RESERVES"); require(getLiquidityPoolByConfig(_type, _reserveTokens, _reserveWeights) == IConverterAnchor(0), "ERR_ALREADY_EXISTS"); IConverterFactory factory = IConverterFactory(addressOf(CONVERTER_FACTORY)); IConverterAnchor anchor = IConverterAnchor(factory.createAnchor(_type, _name, _symbol, _decimals)); IConverter converter = IConverter(factory.createConverter(_type, anchor, registry, _maxConversionFee)); anchor.acceptOwnership(); converter.acceptOwnership(); for (uint256 i = 0; i < length; i++) converter.addReserve(_reserveTokens[i], _reserveWeights[i]); anchor.transferOwnership(address(converter)); converter.acceptAnchorOwnership(); converter.transferOwnership(msg.sender); addConverterInternal(converter); return converter; } /** * @dev adds an existing converter to the registry * can only be called by the owner * * @param _converter converter */ function addConverter(IConverter _converter) public ownerOnly { require(isConverterValid(_converter), "ERR_INVALID_CONVERTER"); addConverterInternal(_converter); } /** * @dev removes a converter from the registry * anyone can remove an existing converter from the registry, as long as the converter is invalid * note that the owner can also remove valid converters * * @param _converter converter */ function removeConverter(IConverter _converter) public { require(msg.sender == owner || !isConverterValid(_converter), "ERR_ACCESS_DENIED"); removeConverterInternal(_converter); } /** * @dev returns the number of converter anchors in the registry * * @return number of anchors */ function getAnchorCount() public view override returns (uint256) { return IConverterRegistryData(addressOf(CONVERTER_REGISTRY_DATA)).getSmartTokenCount(); } /** * @dev returns the list of converter anchors in the registry * * @return list of anchors */ function getAnchors() public view override returns (address[] memory) { return IConverterRegistryData(addressOf(CONVERTER_REGISTRY_DATA)).getSmartTokens(); } /** * @dev returns the converter anchor at a given index * * @param _index index * @return anchor at the given index */ function getAnchor(uint256 _index) public view override returns (IConverterAnchor) { return IConverterRegistryData(addressOf(CONVERTER_REGISTRY_DATA)).getSmartToken(_index); } /** * @dev checks whether or not a given value is a converter anchor * * @param _value value * @return true if the given value is an anchor, false if not */ function isAnchor(address _value) public view override returns (bool) { return IConverterRegistryData(addressOf(CONVERTER_REGISTRY_DATA)).isSmartToken(_value); } /** * @dev returns the number of liquidity pools in the registry * * @return number of liquidity pools */ function getLiquidityPoolCount() public view override returns (uint256) { return IConverterRegistryData(addressOf(CONVERTER_REGISTRY_DATA)).getLiquidityPoolCount(); } /** * @dev returns the list of liquidity pools in the registry * * @return list of liquidity pools */ function getLiquidityPools() public view override returns (address[] memory) { return IConverterRegistryData(addressOf(CONVERTER_REGISTRY_DATA)).getLiquidityPools(); } /** * @dev returns the liquidity pool at a given index * * @param _index index * @return liquidity pool at the given index */ function getLiquidityPool(uint256 _index) public view override returns (IConverterAnchor) { return IConverterRegistryData(addressOf(CONVERTER_REGISTRY_DATA)).getLiquidityPool(_index); } /** * @dev checks whether or not a given value is a liquidity pool * * @param _value value * @return true if the given value is a liquidity pool, false if not */ function isLiquidityPool(address _value) public view override returns (bool) { return IConverterRegistryData(addressOf(CONVERTER_REGISTRY_DATA)).isLiquidityPool(_value); } /** * @dev returns the number of convertible tokens in the registry * * @return number of convertible tokens */ function getConvertibleTokenCount() public view override returns (uint256) { return IConverterRegistryData(addressOf(CONVERTER_REGISTRY_DATA)).getConvertibleTokenCount(); } /** * @dev returns the list of convertible tokens in the registry * * @return list of convertible tokens */ function getConvertibleTokens() public view override returns (address[] memory) { return IConverterRegistryData(addressOf(CONVERTER_REGISTRY_DATA)).getConvertibleTokens(); } /** * @dev returns the convertible token at a given index * * @param _index index * @return convertible token at the given index */ function getConvertibleToken(uint256 _index) public view override returns (IERC20Token) { return IConverterRegistryData(addressOf(CONVERTER_REGISTRY_DATA)).getConvertibleToken(_index); } /** * @dev checks whether or not a given value is a convertible token * * @param _value value * @return true if the given value is a convertible token, false if not */ function isConvertibleToken(address _value) public view override returns (bool) { return IConverterRegistryData(addressOf(CONVERTER_REGISTRY_DATA)).isConvertibleToken(_value); } /** * @dev returns the number of converter anchors associated with a given convertible token * * @param _convertibleToken convertible token * @return number of anchors associated with the given convertible token */ function getConvertibleTokenAnchorCount(IERC20Token _convertibleToken) public view override returns (uint256) { return IConverterRegistryData(addressOf(CONVERTER_REGISTRY_DATA)).getConvertibleTokenSmartTokenCount(_convertibleToken); } /** * @dev returns the list of aoncerter anchors associated with a given convertible token * * @param _convertibleToken convertible token * @return list of anchors associated with the given convertible token */ function getConvertibleTokenAnchors(IERC20Token _convertibleToken) public view override returns (address[] memory) { return IConverterRegistryData(addressOf(CONVERTER_REGISTRY_DATA)).getConvertibleTokenSmartTokens(_convertibleToken); } /** * @dev returns the converter anchor associated with a given convertible token at a given index * * @param _index index * @return anchor associated with the given convertible token at the given index */ function getConvertibleTokenAnchor(IERC20Token _convertibleToken, uint256 _index) public view override returns (IConverterAnchor) { return IConverterRegistryData(addressOf(CONVERTER_REGISTRY_DATA)).getConvertibleTokenSmartToken(_convertibleToken, _index); } /** * @dev checks whether or not a given value is a converter anchor of a given convertible token * * @param _convertibleToken convertible token * @param _value value * @return true if the given value is an anchor of the given convertible token, false if not */ function isConvertibleTokenAnchor(IERC20Token _convertibleToken, address _value) public view override returns (bool) { return IConverterRegistryData(addressOf(CONVERTER_REGISTRY_DATA)).isConvertibleTokenSmartToken(_convertibleToken, _value); } /** * @dev returns a list of converters for a given list of anchors * this is a utility function that can be used to reduce the number of calls to the contract * * @param _anchors list of converter anchors * @return list of converters */ function getConvertersByAnchors(address[] memory _anchors) public view returns (IConverter[] memory) { IConverter[] memory converters = new IConverter[](_anchors.length); for (uint256 i = 0; i < _anchors.length; i++) converters[i] = IConverter(payable(IConverterAnchor(_anchors[i]).owner())); return converters; } /** * @dev checks whether or not a given converter is valid * * @param _converter converter * @return true if the given converter is valid, false if not */ function isConverterValid(IConverter _converter) public view returns (bool) { // verify that the converter is active return _converter.token().owner() == address(_converter); } /** * @dev checks if a liquidity pool with given configuration is already registered * * @param _converter converter with specific configuration * @return if a liquidity pool with the same configuration is already registered */ function isSimilarLiquidityPoolRegistered(IConverter _converter) public view returns (bool) { uint256 reserveTokenCount = _converter.connectorTokenCount(); IERC20Token[] memory reserveTokens = new IERC20Token[](reserveTokenCount); uint32[] memory reserveWeights = new uint32[](reserveTokenCount); // get the reserve-configuration of the converter for (uint256 i = 0; i < reserveTokenCount; i++) { IERC20Token reserveToken = _converter.connectorTokens(i); reserveTokens[i] = reserveToken; reserveWeights[i] = getReserveWeight(_converter, reserveToken); } // return if a liquidity pool with the same configuration is already registered return getLiquidityPoolByConfig(getConverterType(_converter, reserveTokenCount), reserveTokens, reserveWeights) != IConverterAnchor(0); } /** * @dev searches for a liquidity pool with specific configuration * * @param _type converter type, see ConverterBase contract main doc * @param _reserveTokens reserve tokens * @param _reserveWeights reserve weights * @return the liquidity pool, or zero if no such liquidity pool exists */ function getLiquidityPoolByConfig(uint16 _type, IERC20Token[] memory _reserveTokens, uint32[] memory _reserveWeights) public view returns (IConverterAnchor) { // verify that the input parameters represent a valid liquidity pool if (_reserveTokens.length == _reserveWeights.length && _reserveTokens.length > 1) { // get the anchors of the least frequent token (optimization) address[] memory convertibleTokenAnchors = getLeastFrequentTokenAnchors(_reserveTokens); // search for a converter with the same configuration for (uint256 i = 0; i < convertibleTokenAnchors.length; i++) { IConverterAnchor anchor = IConverterAnchor(convertibleTokenAnchors[i]); IConverter converter = IConverter(payable(anchor.owner())); if (isConverterReserveConfigEqual(converter, _type, _reserveTokens, _reserveWeights)) return anchor; } } return IConverterAnchor(0); } /** * @dev adds a converter anchor to the registry * * @param _anchor converter anchor */ function addAnchor(IConverterRegistryData _converterRegistryData, IConverterAnchor _anchor) internal { _converterRegistryData.addSmartToken(_anchor); emit ConverterAnchorAdded(_anchor); emit SmartTokenAdded(_anchor); } /** * @dev removes a converter anchor from the registry * * @param _anchor converter anchor */ function removeAnchor(IConverterRegistryData _converterRegistryData, IConverterAnchor _anchor) internal { _converterRegistryData.removeSmartToken(_anchor); emit ConverterAnchorRemoved(_anchor); emit SmartTokenRemoved(_anchor); } /** * @dev adds a liquidity pool to the registry * * @param _liquidityPoolAnchor liquidity pool converter anchor */ function addLiquidityPool(IConverterRegistryData _converterRegistryData, IConverterAnchor _liquidityPoolAnchor) internal { _converterRegistryData.addLiquidityPool(_liquidityPoolAnchor); emit LiquidityPoolAdded(_liquidityPoolAnchor); } /** * @dev removes a liquidity pool from the registry * * @param _liquidityPoolAnchor liquidity pool converter anchor */ function removeLiquidityPool(IConverterRegistryData _converterRegistryData, IConverterAnchor _liquidityPoolAnchor) internal { _converterRegistryData.removeLiquidityPool(_liquidityPoolAnchor); emit LiquidityPoolRemoved(_liquidityPoolAnchor); } /** * @dev adds a convertible token to the registry * * @param _convertibleToken convertible token * @param _anchor associated converter anchor */ function addConvertibleToken(IConverterRegistryData _converterRegistryData, IERC20Token _convertibleToken, IConverterAnchor _anchor) internal { _converterRegistryData.addConvertibleToken(_convertibleToken, _anchor); emit ConvertibleTokenAdded(_convertibleToken, _anchor); } /** * @dev removes a convertible token from the registry * * @param _convertibleToken convertible token * @param _anchor associated converter anchor */ function removeConvertibleToken(IConverterRegistryData _converterRegistryData, IERC20Token _convertibleToken, IConverterAnchor _anchor) internal { _converterRegistryData.removeConvertibleToken(_convertibleToken, _anchor); emit ConvertibleTokenRemoved(_convertibleToken, _anchor); } function addConverterInternal(IConverter _converter) private { IConverterRegistryData converterRegistryData = IConverterRegistryData(addressOf(CONVERTER_REGISTRY_DATA)); IConverterAnchor anchor = IConverter(_converter).token(); uint256 reserveTokenCount = _converter.connectorTokenCount(); // add the converter anchor addAnchor(converterRegistryData, anchor); if (reserveTokenCount > 1) addLiquidityPool(converterRegistryData, anchor); else addConvertibleToken(converterRegistryData, ISmartToken(address(anchor)), anchor); // add all reserve tokens for (uint256 i = 0; i < reserveTokenCount; i++) addConvertibleToken(converterRegistryData, _converter.connectorTokens(i), anchor); } function removeConverterInternal(IConverter _converter) private { IConverterRegistryData converterRegistryData = IConverterRegistryData(addressOf(CONVERTER_REGISTRY_DATA)); IConverterAnchor anchor = IConverter(_converter).token(); uint256 reserveTokenCount = _converter.connectorTokenCount(); // remove the converter anchor removeAnchor(converterRegistryData, anchor); if (reserveTokenCount > 1) removeLiquidityPool(converterRegistryData, anchor); else removeConvertibleToken(converterRegistryData, ISmartToken(address(anchor)), anchor); // remove all reserve tokens for (uint256 i = 0; i < reserveTokenCount; i++) removeConvertibleToken(converterRegistryData, _converter.connectorTokens(i), anchor); } function getLeastFrequentTokenAnchors(IERC20Token[] memory _reserveTokens) private view returns (address[] memory) { IConverterRegistryData converterRegistryData = IConverterRegistryData(addressOf(CONVERTER_REGISTRY_DATA)); uint256 minAnchorCount = converterRegistryData.getConvertibleTokenSmartTokenCount(_reserveTokens[0]); uint256 index = 0; // find the reserve token which has the smallest number of converter anchors for (uint256 i = 1; i < _reserveTokens.length; i++) { uint256 convertibleTokenAnchorCount = converterRegistryData.getConvertibleTokenSmartTokenCount(_reserveTokens[i]); if (minAnchorCount > convertibleTokenAnchorCount) { minAnchorCount = convertibleTokenAnchorCount; index = i; } } return converterRegistryData.getConvertibleTokenSmartTokens(_reserveTokens[index]); } function isConverterReserveConfigEqual(IConverter _converter, uint16 _type, IERC20Token[] memory _reserveTokens, uint32[] memory _reserveWeights) private view returns (bool) { uint256 reserveTokenCount = _converter.connectorTokenCount(); if (_type != getConverterType(_converter, reserveTokenCount)) return false; if (_reserveTokens.length != reserveTokenCount) return false; for (uint256 i = 0; i < _reserveTokens.length; i++) { if (_reserveWeights[i] != getReserveWeight(_converter, _reserveTokens[i])) return false; } return true; } // utility to get the reserve weight (including from older converters that don't support the new getReserveWeight function) function getReserveWeight(IConverter _converter, IERC20Token _reserveToken) private view returns (uint32) { (, uint32 weight,,,) = _converter.connectors(_reserveToken); return weight; } bytes4 private constant CONVERTER_TYPE_FUNC_SELECTOR = bytes4(keccak256("converterType()")); // utility to get the converter type (including from older converters that don't support the new converterType function) function getConverterType(IConverter _converter, uint256 _reserveTokenCount) private view returns (uint16) { (bool success, bytes memory returnData) = address(_converter).staticcall(abi.encodeWithSelector(CONVERTER_TYPE_FUNC_SELECTOR)); if (success && returnData.length == 32) return abi.decode(returnData, (uint16)); return _reserveTokenCount > 1 ? 1 : 0; } /** * @dev deprecated, backward compatibility, use `getAnchorCount` */ function getSmartTokenCount() public view returns (uint256) { return getAnchorCount(); } /** * @dev deprecated, backward compatibility, use `getAnchors` */ function getSmartTokens() public view returns (address[] memory) { return getAnchors(); } /** * @dev deprecated, backward compatibility, use `getAnchor` */ function getSmartToken(uint256 _index) public view returns (IConverterAnchor) { return getAnchor(_index); } /** * @dev deprecated, backward compatibility, use `isAnchor` */ function isSmartToken(address _value) public view returns (bool) { return isAnchor(_value); } /** * @dev deprecated, backward compatibility, use `getConvertibleTokenAnchorCount` */ function getConvertibleTokenSmartTokenCount(IERC20Token _convertibleToken) public view returns (uint256) { return getConvertibleTokenAnchorCount(_convertibleToken); } /** * @dev deprecated, backward compatibility, use `getConvertibleTokenAnchors` */ function getConvertibleTokenSmartTokens(IERC20Token _convertibleToken) public view returns (address[] memory) { return getConvertibleTokenAnchors(_convertibleToken); } /** * @dev deprecated, backward compatibility, use `getConvertibleTokenAnchor` */ function getConvertibleTokenSmartToken(IERC20Token _convertibleToken, uint256 _index) public view returns (IConverterAnchor) { return getConvertibleTokenAnchor(_convertibleToken, _index); } /** * @dev deprecated, backward compatibility, use `isConvertibleTokenAnchor` */ function isConvertibleTokenSmartToken(IERC20Token _convertibleToken, address _value) public view returns (bool) { return isConvertibleTokenAnchor(_convertibleToken, _value); } /** * @dev deprecated, backward compatibility, use `getConvertersByAnchors` */ function getConvertersBySmartTokens(address[] memory _smartTokens) public view returns (IConverter[] memory) { return getConvertersByAnchors(_smartTokens); } /** * @dev deprecated, backward compatibility, use `getLiquidityPoolByConfig` */ function getLiquidityPoolByReserveConfig(IERC20Token[] memory _reserveTokens, uint32[] memory _reserveWeights) public view returns (IConverterAnchor) { return getLiquidityPoolByConfig(_reserveTokens.length > 1 ? 1 : 0, _reserveTokens, _reserveWeights); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IContractRegistry","name":"_registry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IConverterAnchor","name":"_anchor","type":"address"}],"name":"ConverterAnchorAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IConverterAnchor","name":"_anchor","type":"address"}],"name":"ConverterAnchorRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IERC20Token","name":"_convertibleToken","type":"address"},{"indexed":true,"internalType":"contract IConverterAnchor","name":"_smartToken","type":"address"}],"name":"ConvertibleTokenAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IERC20Token","name":"_convertibleToken","type":"address"},{"indexed":true,"internalType":"contract IConverterAnchor","name":"_smartToken","type":"address"}],"name":"ConvertibleTokenRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IConverterAnchor","name":"_liquidityPool","type":"address"}],"name":"LiquidityPoolAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IConverterAnchor","name":"_liquidityPool","type":"address"}],"name":"LiquidityPoolRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_prevOwner","type":"address"},{"indexed":true,"internalType":"address","name":"_newOwner","type":"address"}],"name":"OwnerUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IConverterAnchor","name":"_smartToken","type":"address"}],"name":"SmartTokenAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IConverterAnchor","name":"_smartToken","type":"address"}],"name":"SmartTokenRemoved","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IConverter","name":"_converter","type":"address"}],"name":"addConverter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getAnchor","outputs":[{"internalType":"contract IConverterAnchor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAnchorCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAnchors","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_anchors","type":"address[]"}],"name":"getConvertersByAnchors","outputs":[{"internalType":"contract IConverter[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_smartTokens","type":"address[]"}],"name":"getConvertersBySmartTokens","outputs":[{"internalType":"contract IConverter[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getConvertibleToken","outputs":[{"internalType":"contract IERC20Token","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20Token","name":"_convertibleToken","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getConvertibleTokenAnchor","outputs":[{"internalType":"contract IConverterAnchor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20Token","name":"_convertibleToken","type":"address"}],"name":"getConvertibleTokenAnchorCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20Token","name":"_convertibleToken","type":"address"}],"name":"getConvertibleTokenAnchors","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getConvertibleTokenCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20Token","name":"_convertibleToken","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getConvertibleTokenSmartToken","outputs":[{"internalType":"contract IConverterAnchor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20Token","name":"_convertibleToken","type":"address"}],"name":"getConvertibleTokenSmartTokenCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20Token","name":"_convertibleToken","type":"address"}],"name":"getConvertibleTokenSmartTokens","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getConvertibleTokens","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getLiquidityPool","outputs":[{"internalType":"contract IConverterAnchor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_type","type":"uint16"},{"internalType":"contract IERC20Token[]","name":"_reserveTokens","type":"address[]"},{"internalType":"uint32[]","name":"_reserveWeights","type":"uint32[]"}],"name":"getLiquidityPoolByConfig","outputs":[{"internalType":"contract IConverterAnchor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20Token[]","name":"_reserveTokens","type":"address[]"},{"internalType":"uint32[]","name":"_reserveWeights","type":"uint32[]"}],"name":"getLiquidityPoolByReserveConfig","outputs":[{"internalType":"contract IConverterAnchor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLiquidityPoolCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLiquidityPools","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getSmartToken","outputs":[{"internalType":"contract IConverterAnchor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSmartTokenCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSmartTokens","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_value","type":"address"}],"name":"isAnchor","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IConverter","name":"_converter","type":"address"}],"name":"isConverterValid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_value","type":"address"}],"name":"isConvertibleToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20Token","name":"_convertibleToken","type":"address"},{"internalType":"address","name":"_value","type":"address"}],"name":"isConvertibleTokenAnchor","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20Token","name":"_convertibleToken","type":"address"},{"internalType":"address","name":"_value","type":"address"}],"name":"isConvertibleTokenSmartToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_value","type":"address"}],"name":"isLiquidityPool","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IConverter","name":"_converter","type":"address"}],"name":"isSimilarLiquidityPoolRegistered","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_value","type":"address"}],"name":"isSmartToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_type","type":"uint16"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"uint32","name":"_maxConversionFee","type":"uint32"},{"internalType":"contract IERC20Token[]","name":"_reserveTokens","type":"address[]"},{"internalType":"uint32[]","name":"_reserveWeights","type":"uint32[]"}],"name":"newConverter","outputs":[{"internalType":"contract IConverter","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"newOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"onlyOwnerCanUpdateRegistry","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"prevRegistry","outputs":[{"internalType":"contract IContractRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"registry","outputs":[{"internalType":"contract IContractRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IConverter","name":"_converter","type":"address"}],"name":"removeConverter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"restoreRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_onlyOwnerCanUpdateRegistry","type":"bool"}],"name":"restrictRegistryUpdate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"updateRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040516200331138038062003311833981810160405260208110156200003757600080fd5b5051600080546001600160a01b03191633179055808062000058816200008a565b50600280546001600160a01b039092166001600160a01b031992831681179091556003805490921617905550620000e9565b6001600160a01b038116620000e6576040805162461bcd60e51b815260206004820152601360248201527f4552525f494e56414c49445f4144445245535300000000000000000000000000604482015290519081900360640190fd5b50565b61321880620000f96000396000f3fe608060405234801561001057600080fd5b50600436106102695760003560e01c80637b10399911610151578063b4c4197a116100c3578063d8cced2a11610087578063d8cced2a14610bef578063e571049b14610c15578063e85455d714610c1d578063effb3c6e14610c43578063f2fde38b14610c4b578063f4fb86c014610c7157610269565b8063b4c4197a14610a62578063c22b82f014610a90578063d3182bed14610bb3578063d4ee1d9014610bbb578063d6c4b5b214610bc357610269565b8063954254f511610115578063954254f5146109ae5780639e76a007146109d4578063a109d214146109fa578063a43d5e9414610a17578063a74498aa14610a3d578063b4a176d314610a5a57610269565b80637b103999146109535780637f45c4c31461095b578063865cf194146109635780638da5cb5b146109805780638f1d0e1a1461098857610269565b80634c7df18f116101ea57806361cd756e116101ae57806361cd756e146108df57806369be4784146108e75780636ce1c4dc146108ef578063725b87861461091557806379ba5097146109435780637a5f0ffd1461094b57610269565b80634c7df18f146105a05780635a0a6618146105bd5780635f1b50fe1461080a578063603f51e414610812578063610c0b051461083e57610269565b80632fe8a6ad116102315780632fe8a6ad146104f85780633ab8857c146105145780634123ef601461053a57806349c5f32b1461056057806349d10b641461059857610269565b8063024c7ec71461026e57806304ceaf411461028f57806311839064146102e75780631d3fccd51461030d5780631f8e262014610457575b600080fd5b61028d6004803603602081101561028457600080fd5b50351515610c97565b005b610297610cbd565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156102d35781810151838201526020016102bb565b505050509050019250505060405180910390f35b610297600480360360208110156102fd57600080fd5b50356001600160a01b0316610ccc565b61043b6004803603606081101561032357600080fd5b61ffff8235169190810190604081016020820135600160201b81111561034857600080fd5b82018360208201111561035a57600080fd5b803590602001918460208302840111600160201b8311171561037b57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156103ca57600080fd5b8201836020820111156103dc57600080fd5b803590602001918460208302840111600160201b831117156103fd57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610dff945050505050565b604080516001600160a01b039092168252519081900360200190f35b6102976004803603602081101561046d57600080fd5b810190602081018135600160201b81111561048757600080fd5b82018360208201111561049957600080fd5b803590602001918460208302840111600160201b831117156104ba57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610ee6945050505050565b610500610ef7565b604080519115158252519081900360200190f35b6105006004803603602081101561052a57600080fd5b50356001600160a01b0316610f07565b6105006004803603602081101561055057600080fd5b50356001600160a01b0316610f9e565b6105866004803603602081101561057657600080fd5b50356001600160a01b0316610fa9565b60408051918252519081900360200190f35b61028d61100e565b61043b600480360360208110156105b657600080fd5b5035611216565b61043b600480360360e08110156105d357600080fd5b61ffff8235169190810190604081016020820135600160201b8111156105f857600080fd5b82018360208201111561060a57600080fd5b803590602001918460018302840111600160201b8311171561062b57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b81111561067d57600080fd5b82018360208201111561068f57600080fd5b803590602001918460018302840111600160201b831117156106b057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929560ff8535169563ffffffff60208701351695919450925060608101915060400135600160201b81111561071757600080fd5b82018360208201111561072957600080fd5b803590602001918460208302840111600160201b8311171561074a57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561079957600080fd5b8201836020820111156107ab57600080fd5b803590602001918460208302840111600160201b831117156107cc57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611272945050505050565b6102976117c7565b61043b6004803603604081101561082857600080fd5b506001600160a01b0381351690602001356118e4565b6102976004803603602081101561085457600080fd5b810190602081018135600160201b81111561086e57600080fd5b82018360208201111561088057600080fd5b803590602001918460208302840111600160201b831117156108a157600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611984945050505050565b61043b611a85565b610586611a94565b61028d6004803603602081101561090557600080fd5b50356001600160a01b0316611b16565b6105006004803603604081101561092b57600080fd5b506001600160a01b0381358116916020013516611b7c565b61028d611b88565b610586611c3f565b61043b611c90565b610297611c9f565b61043b6004803603602081101561097957600080fd5b5035611cf0565b61043b611d4c565b6105006004803603602081101561099e57600080fd5b50356001600160a01b0316611d5b565b610500600480360360208110156109c457600080fd5b50356001600160a01b0316611f64565b61028d600480360360208110156109ea57600080fd5b50356001600160a01b0316612053565b61043b60048036036020811015610a1057600080fd5b50356120c0565b61058660048036036020811015610a2d57600080fd5b50356001600160a01b03166120cb565b61043b60048036036020811015610a5357600080fd5b50356120d6565b61028d612132565b61050060048036036040811015610a7857600080fd5b506001600160a01b038135811691602001351661215e565b61043b60048036036040811015610aa657600080fd5b810190602081018135600160201b811115610ac057600080fd5b820183602082011115610ad257600080fd5b803590602001918460208302840111600160201b83111715610af357600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610b4257600080fd5b820183602082011115610b5457600080fd5b803590602001918460208302840111600160201b83111715610b7557600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506121d4945050505050565b6105866121f6565b61043b612247565b61043b60048036036040811015610bd957600080fd5b506001600160a01b038135169060200135612256565b61050060048036036020811015610c0557600080fd5b50356001600160a01b0316612262565b6105866122c7565b61050060048036036020811015610c3357600080fd5b50356001600160a01b03166122d1565b610297612336565b61028d60048036036020811015610c6157600080fd5b50356001600160a01b0316612387565b61029760048036036020811015610c8757600080fd5b50356001600160a01b0316612405565b610c9f612410565b60038054911515600160a01b0260ff60a01b19909216919091179055565b6060610cc7612336565b905090565b6060610ce56000805160206131c3833981519152612465565b6001600160a01b031663f4fb86c0836040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060006040518083038186803b158015610d3157600080fd5b505afa158015610d45573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015610d6e57600080fd5b8101908080516040519392919084600160201b821115610d8d57600080fd5b908301906020820185811115610da257600080fd5b82518660208202830111600160201b82111715610dbe57600080fd5b82525081516020918201928201910280838360005b83811015610deb578181015183820152602001610dd3565b505050509050016040525050509050919050565b600081518351148015610e13575060018351115b15610edb576060610e23846124b1565b905060005b8151811015610ed8576000828281518110610e3f57fe5b602002602001015190506000816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610e8457600080fd5b505afa158015610e98573d6000803e3d6000fd5b505050506040513d6020811015610eae57600080fd5b50519050610ebe81898989612747565b15610ece57509250610edf915050565b5050600101610e28565b50505b5060005b9392505050565b6060610ef182611984565b92915050565b600354600160a01b900460ff1681565b6000610f206000805160206131c3833981519152612465565b6001600160a01b0316633ab8857c836040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610f6c57600080fd5b505afa158015610f80573d6000803e3d6000fd5b505050506040513d6020811015610f9657600080fd5b505192915050565b6000610ef182612262565b6000610fc26000805160206131c3833981519152612465565b6001600160a01b031663a43d5e94836040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610f6c57600080fd5b6000546001600160a01b03163314806110315750600354600160a01b900460ff16155b611076576040805162461bcd60e51b815260206004820152601160248201527011549497d050d0d154d4d7d11153925151607a1b604482015290519081900360640190fd5b60006110946f436f6e7472616374526567697374727960801b612465565b6002549091506001600160a01b038083169116148015906110bd57506001600160a01b03811615155b611105576040805162461bcd60e51b81526020600482015260146024820152734552525f494e56414c49445f524547495354525960601b604482015290519081900360640190fd5b60006001600160a01b0316816001600160a01b031663bb34534c6f436f6e7472616374526567697374727960801b6040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561116757600080fd5b505afa15801561117b573d6000803e3d6000fd5b505050506040513d602081101561119157600080fd5b50516001600160a01b031614156111e6576040805162461bcd60e51b81526020600482015260146024820152734552525f494e56414c49445f524547495354525960601b604482015290519081900360640190fd5b60028054600380546001600160a01b038084166001600160a01b0319928316179092559091169216919091179055565b600061122f6000805160206131c3833981519152612465565b6001600160a01b031663a109d214836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015610f6c57600080fd5b815181516000919081146112c4576040805162461bcd60e51b81526020600482015260146024820152734552525f494e56414c49445f524553455256455360601b604482015290519081900360640190fd5b60006112d18a8686610dff565b6001600160a01b031614611321576040805162461bcd60e51b81526020600482015260126024820152714552525f414c52454144595f45584953545360701b604482015290519081900360640190fd5b600061133f6f436f6e766572746572466163746f727960801b612465565b90506000816001600160a01b0316632e9ab7b38c8c8c8c6040518563ffffffff1660e01b8152600401808561ffff16815260200180602001806020018460ff168152602001838103835286818151815260200191508051906020019080838360005b838110156113b95781810151838201526020016113a1565b50505050905090810190601f1680156113e65780820380516001836020036101000a031916815260200191505b50838103825285518152855160209182019187019080838360005b83811015611419578181015183820152602001611401565b50505050905090810190601f1680156114465780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600087803b15801561146957600080fd5b505af115801561147d573d6000803e3d6000fd5b505050506040513d602081101561149357600080fd5b505160025460408051630afb25b560e11b815261ffff8f1660048201526001600160a01b038085166024830152928316604482015263ffffffff8b1660648201529051929350600092918516916315f64b6a9160848082019260209290919082900301818787803b15801561150757600080fd5b505af115801561151b573d6000803e3d6000fd5b505050506040513d602081101561153157600080fd5b5051604080516379ba509760e01b815290519192506001600160a01b038416916379ba50979160048082019260009290919082900301818387803b15801561157857600080fd5b505af115801561158c573d6000803e3d6000fd5b50505050806001600160a01b03166379ba50976040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156115cb57600080fd5b505af11580156115df573d6000803e3d6000fd5b5050505060005b8481101561169557816001600160a01b0316636a49d2c489838151811061160957fe5b602002602001015189848151811061161d57fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b031681526020018263ffffffff16815260200192505050600060405180830381600087803b15801561167157600080fd5b505af1158015611685573d6000803e3d6000fd5b5050600190920191506115e69050565b50816001600160a01b031663f2fde38b826040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b1580156116e557600080fd5b505af11580156116f9573d6000803e3d6000fd5b50505050806001600160a01b031663cdc91c696040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561173857600080fd5b505af115801561174c573d6000803e3d6000fd5b50506040805163f2fde38b60e01b815233600482015290516001600160a01b038516935063f2fde38b9250602480830192600092919082900301818387803b15801561179757600080fd5b505af11580156117ab573d6000803e3d6000fd5b505050506117b881612859565b9b9a5050505050505050505050565b60606117e06000805160206131c3833981519152612465565b6001600160a01b0316635f1b50fe6040518163ffffffff1660e01b815260040160006040518083038186803b15801561181857600080fd5b505afa15801561182c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561185557600080fd5b8101908080516040519392919084600160201b82111561187457600080fd5b90830190602082018581111561188957600080fd5b82518660208202830111600160201b821117156118a557600080fd5b82525081516020918201928201910280838360005b838110156118d25781810151838201526020016118ba565b50505050905001604052505050905090565b60006118fd6000805160206131c3833981519152612465565b6001600160a01b031663d6c4b5b284846040518363ffffffff1660e01b815260040180836001600160a01b031681526020018281526020019250505060206040518083038186803b15801561195157600080fd5b505afa158015611965573d6000803e3d6000fd5b505050506040513d602081101561197b57600080fd5b50519392505050565b606080825167ffffffffffffffff8111801561199f57600080fd5b506040519080825280602002602001820160405280156119c9578160200160208202803683370190505b50905060005b8351811015611a7e578381815181106119e457fe5b60200260200101516001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015611a2457600080fd5b505afa158015611a38573d6000803e3d6000fd5b505050506040513d6020811015611a4e57600080fd5b50518251839083908110611a5e57fe5b6001600160a01b03909216602092830291909101909101526001016119cf565b5092915050565b6003546001600160a01b031681565b6000611aad6000805160206131c3833981519152612465565b6001600160a01b03166369be47846040518163ffffffff1660e01b815260040160206040518083038186803b158015611ae557600080fd5b505afa158015611af9573d6000803e3d6000fd5b505050506040513d6020811015611b0f57600080fd5b5051905090565b611b1e612410565b611b2781611f64565b611b70576040805162461bcd60e51b815260206004820152601560248201527422a9292fa4a72b20a624a22fa1a7a72b22a92a22a960591b604482015290519081900360640190fd5b611b7981612859565b50565b6000610edf838361215e565b6001546001600160a01b03163314611bdb576040805162461bcd60e51b815260206004820152601160248201527011549497d050d0d154d4d7d11153925151607a1b604482015290519081900360640190fd5b600154600080546040516001600160a01b0393841693909116917f343765429aea5a34b3ff6a3785a98a5abb2597aca87bfbb58632c173d585373a91a360018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b6000611c586000805160206131c3833981519152612465565b6001600160a01b0316637a5f0ffd6040518163ffffffff1660e01b815260040160206040518083038186803b158015611ae557600080fd5b6002546001600160a01b031681565b6060611cb86000805160206131c3833981519152612465565b6001600160a01b0316637f45c4c36040518163ffffffff1660e01b815260040160006040518083038186803b15801561181857600080fd5b6000611d096000805160206131c3833981519152612465565b6001600160a01b031663865cf194836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015610f6c57600080fd5b6000546001600160a01b031681565b600080826001600160a01b03166371f52bf36040518163ffffffff1660e01b815260040160206040518083038186803b158015611d9757600080fd5b505afa158015611dab573d6000803e3d6000fd5b505050506040513d6020811015611dc157600080fd5b505161ffff16905060608167ffffffffffffffff81118015611de257600080fd5b50604051908082528060200260200182016040528015611e0c578160200160208202803683370190505b50905060608267ffffffffffffffff81118015611e2857600080fd5b50604051908082528060200260200182016040528015611e52578160200160208202803683370190505b50905060005b83811015611f39576000866001600160a01b03166319b64015836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015611ea657600080fd5b505afa158015611eba573d6000803e3d6000fd5b505050506040513d6020811015611ed057600080fd5b505184519091508190859084908110611ee557fe5b60200260200101906001600160a01b031690816001600160a01b031681525050611f0f8782612a14565b838381518110611f1b57fe5b63ffffffff9092166020928302919091019091015250600101611e58565b506000611f50611f498786612a9b565b8484610dff565b6001600160a01b0316141595945050505050565b6000816001600160a01b0316826001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015611fa957600080fd5b505afa158015611fbd573d6000803e3d6000fd5b505050506040513d6020811015611fd357600080fd5b505160408051638da5cb5b60e01b815290516001600160a01b0390921691638da5cb5b91600480820192602092909190829003018186803b15801561201757600080fd5b505afa15801561202b573d6000803e3d6000fd5b505050506040513d602081101561204157600080fd5b50516001600160a01b03161492915050565b6000546001600160a01b0316331480612072575061207081611f64565b155b6120b7576040805162461bcd60e51b815260206004820152601160248201527011549497d050d0d154d4d7d11153925151607a1b604482015290519081900360640190fd5b611b7981612bc0565b6000610ef182611216565b6000610ef182610fa9565b60006120ef6000805160206131c3833981519152612465565b6001600160a01b031663a74498aa836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015610f6c57600080fd5b61213a612410565b600354600280546001600160a01b0319166001600160a01b03909216919091179055565b60006121776000805160206131c3833981519152612465565b6001600160a01b031663725b878684846040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b15801561195157600080fd5b6000610edf60018451116121e95760006121ec565b60015b60ff168484610dff565b600061220f6000805160206131c3833981519152612465565b6001600160a01b031663e571049b6040518163ffffffff1660e01b815260040160206040518083038186803b158015611ae557600080fd5b6001546001600160a01b031681565b6000610edf83836118e4565b600061227b6000805160206131c3833981519152612465565b6001600160a01b0316634123ef60836040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610f6c57600080fd5b6000610cc76121f6565b60006122ea6000805160206131c3833981519152612465565b6001600160a01b031663e85455d7836040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610f6c57600080fd5b606061234f6000805160206131c3833981519152612465565b6001600160a01b03166304ceaf416040518163ffffffff1660e01b815260040160006040518083038186803b15801561181857600080fd5b61238f612410565b6000546001600160a01b03828116911614156123e3576040805162461bcd60e51b815260206004820152600e60248201526d22a9292fa9a0a6a2afa7aba722a960911b604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6060610ef182610ccc565b6000546001600160a01b03163314612463576040805162461bcd60e51b815260206004820152601160248201527011549497d050d0d154d4d7d11153925151607a1b604482015290519081900360640190fd5b565b60025460408051632ecd14d360e21b81526004810184905290516000926001600160a01b03169163bb34534c916024808301926020929190829003018186803b158015610f6c57600080fd5b606060006124cc6000805160206131c3833981519152612465565b90506000816001600160a01b031663a43d5e94856000815181106124ec57fe5b60200260200101516040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561253157600080fd5b505afa158015612545573d6000803e3d6000fd5b505050506040513d602081101561255b57600080fd5b50519050600060015b8551811015612615576000846001600160a01b031663a43d5e9488848151811061258a57fe5b60200260200101516040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156125cf57600080fd5b505afa1580156125e3573d6000803e3d6000fd5b505050506040513d60208110156125f957600080fd5b505190508084111561260c578093508192505b50600101612564565b50826001600160a01b031663f4fb86c086838151811061263157fe5b60200260200101516040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060006040518083038186803b15801561267657600080fd5b505afa15801561268a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156126b357600080fd5b8101908080516040519392919084600160201b8211156126d257600080fd5b9083019060208201858111156126e757600080fd5b82518660208202830111600160201b8211171561270357600080fd5b82525081516020918201928201910280838360005b83811015612730578181015183820152602001612718565b505050509050016040525050509350505050919050565b600080856001600160a01b03166371f52bf36040518163ffffffff1660e01b815260040160206040518083038186803b15801561278357600080fd5b505afa158015612797573d6000803e3d6000fd5b505050506040513d60208110156127ad57600080fd5b505161ffff1690506127bf8682612a9b565b61ffff168561ffff16146127d7576000915050612851565b808451146127e9576000915050612851565b60005b845181101561284a576128128786838151811061280557fe5b6020026020010151612a14565b63ffffffff1684828151811061282457fe5b602002602001015163ffffffff161461284257600092505050612851565b6001016127ec565b5060019150505b949350505050565b60006128726000805160206131c3833981519152612465565b90506000826001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156128af57600080fd5b505afa1580156128c3573d6000803e3d6000fd5b505050506040513d60208110156128d957600080fd5b5051604080516371f52bf360e01b815290519192506000916001600160a01b038616916371f52bf3916004808301926020929190829003018186803b15801561292157600080fd5b505afa158015612935573d6000803e3d6000fd5b505050506040513d602081101561294b57600080fd5b505161ffff16905061295d8383612d74565b6001811115612975576129708383612e47565b612980565b612980838384612ee6565b60005b81811015612a0d57612a0584866001600160a01b03166319b64015846040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156129d357600080fd5b505afa1580156129e7573d6000803e3d6000fd5b505050506040513d60208110156129fd57600080fd5b505185612ee6565b600101612983565b5050505050565b600080836001600160a01b0316630e53aae9846040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060a06040518083038186803b158015612a6457600080fd5b505afa158015612a78573d6000803e3d6000fd5b505050506040513d60a0811015612a8e57600080fd5b5060200151949350505050565b60408051600481526024810182526020810180516001600160e01b0316633e8ff43f60e01b1781529151815160009384936060936001600160a01b03891693919290918291908083835b60208310612b045780518252601f199092019160209182019101612ae5565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d8060008114612b64576040519150601f19603f3d011682016040523d82523d6000602084013e612b69565b606091505b5091509150818015612b7c575080516020145b15612ba257808060200190516020811015612b9657600080fd5b50519250610ef1915050565b60018411612bb1576000612bb4565b60015b60ff1695945050505050565b6000612bd96000805160206131c3833981519152612465565b90506000826001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015612c1657600080fd5b505afa158015612c2a573d6000803e3d6000fd5b505050506040513d6020811015612c4057600080fd5b5051604080516371f52bf360e01b815290519192506000916001600160a01b038616916371f52bf3916004808301926020929190829003018186803b158015612c8857600080fd5b505afa158015612c9c573d6000803e3d6000fd5b505050506040513d6020811015612cb257600080fd5b505161ffff169050612cc48383612f9b565b6001811115612cdc57612cd7838361306e565b612ce7565b612ce783838461310d565b60005b81811015612a0d57612d6c84866001600160a01b03166319b64015846040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015612d3a57600080fd5b505afa158015612d4e573d6000803e3d6000fd5b505050506040513d6020811015612d6457600080fd5b50518561310d565b600101612cea565b816001600160a01b0316638de6c3eb826040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b158015612dc357600080fd5b505af1158015612dd7573d6000803e3d6000fd5b50506040516001600160a01b03841692507fc0a6d303d67b7ed9fa0abae1c48878df32acc0e7ca4334c7dad2bceeee5956fd9150600090a26040516001600160a01b038216907f88881feecdf61136ac4bdb1f681f2f3746a82910263d21ffea94750d2a78c0ab90600090a25050565b816001600160a01b031663ee6a934c826040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b158015612e9657600080fd5b505af1158015612eaa573d6000803e3d6000fd5b50506040516001600160a01b03841692507fb893f883ef734b712208a877459424ee509832c57e0461fb1ac99ed4d42f2d899150600090a25050565b826001600160a01b03166336900c1183836040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b0316815260200192505050600060405180830381600087803b158015612f4657600080fd5b505af1158015612f5a573d6000803e3d6000fd5b50506040516001600160a01b038085169350851691507ff2e7cf6d6ed3f77039511409a43d4fa5108f09ab71d72b014380364c910233a590600090a3505050565b816001600160a01b031663ceb9838c826040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b158015612fea57600080fd5b505af1158015612ffe573d6000803e3d6000fd5b50506040516001600160a01b03841692507fbfdf1baaa7e4871111360083540f067050014f651c9e4610a2a4a4bdf8bfab5d9150600090a26040516001600160a01b038216907f2aff63790c7da80d1c50ede92d23bc841c384837735c92c184331f3d7b91e5bf90600090a25050565b816001600160a01b031663ae22107f826040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b1580156130bd57600080fd5b505af11580156130d1573d6000803e3d6000fd5b50506040516001600160a01b03841692507f59c3fbcae88f30e9b0e35c132a7f68c53231dffa4722f197c7ecb0ee013eee609150600090a25050565b826001600160a01b031663fba8f03183836040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b0316815260200192505050600060405180830381600087803b15801561316d57600080fd5b505af1158015613181573d6000803e3d6000fd5b50506040516001600160a01b038085169350851691507f9430ad6ff45d6c3e126c7711bf0036bd9bc6b202fa19628abd88e59cf43ced4390600090a350505056fe42616e636f72436f6e7665727465725265676973747279446174610000000000a2646970667358221220194ad4e88c4a6ecba42defab4b8f06cdade5dee09f365fba3651e6afa9555a2064736f6c634300060c003300000000000000000000000052ae12abe5d8bd778bd5397f99ca900624cfadd4
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102695760003560e01c80637b10399911610151578063b4c4197a116100c3578063d8cced2a11610087578063d8cced2a14610bef578063e571049b14610c15578063e85455d714610c1d578063effb3c6e14610c43578063f2fde38b14610c4b578063f4fb86c014610c7157610269565b8063b4c4197a14610a62578063c22b82f014610a90578063d3182bed14610bb3578063d4ee1d9014610bbb578063d6c4b5b214610bc357610269565b8063954254f511610115578063954254f5146109ae5780639e76a007146109d4578063a109d214146109fa578063a43d5e9414610a17578063a74498aa14610a3d578063b4a176d314610a5a57610269565b80637b103999146109535780637f45c4c31461095b578063865cf194146109635780638da5cb5b146109805780638f1d0e1a1461098857610269565b80634c7df18f116101ea57806361cd756e116101ae57806361cd756e146108df57806369be4784146108e75780636ce1c4dc146108ef578063725b87861461091557806379ba5097146109435780637a5f0ffd1461094b57610269565b80634c7df18f146105a05780635a0a6618146105bd5780635f1b50fe1461080a578063603f51e414610812578063610c0b051461083e57610269565b80632fe8a6ad116102315780632fe8a6ad146104f85780633ab8857c146105145780634123ef601461053a57806349c5f32b1461056057806349d10b641461059857610269565b8063024c7ec71461026e57806304ceaf411461028f57806311839064146102e75780631d3fccd51461030d5780631f8e262014610457575b600080fd5b61028d6004803603602081101561028457600080fd5b50351515610c97565b005b610297610cbd565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156102d35781810151838201526020016102bb565b505050509050019250505060405180910390f35b610297600480360360208110156102fd57600080fd5b50356001600160a01b0316610ccc565b61043b6004803603606081101561032357600080fd5b61ffff8235169190810190604081016020820135600160201b81111561034857600080fd5b82018360208201111561035a57600080fd5b803590602001918460208302840111600160201b8311171561037b57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156103ca57600080fd5b8201836020820111156103dc57600080fd5b803590602001918460208302840111600160201b831117156103fd57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610dff945050505050565b604080516001600160a01b039092168252519081900360200190f35b6102976004803603602081101561046d57600080fd5b810190602081018135600160201b81111561048757600080fd5b82018360208201111561049957600080fd5b803590602001918460208302840111600160201b831117156104ba57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610ee6945050505050565b610500610ef7565b604080519115158252519081900360200190f35b6105006004803603602081101561052a57600080fd5b50356001600160a01b0316610f07565b6105006004803603602081101561055057600080fd5b50356001600160a01b0316610f9e565b6105866004803603602081101561057657600080fd5b50356001600160a01b0316610fa9565b60408051918252519081900360200190f35b61028d61100e565b61043b600480360360208110156105b657600080fd5b5035611216565b61043b600480360360e08110156105d357600080fd5b61ffff8235169190810190604081016020820135600160201b8111156105f857600080fd5b82018360208201111561060a57600080fd5b803590602001918460018302840111600160201b8311171561062b57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b81111561067d57600080fd5b82018360208201111561068f57600080fd5b803590602001918460018302840111600160201b831117156106b057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929560ff8535169563ffffffff60208701351695919450925060608101915060400135600160201b81111561071757600080fd5b82018360208201111561072957600080fd5b803590602001918460208302840111600160201b8311171561074a57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561079957600080fd5b8201836020820111156107ab57600080fd5b803590602001918460208302840111600160201b831117156107cc57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611272945050505050565b6102976117c7565b61043b6004803603604081101561082857600080fd5b506001600160a01b0381351690602001356118e4565b6102976004803603602081101561085457600080fd5b810190602081018135600160201b81111561086e57600080fd5b82018360208201111561088057600080fd5b803590602001918460208302840111600160201b831117156108a157600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611984945050505050565b61043b611a85565b610586611a94565b61028d6004803603602081101561090557600080fd5b50356001600160a01b0316611b16565b6105006004803603604081101561092b57600080fd5b506001600160a01b0381358116916020013516611b7c565b61028d611b88565b610586611c3f565b61043b611c90565b610297611c9f565b61043b6004803603602081101561097957600080fd5b5035611cf0565b61043b611d4c565b6105006004803603602081101561099e57600080fd5b50356001600160a01b0316611d5b565b610500600480360360208110156109c457600080fd5b50356001600160a01b0316611f64565b61028d600480360360208110156109ea57600080fd5b50356001600160a01b0316612053565b61043b60048036036020811015610a1057600080fd5b50356120c0565b61058660048036036020811015610a2d57600080fd5b50356001600160a01b03166120cb565b61043b60048036036020811015610a5357600080fd5b50356120d6565b61028d612132565b61050060048036036040811015610a7857600080fd5b506001600160a01b038135811691602001351661215e565b61043b60048036036040811015610aa657600080fd5b810190602081018135600160201b811115610ac057600080fd5b820183602082011115610ad257600080fd5b803590602001918460208302840111600160201b83111715610af357600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610b4257600080fd5b820183602082011115610b5457600080fd5b803590602001918460208302840111600160201b83111715610b7557600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506121d4945050505050565b6105866121f6565b61043b612247565b61043b60048036036040811015610bd957600080fd5b506001600160a01b038135169060200135612256565b61050060048036036020811015610c0557600080fd5b50356001600160a01b0316612262565b6105866122c7565b61050060048036036020811015610c3357600080fd5b50356001600160a01b03166122d1565b610297612336565b61028d60048036036020811015610c6157600080fd5b50356001600160a01b0316612387565b61029760048036036020811015610c8757600080fd5b50356001600160a01b0316612405565b610c9f612410565b60038054911515600160a01b0260ff60a01b19909216919091179055565b6060610cc7612336565b905090565b6060610ce56000805160206131c3833981519152612465565b6001600160a01b031663f4fb86c0836040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060006040518083038186803b158015610d3157600080fd5b505afa158015610d45573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015610d6e57600080fd5b8101908080516040519392919084600160201b821115610d8d57600080fd5b908301906020820185811115610da257600080fd5b82518660208202830111600160201b82111715610dbe57600080fd5b82525081516020918201928201910280838360005b83811015610deb578181015183820152602001610dd3565b505050509050016040525050509050919050565b600081518351148015610e13575060018351115b15610edb576060610e23846124b1565b905060005b8151811015610ed8576000828281518110610e3f57fe5b602002602001015190506000816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610e8457600080fd5b505afa158015610e98573d6000803e3d6000fd5b505050506040513d6020811015610eae57600080fd5b50519050610ebe81898989612747565b15610ece57509250610edf915050565b5050600101610e28565b50505b5060005b9392505050565b6060610ef182611984565b92915050565b600354600160a01b900460ff1681565b6000610f206000805160206131c3833981519152612465565b6001600160a01b0316633ab8857c836040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610f6c57600080fd5b505afa158015610f80573d6000803e3d6000fd5b505050506040513d6020811015610f9657600080fd5b505192915050565b6000610ef182612262565b6000610fc26000805160206131c3833981519152612465565b6001600160a01b031663a43d5e94836040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610f6c57600080fd5b6000546001600160a01b03163314806110315750600354600160a01b900460ff16155b611076576040805162461bcd60e51b815260206004820152601160248201527011549497d050d0d154d4d7d11153925151607a1b604482015290519081900360640190fd5b60006110946f436f6e7472616374526567697374727960801b612465565b6002549091506001600160a01b038083169116148015906110bd57506001600160a01b03811615155b611105576040805162461bcd60e51b81526020600482015260146024820152734552525f494e56414c49445f524547495354525960601b604482015290519081900360640190fd5b60006001600160a01b0316816001600160a01b031663bb34534c6f436f6e7472616374526567697374727960801b6040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561116757600080fd5b505afa15801561117b573d6000803e3d6000fd5b505050506040513d602081101561119157600080fd5b50516001600160a01b031614156111e6576040805162461bcd60e51b81526020600482015260146024820152734552525f494e56414c49445f524547495354525960601b604482015290519081900360640190fd5b60028054600380546001600160a01b038084166001600160a01b0319928316179092559091169216919091179055565b600061122f6000805160206131c3833981519152612465565b6001600160a01b031663a109d214836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015610f6c57600080fd5b815181516000919081146112c4576040805162461bcd60e51b81526020600482015260146024820152734552525f494e56414c49445f524553455256455360601b604482015290519081900360640190fd5b60006112d18a8686610dff565b6001600160a01b031614611321576040805162461bcd60e51b81526020600482015260126024820152714552525f414c52454144595f45584953545360701b604482015290519081900360640190fd5b600061133f6f436f6e766572746572466163746f727960801b612465565b90506000816001600160a01b0316632e9ab7b38c8c8c8c6040518563ffffffff1660e01b8152600401808561ffff16815260200180602001806020018460ff168152602001838103835286818151815260200191508051906020019080838360005b838110156113b95781810151838201526020016113a1565b50505050905090810190601f1680156113e65780820380516001836020036101000a031916815260200191505b50838103825285518152855160209182019187019080838360005b83811015611419578181015183820152602001611401565b50505050905090810190601f1680156114465780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600087803b15801561146957600080fd5b505af115801561147d573d6000803e3d6000fd5b505050506040513d602081101561149357600080fd5b505160025460408051630afb25b560e11b815261ffff8f1660048201526001600160a01b038085166024830152928316604482015263ffffffff8b1660648201529051929350600092918516916315f64b6a9160848082019260209290919082900301818787803b15801561150757600080fd5b505af115801561151b573d6000803e3d6000fd5b505050506040513d602081101561153157600080fd5b5051604080516379ba509760e01b815290519192506001600160a01b038416916379ba50979160048082019260009290919082900301818387803b15801561157857600080fd5b505af115801561158c573d6000803e3d6000fd5b50505050806001600160a01b03166379ba50976040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156115cb57600080fd5b505af11580156115df573d6000803e3d6000fd5b5050505060005b8481101561169557816001600160a01b0316636a49d2c489838151811061160957fe5b602002602001015189848151811061161d57fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b031681526020018263ffffffff16815260200192505050600060405180830381600087803b15801561167157600080fd5b505af1158015611685573d6000803e3d6000fd5b5050600190920191506115e69050565b50816001600160a01b031663f2fde38b826040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b1580156116e557600080fd5b505af11580156116f9573d6000803e3d6000fd5b50505050806001600160a01b031663cdc91c696040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561173857600080fd5b505af115801561174c573d6000803e3d6000fd5b50506040805163f2fde38b60e01b815233600482015290516001600160a01b038516935063f2fde38b9250602480830192600092919082900301818387803b15801561179757600080fd5b505af11580156117ab573d6000803e3d6000fd5b505050506117b881612859565b9b9a5050505050505050505050565b60606117e06000805160206131c3833981519152612465565b6001600160a01b0316635f1b50fe6040518163ffffffff1660e01b815260040160006040518083038186803b15801561181857600080fd5b505afa15801561182c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561185557600080fd5b8101908080516040519392919084600160201b82111561187457600080fd5b90830190602082018581111561188957600080fd5b82518660208202830111600160201b821117156118a557600080fd5b82525081516020918201928201910280838360005b838110156118d25781810151838201526020016118ba565b50505050905001604052505050905090565b60006118fd6000805160206131c3833981519152612465565b6001600160a01b031663d6c4b5b284846040518363ffffffff1660e01b815260040180836001600160a01b031681526020018281526020019250505060206040518083038186803b15801561195157600080fd5b505afa158015611965573d6000803e3d6000fd5b505050506040513d602081101561197b57600080fd5b50519392505050565b606080825167ffffffffffffffff8111801561199f57600080fd5b506040519080825280602002602001820160405280156119c9578160200160208202803683370190505b50905060005b8351811015611a7e578381815181106119e457fe5b60200260200101516001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015611a2457600080fd5b505afa158015611a38573d6000803e3d6000fd5b505050506040513d6020811015611a4e57600080fd5b50518251839083908110611a5e57fe5b6001600160a01b03909216602092830291909101909101526001016119cf565b5092915050565b6003546001600160a01b031681565b6000611aad6000805160206131c3833981519152612465565b6001600160a01b03166369be47846040518163ffffffff1660e01b815260040160206040518083038186803b158015611ae557600080fd5b505afa158015611af9573d6000803e3d6000fd5b505050506040513d6020811015611b0f57600080fd5b5051905090565b611b1e612410565b611b2781611f64565b611b70576040805162461bcd60e51b815260206004820152601560248201527422a9292fa4a72b20a624a22fa1a7a72b22a92a22a960591b604482015290519081900360640190fd5b611b7981612859565b50565b6000610edf838361215e565b6001546001600160a01b03163314611bdb576040805162461bcd60e51b815260206004820152601160248201527011549497d050d0d154d4d7d11153925151607a1b604482015290519081900360640190fd5b600154600080546040516001600160a01b0393841693909116917f343765429aea5a34b3ff6a3785a98a5abb2597aca87bfbb58632c173d585373a91a360018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b6000611c586000805160206131c3833981519152612465565b6001600160a01b0316637a5f0ffd6040518163ffffffff1660e01b815260040160206040518083038186803b158015611ae557600080fd5b6002546001600160a01b031681565b6060611cb86000805160206131c3833981519152612465565b6001600160a01b0316637f45c4c36040518163ffffffff1660e01b815260040160006040518083038186803b15801561181857600080fd5b6000611d096000805160206131c3833981519152612465565b6001600160a01b031663865cf194836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015610f6c57600080fd5b6000546001600160a01b031681565b600080826001600160a01b03166371f52bf36040518163ffffffff1660e01b815260040160206040518083038186803b158015611d9757600080fd5b505afa158015611dab573d6000803e3d6000fd5b505050506040513d6020811015611dc157600080fd5b505161ffff16905060608167ffffffffffffffff81118015611de257600080fd5b50604051908082528060200260200182016040528015611e0c578160200160208202803683370190505b50905060608267ffffffffffffffff81118015611e2857600080fd5b50604051908082528060200260200182016040528015611e52578160200160208202803683370190505b50905060005b83811015611f39576000866001600160a01b03166319b64015836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015611ea657600080fd5b505afa158015611eba573d6000803e3d6000fd5b505050506040513d6020811015611ed057600080fd5b505184519091508190859084908110611ee557fe5b60200260200101906001600160a01b031690816001600160a01b031681525050611f0f8782612a14565b838381518110611f1b57fe5b63ffffffff9092166020928302919091019091015250600101611e58565b506000611f50611f498786612a9b565b8484610dff565b6001600160a01b0316141595945050505050565b6000816001600160a01b0316826001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015611fa957600080fd5b505afa158015611fbd573d6000803e3d6000fd5b505050506040513d6020811015611fd357600080fd5b505160408051638da5cb5b60e01b815290516001600160a01b0390921691638da5cb5b91600480820192602092909190829003018186803b15801561201757600080fd5b505afa15801561202b573d6000803e3d6000fd5b505050506040513d602081101561204157600080fd5b50516001600160a01b03161492915050565b6000546001600160a01b0316331480612072575061207081611f64565b155b6120b7576040805162461bcd60e51b815260206004820152601160248201527011549497d050d0d154d4d7d11153925151607a1b604482015290519081900360640190fd5b611b7981612bc0565b6000610ef182611216565b6000610ef182610fa9565b60006120ef6000805160206131c3833981519152612465565b6001600160a01b031663a74498aa836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015610f6c57600080fd5b61213a612410565b600354600280546001600160a01b0319166001600160a01b03909216919091179055565b60006121776000805160206131c3833981519152612465565b6001600160a01b031663725b878684846040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b15801561195157600080fd5b6000610edf60018451116121e95760006121ec565b60015b60ff168484610dff565b600061220f6000805160206131c3833981519152612465565b6001600160a01b031663e571049b6040518163ffffffff1660e01b815260040160206040518083038186803b158015611ae557600080fd5b6001546001600160a01b031681565b6000610edf83836118e4565b600061227b6000805160206131c3833981519152612465565b6001600160a01b0316634123ef60836040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610f6c57600080fd5b6000610cc76121f6565b60006122ea6000805160206131c3833981519152612465565b6001600160a01b031663e85455d7836040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610f6c57600080fd5b606061234f6000805160206131c3833981519152612465565b6001600160a01b03166304ceaf416040518163ffffffff1660e01b815260040160006040518083038186803b15801561181857600080fd5b61238f612410565b6000546001600160a01b03828116911614156123e3576040805162461bcd60e51b815260206004820152600e60248201526d22a9292fa9a0a6a2afa7aba722a960911b604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6060610ef182610ccc565b6000546001600160a01b03163314612463576040805162461bcd60e51b815260206004820152601160248201527011549497d050d0d154d4d7d11153925151607a1b604482015290519081900360640190fd5b565b60025460408051632ecd14d360e21b81526004810184905290516000926001600160a01b03169163bb34534c916024808301926020929190829003018186803b158015610f6c57600080fd5b606060006124cc6000805160206131c3833981519152612465565b90506000816001600160a01b031663a43d5e94856000815181106124ec57fe5b60200260200101516040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561253157600080fd5b505afa158015612545573d6000803e3d6000fd5b505050506040513d602081101561255b57600080fd5b50519050600060015b8551811015612615576000846001600160a01b031663a43d5e9488848151811061258a57fe5b60200260200101516040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156125cf57600080fd5b505afa1580156125e3573d6000803e3d6000fd5b505050506040513d60208110156125f957600080fd5b505190508084111561260c578093508192505b50600101612564565b50826001600160a01b031663f4fb86c086838151811061263157fe5b60200260200101516040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060006040518083038186803b15801561267657600080fd5b505afa15801561268a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156126b357600080fd5b8101908080516040519392919084600160201b8211156126d257600080fd5b9083019060208201858111156126e757600080fd5b82518660208202830111600160201b8211171561270357600080fd5b82525081516020918201928201910280838360005b83811015612730578181015183820152602001612718565b505050509050016040525050509350505050919050565b600080856001600160a01b03166371f52bf36040518163ffffffff1660e01b815260040160206040518083038186803b15801561278357600080fd5b505afa158015612797573d6000803e3d6000fd5b505050506040513d60208110156127ad57600080fd5b505161ffff1690506127bf8682612a9b565b61ffff168561ffff16146127d7576000915050612851565b808451146127e9576000915050612851565b60005b845181101561284a576128128786838151811061280557fe5b6020026020010151612a14565b63ffffffff1684828151811061282457fe5b602002602001015163ffffffff161461284257600092505050612851565b6001016127ec565b5060019150505b949350505050565b60006128726000805160206131c3833981519152612465565b90506000826001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156128af57600080fd5b505afa1580156128c3573d6000803e3d6000fd5b505050506040513d60208110156128d957600080fd5b5051604080516371f52bf360e01b815290519192506000916001600160a01b038616916371f52bf3916004808301926020929190829003018186803b15801561292157600080fd5b505afa158015612935573d6000803e3d6000fd5b505050506040513d602081101561294b57600080fd5b505161ffff16905061295d8383612d74565b6001811115612975576129708383612e47565b612980565b612980838384612ee6565b60005b81811015612a0d57612a0584866001600160a01b03166319b64015846040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156129d357600080fd5b505afa1580156129e7573d6000803e3d6000fd5b505050506040513d60208110156129fd57600080fd5b505185612ee6565b600101612983565b5050505050565b600080836001600160a01b0316630e53aae9846040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060a06040518083038186803b158015612a6457600080fd5b505afa158015612a78573d6000803e3d6000fd5b505050506040513d60a0811015612a8e57600080fd5b5060200151949350505050565b60408051600481526024810182526020810180516001600160e01b0316633e8ff43f60e01b1781529151815160009384936060936001600160a01b03891693919290918291908083835b60208310612b045780518252601f199092019160209182019101612ae5565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d8060008114612b64576040519150601f19603f3d011682016040523d82523d6000602084013e612b69565b606091505b5091509150818015612b7c575080516020145b15612ba257808060200190516020811015612b9657600080fd5b50519250610ef1915050565b60018411612bb1576000612bb4565b60015b60ff1695945050505050565b6000612bd96000805160206131c3833981519152612465565b90506000826001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015612c1657600080fd5b505afa158015612c2a573d6000803e3d6000fd5b505050506040513d6020811015612c4057600080fd5b5051604080516371f52bf360e01b815290519192506000916001600160a01b038616916371f52bf3916004808301926020929190829003018186803b158015612c8857600080fd5b505afa158015612c9c573d6000803e3d6000fd5b505050506040513d6020811015612cb257600080fd5b505161ffff169050612cc48383612f9b565b6001811115612cdc57612cd7838361306e565b612ce7565b612ce783838461310d565b60005b81811015612a0d57612d6c84866001600160a01b03166319b64015846040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015612d3a57600080fd5b505afa158015612d4e573d6000803e3d6000fd5b505050506040513d6020811015612d6457600080fd5b50518561310d565b600101612cea565b816001600160a01b0316638de6c3eb826040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b158015612dc357600080fd5b505af1158015612dd7573d6000803e3d6000fd5b50506040516001600160a01b03841692507fc0a6d303d67b7ed9fa0abae1c48878df32acc0e7ca4334c7dad2bceeee5956fd9150600090a26040516001600160a01b038216907f88881feecdf61136ac4bdb1f681f2f3746a82910263d21ffea94750d2a78c0ab90600090a25050565b816001600160a01b031663ee6a934c826040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b158015612e9657600080fd5b505af1158015612eaa573d6000803e3d6000fd5b50506040516001600160a01b03841692507fb893f883ef734b712208a877459424ee509832c57e0461fb1ac99ed4d42f2d899150600090a25050565b826001600160a01b03166336900c1183836040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b0316815260200192505050600060405180830381600087803b158015612f4657600080fd5b505af1158015612f5a573d6000803e3d6000fd5b50506040516001600160a01b038085169350851691507ff2e7cf6d6ed3f77039511409a43d4fa5108f09ab71d72b014380364c910233a590600090a3505050565b816001600160a01b031663ceb9838c826040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b158015612fea57600080fd5b505af1158015612ffe573d6000803e3d6000fd5b50506040516001600160a01b03841692507fbfdf1baaa7e4871111360083540f067050014f651c9e4610a2a4a4bdf8bfab5d9150600090a26040516001600160a01b038216907f2aff63790c7da80d1c50ede92d23bc841c384837735c92c184331f3d7b91e5bf90600090a25050565b816001600160a01b031663ae22107f826040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b1580156130bd57600080fd5b505af11580156130d1573d6000803e3d6000fd5b50506040516001600160a01b03841692507f59c3fbcae88f30e9b0e35c132a7f68c53231dffa4722f197c7ecb0ee013eee609150600090a25050565b826001600160a01b031663fba8f03183836040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b0316815260200192505050600060405180830381600087803b15801561316d57600080fd5b505af1158015613181573d6000803e3d6000fd5b50506040516001600160a01b038085169350851691507f9430ad6ff45d6c3e126c7711bf0036bd9bc6b202fa19628abd88e59cf43ced4390600090a350505056fe42616e636f72436f6e7665727465725265676973747279446174610000000000a2646970667358221220194ad4e88c4a6ecba42defab4b8f06cdade5dee09f365fba3651e6afa9555a2064736f6c634300060c0033
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
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ 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.