More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 4,565 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Accept Ownership | 11029520 | 1534 days ago | IN | 0 ETH | 0.00111995 | ||||
X Convert Priori... | 8205828 | 1980 days ago | IN | 0 ETH | 0.0029801 | ||||
X Convert Priori... | 8205827 | 1980 days ago | IN | 0 ETH | 0.0029801 | ||||
X Convert Priori... | 8205826 | 1980 days ago | IN | 0 ETH | 0.00297636 | ||||
X Convert Priori... | 8205822 | 1980 days ago | IN | 0 ETH | 0.00297559 | ||||
X Convert Priori... | 8205812 | 1980 days ago | IN | 2 ETH | 0.00302148 | ||||
X Convert Priori... | 8205600 | 1980 days ago | IN | 0 ETH | 0.00279326 | ||||
X Convert Priori... | 8205511 | 1980 days ago | IN | 1 ETH | 0.00301917 | ||||
X Convert Priori... | 8203956 | 1980 days ago | IN | 1.26030244 ETH | 0.00176195 | ||||
X Convert Priori... | 8203852 | 1980 days ago | IN | 8 ETH | 0.00176253 | ||||
X Convert Priori... | 8203763 | 1980 days ago | IN | 4 ETH | 0.00176297 | ||||
X Convert Priori... | 8203676 | 1980 days ago | IN | 0 ETH | 0.00176045 | ||||
X Convert Priori... | 8203506 | 1980 days ago | IN | 0.24 ETH | 0.00176253 | ||||
X Convert Priori... | 8203461 | 1980 days ago | IN | 0 ETH | 0.00165487 | ||||
X Convert Priori... | 8203453 | 1980 days ago | IN | 0 ETH | 0.00176089 | ||||
X Convert Priori... | 8202313 | 1980 days ago | IN | 0.07560069 ETH | 0.00176387 | ||||
X Convert Priori... | 8202292 | 1980 days ago | IN | 0.1173373 ETH | 0.00176342 | ||||
X Convert Priori... | 8202223 | 1980 days ago | IN | 0.01039254 ETH | 0.00176208 | ||||
X Convert Priori... | 8202212 | 1980 days ago | IN | 0.01080419 ETH | 0.00176253 | ||||
X Convert Priori... | 8202154 | 1980 days ago | IN | 0.23899719 ETH | 0.00176342 | ||||
X Convert Priori... | 8202118 | 1980 days ago | IN | 0.23329956 ETH | 0.00176342 | ||||
X Convert Priori... | 8201377 | 1980 days ago | IN | 0 ETH | 0.00223541 | ||||
X Convert Priori... | 8201367 | 1980 days ago | IN | 0 ETH | 0.00226401 | ||||
X Convert Priori... | 8201335 | 1981 days ago | IN | 0 ETH | 0.00270487 | ||||
X Convert Priori... | 8200869 | 1981 days ago | IN | 0.08181888 ETH | 0.00201329 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
8882230 | 1874 days ago | 9.46423617 ETH | ||||
8882230 | 1874 days ago | 9.46423617 ETH | ||||
8882230 | 1874 days ago | 9.46423617 ETH | ||||
8882230 | 1874 days ago | 9.46423617 ETH | ||||
8882230 | 1874 days ago | 9.46423617 ETH | ||||
8882230 | 1874 days ago | 9.46423617 ETH | ||||
8882229 | 1874 days ago | 9.46423617 ETH | ||||
8882229 | 1874 days ago | 9.46423617 ETH | ||||
8882227 | 1874 days ago | 9.46423617 ETH | ||||
8882227 | 1874 days ago | 9.46423617 ETH | ||||
8882215 | 1874 days ago | 9.46423617 ETH | ||||
8882215 | 1874 days ago | 9.46423617 ETH | ||||
8882215 | 1874 days ago | 9.46423617 ETH | ||||
8882215 | 1874 days ago | 9.46423617 ETH | ||||
8882214 | 1874 days ago | 9.46423617 ETH | ||||
8882214 | 1874 days ago | 9.46423617 ETH | ||||
8882211 | 1874 days ago | 9.46423617 ETH | ||||
8882211 | 1874 days ago | 9.46423617 ETH | ||||
8743256 | 1896 days ago | 1.47014047 ETH | ||||
8743256 | 1896 days ago | 1.47014047 ETH | ||||
8737139 | 1897 days ago | 4.7 ETH | ||||
8737139 | 1897 days ago | 4.7 ETH | ||||
8734463 | 1897 days ago | 1.65502427 ETH | ||||
8734463 | 1897 days ago | 1.65502427 ETH | ||||
8722382 | 1899 days ago | 9.8289586 ETH |
Loading...
Loading
Contract Name:
BancorNetwork
Compiler Version
v0.4.24+commit.e67f0147
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2019-01-29 */ pragma solidity ^0.4.24; // File: contracts/token/interfaces/IERC20Token.sol /* ERC20 Standard Token interface */ contract IERC20Token { // these functions aren't abstract since the compiler emits automatically generated getter functions as external function name() public view returns (string) {} function symbol() public view returns (string) {} function decimals() public view returns (uint8) {} function totalSupply() public view returns (uint256) {} function balanceOf(address _owner) public view returns (uint256) { _owner; } function allowance(address _owner, address _spender) public view returns (uint256) { _owner; _spender; } function transfer(address _to, uint256 _value) public returns (bool success); function transferFrom(address _from, address _to, uint256 _value) public returns (bool success); function approve(address _spender, uint256 _value) public returns (bool success); } // File: contracts/IBancorNetwork.sol /* Bancor Network interface */ contract IBancorNetwork { function convert(IERC20Token[] _path, uint256 _amount, uint256 _minReturn) public payable returns (uint256); function convertFor(IERC20Token[] _path, uint256 _amount, uint256 _minReturn, address _for) public payable returns (uint256); function convertForPrioritized3( IERC20Token[] _path, uint256 _amount, uint256 _minReturn, address _for, uint256 _customVal, uint256 _block, uint8 _v, bytes32 _r, bytes32 _s ) public payable returns (uint256); // deprecated, backward compatibility function convertForPrioritized2( IERC20Token[] _path, uint256 _amount, uint256 _minReturn, address _for, uint256 _block, uint8 _v, bytes32 _r, bytes32 _s ) public payable returns (uint256); // deprecated, backward compatibility function convertForPrioritized( IERC20Token[] _path, uint256 _amount, uint256 _minReturn, address _for, uint256 _block, uint256 _nonce, uint8 _v, bytes32 _r, bytes32 _s ) public payable returns (uint256); } // File: contracts/ContractIds.sol /** Id definitions for bancor contracts Can be used in conjunction with the contract registry to get contract addresses */ contract ContractIds { // generic bytes32 public constant CONTRACT_FEATURES = "ContractFeatures"; bytes32 public constant CONTRACT_REGISTRY = "ContractRegistry"; bytes32 public constant NON_STANDARD_TOKEN_REGISTRY = "NonStandardTokenRegistry"; // bancor logic bytes32 public constant BANCOR_NETWORK = "BancorNetwork"; bytes32 public constant BANCOR_FORMULA = "BancorFormula"; bytes32 public constant BANCOR_GAS_PRICE_LIMIT = "BancorGasPriceLimit"; bytes32 public constant BANCOR_CONVERTER_UPGRADER = "BancorConverterUpgrader"; bytes32 public constant BANCOR_CONVERTER_FACTORY = "BancorConverterFactory"; // BNT core bytes32 public constant BNT_TOKEN = "BNTToken"; bytes32 public constant BNT_CONVERTER = "BNTConverter"; // BancorX bytes32 public constant BANCOR_X = "BancorX"; bytes32 public constant BANCOR_X_UPGRADER = "BancorXUpgrader"; } // File: contracts/FeatureIds.sol /** Id definitions for bancor contract features Can be used to query the ContractFeatures contract to check whether a certain feature is supported by a contract */ contract FeatureIds { // converter features uint256 public constant CONVERTER_CONVERSION_WHITELIST = 1 << 0; } // File: contracts/utility/interfaces/IWhitelist.sol /* Whitelist interface */ contract IWhitelist { function isWhitelisted(address _address) public view returns (bool); } // File: contracts/converter/interfaces/IBancorConverter.sol /* Bancor Converter interface */ contract IBancorConverter { function getReturn(IERC20Token _fromToken, IERC20Token _toToken, uint256 _amount) public view returns (uint256, uint256); function convert(IERC20Token _fromToken, IERC20Token _toToken, uint256 _amount, uint256 _minReturn) public returns (uint256); function conversionWhitelist() public view returns (IWhitelist) {} function conversionFee() public view returns (uint32) {} function connectors(address _address) public view returns (uint256, uint32, bool, bool, bool) { _address; } function getConnectorBalance(IERC20Token _connectorToken) public view returns (uint256); function claimTokens(address _from, uint256 _amount) public; // deprecated, backward compatibility function change(IERC20Token _fromToken, IERC20Token _toToken, uint256 _amount, uint256 _minReturn) public returns (uint256); } // File: contracts/converter/interfaces/IBancorFormula.sol /* Bancor Formula interface */ contract IBancorFormula { function calculatePurchaseReturn(uint256 _supply, uint256 _connectorBalance, uint32 _connectorWeight, uint256 _depositAmount) public view returns (uint256); function calculateSaleReturn(uint256 _supply, uint256 _connectorBalance, uint32 _connectorWeight, uint256 _sellAmount) public view returns (uint256); function calculateCrossConnectorReturn(uint256 _fromConnectorBalance, uint32 _fromConnectorWeight, uint256 _toConnectorBalance, uint32 _toConnectorWeight, uint256 _amount) public view returns (uint256); } // File: contracts/converter/interfaces/IBancorGasPriceLimit.sol /* Bancor Gas Price Limit interface */ contract IBancorGasPriceLimit { function gasPrice() public view returns (uint256) {} function validateGasPrice(uint256) public view; } // File: contracts/utility/interfaces/IOwned.sol /* Owned contract interface */ contract IOwned { // this function isn't abstract since the compiler emits automatically generated getter functions as external function owner() public view returns (address) {} function transferOwnership(address _newOwner) public; function acceptOwnership() public; } // File: contracts/utility/Owned.sol /* Provides support and utilities for contract ownership */ contract Owned is IOwned { address public owner; address public newOwner; event OwnerUpdate(address indexed _prevOwner, address indexed _newOwner); /** @dev constructor */ constructor() public { owner = msg.sender; } // allows execution by the owner only modifier ownerOnly { require(msg.sender == owner); _; } /** @dev allows transferring the contract ownership the new owner still needs to accept the transfer can only be called by the contract owner @param _newOwner new contract owner */ function transferOwnership(address _newOwner) public ownerOnly { require(_newOwner != owner); newOwner = _newOwner; } /** @dev used by a new owner to accept an ownership transfer */ function acceptOwnership() public { require(msg.sender == newOwner); emit OwnerUpdate(owner, newOwner); owner = newOwner; newOwner = address(0); } } // File: contracts/utility/Utils.sol /* Utilities & Common Modifiers */ contract Utils { /** constructor */ constructor() public { } // verifies that an amount is greater than zero modifier greaterThanZero(uint256 _amount) { require(_amount > 0); _; } // validates an address - currently only checks that it isn't null modifier validAddress(address _address) { require(_address != address(0)); _; } // verifies that the address is different than this contract address modifier notThis(address _address) { require(_address != address(this)); _; } } // File: contracts/utility/interfaces/ITokenHolder.sol /* Token Holder interface */ contract ITokenHolder is IOwned { function withdrawTokens(IERC20Token _token, address _to, uint256 _amount) public; } // File: contracts/token/interfaces/INonStandardERC20.sol /* ERC20 Standard Token interface which doesn't return true/false for transfer, transferFrom and approve */ contract INonStandardERC20 { // these functions aren't abstract since the compiler emits automatically generated getter functions as external function name() public view returns (string) {} function symbol() public view returns (string) {} function decimals() public view returns (uint8) {} function totalSupply() public view returns (uint256) {} function balanceOf(address _owner) public view returns (uint256) { _owner; } function allowance(address _owner, address _spender) public view returns (uint256) { _owner; _spender; } function transfer(address _to, uint256 _value) public; function transferFrom(address _from, address _to, uint256 _value) public; function approve(address _spender, uint256 _value) public; } // File: contracts/utility/TokenHolder.sol /* We consider every contract to be a 'token holder' since it's currently not possible for a contract to deny receiving tokens. The TokenHolder's contract sole purpose is to provide a safety mechanism that allows the owner to send tokens that were sent to the contract by mistake back to their sender. Note that we use the non standard ERC-20 interface which has no return value for transfer in order to support both non standard as well as standard token contracts. see https://github.com/ethereum/solidity/issues/4116 */ contract TokenHolder is ITokenHolder, Owned, Utils { /** @dev constructor */ constructor() public { } /** @dev withdraws tokens held by the contract and sends them to an account can only be called by the owner @param _token ERC20 token contract address @param _to account to receive the new amount @param _amount amount to withdraw */ function withdrawTokens(IERC20Token _token, address _to, uint256 _amount) public ownerOnly validAddress(_token) validAddress(_to) notThis(_to) { INonStandardERC20(_token).transfer(_to, _amount); } } // File: contracts/utility/SafeMath.sol /* Library for basic math operations with overflow/underflow protection */ library SafeMath { /** @dev returns the sum of _x and _y, reverts if the calculation overflows @param _x value 1 @param _y value 2 @return sum */ function add(uint256 _x, uint256 _y) internal pure returns (uint256) { uint256 z = _x + _y; require(z >= _x); return z; } /** @dev returns the difference of _x minus _y, reverts if the calculation underflows @param _x minuend @param _y subtrahend @return difference */ function sub(uint256 _x, uint256 _y) internal pure returns (uint256) { require(_x >= _y); return _x - _y; } /** @dev returns the product of multiplying _x by _y, reverts if the calculation overflows @param _x factor 1 @param _y factor 2 @return product */ function mul(uint256 _x, uint256 _y) internal pure returns (uint256) { // gas optimization if (_x == 0) return 0; uint256 z = _x * _y; require(z / _x == _y); return z; } /** @dev Integer division of two numbers truncating the quotient, reverts on division by zero. @param _x dividend @param _y divisor @return quotient */ function div(uint256 _x, uint256 _y) internal pure returns (uint256) { require(_y > 0); uint256 c = _x / _y; return c; } } // File: contracts/utility/interfaces/IContractRegistry.sol /* Contract Registry interface */ contract IContractRegistry { function addressOf(bytes32 _contractName) public view returns (address); // deprecated, backward compatibility function getAddress(bytes32 _contractName) public view returns (address); } // File: contracts/utility/interfaces/IContractFeatures.sol /* Contract Features interface */ contract IContractFeatures { function isSupported(address _contract, uint256 _features) public view returns (bool); function enableFeatures(uint256 _features, bool _enable) public; } // File: contracts/utility/interfaces/IAddressList.sol /* Address list interface */ contract IAddressList { mapping (address => bool) public listedAddresses; } // File: contracts/token/interfaces/IEtherToken.sol /* Ether Token interface */ contract IEtherToken is ITokenHolder, IERC20Token { function deposit() public payable; function withdraw(uint256 _amount) public; function withdrawTo(address _to, uint256 _amount) public; } // File: contracts/token/interfaces/ISmartToken.sol /* Smart Token interface */ contract ISmartToken is IOwned, IERC20Token { function disableTransfers(bool _disable) public; function issue(address _to, uint256 _amount) public; function destroy(address _from, uint256 _amount) public; } // File: contracts/bancorx/interfaces/IBancorX.sol contract IBancorX { function xTransfer(bytes32 _toBlockchain, bytes32 _to, uint256 _amount, uint256 _id) public; function getXTransferAmount(uint256 _xTransferId, address _for) public view returns (uint256); } // File: contracts/BancorNetwork.sol /* The BancorNetwork contract is the main entry point for bancor token conversions. It also allows converting between any token in the bancor network to any other token in a single transaction by providing a conversion path. A note on conversion path - Conversion path is a data structure that's used when converting a token to another token in the bancor network when the conversion cannot necessarily be done by single converter and might require multiple 'hops'. The path defines which converters should be used and what kind of conversion should be done in each step. The path format doesn't include complex structure and instead, it is represented by a single array in which each 'hop' is represented by a 2-tuple - smart token & to token. In addition, the first element is always the source token. The smart token is only used as a pointer to a converter (since converter addresses are more likely to change). Format: [source token, smart token, to token, smart token, to token...] */ contract BancorNetwork is IBancorNetwork, TokenHolder, ContractIds, FeatureIds { using SafeMath for uint256; uint64 private constant MAX_CONVERSION_FEE = 1000000; address public signerAddress = 0x0; // verified address that allows conversions with higher gas price IContractRegistry public registry; // contract registry contract address mapping (address => bool) public etherTokens; // list of all supported ether tokens mapping (bytes32 => bool) public conversionHashes; // list of conversion hashes, to prevent re-use of the same hash /** @dev constructor @param _registry address of a contract registry contract */ constructor(IContractRegistry _registry) public validAddress(_registry) { registry = _registry; } // validates a conversion path - verifies that the number of elements is odd and that maximum number of 'hops' is 10 modifier validConversionPath(IERC20Token[] _path) { require(_path.length > 2 && _path.length <= (1 + 2 * 10) && _path.length % 2 == 1); _; } /* @dev allows the owner to update the contract registry contract address @param _registry address of a contract registry contract */ function setRegistry(IContractRegistry _registry) public ownerOnly validAddress(_registry) notThis(_registry) { registry = _registry; } /* @dev allows the owner to update the signer address @param _signerAddress new signer address */ function setSignerAddress(address _signerAddress) public ownerOnly validAddress(_signerAddress) notThis(_signerAddress) { signerAddress = _signerAddress; } /** @dev allows the owner to register/unregister ether tokens @param _token ether token contract address @param _register true to register, false to unregister */ function registerEtherToken(IEtherToken _token, bool _register) public ownerOnly validAddress(_token) notThis(_token) { etherTokens[_token] = _register; } /** @dev verifies that the signer address is trusted by recovering the address associated with the public key from elliptic curve signature, returns zero on error. notice that the signature is valid only for one conversion and expires after the give block. @return true if the signer is verified */ function verifyTrustedSender(IERC20Token[] _path, uint256 _customVal, uint256 _block, address _addr, uint8 _v, bytes32 _r, bytes32 _s) private returns(bool) { bytes32 hash = keccak256(_block, tx.gasprice, _addr, msg.sender, _customVal, _path); // checking that it is the first conversion with the given signature // and that the current block number doesn't exceeded the maximum block // number that's allowed with the current signature require(!conversionHashes[hash] && block.number <= _block); // recovering the signing address and comparing it to the trusted signer // address that was set in the contract bytes32 prefixedHash = keccak256("\x19Ethereum Signed Message:\n32", hash); bool verified = ecrecover(prefixedHash, _v, _r, _s) == signerAddress; // if the signer is the trusted signer - mark the hash so that it can't // be used multiple times if (verified) conversionHashes[hash] = true; return verified; } /** @dev validates xConvert call by verifying the path format, claiming the callers tokens (if not ETH), and verifying the gas price limit @param _path conversion path, see conversion path format above @param _amount amount to convert from (in the initial source token) @param _block if the current block exceeded the given parameter - it is cancelled @param _v (signature[128:130]) associated with the signer address and helps to validate if the signature is legit @param _r (signature[0:64]) associated with the signer address and helps to validate if the signature is legit @param _s (signature[64:128]) associated with the signer address and helps to validate if the signature is legit */ function validateXConversion( IERC20Token[] _path, uint256 _amount, uint256 _block, uint8 _v, bytes32 _r, bytes32 _s ) private validConversionPath(_path) { // if ETH is provided, ensure that the amount is identical to _amount and verify that the source token is an ether token IERC20Token fromToken = _path[0]; require(msg.value == 0 || (_amount == msg.value && etherTokens[fromToken])); // require that the dest token is BNT require(_path[_path.length - 1] == registry.addressOf(ContractIds.BNT_TOKEN)); // if ETH was sent with the call, the source is an ether token - deposit the ETH in it // otherwise, we claim the tokens from the sender if (msg.value > 0) { IEtherToken(fromToken).deposit.value(msg.value)(); } else { ensureTransferFrom(fromToken, msg.sender, this, _amount); } // verify gas price limit if (_v == 0x0 && _r == 0x0 && _s == 0x0) { IBancorGasPriceLimit gasPriceLimit = IBancorGasPriceLimit(registry.addressOf(ContractIds.BANCOR_GAS_PRICE_LIMIT)); gasPriceLimit.validateGasPrice(tx.gasprice); } else { require(verifyTrustedSender(_path, _amount, _block, msg.sender, _v, _r, _s)); } } /** @dev converts the token to any other token in the bancor network by following a predefined conversion path and transfers the result tokens to a target account note that the converter should already own the source tokens @param _path conversion path, see conversion path format above @param _amount amount to convert from (in the initial source token) @param _minReturn if the conversion results in an amount smaller than the minimum return - it is cancelled, must be nonzero @param _for account that will receive the conversion result @return tokens issued in return */ function convertFor(IERC20Token[] _path, uint256 _amount, uint256 _minReturn, address _for) public payable returns (uint256) { return convertForPrioritized3(_path, _amount, _minReturn, _for, _amount, 0x0, 0x0, 0x0, 0x0); } /** @dev converts the token to any other token in the bancor network by following a predefined conversion path and transfers the result tokens to a target account. this version of the function also allows the verified signer to bypass the universal gas price limit. note that the converter should already own the source tokens @param _path conversion path, see conversion path format above @param _amount amount to convert from (in the initial source token) @param _minReturn if the conversion results in an amount smaller than the minimum return - it is cancelled, must be nonzero @param _for account that will receive the conversion result @param _customVal custom value that was signed for prioritized conversion @param _block if the current block exceeded the given parameter - it is cancelled @param _v (signature[128:130]) associated with the signer address and helps to validate if the signature is legit @param _r (signature[0:64]) associated with the signer address and helps to validate if the signature is legit @param _s (signature[64:128]) associated with the signer address and helps to validate if the signature is legit @return tokens issued in return */ function convertForPrioritized3( IERC20Token[] _path, uint256 _amount, uint256 _minReturn, address _for, uint256 _customVal, uint256 _block, uint8 _v, bytes32 _r, bytes32 _s ) public payable returns (uint256) { // if ETH is provided, ensure that the amount is identical to _amount and verify that the source token is an ether token IERC20Token fromToken = _path[0]; require(msg.value == 0 || (_amount == msg.value && etherTokens[fromToken])); // if ETH was sent with the call, the source is an ether token - deposit the ETH in it // otherwise, we assume we already have the tokens if (msg.value > 0) IEtherToken(fromToken).deposit.value(msg.value)(); return convertForInternal(_path, _amount, _minReturn, _for, _customVal, _block, _v, _r, _s); } /** @dev converts any other token to BNT in the bancor network by following a predefined conversion path and transfers the resulting tokens to BancorX. note that the network should already have been given allowance of the source token (if not ETH) @param _path conversion path, see conversion path format above @param _amount amount to convert from (in the initial source token) @param _minReturn if the conversion results in an amount smaller than the minimum return - it is cancelled, must be nonzero @param _toBlockchain blockchain BNT will be issued on @param _to address/account on _toBlockchain to send the BNT to @param _conversionId pre-determined unique (if non zero) id which refers to this transaction @return the amount of BNT received from this conversion */ function xConvert( IERC20Token[] _path, uint256 _amount, uint256 _minReturn, bytes32 _toBlockchain, bytes32 _to, uint256 _conversionId ) public payable returns (uint256) { return xConvertPrioritized(_path, _amount, _minReturn, _toBlockchain, _to, _conversionId, 0x0, 0x0, 0x0, 0x0); } /** @dev converts any other token to BNT in the bancor network by following a predefined conversion path and transfers the resulting tokens to BancorX. this version of the function also allows the verified signer to bypass the universal gas price limit. note that the network should already have been given allowance of the source token (if not ETH) @param _path conversion path, see conversion path format above @param _amount amount to convert from (in the initial source token) @param _minReturn if the conversion results in an amount smaller than the minimum return - it is cancelled, must be nonzero @param _toBlockchain blockchain BNT will be issued on @param _to address/account on _toBlockchain to send the BNT to @param _conversionId pre-determined unique (if non zero) id which refers to this transaction @param _block if the current block exceeded the given parameter - it is cancelled @param _v (signature[128:130]) associated with the signer address and helps to validate if the signature is legit @param _r (signature[0:64]) associated with the signer address and helps to validate if the signature is legit @param _s (signature[64:128]) associated with the signer address and helps to validate if the signature is legit @return the amount of BNT received from this conversion */ function xConvertPrioritized( IERC20Token[] _path, uint256 _amount, uint256 _minReturn, bytes32 _toBlockchain, bytes32 _to, uint256 _conversionId, uint256 _block, uint8 _v, bytes32 _r, bytes32 _s ) public payable returns (uint256) { // do a lot of validation and transfers in separate function to work around 16 variable limit validateXConversion(_path, _amount, _block, _v, _r, _s); // convert to BNT and get the resulting amount (, uint256 retAmount) = convertByPath(_path, _amount, _minReturn, _path[0], this); // transfer the resulting amount to BancorX, and return the amount IBancorX(registry.addressOf(ContractIds.BANCOR_X)).xTransfer(_toBlockchain, _to, retAmount, _conversionId); return retAmount; } /** @dev converts token to any other token in the bancor network by following a predefined conversion paths and transfers the result tokens to a target account. @param _path conversion path, see conversion path format above @param _amount amount to convert from (in the initial source token) @param _minReturn if the conversion results in an amount smaller than the minimum return - it is cancelled, must be nonzero @param _for account that will receive the conversion result @param _block if the current block exceeded the given parameter - it is cancelled @param _v (signature[128:130]) associated with the signer address and helps to validate if the signature is legit @param _r (signature[0:64]) associated with the signer address and helps to validate if the signature is legit @param _s (signature[64:128]) associated with the signer address and helps to validate if the signature is legit @return tokens issued in return */ function convertForInternal( IERC20Token[] _path, uint256 _amount, uint256 _minReturn, address _for, uint256 _customVal, uint256 _block, uint8 _v, bytes32 _r, bytes32 _s ) private validConversionPath(_path) returns (uint256) { if (_v == 0x0 && _r == 0x0 && _s == 0x0) { IBancorGasPriceLimit gasPriceLimit = IBancorGasPriceLimit(registry.addressOf(ContractIds.BANCOR_GAS_PRICE_LIMIT)); gasPriceLimit.validateGasPrice(tx.gasprice); } else { require(verifyTrustedSender(_path, _customVal, _block, _for, _v, _r, _s)); } // if ETH is provided, ensure that the amount is identical to _amount and verify that the source token is an ether token IERC20Token fromToken = _path[0]; IERC20Token toToken; (toToken, _amount) = convertByPath(_path, _amount, _minReturn, fromToken, _for); // finished the conversion, transfer the funds to the target account // if the target token is an ether token, withdraw the tokens and send them as ETH // otherwise, transfer the tokens as is if (etherTokens[toToken]) IEtherToken(toToken).withdrawTo(_for, _amount); else ensureTransfer(toToken, _for, _amount); return _amount; } /** @dev executes the actual conversion by following the conversion path @param _path conversion path, see conversion path format above @param _amount amount to convert from (in the initial source token) @param _minReturn if the conversion results in an amount smaller than the minimum return - it is cancelled, must be nonzero @param _fromToken ERC20 token to convert from (the first element in the path) @param _for account that will receive the conversion result @return ERC20 token to convert to (the last element in the path) & tokens issued in return */ function convertByPath( IERC20Token[] _path, uint256 _amount, uint256 _minReturn, IERC20Token _fromToken, address _for ) private returns (IERC20Token, uint256) { ISmartToken smartToken; IERC20Token toToken; IBancorConverter converter; // get the contract features address from the registry IContractFeatures features = IContractFeatures(registry.addressOf(ContractIds.CONTRACT_FEATURES)); // iterate over the conversion path uint256 pathLength = _path.length; for (uint256 i = 1; i < pathLength; i += 2) { smartToken = ISmartToken(_path[i]); toToken = _path[i + 1]; converter = IBancorConverter(smartToken.owner()); checkWhitelist(converter, _for, features); // if the smart token isn't the source (from token), the converter doesn't have control over it and thus we need to approve the request if (smartToken != _fromToken) ensureAllowance(_fromToken, converter, _amount); // make the conversion - if it's the last one, also provide the minimum return value _amount = converter.change(_fromToken, toToken, _amount, i == pathLength - 2 ? _minReturn : 1); _fromToken = toToken; } return (toToken, _amount); } /** @dev returns the expected return amount for converting a specific amount by following a given conversion path. notice that there is no support for circular paths. @param _path conversion path, see conversion path format above @param _amount amount to convert from (in the initial source token) @return expected conversion return amount and conversion fee */ function getReturnByPath(IERC20Token[] _path, uint256 _amount) public view returns (uint256, uint256) { IERC20Token fromToken; ISmartToken smartToken; IERC20Token toToken; IBancorConverter converter; uint256 amount; uint256 fee; uint256 supply; uint256 balance; uint32 weight; ISmartToken prevSmartToken; IBancorFormula formula = IBancorFormula(registry.getAddress(ContractIds.BANCOR_FORMULA)); amount = _amount; fromToken = _path[0]; // iterate over the conversion path for (uint256 i = 1; i < _path.length; i += 2) { smartToken = ISmartToken(_path[i]); toToken = _path[i + 1]; converter = IBancorConverter(smartToken.owner()); if (toToken == smartToken) { // buy the smart token // check if the current smart token supply was changed in the previous iteration supply = smartToken == prevSmartToken ? supply : smartToken.totalSupply(); // validate input require(getConnectorSaleEnabled(converter, fromToken)); // calculate the amount & the conversion fee balance = converter.getConnectorBalance(fromToken); weight = getConnectorWeight(converter, fromToken); amount = formula.calculatePurchaseReturn(supply, balance, weight, amount); fee = amount.mul(converter.conversionFee()).div(MAX_CONVERSION_FEE); amount -= fee; // update the smart token supply for the next iteration supply = smartToken.totalSupply() + amount; } else if (fromToken == smartToken) { // sell the smart token // check if the current smart token supply was changed in the previous iteration supply = smartToken == prevSmartToken ? supply : smartToken.totalSupply(); // calculate the amount & the conversion fee balance = converter.getConnectorBalance(toToken); weight = getConnectorWeight(converter, toToken); amount = formula.calculateSaleReturn(supply, balance, weight, amount); fee = amount.mul(converter.conversionFee()).div(MAX_CONVERSION_FEE); amount -= fee; // update the smart token supply for the next iteration supply = smartToken.totalSupply() - amount; } else { // cross connector conversion (amount, fee) = converter.getReturn(fromToken, toToken, amount); } prevSmartToken = smartToken; fromToken = toToken; } return (amount, fee); } /** @dev checks whether the given converter supports a whitelist and if so, ensures that the account that should receive the conversion result is actually whitelisted @param _converter converter to check for whitelist @param _for account that will receive the conversion result @param _features contract features contract address */ function checkWhitelist(IBancorConverter _converter, address _for, IContractFeatures _features) private view { IWhitelist whitelist; // check if the converter supports the conversion whitelist feature if (!_features.isSupported(_converter, FeatureIds.CONVERTER_CONVERSION_WHITELIST)) return; // get the whitelist contract from the converter whitelist = _converter.conversionWhitelist(); if (whitelist == address(0)) return; // check if the account that should receive the conversion result is actually whitelisted require(whitelist.isWhitelisted(_for)); } /** @dev claims the caller's tokens, converts them to any other token in the bancor network by following a predefined conversion path and transfers the result tokens to a target account note that allowance must be set beforehand @param _path conversion path, see conversion path format above @param _amount amount to convert from (in the initial source token) @param _minReturn if the conversion results in an amount smaller than the minimum return - it is cancelled, must be nonzero @param _for account that will receive the conversion result @return tokens issued in return */ function claimAndConvertFor(IERC20Token[] _path, uint256 _amount, uint256 _minReturn, address _for) public returns (uint256) { // we need to transfer the tokens from the caller to the converter before we follow // the conversion path, to allow it to execute the conversion on behalf of the caller // note: we assume we already have allowance IERC20Token fromToken = _path[0]; ensureTransferFrom(fromToken, msg.sender, this, _amount); return convertFor(_path, _amount, _minReturn, _for); } /** @dev converts the token to any other token in the bancor network by following a predefined conversion path and transfers the result tokens back to the sender note that the converter should already own the source tokens @param _path conversion path, see conversion path format above @param _amount amount to convert from (in the initial source token) @param _minReturn if the conversion results in an amount smaller than the minimum return - it is cancelled, must be nonzero @return tokens issued in return */ function convert(IERC20Token[] _path, uint256 _amount, uint256 _minReturn) public payable returns (uint256) { return convertFor(_path, _amount, _minReturn, msg.sender); } /** @dev claims the caller's tokens, converts them to any other token in the bancor network by following a predefined conversion path and transfers the result tokens back to the sender note that allowance must be set beforehand @param _path conversion path, see conversion path format above @param _amount amount to convert from (in the initial source token) @param _minReturn if the conversion results in an amount smaller than the minimum return - it is cancelled, must be nonzero @return tokens issued in return */ function claimAndConvert(IERC20Token[] _path, uint256 _amount, uint256 _minReturn) public returns (uint256) { return claimAndConvertFor(_path, _amount, _minReturn, msg.sender); } /** @dev ensures transfer of tokens, taking into account that some ERC-20 implementations don't return true on success but revert on failure instead @param _token the token to transfer @param _to the address to transfer the tokens to @param _amount the amount to transfer */ function ensureTransfer(IERC20Token _token, address _to, uint256 _amount) private { IAddressList addressList = IAddressList(registry.addressOf(ContractIds.NON_STANDARD_TOKEN_REGISTRY)); if (addressList.listedAddresses(_token)) { uint256 prevBalance = _token.balanceOf(_to); // we have to cast the token contract in an interface which has no return value INonStandardERC20(_token).transfer(_to, _amount); uint256 postBalance = _token.balanceOf(_to); assert(postBalance > prevBalance); } else { // if the token isn't whitelisted, we assert on transfer assert(_token.transfer(_to, _amount)); } } /** @dev ensures transfer of tokens, taking into account that some ERC-20 implementations don't return true on success but revert on failure instead @param _token the token to transfer @param _from the address to transfer the tokens from @param _to the address to transfer the tokens to @param _amount the amount to transfer */ function ensureTransferFrom(IERC20Token _token, address _from, address _to, uint256 _amount) private { IAddressList addressList = IAddressList(registry.addressOf(ContractIds.NON_STANDARD_TOKEN_REGISTRY)); if (addressList.listedAddresses(_token)) { uint256 prevBalance = _token.balanceOf(_to); // we have to cast the token contract in an interface which has no return value INonStandardERC20(_token).transferFrom(_from, _to, _amount); uint256 postBalance = _token.balanceOf(_to); assert(postBalance > prevBalance); } else { // if the token isn't whitelisted, we assert on transfer assert(_token.transferFrom(_from, _to, _amount)); } } /** @dev utility, checks whether allowance for the given spender exists and approves one if it doesn't. Note that we use the non standard erc-20 interface in which `approve` has no return value so that this function will work for both standard and non standard tokens @param _token token to check the allowance in @param _spender approved address @param _value allowance amount */ function ensureAllowance(IERC20Token _token, address _spender, uint256 _value) private { // check if allowance for the given amount already exists if (_token.allowance(this, _spender) >= _value) return; // if the allowance is nonzero, must reset it to 0 first if (_token.allowance(this, _spender) != 0) INonStandardERC20(_token).approve(_spender, 0); // approve the new allowance INonStandardERC20(_token).approve(_spender, _value); } /** @dev returns the connector weight @param _converter converter contract address @param _connector connector's address to read from @return connector's weight */ function getConnectorWeight(IBancorConverter _converter, IERC20Token _connector) private view returns(uint32) { uint256 virtualBalance; uint32 weight; bool isVirtualBalanceEnabled; bool isSaleEnabled; bool isSet; (virtualBalance, weight, isVirtualBalanceEnabled, isSaleEnabled, isSet) = _converter.connectors(_connector); return weight; } /** @dev returns true if connector sale is enabled @param _converter converter contract address @param _connector connector's address to read from @return true if connector sale is enabled, otherwise - false */ function getConnectorSaleEnabled(IBancorConverter _converter, IERC20Token _connector) private view returns(bool) { uint256 virtualBalance; uint32 weight; bool isVirtualBalanceEnabled; bool isSaleEnabled; bool isSet; (virtualBalance, weight, isVirtualBalanceEnabled, isSaleEnabled, isSet) = _converter.connectors(_connector); return isSaleEnabled; } // deprecated, backward compatibility function convertForPrioritized2( IERC20Token[] _path, uint256 _amount, uint256 _minReturn, address _for, uint256 _block, uint8 _v, bytes32 _r, bytes32 _s ) public payable returns (uint256) { return convertForPrioritized3(_path, _amount, _minReturn, _for, _amount, _block, _v, _r, _s); } // deprecated, backward compatibility function convertForPrioritized( IERC20Token[] _path, uint256 _amount, uint256 _minReturn, address _for, uint256 _block, uint256 _nonce, uint8 _v, bytes32 _r, bytes32 _s) public payable returns (uint256) { _nonce; return convertForPrioritized3(_path, _amount, _minReturn, _for, _amount, _block, _v, _r, _s); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":false,"inputs":[{"name":"_token","type":"address"},{"name":"_register","type":"bool"}],"name":"registerEtherToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_signerAddress","type":"address"}],"name":"setSignerAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"}],"name":"getReturnByPath","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"BANCOR_CONVERTER_UPGRADER","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"},{"name":"_minReturn","type":"uint256"},{"name":"_for","type":"address"},{"name":"_block","type":"uint256"},{"name":"_nonce","type":"uint256"},{"name":"_v","type":"uint8"},{"name":"_r","type":"bytes32"},{"name":"_s","type":"bytes32"}],"name":"convertForPrioritized","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"BNT_TOKEN","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"CONTRACT_REGISTRY","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"BANCOR_CONVERTER_FACTORY","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"signerAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"},{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"}],"name":"withdrawTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"BNT_CONVERTER","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"},{"name":"_minReturn","type":"uint256"},{"name":"_toBlockchain","type":"bytes32"},{"name":"_to","type":"bytes32"},{"name":"_conversionId","type":"uint256"},{"name":"_block","type":"uint256"},{"name":"_v","type":"uint8"},{"name":"_r","type":"bytes32"},{"name":"_s","type":"bytes32"}],"name":"xConvertPrioritized","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"},{"name":"_minReturn","type":"uint256"},{"name":"_for","type":"address"},{"name":"_block","type":"uint256"},{"name":"_v","type":"uint8"},{"name":"_r","type":"bytes32"},{"name":"_s","type":"bytes32"}],"name":"convertForPrioritized2","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"BANCOR_FORMULA","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"acceptOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"registry","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"etherTokens","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"CONTRACT_FEATURES","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"conversionHashes","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"BANCOR_NETWORK","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"BANCOR_GAS_PRICE_LIMIT","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"CONVERTER_CONVERSION_WHITELIST","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_registry","type":"address"}],"name":"setRegistry","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"},{"name":"_minReturn","type":"uint256"},{"name":"_for","type":"address"}],"name":"claimAndConvertFor","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"},{"name":"_minReturn","type":"uint256"},{"name":"_for","type":"address"},{"name":"_customVal","type":"uint256"},{"name":"_block","type":"uint256"},{"name":"_v","type":"uint8"},{"name":"_r","type":"bytes32"},{"name":"_s","type":"bytes32"}],"name":"convertForPrioritized3","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"BANCOR_X","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"},{"name":"_minReturn","type":"uint256"},{"name":"_toBlockchain","type":"bytes32"},{"name":"_to","type":"bytes32"},{"name":"_conversionId","type":"uint256"}],"name":"xConvert","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"},{"name":"_minReturn","type":"uint256"}],"name":"claimAndConvert","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"},{"name":"_minReturn","type":"uint256"},{"name":"_for","type":"address"}],"name":"convertFor","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"BANCOR_X_UPGRADER","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"newOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_path","type":"address[]"},{"name":"_amount","type":"uint256"},{"name":"_minReturn","type":"uint256"}],"name":"convert","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"NON_STANDARD_TOKEN_REGISTRY","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_registry","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_prevOwner","type":"address"},{"indexed":true,"name":"_newOwner","type":"address"}],"name":"OwnerUpdate","type":"event"}]
Contract Creation Code
608060405260028054600160a060020a031916905534801561002057600080fd5b50604051602080613087833981016040525160008054600160a060020a0319163317905580600160a060020a038116151561005a57600080fd5b5060038054600160a060020a031916600160a060020a0392909216919091179055612ffd8061008a6000396000f30060806040526004361061019d5763ffffffff60e060020a60003504166302ef521e81146101a2578063046dc166146101ca5780630c8496cc146101eb5780630c87355e1461025b5780631134269a146102825780631d000b61146102ff57806325f9bfef146103145780635a46f06c146103295780635b7633d01461033e5780635e35359e1461036f57806362614ae6146103995780636896b999146103ae5780636b08f2ef146104295780636d7bd3fc146104a057806379ba5097146104b55780637b103999146104ca5780638077ccf7146104df57806383315b6e1461051457806389e63a60146105295780638da5cb5b146105415780639232494e146105565780639249993a1461056b57806392d1abb714610580578063a91ee0dc14610595578063b1e9932b146105b6578063b406d38614610621578063c4a8598e1461069e578063c52173de146106b3578063c7ba24bc14610712578063c98fefed14610770578063cc97b38f146107ce578063d4ee1d90146107e3578063f2fde38b146107f8578063f3898a9714610819578063f5286b9c1461086a575b600080fd5b3480156101ae57600080fd5b506101c8600160a060020a0360043516602435151561087f565b005b3480156101d657600080fd5b506101c8600160a060020a03600435166108f0565b3480156101f757600080fd5b50604080516020600480358082013583810280860185019096528085526102429536959394602494938501929182918501908490808284375094975050933594506109659350505050565b6040805192835260208301919091528051918290030190f35b34801561026757600080fd5b506102706111c6565b60408051918252519081900360200190f35b604080516020600480358082013583810280860185019096528085526102709536959394602494938501929182918501908490808284375094975050843595505050602083013592600160a060020a0360408201351692506060810135915060808101359060ff60a0820135169060c08101359060e001356111ea565b34801561030b57600080fd5b5061027061120b565b34801561032057600080fd5b5061027061122f565b34801561033557600080fd5b50610270611253565b34801561034a57600080fd5b50610353611277565b60408051600160a060020a039092168252519081900360200190f35b34801561037b57600080fd5b506101c8600160a060020a0360043581169060243516604435611286565b3480156103a557600080fd5b50610270611363565b604080516020600480358082013583810280860185019096528085526102709536959394602494938501929182918501908490808284375094975050843595505050602083013592604081013592506060810135915060808101359060a08101359060ff60c0820135169060e0810135906101000135611387565b604080516020600480358082013583810280860185019096528085526102709536959394602494938501929182918501908490808284375094975050843595505050602083013592600160a060020a0360408201351692506060810135915060ff6080820135169060a08101359060c001356114fc565b3480156104ac57600080fd5b5061027061151c565b3480156104c157600080fd5b506101c8611540565b3480156104d657600080fd5b506103536115c8565b3480156104eb57600080fd5b50610500600160a060020a03600435166115d7565b604080519115158252519081900360200190f35b34801561052057600080fd5b506102706115ec565b34801561053557600080fd5b50610500600435611610565b34801561054d57600080fd5b50610353611625565b34801561056257600080fd5b50610270611634565b34801561057757600080fd5b50610270611658565b34801561058c57600080fd5b5061027061167c565b3480156105a157600080fd5b506101c8600160a060020a0360043516611681565b3480156105c257600080fd5b5060408051602060048035808201358381028086018501909652808552610270953695939460249493850192918291850190849080828437509497505084359550505060208301359260400135600160a060020a031691506116f69050565b604080516020600480358082013583810280860185019096528085526102709536959394602494938501929182918501908490808284375094975050843595505050602083013592600160a060020a0360408201351692506060810135915060808101359060ff60a0820135169060c08101359060e00135611736565b3480156106aa57600080fd5b50610270611811565b604080516020600480358082013583810280860185019096528085526102709536959394602494938501929182918501908490808284375094975050843595505050602083013592604081013592506060810135915060800135611835565b34801561071e57600080fd5b5060408051602060048035808201358381028086018501909652808552610270953695939460249493850192918291850190849080828437509497505084359550505060209092013591506118549050565b60408051602060048035808201358381028086018501909652808552610270953695939460249493850192918291850190849080828437509497505084359550505060208301359260400135600160a060020a0316915061186a9050565b3480156107da57600080fd5b50610270611886565b3480156107ef57600080fd5b506103536118aa565b34801561080457600080fd5b506101c8600160a060020a03600435166118b9565b604080516020600480358082013583810280860185019096528085526102709536959394602494938501929182918501908490808284375094975050843595505050602090920135915061191a9050565b34801561087657600080fd5b50610270611928565b600054600160a060020a0316331461089657600080fd5b81600160a060020a03811615156108ac57600080fd5b82600160a060020a0381163014156108c357600080fd5b5050600160a060020a03919091166000908152600460205260409020805460ff1916911515919091179055565b600054600160a060020a0316331461090757600080fd5b80600160a060020a038116151561091d57600080fd5b81600160a060020a03811630141561093457600080fd5b50506002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600080600080600080600080600080600080600080600360009054906101000a9004600160a060020a0316600160a060020a03166321f8a7217f42616e636f72466f726d756c61000000000000000000000000000000000000006040518263ffffffff1660e060020a028152600401808260001916600019168152602001915050602060405180830381600087803b158015610a0057600080fd5b505af1158015610a14573d6000803e3d6000fd5b505050506040513d6020811015610a2a57600080fd5b810190808051906020019092919050505091508e97508f6000815181101515610a4f57fe5b906020019060200201519b50600190505b8f518110156111b0578f81815181101515610a7757fe5b906020019060200201519a508f81600101815181101515610a9457fe5b9060200190602002015199508a600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610ade57600080fd5b505af1158015610af2573d6000803e3d6000fd5b505050506040513d6020811015610b0857600080fd5b50519850600160a060020a038a8116908c161415610e2e5782600160a060020a03168b600160a060020a031614610ba8578a600160a060020a03166318160ddd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610b7757600080fd5b505af1158015610b8b573d6000803e3d6000fd5b505050506040513d6020811015610ba157600080fd5b5051610baa565b855b9550610bb6898d61194c565b1515610bc157600080fd5b88600160a060020a031663d89595128d6040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b158015610c1c57600080fd5b505af1158015610c30573d6000803e3d6000fd5b505050506040513d6020811015610c4657600080fd5b50519450610c54898d6119eb565b604080517f29a00e7c000000000000000000000000000000000000000000000000000000008152600481018990526024810188905263ffffffff83166044820152606481018b90529051919550600160a060020a038416916329a00e7c916084808201926020929091908290030181600087803b158015610cd457600080fd5b505af1158015610ce8573d6000803e3d6000fd5b505050506040513d6020811015610cfe57600080fd5b5051604080517f579cd3ca0000000000000000000000000000000000000000000000000000000081529051919950610db491620f424091610da891600160a060020a038e169163579cd3ca9160048083019260209291908290030181600087803b158015610d6b57600080fd5b505af1158015610d7f573d6000803e3d6000fd5b505050506040513d6020811015610d9557600080fd5b50518b9063ffffffff90811690611a8a16565b9063ffffffff611ac316565b96508688039750878b600160a060020a03166318160ddd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610dfa57600080fd5b505af1158015610e0e573d6000803e3d6000fd5b505050506040513d6020811015610e2457600080fd5b50510195506111a0565b8a600160a060020a03168c600160a060020a031614156110f85782600160a060020a03168b600160a060020a031614610ed0578a600160a060020a03166318160ddd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610e9f57600080fd5b505af1158015610eb3573d6000803e3d6000fd5b505050506040513d6020811015610ec957600080fd5b5051610ed2565b855b955088600160a060020a031663d89595128b6040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b158015610f2f57600080fd5b505af1158015610f43573d6000803e3d6000fd5b505050506040513d6020811015610f5957600080fd5b50519450610f67898b6119eb565b604080517f49f9b0f7000000000000000000000000000000000000000000000000000000008152600481018990526024810188905263ffffffff83166044820152606481018b90529051919550600160a060020a038416916349f9b0f7916084808201926020929091908290030181600087803b158015610fe757600080fd5b505af1158015610ffb573d6000803e3d6000fd5b505050506040513d602081101561101157600080fd5b5051604080517f579cd3ca000000000000000000000000000000000000000000000000000000008152905191995061107e91620f424091610da891600160a060020a038e169163579cd3ca9160048083019260209291908290030181600087803b158015610d6b57600080fd5b96508688039750878b600160a060020a03166318160ddd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156110c457600080fd5b505af11580156110d8573d6000803e3d6000fd5b505050506040513d60208110156110ee57600080fd5b50510395506111a0565b604080517f1e1401f8000000000000000000000000000000000000000000000000000000008152600160a060020a038e811660048301528c81166024830152604482018b90528251908c1692631e1401f892606480820193918290030181600087803b15801561116757600080fd5b505af115801561117b573d6000803e3d6000fd5b505050506040513d604081101561119157600080fd5b50805160209091015190985096505b989a508a988a9250600201610a60565b50959e949d50939b505050505050505050505050565b7f42616e636f72436f6e766572746572557067726164657200000000000000000081565b60006111fd8a8a8a8a8d8b8a8a8a611736565b9a9950505050505050505050565b7f424e54546f6b656e00000000000000000000000000000000000000000000000081565b7f436f6e747261637452656769737472790000000000000000000000000000000081565b7f42616e636f72436f6e766572746572466163746f72790000000000000000000081565b600254600160a060020a031681565b600054600160a060020a0316331461129d57600080fd5b82600160a060020a03811615156112b357600080fd5b82600160a060020a03811615156112c957600080fd5b83600160a060020a0381163014156112e057600080fd5b85600160a060020a031663a9059cbb86866040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050600060405180830381600087803b15801561134357600080fd5b505af1158015611357573d6000803e3d6000fd5b50505050505050505050565b7f424e54436f6e766572746572000000000000000000000000000000000000000081565b6000806113988c8c88888888611ae6565b6113bd8c8c8c8f60008151811015156113ad57fe5b9060200190602002015130611e18565b6003546040805160e260020a632ecd14d30281527f42616e636f72580000000000000000000000000000000000000000000000000060048201529051929450600160a060020a03909116925063bb34534c9160248083019260209291908290030181600087803b15801561143057600080fd5b505af1158015611444573d6000803e3d6000fd5b505050506040513d602081101561145a57600080fd5b5051604080517f427c0374000000000000000000000000000000000000000000000000000000008152600481018c9052602481018b905260448101849052606481018a90529051600160a060020a039092169163427c03749160848082019260009290919082900301818387803b1580156114d457600080fd5b505af11580156114e8573d6000803e3d6000fd5b50929e9d5050505050505050505050505050565b600061150f898989898c8a8a8a8a611736565b9998505050505050505050565b7f42616e636f72466f726d756c610000000000000000000000000000000000000081565b600154600160a060020a0316331461155757600080fd5b60015460008054604051600160a060020a0393841693909116917f343765429aea5a34b3ff6a3785a98a5abb2597aca87bfbb58632c173d585373a91a3600180546000805473ffffffffffffffffffffffffffffffffffffffff19908116600160a060020a03841617909155169055565b600354600160a060020a031681565b60046020526000908152604090205460ff1681565b7f436f6e747261637446656174757265730000000000000000000000000000000081565b60056020526000908152604090205460ff1681565b600054600160a060020a031681565b7f42616e636f724e6574776f726b0000000000000000000000000000000000000081565b7f42616e636f7247617350726963654c696d69740000000000000000000000000081565b600181565b600054600160a060020a0316331461169857600080fd5b80600160a060020a03811615156116ae57600080fd5b81600160a060020a0381163014156116c557600080fd5b50506003805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60008085600081518110151561170857fe5b90602001906020020151905061172081333088612087565b61172c8686868661186a565b9695505050505050565b6000808a600081518110151561174857fe5b90602001906020020151905034600014806117855750348a1480156117855750600160a060020a03811660009081526004602052604090205460ff165b151561179057600080fd5b60003411156117f15780600160a060020a031663d0e30db0346040518263ffffffff1660e060020a0281526004016000604051808303818588803b1580156117d757600080fd5b505af11580156117eb573d6000803e3d6000fd5b50505050505b6118028b8b8b8b8b8b8b8b8b61241f565b9b9a5050505050505050505050565b7f42616e636f72580000000000000000000000000000000000000000000000000081565b600061184987878787878787808080611387565b979650505050505050565b6000611862848484336116f6565b949350505050565b600061187d858585858286808080611736565b95945050505050565b7f42616e636f72585570677261646572000000000000000000000000000000000081565b600154600160a060020a031681565b600054600160a060020a031633146118d057600080fd5b600054600160a060020a03828116911614156118eb57600080fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60006118628484843361186a565b7f4e6f6e5374616e64617264546f6b656e5265676973747279000000000000000081565b60008060008060008087600160a060020a0316630e53aae9886040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a0316815260200191505060a060405180830381600087803b1580156119b057600080fd5b505af11580156119c4573d6000803e3d6000fd5b505050506040513d60a08110156119da57600080fd5b506060015198975050505050505050565b60008060008060008087600160a060020a0316630e53aae9886040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a0316815260200191505060a060405180830381600087803b158015611a4f57600080fd5b505af1158015611a63573d6000803e3d6000fd5b505050506040513d60a0811015611a7957600080fd5b506020015198975050505050505050565b600080831515611a9d5760009150611abc565b50828202828482811515611aad57fe5b0414611ab857600080fd5b8091505b5092915050565b600080808311611ad257600080fd5b8284811515611add57fe5b04949350505050565b6000808760028151118015611afd57506015815111155b8015611b0e57508051600290066001145b1515611b1957600080fd5b886000815181101515611b2857fe5b9060200190602002015192503460001480611b6557503488148015611b655750600160a060020a03831660009081526004602052604090205460ff165b1515611b7057600080fd5b6003546040805160e260020a632ecd14d30281527f424e54546f6b656e00000000000000000000000000000000000000000000000060048201529051600160a060020a039092169163bb34534c916024808201926020929091908290030181600087803b158015611be057600080fd5b505af1158015611bf4573d6000803e3d6000fd5b505050506040513d6020811015611c0a57600080fd5b50518951600160a060020a03909116908a906000198101908110611c2a57fe5b60209081029091010151600160a060020a031614611c4757600080fd5b6000341115611cac5782600160a060020a031663d0e30db0346040518263ffffffff1660e060020a0281526004016000604051808303818588803b158015611c8e57600080fd5b505af1158015611ca2573d6000803e3d6000fd5b5050505050611cb8565b611cb88333308b612087565b60ff8616158015611cc7575084155b8015611cd1575083155b15611df3576003546040805160e260020a632ecd14d30281527f42616e636f7247617350726963654c696d69740000000000000000000000000060048201529051600160a060020a039092169163bb34534c916024808201926020929091908290030181600087803b158015611d4657600080fd5b505af1158015611d5a573d6000803e3d6000fd5b505050506040513d6020811015611d7057600080fd5b5051604080517f6b4dff1f0000000000000000000000000000000000000000000000000000000081523a60048201529051919350600160a060020a03841691636b4dff1f9160248082019260009290919082900301818387803b158015611dd657600080fd5b505af1158015611dea573d6000803e3d6000fd5b50505050611e0d565b611e02898989338a8a8a612696565b1515611e0d57600080fd5b505050505050505050565b6003546040805160e260020a632ecd14d30281527f436f6e7472616374466561747572657300000000000000000000000000000000600482015290516000928392839283928392839283928392600160a060020a039091169163bb34534c9160248082019260209290919082900301818787803b158015611e9857600080fd5b505af1158015611eac573d6000803e3d6000fd5b505050506040513d6020811015611ec257600080fd5b50518d519093509150600190505b81811015612076578c81815181101515611ee657fe5b9060200190602002015195508c81600101815181101515611f0357fe5b90602001906020020151945085600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015611f4d57600080fd5b505af1158015611f61573d6000803e3d6000fd5b505050506040513d6020811015611f7757600080fd5b50519350611f86848a8561285d565b600160a060020a03868116908b1614611fa457611fa48a858e612a19565b83600160a060020a0316635e5144eb8b878f600287038614611fc7576001611fc9565b8f5b6040518563ffffffff1660e060020a0281526004018085600160a060020a0316600160a060020a0316815260200184600160a060020a0316600160a060020a03168152602001838152602001828152602001945050505050602060405180830381600087803b15801561203b57600080fd5b505af115801561204f573d6000803e3d6000fd5b505050506040513d602081101561206557600080fd5b50519b509398508893600201611ed0565b50929b999a50505050505050505050565b6003546040805160e260020a632ecd14d30281527f4e6f6e5374616e64617264546f6b656e526567697374727900000000000000006004820152905160009283928392600160a060020a039092169163bb34534c9160248082019260209290919082900301818787803b1580156120fd57600080fd5b505af1158015612111573d6000803e3d6000fd5b505050506040513d602081101561212757600080fd5b5051604080517faeea10bd000000000000000000000000000000000000000000000000000000008152600160a060020a038a8116600483015291519295509085169163aeea10bd916024808201926020929091908290030181600087803b15801561219157600080fd5b505af11580156121a5573d6000803e3d6000fd5b505050506040513d60208110156121bb57600080fd5b50511561236e5786600160a060020a03166370a08231866040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b15801561221d57600080fd5b505af1158015612231573d6000803e3d6000fd5b505050506040513d602081101561224757600080fd5b5051604080517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a0389811660048301528881166024830152604482018890529151929450908916916323b872dd9160648082019260009290919082900301818387803b1580156122bf57600080fd5b505af11580156122d3573d6000803e3d6000fd5b5050505086600160a060020a03166370a08231866040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b15801561233257600080fd5b505af1158015612346573d6000803e3d6000fd5b505050506040513d602081101561235c57600080fd5b5051905081811161236957fe5b612416565b604080517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a0388811660048301528781166024830152604482018790529151918916916323b872dd916064808201926020929091908290030181600087803b1580156123e257600080fd5b505af11580156123f6573d6000803e3d6000fd5b505050506040513d602081101561240c57600080fd5b5051151561241657fe5b50505050505050565b6000806000808c6002815111801561243957506015815111155b801561244a57508051600290066001145b151561245557600080fd5b60ff8816158015612464575086155b801561246e575085155b15612590576003546040805160e260020a632ecd14d30281527f42616e636f7247617350726963654c696d69740000000000000000000000000060048201529051600160a060020a039092169163bb34534c916024808201926020929091908290030181600087803b1580156124e357600080fd5b505af11580156124f7573d6000803e3d6000fd5b505050506040513d602081101561250d57600080fd5b5051604080517f6b4dff1f0000000000000000000000000000000000000000000000000000000081523a60048201529051919550600160a060020a03861691636b4dff1f9160248082019260009290919082900301818387803b15801561257357600080fd5b505af1158015612587573d6000803e3d6000fd5b505050506125aa565b61259f8e8b8b8e8c8c8c612696565b15156125aa57600080fd5b8d60008151811015156125b957fe5b9060200190602002015192506125d28e8e8e868f611e18565b600160a060020a038216600090815260046020526040902054909e5090925060ff16156126795781600160a060020a031663205c28788c8f6040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050600060405180830381600087803b15801561265c57600080fd5b505af1158015612670573d6000803e3d6000fd5b50505050612684565b612684828c8f612c53565b509a9c9b505050505050505050505050565b600080600080883a89338d8f6040518087815260200186815260200185600160a060020a0316600160a060020a03166c0100000000000000000000000002815260140184600160a060020a0316600160a060020a03166c01000000000000000000000000028152601401838152602001828051906020019060200280838360005b8381101561272f578181015183820152602001612717565b50506040805195909301859003909420600081815260056020529290922054919d505060ff16159850508715965061276e955050505050505750884311155b151561277957600080fd5b604080517f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c8101859052815190819003603c0181206002546000808452602084810180875284905260ff8d1685870152606085018c9052608085018b90529451929650600160a060020a039091169360019360a0808201949293601f19840193928390039091019190865af115801561281a573d6000803e3d6000fd5b50505060206040510351600160a060020a031614905080156111fd576000838152600560205260409020805460ff191660011790559a9950505050505050505050565b604080517fa5fbf287000000000000000000000000000000000000000000000000000000008152600160a060020a03858116600483015260016024830152915160009284169163a5fbf28791604480830192602092919082900301818787803b1580156128c957600080fd5b505af11580156128dd573d6000803e3d6000fd5b505050506040513d60208110156128f357600080fd5b5051151561290057612a13565b83600160a060020a031663c45d3d926040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561293e57600080fd5b505af1158015612952573d6000803e3d6000fd5b505050506040513d602081101561296857600080fd5b50519050600160a060020a038116151561298157612a13565b80600160a060020a0316633af32abf846040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b1580156129dc57600080fd5b505af11580156129f0573d6000803e3d6000fd5b505050506040513d6020811015612a0657600080fd5b50511515612a1357600080fd5b50505050565b604080517fdd62ed3e000000000000000000000000000000000000000000000000000000008152306004820152600160a060020a0384811660248301529151839286169163dd62ed3e9160448083019260209291908290030181600087803b158015612a8457600080fd5b505af1158015612a98573d6000803e3d6000fd5b505050506040513d6020811015612aae57600080fd5b505110612aba57612c4e565b604080517fdd62ed3e000000000000000000000000000000000000000000000000000000008152306004820152600160a060020a03848116602483015291519185169163dd62ed3e916044808201926020929091908290030181600087803b158015612b2557600080fd5b505af1158015612b39573d6000803e3d6000fd5b505050506040513d6020811015612b4f57600080fd5b505115612bd757604080517f095ea7b3000000000000000000000000000000000000000000000000000000008152600160a060020a03848116600483015260006024830181905292519086169263095ea7b3926044808201939182900301818387803b158015612bbe57600080fd5b505af1158015612bd2573d6000803e3d6000fd5b505050505b82600160a060020a031663095ea7b383836040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050600060405180830381600087803b158015612c3a57600080fd5b505af1158015612416573d6000803e3d6000fd5b505050565b6003546040805160e260020a632ecd14d30281527f4e6f6e5374616e64617264546f6b656e526567697374727900000000000000006004820152905160009283928392600160a060020a039092169163bb34534c9160248082019260209290919082900301818787803b158015612cc957600080fd5b505af1158015612cdd573d6000803e3d6000fd5b505050506040513d6020811015612cf357600080fd5b5051604080517faeea10bd000000000000000000000000000000000000000000000000000000008152600160a060020a03898116600483015291519295509085169163aeea10bd916024808201926020929091908290030181600087803b158015612d5d57600080fd5b505af1158015612d71573d6000803e3d6000fd5b505050506040513d6020811015612d8757600080fd5b505115612f325785600160a060020a03166370a08231866040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b158015612de957600080fd5b505af1158015612dfd573d6000803e3d6000fd5b505050506040513d6020811015612e1357600080fd5b5051604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a0388811660048301526024820188905291519294509088169163a9059cbb9160448082019260009290919082900301818387803b158015612e8357600080fd5b505af1158015612e97573d6000803e3d6000fd5b5050505085600160a060020a03166370a08231866040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b158015612ef657600080fd5b505af1158015612f0a573d6000803e3d6000fd5b505050506040513d6020811015612f2057600080fd5b50519050818111612f2d57fe5b612fc9565b85600160a060020a031663a9059cbb86866040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b158015612f9557600080fd5b505af1158015612fa9573d6000803e3d6000fd5b505050506040513d6020811015612fbf57600080fd5b50511515612fc957fe5b5050505050505600a165627a7a72305820b379c72296c7f316eea8dfb5e74dff74482b21cd0458905b9fbd4d5c8238a8c7002900000000000000000000000052ae12abe5d8bd778bd5397f99ca900624cfadd4
Deployed Bytecode
0x60806040526004361061019d5763ffffffff60e060020a60003504166302ef521e81146101a2578063046dc166146101ca5780630c8496cc146101eb5780630c87355e1461025b5780631134269a146102825780631d000b61146102ff57806325f9bfef146103145780635a46f06c146103295780635b7633d01461033e5780635e35359e1461036f57806362614ae6146103995780636896b999146103ae5780636b08f2ef146104295780636d7bd3fc146104a057806379ba5097146104b55780637b103999146104ca5780638077ccf7146104df57806383315b6e1461051457806389e63a60146105295780638da5cb5b146105415780639232494e146105565780639249993a1461056b57806392d1abb714610580578063a91ee0dc14610595578063b1e9932b146105b6578063b406d38614610621578063c4a8598e1461069e578063c52173de146106b3578063c7ba24bc14610712578063c98fefed14610770578063cc97b38f146107ce578063d4ee1d90146107e3578063f2fde38b146107f8578063f3898a9714610819578063f5286b9c1461086a575b600080fd5b3480156101ae57600080fd5b506101c8600160a060020a0360043516602435151561087f565b005b3480156101d657600080fd5b506101c8600160a060020a03600435166108f0565b3480156101f757600080fd5b50604080516020600480358082013583810280860185019096528085526102429536959394602494938501929182918501908490808284375094975050933594506109659350505050565b6040805192835260208301919091528051918290030190f35b34801561026757600080fd5b506102706111c6565b60408051918252519081900360200190f35b604080516020600480358082013583810280860185019096528085526102709536959394602494938501929182918501908490808284375094975050843595505050602083013592600160a060020a0360408201351692506060810135915060808101359060ff60a0820135169060c08101359060e001356111ea565b34801561030b57600080fd5b5061027061120b565b34801561032057600080fd5b5061027061122f565b34801561033557600080fd5b50610270611253565b34801561034a57600080fd5b50610353611277565b60408051600160a060020a039092168252519081900360200190f35b34801561037b57600080fd5b506101c8600160a060020a0360043581169060243516604435611286565b3480156103a557600080fd5b50610270611363565b604080516020600480358082013583810280860185019096528085526102709536959394602494938501929182918501908490808284375094975050843595505050602083013592604081013592506060810135915060808101359060a08101359060ff60c0820135169060e0810135906101000135611387565b604080516020600480358082013583810280860185019096528085526102709536959394602494938501929182918501908490808284375094975050843595505050602083013592600160a060020a0360408201351692506060810135915060ff6080820135169060a08101359060c001356114fc565b3480156104ac57600080fd5b5061027061151c565b3480156104c157600080fd5b506101c8611540565b3480156104d657600080fd5b506103536115c8565b3480156104eb57600080fd5b50610500600160a060020a03600435166115d7565b604080519115158252519081900360200190f35b34801561052057600080fd5b506102706115ec565b34801561053557600080fd5b50610500600435611610565b34801561054d57600080fd5b50610353611625565b34801561056257600080fd5b50610270611634565b34801561057757600080fd5b50610270611658565b34801561058c57600080fd5b5061027061167c565b3480156105a157600080fd5b506101c8600160a060020a0360043516611681565b3480156105c257600080fd5b5060408051602060048035808201358381028086018501909652808552610270953695939460249493850192918291850190849080828437509497505084359550505060208301359260400135600160a060020a031691506116f69050565b604080516020600480358082013583810280860185019096528085526102709536959394602494938501929182918501908490808284375094975050843595505050602083013592600160a060020a0360408201351692506060810135915060808101359060ff60a0820135169060c08101359060e00135611736565b3480156106aa57600080fd5b50610270611811565b604080516020600480358082013583810280860185019096528085526102709536959394602494938501929182918501908490808284375094975050843595505050602083013592604081013592506060810135915060800135611835565b34801561071e57600080fd5b5060408051602060048035808201358381028086018501909652808552610270953695939460249493850192918291850190849080828437509497505084359550505060209092013591506118549050565b60408051602060048035808201358381028086018501909652808552610270953695939460249493850192918291850190849080828437509497505084359550505060208301359260400135600160a060020a0316915061186a9050565b3480156107da57600080fd5b50610270611886565b3480156107ef57600080fd5b506103536118aa565b34801561080457600080fd5b506101c8600160a060020a03600435166118b9565b604080516020600480358082013583810280860185019096528085526102709536959394602494938501929182918501908490808284375094975050843595505050602090920135915061191a9050565b34801561087657600080fd5b50610270611928565b600054600160a060020a0316331461089657600080fd5b81600160a060020a03811615156108ac57600080fd5b82600160a060020a0381163014156108c357600080fd5b5050600160a060020a03919091166000908152600460205260409020805460ff1916911515919091179055565b600054600160a060020a0316331461090757600080fd5b80600160a060020a038116151561091d57600080fd5b81600160a060020a03811630141561093457600080fd5b50506002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600080600080600080600080600080600080600080600360009054906101000a9004600160a060020a0316600160a060020a03166321f8a7217f42616e636f72466f726d756c61000000000000000000000000000000000000006040518263ffffffff1660e060020a028152600401808260001916600019168152602001915050602060405180830381600087803b158015610a0057600080fd5b505af1158015610a14573d6000803e3d6000fd5b505050506040513d6020811015610a2a57600080fd5b810190808051906020019092919050505091508e97508f6000815181101515610a4f57fe5b906020019060200201519b50600190505b8f518110156111b0578f81815181101515610a7757fe5b906020019060200201519a508f81600101815181101515610a9457fe5b9060200190602002015199508a600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610ade57600080fd5b505af1158015610af2573d6000803e3d6000fd5b505050506040513d6020811015610b0857600080fd5b50519850600160a060020a038a8116908c161415610e2e5782600160a060020a03168b600160a060020a031614610ba8578a600160a060020a03166318160ddd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610b7757600080fd5b505af1158015610b8b573d6000803e3d6000fd5b505050506040513d6020811015610ba157600080fd5b5051610baa565b855b9550610bb6898d61194c565b1515610bc157600080fd5b88600160a060020a031663d89595128d6040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b158015610c1c57600080fd5b505af1158015610c30573d6000803e3d6000fd5b505050506040513d6020811015610c4657600080fd5b50519450610c54898d6119eb565b604080517f29a00e7c000000000000000000000000000000000000000000000000000000008152600481018990526024810188905263ffffffff83166044820152606481018b90529051919550600160a060020a038416916329a00e7c916084808201926020929091908290030181600087803b158015610cd457600080fd5b505af1158015610ce8573d6000803e3d6000fd5b505050506040513d6020811015610cfe57600080fd5b5051604080517f579cd3ca0000000000000000000000000000000000000000000000000000000081529051919950610db491620f424091610da891600160a060020a038e169163579cd3ca9160048083019260209291908290030181600087803b158015610d6b57600080fd5b505af1158015610d7f573d6000803e3d6000fd5b505050506040513d6020811015610d9557600080fd5b50518b9063ffffffff90811690611a8a16565b9063ffffffff611ac316565b96508688039750878b600160a060020a03166318160ddd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610dfa57600080fd5b505af1158015610e0e573d6000803e3d6000fd5b505050506040513d6020811015610e2457600080fd5b50510195506111a0565b8a600160a060020a03168c600160a060020a031614156110f85782600160a060020a03168b600160a060020a031614610ed0578a600160a060020a03166318160ddd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610e9f57600080fd5b505af1158015610eb3573d6000803e3d6000fd5b505050506040513d6020811015610ec957600080fd5b5051610ed2565b855b955088600160a060020a031663d89595128b6040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b158015610f2f57600080fd5b505af1158015610f43573d6000803e3d6000fd5b505050506040513d6020811015610f5957600080fd5b50519450610f67898b6119eb565b604080517f49f9b0f7000000000000000000000000000000000000000000000000000000008152600481018990526024810188905263ffffffff83166044820152606481018b90529051919550600160a060020a038416916349f9b0f7916084808201926020929091908290030181600087803b158015610fe757600080fd5b505af1158015610ffb573d6000803e3d6000fd5b505050506040513d602081101561101157600080fd5b5051604080517f579cd3ca000000000000000000000000000000000000000000000000000000008152905191995061107e91620f424091610da891600160a060020a038e169163579cd3ca9160048083019260209291908290030181600087803b158015610d6b57600080fd5b96508688039750878b600160a060020a03166318160ddd6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156110c457600080fd5b505af11580156110d8573d6000803e3d6000fd5b505050506040513d60208110156110ee57600080fd5b50510395506111a0565b604080517f1e1401f8000000000000000000000000000000000000000000000000000000008152600160a060020a038e811660048301528c81166024830152604482018b90528251908c1692631e1401f892606480820193918290030181600087803b15801561116757600080fd5b505af115801561117b573d6000803e3d6000fd5b505050506040513d604081101561119157600080fd5b50805160209091015190985096505b989a508a988a9250600201610a60565b50959e949d50939b505050505050505050505050565b7f42616e636f72436f6e766572746572557067726164657200000000000000000081565b60006111fd8a8a8a8a8d8b8a8a8a611736565b9a9950505050505050505050565b7f424e54546f6b656e00000000000000000000000000000000000000000000000081565b7f436f6e747261637452656769737472790000000000000000000000000000000081565b7f42616e636f72436f6e766572746572466163746f72790000000000000000000081565b600254600160a060020a031681565b600054600160a060020a0316331461129d57600080fd5b82600160a060020a03811615156112b357600080fd5b82600160a060020a03811615156112c957600080fd5b83600160a060020a0381163014156112e057600080fd5b85600160a060020a031663a9059cbb86866040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050600060405180830381600087803b15801561134357600080fd5b505af1158015611357573d6000803e3d6000fd5b50505050505050505050565b7f424e54436f6e766572746572000000000000000000000000000000000000000081565b6000806113988c8c88888888611ae6565b6113bd8c8c8c8f60008151811015156113ad57fe5b9060200190602002015130611e18565b6003546040805160e260020a632ecd14d30281527f42616e636f72580000000000000000000000000000000000000000000000000060048201529051929450600160a060020a03909116925063bb34534c9160248083019260209291908290030181600087803b15801561143057600080fd5b505af1158015611444573d6000803e3d6000fd5b505050506040513d602081101561145a57600080fd5b5051604080517f427c0374000000000000000000000000000000000000000000000000000000008152600481018c9052602481018b905260448101849052606481018a90529051600160a060020a039092169163427c03749160848082019260009290919082900301818387803b1580156114d457600080fd5b505af11580156114e8573d6000803e3d6000fd5b50929e9d5050505050505050505050505050565b600061150f898989898c8a8a8a8a611736565b9998505050505050505050565b7f42616e636f72466f726d756c610000000000000000000000000000000000000081565b600154600160a060020a0316331461155757600080fd5b60015460008054604051600160a060020a0393841693909116917f343765429aea5a34b3ff6a3785a98a5abb2597aca87bfbb58632c173d585373a91a3600180546000805473ffffffffffffffffffffffffffffffffffffffff19908116600160a060020a03841617909155169055565b600354600160a060020a031681565b60046020526000908152604090205460ff1681565b7f436f6e747261637446656174757265730000000000000000000000000000000081565b60056020526000908152604090205460ff1681565b600054600160a060020a031681565b7f42616e636f724e6574776f726b0000000000000000000000000000000000000081565b7f42616e636f7247617350726963654c696d69740000000000000000000000000081565b600181565b600054600160a060020a0316331461169857600080fd5b80600160a060020a03811615156116ae57600080fd5b81600160a060020a0381163014156116c557600080fd5b50506003805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60008085600081518110151561170857fe5b90602001906020020151905061172081333088612087565b61172c8686868661186a565b9695505050505050565b6000808a600081518110151561174857fe5b90602001906020020151905034600014806117855750348a1480156117855750600160a060020a03811660009081526004602052604090205460ff165b151561179057600080fd5b60003411156117f15780600160a060020a031663d0e30db0346040518263ffffffff1660e060020a0281526004016000604051808303818588803b1580156117d757600080fd5b505af11580156117eb573d6000803e3d6000fd5b50505050505b6118028b8b8b8b8b8b8b8b8b61241f565b9b9a5050505050505050505050565b7f42616e636f72580000000000000000000000000000000000000000000000000081565b600061184987878787878787808080611387565b979650505050505050565b6000611862848484336116f6565b949350505050565b600061187d858585858286808080611736565b95945050505050565b7f42616e636f72585570677261646572000000000000000000000000000000000081565b600154600160a060020a031681565b600054600160a060020a031633146118d057600080fd5b600054600160a060020a03828116911614156118eb57600080fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60006118628484843361186a565b7f4e6f6e5374616e64617264546f6b656e5265676973747279000000000000000081565b60008060008060008087600160a060020a0316630e53aae9886040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a0316815260200191505060a060405180830381600087803b1580156119b057600080fd5b505af11580156119c4573d6000803e3d6000fd5b505050506040513d60a08110156119da57600080fd5b506060015198975050505050505050565b60008060008060008087600160a060020a0316630e53aae9886040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a0316815260200191505060a060405180830381600087803b158015611a4f57600080fd5b505af1158015611a63573d6000803e3d6000fd5b505050506040513d60a0811015611a7957600080fd5b506020015198975050505050505050565b600080831515611a9d5760009150611abc565b50828202828482811515611aad57fe5b0414611ab857600080fd5b8091505b5092915050565b600080808311611ad257600080fd5b8284811515611add57fe5b04949350505050565b6000808760028151118015611afd57506015815111155b8015611b0e57508051600290066001145b1515611b1957600080fd5b886000815181101515611b2857fe5b9060200190602002015192503460001480611b6557503488148015611b655750600160a060020a03831660009081526004602052604090205460ff165b1515611b7057600080fd5b6003546040805160e260020a632ecd14d30281527f424e54546f6b656e00000000000000000000000000000000000000000000000060048201529051600160a060020a039092169163bb34534c916024808201926020929091908290030181600087803b158015611be057600080fd5b505af1158015611bf4573d6000803e3d6000fd5b505050506040513d6020811015611c0a57600080fd5b50518951600160a060020a03909116908a906000198101908110611c2a57fe5b60209081029091010151600160a060020a031614611c4757600080fd5b6000341115611cac5782600160a060020a031663d0e30db0346040518263ffffffff1660e060020a0281526004016000604051808303818588803b158015611c8e57600080fd5b505af1158015611ca2573d6000803e3d6000fd5b5050505050611cb8565b611cb88333308b612087565b60ff8616158015611cc7575084155b8015611cd1575083155b15611df3576003546040805160e260020a632ecd14d30281527f42616e636f7247617350726963654c696d69740000000000000000000000000060048201529051600160a060020a039092169163bb34534c916024808201926020929091908290030181600087803b158015611d4657600080fd5b505af1158015611d5a573d6000803e3d6000fd5b505050506040513d6020811015611d7057600080fd5b5051604080517f6b4dff1f0000000000000000000000000000000000000000000000000000000081523a60048201529051919350600160a060020a03841691636b4dff1f9160248082019260009290919082900301818387803b158015611dd657600080fd5b505af1158015611dea573d6000803e3d6000fd5b50505050611e0d565b611e02898989338a8a8a612696565b1515611e0d57600080fd5b505050505050505050565b6003546040805160e260020a632ecd14d30281527f436f6e7472616374466561747572657300000000000000000000000000000000600482015290516000928392839283928392839283928392600160a060020a039091169163bb34534c9160248082019260209290919082900301818787803b158015611e9857600080fd5b505af1158015611eac573d6000803e3d6000fd5b505050506040513d6020811015611ec257600080fd5b50518d519093509150600190505b81811015612076578c81815181101515611ee657fe5b9060200190602002015195508c81600101815181101515611f0357fe5b90602001906020020151945085600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015611f4d57600080fd5b505af1158015611f61573d6000803e3d6000fd5b505050506040513d6020811015611f7757600080fd5b50519350611f86848a8561285d565b600160a060020a03868116908b1614611fa457611fa48a858e612a19565b83600160a060020a0316635e5144eb8b878f600287038614611fc7576001611fc9565b8f5b6040518563ffffffff1660e060020a0281526004018085600160a060020a0316600160a060020a0316815260200184600160a060020a0316600160a060020a03168152602001838152602001828152602001945050505050602060405180830381600087803b15801561203b57600080fd5b505af115801561204f573d6000803e3d6000fd5b505050506040513d602081101561206557600080fd5b50519b509398508893600201611ed0565b50929b999a50505050505050505050565b6003546040805160e260020a632ecd14d30281527f4e6f6e5374616e64617264546f6b656e526567697374727900000000000000006004820152905160009283928392600160a060020a039092169163bb34534c9160248082019260209290919082900301818787803b1580156120fd57600080fd5b505af1158015612111573d6000803e3d6000fd5b505050506040513d602081101561212757600080fd5b5051604080517faeea10bd000000000000000000000000000000000000000000000000000000008152600160a060020a038a8116600483015291519295509085169163aeea10bd916024808201926020929091908290030181600087803b15801561219157600080fd5b505af11580156121a5573d6000803e3d6000fd5b505050506040513d60208110156121bb57600080fd5b50511561236e5786600160a060020a03166370a08231866040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b15801561221d57600080fd5b505af1158015612231573d6000803e3d6000fd5b505050506040513d602081101561224757600080fd5b5051604080517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a0389811660048301528881166024830152604482018890529151929450908916916323b872dd9160648082019260009290919082900301818387803b1580156122bf57600080fd5b505af11580156122d3573d6000803e3d6000fd5b5050505086600160a060020a03166370a08231866040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b15801561233257600080fd5b505af1158015612346573d6000803e3d6000fd5b505050506040513d602081101561235c57600080fd5b5051905081811161236957fe5b612416565b604080517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a0388811660048301528781166024830152604482018790529151918916916323b872dd916064808201926020929091908290030181600087803b1580156123e257600080fd5b505af11580156123f6573d6000803e3d6000fd5b505050506040513d602081101561240c57600080fd5b5051151561241657fe5b50505050505050565b6000806000808c6002815111801561243957506015815111155b801561244a57508051600290066001145b151561245557600080fd5b60ff8816158015612464575086155b801561246e575085155b15612590576003546040805160e260020a632ecd14d30281527f42616e636f7247617350726963654c696d69740000000000000000000000000060048201529051600160a060020a039092169163bb34534c916024808201926020929091908290030181600087803b1580156124e357600080fd5b505af11580156124f7573d6000803e3d6000fd5b505050506040513d602081101561250d57600080fd5b5051604080517f6b4dff1f0000000000000000000000000000000000000000000000000000000081523a60048201529051919550600160a060020a03861691636b4dff1f9160248082019260009290919082900301818387803b15801561257357600080fd5b505af1158015612587573d6000803e3d6000fd5b505050506125aa565b61259f8e8b8b8e8c8c8c612696565b15156125aa57600080fd5b8d60008151811015156125b957fe5b9060200190602002015192506125d28e8e8e868f611e18565b600160a060020a038216600090815260046020526040902054909e5090925060ff16156126795781600160a060020a031663205c28788c8f6040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050600060405180830381600087803b15801561265c57600080fd5b505af1158015612670573d6000803e3d6000fd5b50505050612684565b612684828c8f612c53565b509a9c9b505050505050505050505050565b600080600080883a89338d8f6040518087815260200186815260200185600160a060020a0316600160a060020a03166c0100000000000000000000000002815260140184600160a060020a0316600160a060020a03166c01000000000000000000000000028152601401838152602001828051906020019060200280838360005b8381101561272f578181015183820152602001612717565b50506040805195909301859003909420600081815260056020529290922054919d505060ff16159850508715965061276e955050505050505750884311155b151561277957600080fd5b604080517f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c8101859052815190819003603c0181206002546000808452602084810180875284905260ff8d1685870152606085018c9052608085018b90529451929650600160a060020a039091169360019360a0808201949293601f19840193928390039091019190865af115801561281a573d6000803e3d6000fd5b50505060206040510351600160a060020a031614905080156111fd576000838152600560205260409020805460ff191660011790559a9950505050505050505050565b604080517fa5fbf287000000000000000000000000000000000000000000000000000000008152600160a060020a03858116600483015260016024830152915160009284169163a5fbf28791604480830192602092919082900301818787803b1580156128c957600080fd5b505af11580156128dd573d6000803e3d6000fd5b505050506040513d60208110156128f357600080fd5b5051151561290057612a13565b83600160a060020a031663c45d3d926040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561293e57600080fd5b505af1158015612952573d6000803e3d6000fd5b505050506040513d602081101561296857600080fd5b50519050600160a060020a038116151561298157612a13565b80600160a060020a0316633af32abf846040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b1580156129dc57600080fd5b505af11580156129f0573d6000803e3d6000fd5b505050506040513d6020811015612a0657600080fd5b50511515612a1357600080fd5b50505050565b604080517fdd62ed3e000000000000000000000000000000000000000000000000000000008152306004820152600160a060020a0384811660248301529151839286169163dd62ed3e9160448083019260209291908290030181600087803b158015612a8457600080fd5b505af1158015612a98573d6000803e3d6000fd5b505050506040513d6020811015612aae57600080fd5b505110612aba57612c4e565b604080517fdd62ed3e000000000000000000000000000000000000000000000000000000008152306004820152600160a060020a03848116602483015291519185169163dd62ed3e916044808201926020929091908290030181600087803b158015612b2557600080fd5b505af1158015612b39573d6000803e3d6000fd5b505050506040513d6020811015612b4f57600080fd5b505115612bd757604080517f095ea7b3000000000000000000000000000000000000000000000000000000008152600160a060020a03848116600483015260006024830181905292519086169263095ea7b3926044808201939182900301818387803b158015612bbe57600080fd5b505af1158015612bd2573d6000803e3d6000fd5b505050505b82600160a060020a031663095ea7b383836040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050600060405180830381600087803b158015612c3a57600080fd5b505af1158015612416573d6000803e3d6000fd5b505050565b6003546040805160e260020a632ecd14d30281527f4e6f6e5374616e64617264546f6b656e526567697374727900000000000000006004820152905160009283928392600160a060020a039092169163bb34534c9160248082019260209290919082900301818787803b158015612cc957600080fd5b505af1158015612cdd573d6000803e3d6000fd5b505050506040513d6020811015612cf357600080fd5b5051604080517faeea10bd000000000000000000000000000000000000000000000000000000008152600160a060020a03898116600483015291519295509085169163aeea10bd916024808201926020929091908290030181600087803b158015612d5d57600080fd5b505af1158015612d71573d6000803e3d6000fd5b505050506040513d6020811015612d8757600080fd5b505115612f325785600160a060020a03166370a08231866040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b158015612de957600080fd5b505af1158015612dfd573d6000803e3d6000fd5b505050506040513d6020811015612e1357600080fd5b5051604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a0388811660048301526024820188905291519294509088169163a9059cbb9160448082019260009290919082900301818387803b158015612e8357600080fd5b505af1158015612e97573d6000803e3d6000fd5b5050505085600160a060020a03166370a08231866040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b158015612ef657600080fd5b505af1158015612f0a573d6000803e3d6000fd5b505050506040513d6020811015612f2057600080fd5b50519050818111612f2d57fe5b612fc9565b85600160a060020a031663a9059cbb86866040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b158015612f9557600080fd5b505af1158015612fa9573d6000803e3d6000fd5b505050506040513d6020811015612fbf57600080fd5b50511515612fc957fe5b5050505050505600a165627a7a72305820b379c72296c7f316eea8dfb5e74dff74482b21cd0458905b9fbd4d5c8238a8c70029
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
Swarm Source
bzzr://b379c72296c7f316eea8dfb5e74dff74482b21cd0458905b9fbd4d5c8238a8c7
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.