More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 63 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Release | 19648680 | 244 days ago | IN | 0 ETH | 0.00321686 | ||||
Release | 18144564 | 455 days ago | IN | 0 ETH | 0.00035818 | ||||
Release | 18047910 | 468 days ago | IN | 0 ETH | 0.00139384 | ||||
Release | 15987445 | 757 days ago | IN | 0 ETH | 0.00184311 | ||||
Slash Small User... | 15659133 | 803 days ago | IN | 0 ETH | 0.00075482 | ||||
Reserve Slash | 15659130 | 803 days ago | IN | 0 ETH | 0.00028047 | ||||
Slash Small User... | 15659082 | 803 days ago | IN | 0 ETH | 0.00034654 | ||||
Reserve Slash | 15659054 | 803 days ago | IN | 0 ETH | 0.00026194 | ||||
Release | 15282703 | 861 days ago | IN | 0 ETH | 0.00197836 | ||||
Release | 15257387 | 865 days ago | IN | 0 ETH | 0.00095224 | ||||
Transfer | 15246056 | 867 days ago | IN | 0.0005 ETH | 0.00016066 | ||||
Release | 14035406 | 1059 days ago | IN | 0 ETH | 0.01302921 | ||||
Release | 13003059 | 1220 days ago | IN | 0 ETH | 0.00765163 | ||||
Release | 13003046 | 1220 days ago | IN | 0 ETH | 0.00765163 | ||||
Release | 13002742 | 1220 days ago | IN | 0 ETH | 0.00173365 | ||||
Release | 12894957 | 1237 days ago | IN | 0 ETH | 0.00090697 | ||||
Release | 12721097 | 1264 days ago | IN | 0 ETH | 0.00046896 | ||||
Release | 12720948 | 1264 days ago | IN | 0 ETH | 0.0002896 | ||||
Release | 12720413 | 1264 days ago | IN | 0 ETH | 0.00090697 | ||||
Release | 12627421 | 1279 days ago | IN | 0 ETH | 0.00126959 | ||||
Release | 12627154 | 1279 days ago | IN | 0 ETH | 0.00040315 | ||||
Release | 12626363 | 1279 days ago | IN | 0 ETH | 0.00031595 | ||||
Release | 12626270 | 1279 days ago | IN | 0 ETH | 0.00031451 | ||||
Release | 12185761 | 1347 days ago | IN | 0 ETH | 0.01061086 | ||||
Release | 12185724 | 1347 days ago | IN | 0 ETH | 0.01052068 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
UsernameRegistrar
Compiler Version
v0.4.25+commit.59dbf8f1
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2018-10-24 */ pragma solidity ^0.4.24; /** * @title MerkleProof * @dev Merkle proof verification based on * https://github.com/ameensol/merkle-tree-solidity/blob/master/src/MerkleProof.sol */ library MerkleProof { /** * @dev Verifies a Merkle proof proving the existence of a leaf in a Merkle tree. Assumes that each pair of leaves * and each pair of pre-images are sorted. * @param _proof Merkle proof containing sibling hashes on the branch from the leaf to the root of the Merkle tree * @param _root Merkle root * @param _leaf Leaf of Merkle tree */ function verifyProof( bytes32[] _proof, bytes32 _root, bytes32 _leaf ) internal pure returns (bool) { bytes32 computedHash = _leaf; for (uint256 i = 0; i < _proof.length; i++) { bytes32 proofElement = _proof[i]; if (computedHash < proofElement) { // Hash(current computed hash + current element of the proof) computedHash = keccak256(abi.encodePacked(computedHash, proofElement)); } else { // Hash(current element of the proof + current computed hash) computedHash = keccak256(abi.encodePacked(proofElement, computedHash)); } } // Check if the computed hash (root) is equal to the provided root return computedHash == _root; } } contract Controlled { /// @notice The address of the controller is the only address that can call /// a function with this modifier modifier onlyController { require(msg.sender == controller); _; } address public controller; constructor() internal { controller = msg.sender; } /// @notice Changes the controller of the contract /// @param _newController The new controller of the contract function changeController(address _newController) public onlyController { controller = _newController; } } // Abstract contract for the full ERC 20 Token standard // https://github.com/ethereum/EIPs/issues/20 interface ERC20Token { /** * @notice send `_value` token to `_to` from `msg.sender` * @param _to The address of the recipient * @param _value The amount of token to be transferred * @return Whether the transfer was successful or not */ function transfer(address _to, uint256 _value) external returns (bool success); /** * @notice `msg.sender` approves `_spender` to spend `_value` tokens * @param _spender The address of the account able to transfer the tokens * @param _value The amount of tokens to be approved for transfer * @return Whether the approval was successful or not */ function approve(address _spender, uint256 _value) external returns (bool success); /** * @notice send `_value` token to `_to` from `_from` on the condition it is approved by `_from` * @param _from The address of the sender * @param _to The address of the recipient * @param _value The amount of token to be transferred * @return Whether the transfer was successful or not */ function transferFrom(address _from, address _to, uint256 _value) external returns (bool success); /** * @param _owner The address from which the balance will be retrieved * @return The balance */ function balanceOf(address _owner) external view returns (uint256 balance); /** * @param _owner The address of the account owning tokens * @param _spender The address of the account able to transfer the tokens * @return Amount of remaining tokens allowed to spent */ function allowance(address _owner, address _spender) external view returns (uint256 remaining); /** * @notice return total supply of tokens */ function totalSupply() external view returns (uint256 supply); event Transfer(address indexed _from, address indexed _to, uint256 _value); event Approval(address indexed _owner, address indexed _spender, uint256 _value); } contract ApproveAndCallFallBack { function receiveApproval(address from, uint256 _amount, address _token, bytes _data) public; } interface ENS { // Logged when the owner of a node assigns a new owner to a subnode. event NewOwner(bytes32 indexed node, bytes32 indexed label, address owner); // Logged when the owner of a node transfers ownership to a new account. event Transfer(bytes32 indexed node, address owner); // Logged when the resolver for a node changes. event NewResolver(bytes32 indexed node, address resolver); // Logged when the TTL of a node changes event NewTTL(bytes32 indexed node, uint64 ttl); function setSubnodeOwner(bytes32 node, bytes32 label, address owner) public; function setResolver(bytes32 node, address resolver) public; function setOwner(bytes32 node, address owner) public; function setTTL(bytes32 node, uint64 ttl) public; function owner(bytes32 node) public view returns (address); function resolver(bytes32 node) public view returns (address); function ttl(bytes32 node) public view returns (uint64); } /** * A simple resolver anyone can use; only allows the owner of a node to set its * address. */ contract PublicResolver { bytes4 constant INTERFACE_META_ID = 0x01ffc9a7; bytes4 constant ADDR_INTERFACE_ID = 0x3b3b57de; bytes4 constant CONTENT_INTERFACE_ID = 0xd8389dc5; bytes4 constant NAME_INTERFACE_ID = 0x691f3431; bytes4 constant ABI_INTERFACE_ID = 0x2203ab56; bytes4 constant PUBKEY_INTERFACE_ID = 0xc8690233; bytes4 constant TEXT_INTERFACE_ID = 0x59d1d43c; bytes4 constant MULTIHASH_INTERFACE_ID = 0xe89401a1; event AddrChanged(bytes32 indexed node, address a); event ContentChanged(bytes32 indexed node, bytes32 hash); event NameChanged(bytes32 indexed node, string name); event ABIChanged(bytes32 indexed node, uint256 indexed contentType); event PubkeyChanged(bytes32 indexed node, bytes32 x, bytes32 y); event TextChanged(bytes32 indexed node, string indexedKey, string key); event MultihashChanged(bytes32 indexed node, bytes hash); struct PublicKey { bytes32 x; bytes32 y; } struct Record { address addr; bytes32 content; string name; PublicKey pubkey; mapping(string=>string) text; mapping(uint256=>bytes) abis; bytes multihash; } ENS ens; mapping (bytes32 => Record) records; modifier only_owner(bytes32 node) { require(ens.owner(node) == msg.sender); _; } /** * Constructor. * @param ensAddr The ENS registrar contract. */ constructor(ENS ensAddr) public { ens = ensAddr; } /** * Sets the address associated with an ENS node. * May only be called by the owner of that node in the ENS registry. * @param node The node to update. * @param addr The address to set. */ function setAddr(bytes32 node, address addr) public only_owner(node) { records[node].addr = addr; emit AddrChanged(node, addr); } /** * Sets the content hash associated with an ENS node. * May only be called by the owner of that node in the ENS registry. * Note that this resource type is not standardized, and will likely change * in future to a resource type based on multihash. * @param node The node to update. * @param hash The content hash to set */ function setContent(bytes32 node, bytes32 hash) public only_owner(node) { records[node].content = hash; emit ContentChanged(node, hash); } /** * Sets the multihash associated with an ENS node. * May only be called by the owner of that node in the ENS registry. * @param node The node to update. * @param hash The multihash to set */ function setMultihash(bytes32 node, bytes hash) public only_owner(node) { records[node].multihash = hash; emit MultihashChanged(node, hash); } /** * Sets the name associated with an ENS node, for reverse records. * May only be called by the owner of that node in the ENS registry. * @param node The node to update. * @param name The name to set. */ function setName(bytes32 node, string name) public only_owner(node) { records[node].name = name; emit NameChanged(node, name); } /** * Sets the ABI associated with an ENS node. * Nodes may have one ABI of each content type. To remove an ABI, set it to * the empty string. * @param node The node to update. * @param contentType The content type of the ABI * @param data The ABI data. */ function setABI(bytes32 node, uint256 contentType, bytes data) public only_owner(node) { // Content types must be powers of 2 require(((contentType - 1) & contentType) == 0); records[node].abis[contentType] = data; emit ABIChanged(node, contentType); } /** * Sets the SECP256k1 public key associated with an ENS node. * @param node The ENS node to query * @param x the X coordinate of the curve point for the public key. * @param y the Y coordinate of the curve point for the public key. */ function setPubkey(bytes32 node, bytes32 x, bytes32 y) public only_owner(node) { records[node].pubkey = PublicKey(x, y); emit PubkeyChanged(node, x, y); } /** * Sets the text data associated with an ENS node and key. * May only be called by the owner of that node in the ENS registry. * @param node The node to update. * @param key The key to set. * @param value The text data value to set. */ function setText(bytes32 node, string key, string value) public only_owner(node) { records[node].text[key] = value; emit TextChanged(node, key, key); } /** * Returns the text data associated with an ENS node and key. * @param node The ENS node to query. * @param key The text data key to query. * @return The associated text data. */ function text(bytes32 node, string key) public view returns (string) { return records[node].text[key]; } /** * Returns the SECP256k1 public key associated with an ENS node. * Defined in EIP 619. * @param node The ENS node to query * @return x, y the X and Y coordinates of the curve point for the public key. */ function pubkey(bytes32 node) public view returns (bytes32 x, bytes32 y) { return (records[node].pubkey.x, records[node].pubkey.y); } /** * Returns the ABI associated with an ENS node. * Defined in EIP205. * @param node The ENS node to query * @param contentTypes A bitwise OR of the ABI formats accepted by the caller. * @return contentType The content type of the return value * @return data The ABI data */ function ABI(bytes32 node, uint256 contentTypes) public view returns (uint256 contentType, bytes data) { Record storage record = records[node]; for (contentType = 1; contentType <= contentTypes; contentType <<= 1) { if ((contentType & contentTypes) != 0 && record.abis[contentType].length > 0) { data = record.abis[contentType]; return; } } contentType = 0; } /** * Returns the name associated with an ENS node, for reverse records. * Defined in EIP181. * @param node The ENS node to query. * @return The associated name. */ function name(bytes32 node) public view returns (string) { return records[node].name; } /** * Returns the content hash associated with an ENS node. * Note that this resource type is not standardized, and will likely change * in future to a resource type based on multihash. * @param node The ENS node to query. * @return The associated content hash. */ function content(bytes32 node) public view returns (bytes32) { return records[node].content; } /** * Returns the multihash associated with an ENS node. * @param node The ENS node to query. * @return The associated multihash. */ function multihash(bytes32 node) public view returns (bytes) { return records[node].multihash; } /** * Returns the address associated with an ENS node. * @param node The ENS node to query. * @return The associated address. */ function addr(bytes32 node) public view returns (address) { return records[node].addr; } /** * Returns true if the resolver implements the interface specified by the provided hash. * @param interfaceID The ID of the interface to check for. * @return True if the contract implements the requested interface. */ function supportsInterface(bytes4 interfaceID) public pure returns (bool) { return interfaceID == ADDR_INTERFACE_ID || interfaceID == CONTENT_INTERFACE_ID || interfaceID == NAME_INTERFACE_ID || interfaceID == ABI_INTERFACE_ID || interfaceID == PUBKEY_INTERFACE_ID || interfaceID == TEXT_INTERFACE_ID || interfaceID == MULTIHASH_INTERFACE_ID || interfaceID == INTERFACE_META_ID; } } /** * @author Ricardo Guilherme Schmidt (Status Research & Development GmbH) * @notice Registers usernames as ENS subnodes of the domain `ensNode` */ contract UsernameRegistrar is Controlled, ApproveAndCallFallBack { ERC20Token public token; ENS public ensRegistry; PublicResolver public resolver; address public parentRegistry; uint256 public constant releaseDelay = 365 days; mapping (bytes32 => Account) public accounts; mapping (bytes32 => SlashReserve) reservedSlashers; //Slashing conditions uint256 public usernameMinLength; bytes32 public reservedUsernamesMerkleRoot; event RegistryState(RegistrarState state); event RegistryPrice(uint256 price); event RegistryMoved(address newRegistry); event UsernameOwner(bytes32 indexed nameHash, address owner); enum RegistrarState { Inactive, Active, Moved } bytes32 public ensNode; uint256 public price; RegistrarState public state; uint256 public reserveAmount; struct Account { uint256 balance; uint256 creationTime; address owner; } struct SlashReserve { address reserver; uint256 blockNumber; } /** * @notice Callable only by `parentRegistry()` to continue migration of ENSSubdomainRegistry. */ modifier onlyParentRegistry { require(msg.sender == parentRegistry, "Migration only."); _; } /** * @notice Initializes UsernameRegistrar contract. * The only parameter from this list that can be changed later is `_resolver`. * Other updates require a new contract and migration of domain. * @param _token ERC20 token with optional `approveAndCall(address,uint256,bytes)` for locking fee. * @param _ensRegistry Ethereum Name Service root contract address. * @param _resolver Public Resolver for resolving usernames. * @param _ensNode ENS node (domain) being used for usernames subnodes (subdomain) * @param _usernameMinLength Minimum length of usernames * @param _reservedUsernamesMerkleRoot Merkle root of reserved usernames * @param _parentRegistry Address of old registry (if any) for optional account migration. */ constructor( ERC20Token _token, ENS _ensRegistry, PublicResolver _resolver, bytes32 _ensNode, uint256 _usernameMinLength, bytes32 _reservedUsernamesMerkleRoot, address _parentRegistry ) public { require(address(_token) != address(0), "No ERC20Token address defined."); require(address(_ensRegistry) != address(0), "No ENS address defined."); require(address(_resolver) != address(0), "No Resolver address defined."); require(_ensNode != bytes32(0), "No ENS node defined."); token = _token; ensRegistry = _ensRegistry; resolver = _resolver; ensNode = _ensNode; usernameMinLength = _usernameMinLength; reservedUsernamesMerkleRoot = _reservedUsernamesMerkleRoot; parentRegistry = _parentRegistry; setState(RegistrarState.Inactive); } /** * @notice Registers `_label` username to `ensNode` setting msg.sender as owner. * Terms of name registration: * - SNT is deposited, not spent; the amount is locked up for 1 year. * - After 1 year, the user can release the name and receive their deposit back (at any time). * - User deposits are completely protected. The contract controller cannot access them. * - User's address(es) will be publicly associated with the ENS name. * - User must authorise the contract to transfer `price` `token.name()` on their behalf. * - Usernames registered with less then `usernameMinLength` characters can be slashed. * - Usernames contained in the merkle tree of root `reservedUsernamesMerkleRoot` can be slashed. * - Usernames starting with `0x` and bigger then 12 characters can be slashed. * - If terms of the contract change—e.g. Status makes contract upgrades—the user has the right to release the username and get their deposit back. * @param _label Choosen unowned username hash. * @param _account Optional address to set at public resolver. * @param _pubkeyA Optional pubkey part A to set at public resolver. * @param _pubkeyB Optional pubkey part B to set at public resolver. */ function register( bytes32 _label, address _account, bytes32 _pubkeyA, bytes32 _pubkeyB ) external returns(bytes32 namehash) { return registerUser(msg.sender, _label, _account, _pubkeyA, _pubkeyB); } /** * @notice Release username and retrieve locked fee, needs to be called * after `releasePeriod` from creation time by ENS registry owner of domain * or anytime by account owner when domain migrated to a new registry. * @param _label Username hash. */ function release( bytes32 _label ) external { bytes32 namehash = keccak256(abi.encodePacked(ensNode, _label)); Account memory account = accounts[_label]; require(account.creationTime > 0, "Username not registered."); if (state == RegistrarState.Active) { require(msg.sender == ensRegistry.owner(namehash), "Not owner of ENS node."); require(block.timestamp > account.creationTime + releaseDelay, "Release period not reached."); } else { require(msg.sender == account.owner, "Not the former account owner."); } delete accounts[_label]; if (account.balance > 0) { reserveAmount -= account.balance; require(token.transfer(msg.sender, account.balance), "Transfer failed"); } if (state == RegistrarState.Active) { ensRegistry.setSubnodeOwner(ensNode, _label, address(this)); ensRegistry.setResolver(namehash, address(0)); ensRegistry.setOwner(namehash, address(0)); } else { address newOwner = ensRegistry.owner(ensNode); //Low level call, case dropUsername not implemented or failing, proceed release. //Invert (!) to supress warning, return of this call have no use. !newOwner.call.gas(80000)( abi.encodeWithSignature( "dropUsername(bytes32)", _label ) ); } emit UsernameOwner(namehash, address(0)); } /** * @notice update account owner, should be called by new ens node owner * to update this contract registry, otherwise former owner can release * if domain is moved to a new registry. * @param _label Username hash. **/ function updateAccountOwner( bytes32 _label ) external { bytes32 namehash = keccak256(abi.encodePacked(ensNode, _label)); require(msg.sender == ensRegistry.owner(namehash), "Caller not owner of ENS node."); require(accounts[_label].creationTime > 0, "Username not registered."); require(ensRegistry.owner(ensNode) == address(this), "Registry not owner of registry."); accounts[_label].owner = msg.sender; emit UsernameOwner(namehash, msg.sender); } /** * @notice secretly reserve the slashing reward to `msg.sender` * @param _secret keccak256(abi.encodePacked(namehash, creationTime, reserveSecret)) */ function reserveSlash(bytes32 _secret) external { require(reservedSlashers[_secret].blockNumber == 0, "Already Reserved"); reservedSlashers[_secret] = SlashReserve(msg.sender, block.number); } /** * @notice Slash username smaller then `usernameMinLength`. * @param _username Raw value of offending username. */ function slashSmallUsername( string _username, uint256 _reserveSecret ) external { bytes memory username = bytes(_username); require(username.length < usernameMinLength, "Not a small username."); slashUsername(username, _reserveSecret); } /** * @notice Slash username starting with "0x" and with length greater than 12. * @param _username Raw value of offending username. */ function slashAddressLikeUsername( string _username, uint256 _reserveSecret ) external { bytes memory username = bytes(_username); require(username.length > 12, "Too small to look like an address."); require(username[0] == byte("0"), "First character need to be 0"); require(username[1] == byte("x"), "Second character need to be x"); for(uint i = 2; i < 7; i++){ byte b = username[i]; require((b >= 48 && b <= 57) || (b >= 97 && b <= 102), "Does not look like an address"); } slashUsername(username, _reserveSecret); } /** * @notice Slash username that is exactly a reserved name. * @param _username Raw value of offending username. * @param _proof Merkle proof that name is listed on merkle tree. */ function slashReservedUsername( string _username, bytes32[] _proof, uint256 _reserveSecret ) external { bytes memory username = bytes(_username); require( MerkleProof.verifyProof( _proof, reservedUsernamesMerkleRoot, keccak256(username) ), "Invalid Proof." ); slashUsername(username, _reserveSecret); } /** * @notice Slash username that contains a non alphanumeric character. * @param _username Raw value of offending username. * @param _offendingPos Position of non alphanumeric character. */ function slashInvalidUsername( string _username, uint256 _offendingPos, uint256 _reserveSecret ) external { bytes memory username = bytes(_username); require(username.length > _offendingPos, "Invalid position."); byte b = username[_offendingPos]; require(!((b >= 48 && b <= 57) || (b >= 97 && b <= 122)), "Not invalid character."); slashUsername(username, _reserveSecret); } /** * @notice Clear resolver and ownership of unowned subdomians. * @param _labels Sequence to erase. */ function eraseNode( bytes32[] _labels ) external { uint len = _labels.length; require(len != 0, "Nothing to erase"); bytes32 label = _labels[len - 1]; bytes32 subnode = keccak256(abi.encodePacked(ensNode, label)); require(ensRegistry.owner(subnode) == address(0), "First slash/release top level subdomain"); ensRegistry.setSubnodeOwner(ensNode, label, address(this)); if(len > 1) { eraseNodeHierarchy(len - 2, _labels, subnode); } ensRegistry.setResolver(subnode, 0); ensRegistry.setOwner(subnode, 0); } /** * @notice Migrate account to new registry, opt-in to new contract. * @param _label Username hash. **/ function moveAccount( bytes32 _label, UsernameRegistrar _newRegistry ) external { require(state == RegistrarState.Moved, "Wrong contract state"); require(msg.sender == accounts[_label].owner, "Callable only by account owner."); require(ensRegistry.owner(ensNode) == address(_newRegistry), "Wrong update"); Account memory account = accounts[_label]; delete accounts[_label]; token.approve(_newRegistry, account.balance); _newRegistry.migrateUsername( _label, account.balance, account.creationTime, account.owner ); } /** * @notice Activate registration. * @param _price The price of registration. */ function activate( uint256 _price ) external onlyController { require(state == RegistrarState.Inactive, "Registry state is not Inactive"); require(ensRegistry.owner(ensNode) == address(this), "Registry does not own registry"); price = _price; setState(RegistrarState.Active); emit RegistryPrice(_price); } /** * @notice Updates Public Resolver for resolving users. * @param _resolver New PublicResolver. */ function setResolver( address _resolver ) external onlyController { resolver = PublicResolver(_resolver); } /** * @notice Updates registration price. * @param _price New registration price. */ function updateRegistryPrice( uint256 _price ) external onlyController { require(state == RegistrarState.Active, "Registry not owned"); price = _price; emit RegistryPrice(_price); } /** * @notice Transfer ownership of ensNode to `_newRegistry`. * Usernames registered are not affected, but they would be able to instantly release. * @param _newRegistry New UsernameRegistrar for hodling `ensNode` node. */ function moveRegistry( UsernameRegistrar _newRegistry ) external onlyController { require(_newRegistry != this, "Cannot move to self."); require(ensRegistry.owner(ensNode) == address(this), "Registry not owned anymore."); setState(RegistrarState.Moved); ensRegistry.setOwner(ensNode, _newRegistry); _newRegistry.migrateRegistry(price); emit RegistryMoved(_newRegistry); } /** * @notice Opt-out migration of username from `parentRegistry()`. * Clear ENS resolver and subnode owner. * @param _label Username hash. */ function dropUsername( bytes32 _label ) external onlyParentRegistry { require(accounts[_label].creationTime == 0, "Already migrated"); bytes32 namehash = keccak256(abi.encodePacked(ensNode, _label)); ensRegistry.setSubnodeOwner(ensNode, _label, address(this)); ensRegistry.setResolver(namehash, address(0)); ensRegistry.setOwner(namehash, address(0)); } /** * @notice Withdraw not reserved tokens * @param _token Address of ERC20 withdrawing excess, or address(0) if want ETH. * @param _beneficiary Address to send the funds. **/ function withdrawExcessBalance( address _token, address _beneficiary ) external onlyController { require(_beneficiary != address(0), "Cannot burn token"); if (_token == address(0)) { _beneficiary.transfer(address(this).balance); } else { ERC20Token excessToken = ERC20Token(_token); uint256 amount = excessToken.balanceOf(address(this)); if(_token == address(token)){ require(amount > reserveAmount, "Is not excess"); amount -= reserveAmount; } else { require(amount > 0, "No balance"); } excessToken.transfer(_beneficiary, amount); } } /** * @notice Withdraw ens nodes not belonging to this contract. * @param _domainHash Ens node namehash. * @param _beneficiary New owner of ens node. **/ function withdrawWrongNode( bytes32 _domainHash, address _beneficiary ) external onlyController { require(_beneficiary != address(0), "Cannot burn node"); require(_domainHash != ensNode, "Cannot withdraw main node"); require(ensRegistry.owner(_domainHash) == address(this), "Not owner of this node"); ensRegistry.setOwner(_domainHash, _beneficiary); } /** * @notice Gets registration price. * @return Registration price. **/ function getPrice() external view returns(uint256 registryPrice) { return price; } /** * @notice reads amount tokens locked in username * @param _label Username hash. * @return Locked username balance. **/ function getAccountBalance(bytes32 _label) external view returns(uint256 accountBalance) { accountBalance = accounts[_label].balance; } /** * @notice reads username account owner at this contract, * which can release or migrate in case of upgrade. * @param _label Username hash. * @return Username account owner. **/ function getAccountOwner(bytes32 _label) external view returns(address owner) { owner = accounts[_label].owner; } /** * @notice reads when the account was registered * @param _label Username hash. * @return Registration time. **/ function getCreationTime(bytes32 _label) external view returns(uint256 creationTime) { creationTime = accounts[_label].creationTime; } /** * @notice calculate time where username can be released * @param _label Username hash. * @return Exact time when username can be released. **/ function getExpirationTime(bytes32 _label) external view returns(uint256 releaseTime) { uint256 creationTime = accounts[_label].creationTime; if (creationTime > 0){ releaseTime = creationTime + releaseDelay; } } /** * @notice calculate reward part an account could payout on slash * @param _label Username hash. * @return Part of reward **/ function getSlashRewardPart(bytes32 _label) external view returns(uint256 partReward) { uint256 balance = accounts[_label].balance; if (balance > 0) { partReward = balance / 3; } } /** * @notice Support for "approveAndCall". Callable only by `token()`. * @param _from Who approved. * @param _amount Amount being approved, need to be equal `getPrice()`. * @param _token Token being approved, need to be equal `token()`. * @param _data Abi encoded data with selector of `register(bytes32,address,bytes32,bytes32)`. */ function receiveApproval( address _from, uint256 _amount, address _token, bytes _data ) public { require(_amount == price, "Wrong value"); require(_token == address(token), "Wrong token"); require(_token == address(msg.sender), "Wrong call"); require(_data.length <= 132, "Wrong data length"); bytes4 sig; bytes32 label; address account; bytes32 pubkeyA; bytes32 pubkeyB; (sig, label, account, pubkeyA, pubkeyB) = abiDecodeRegister(_data); require( sig == bytes4(0xb82fedbb), //bytes4(keccak256("register(bytes32,address,bytes32,bytes32)")) "Wrong method selector" ); registerUser(_from, label, account, pubkeyA, pubkeyB); } /** * @notice Continues migration of username to new registry. * @param _label Username hash. * @param _tokenBalance Amount being transfered from `parentRegistry()`. * @param _creationTime Time user registrated in `parentRegistry()` is preserved. * @param _accountOwner Account owner which migrated the account. **/ function migrateUsername( bytes32 _label, uint256 _tokenBalance, uint256 _creationTime, address _accountOwner ) external onlyParentRegistry { if (_tokenBalance > 0) { require( token.transferFrom( parentRegistry, address(this), _tokenBalance ), "Error moving funds from old registar." ); reserveAmount += _tokenBalance; } accounts[_label] = Account(_tokenBalance, _creationTime, _accountOwner); } /** * @dev callable only by parent registry to continue migration * of registry and activate registration. * @param _price The price of registration. **/ function migrateRegistry( uint256 _price ) external onlyParentRegistry { require(state == RegistrarState.Inactive, "Not Inactive"); require(ensRegistry.owner(ensNode) == address(this), "ENS registry owner not transfered."); price = _price; setState(RegistrarState.Active); emit RegistryPrice(_price); } /** * @notice Registers `_label` username to `ensNode` setting msg.sender as owner. * @param _owner Address registering the user and paying registry price. * @param _label Choosen unowned username hash. * @param _account Optional address to set at public resolver. * @param _pubkeyA Optional pubkey part A to set at public resolver. * @param _pubkeyB Optional pubkey part B to set at public resolver. */ function registerUser( address _owner, bytes32 _label, address _account, bytes32 _pubkeyA, bytes32 _pubkeyB ) internal returns(bytes32 namehash) { require(state == RegistrarState.Active, "Registry not active."); namehash = keccak256(abi.encodePacked(ensNode, _label)); require(ensRegistry.owner(namehash) == address(0), "ENS node already owned."); require(accounts[_label].creationTime == 0, "Username already registered."); accounts[_label] = Account(price, block.timestamp, _owner); if(price > 0) { require(token.allowance(_owner, address(this)) >= price, "Unallowed to spend."); require( token.transferFrom( _owner, address(this), price ), "Transfer failed" ); reserveAmount += price; } bool resolvePubkey = _pubkeyA != 0 || _pubkeyB != 0; bool resolveAccount = _account != address(0); if (resolvePubkey || resolveAccount) { //set to self the ownership to setup initial resolver ensRegistry.setSubnodeOwner(ensNode, _label, address(this)); ensRegistry.setResolver(namehash, resolver); //default resolver if (resolveAccount) { resolver.setAddr(namehash, _account); } if (resolvePubkey) { resolver.setPubkey(namehash, _pubkeyA, _pubkeyB); } ensRegistry.setOwner(namehash, _owner); } else { //transfer ownership of subdone directly to registrant ensRegistry.setSubnodeOwner(ensNode, _label, _owner); } emit UsernameOwner(namehash, _owner); } /** * @dev Removes account hash of `_username` and send account.balance to msg.sender. * @param _username Username being slashed. */ function slashUsername( bytes _username, uint256 _reserveSecret ) internal { bytes32 label = keccak256(_username); bytes32 namehash = keccak256(abi.encodePacked(ensNode, label)); uint256 amountToTransfer = 0; uint256 creationTime = accounts[label].creationTime; address owner = ensRegistry.owner(namehash); if(creationTime == 0) { require( owner != address(0) || ensRegistry.resolver(namehash) != address(0), "Nothing to slash." ); } else { assert(creationTime != block.timestamp); amountToTransfer = accounts[label].balance; delete accounts[label]; } ensRegistry.setSubnodeOwner(ensNode, label, address(this)); ensRegistry.setResolver(namehash, address(0)); ensRegistry.setOwner(namehash, address(0)); if (amountToTransfer > 0) { reserveAmount -= amountToTransfer; uint256 partialDeposit = amountToTransfer / 3; amountToTransfer = partialDeposit * 2; // reserve 1/3 to network (controller) bytes32 secret = keccak256(abi.encodePacked(namehash, creationTime, _reserveSecret)); SlashReserve memory reserve = reservedSlashers[secret]; require(reserve.reserver != address(0), "Not reserved."); require(reserve.blockNumber < block.number, "Cannot reveal in same block"); delete reservedSlashers[secret]; require(token.transfer(reserve.reserver, amountToTransfer), "Error in transfer."); } emit UsernameOwner(namehash, address(0)); } function setState(RegistrarState _state) private { state = _state; emit RegistryState(_state); } /** * @notice recursively erase all _labels in _subnode * @param _idx recursive position of _labels to erase * @param _labels list of subnode labes * @param _subnode subnode being erased */ function eraseNodeHierarchy( uint _idx, bytes32[] _labels, bytes32 _subnode ) private { // Take ownership of the node ensRegistry.setSubnodeOwner(_subnode, _labels[_idx], address(this)); bytes32 subnode = keccak256(abi.encodePacked(_subnode, _labels[_idx])); // Recurse if there are more labels if (_idx > 0) { eraseNodeHierarchy(_idx - 1, _labels, subnode); } // Erase the resolver and owner records ensRegistry.setResolver(subnode, 0); ensRegistry.setOwner(subnode, 0); } /** * @dev Decodes abi encoded data with selector for "register(bytes32,address,bytes32,bytes32)". * @param _data Abi encoded data. * @return Decoded registry call. */ function abiDecodeRegister( bytes _data ) private pure returns( bytes4 sig, bytes32 label, address account, bytes32 pubkeyA, bytes32 pubkeyB ) { assembly { sig := mload(add(_data, add(0x20, 0))) label := mload(add(_data, 36)) account := mload(add(_data, 68)) pubkeyA := mload(add(_data, 100)) pubkeyB := mload(add(_data, 132)) } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":true,"inputs":[],"name":"resolver","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_secret","type":"bytes32"}],"name":"reserveSlash","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"reservedUsernamesMerkleRoot","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"},{"name":"_beneficiary","type":"address"}],"name":"withdrawExcessBalance","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_label","type":"bytes32"}],"name":"updateAccountOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newController","type":"address"}],"name":"changeController","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_username","type":"string"},{"name":"_offendingPos","type":"uint256"},{"name":"_reserveSecret","type":"uint256"}],"name":"slashInvalidUsername","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_username","type":"string"},{"name":"_proof","type":"bytes32[]"},{"name":"_reserveSecret","type":"uint256"}],"name":"slashReservedUsername","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"reserveAmount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_resolver","type":"address"}],"name":"setResolver","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"usernameMinLength","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_label","type":"bytes32"}],"name":"release","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_label","type":"bytes32"}],"name":"getCreationTime","outputs":[{"name":"creationTime","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"releaseDelay","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ensRegistry","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_label","type":"bytes32"},{"name":"_tokenBalance","type":"uint256"},{"name":"_creationTime","type":"uint256"},{"name":"_accountOwner","type":"address"}],"name":"migrateUsername","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_label","type":"bytes32"}],"name":"getSlashRewardPart","outputs":[{"name":"partReward","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_price","type":"uint256"}],"name":"updateRegistryPrice","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_username","type":"string"},{"name":"_reserveSecret","type":"uint256"}],"name":"slashAddressLikeUsername","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_amount","type":"uint256"},{"name":"_token","type":"address"},{"name":"_data","type":"bytes"}],"name":"receiveApproval","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_username","type":"string"},{"name":"_reserveSecret","type":"uint256"}],"name":"slashSmallUsername","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getPrice","outputs":[{"name":"registryPrice","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_price","type":"uint256"}],"name":"migrateRegistry","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"price","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_label","type":"bytes32"}],"name":"getExpirationTime","outputs":[{"name":"releaseTime","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_label","type":"bytes32"}],"name":"getAccountOwner","outputs":[{"name":"owner","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_domainHash","type":"bytes32"},{"name":"_beneficiary","type":"address"}],"name":"withdrawWrongNode","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_price","type":"uint256"}],"name":"activate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_label","type":"bytes32"},{"name":"_account","type":"address"},{"name":"_pubkeyA","type":"bytes32"},{"name":"_pubkeyB","type":"bytes32"}],"name":"register","outputs":[{"name":"namehash","type":"bytes32"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"accounts","outputs":[{"name":"balance","type":"uint256"},{"name":"creationTime","type":"uint256"},{"name":"owner","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"state","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_label","type":"bytes32"},{"name":"_newRegistry","type":"address"}],"name":"moveAccount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"parentRegistry","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ensNode","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_labels","type":"bytes32[]"}],"name":"eraseNode","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newRegistry","type":"address"}],"name":"moveRegistry","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_label","type":"bytes32"}],"name":"getAccountBalance","outputs":[{"name":"accountBalance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"controller","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_label","type":"bytes32"}],"name":"dropUsername","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"token","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_token","type":"address"},{"name":"_ensRegistry","type":"address"},{"name":"_resolver","type":"address"},{"name":"_ensNode","type":"bytes32"},{"name":"_usernameMinLength","type":"uint256"},{"name":"_reservedUsernamesMerkleRoot","type":"bytes32"},{"name":"_parentRegistry","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"state","type":"uint8"}],"name":"RegistryState","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"price","type":"uint256"}],"name":"RegistryPrice","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newRegistry","type":"address"}],"name":"RegistryMoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"nameHash","type":"bytes32"},{"indexed":false,"name":"owner","type":"address"}],"name":"UsernameOwner","type":"event"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405160e080620049ea83398101604090815281516020830151918301516060840151608085015160a086015160c09096015160008054600160a060020a031916331790559395929391929091600160a060020a0387161515620000d757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4e6f204552433230546f6b656e206164647265737320646566696e65642e0000604482015290519081900360640190fd5b600160a060020a03861615156200014f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e6f20454e53206164647265737320646566696e65642e000000000000000000604482015290519081900360640190fd5b600160a060020a0385161515620001c757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4e6f205265736f6c766572206164647265737320646566696e65642e00000000604482015290519081900360640190fd5b8315156200023657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4e6f20454e53206e6f646520646566696e65642e000000000000000000000000604482015290519081900360640190fd5b60018054600160a060020a03808a16600160a060020a03199283161790925560028054898416908316179055600380548884169083161790556009869055600785905560088490556004805492841692909116919091179055620002a46000640100000000620002b1810204565b5050505050505062000319565b600b805482919060ff19166001836002811115620002cb57fe5b02179055507fee85d4d9a9722e814f07db07f29734cd5a97e0e58781ad41ae4572193b1caea081604051808260028111156200030357fe5b60ff16815260200191505060405180910390a150565b6146c180620003296000396000f3006080604052600436106101d45763ffffffff60e060020a60003504166304f3bcec81146101d957806305c244811461020a57806307f908cb14610224578063307c7a0d1461024b57806332e1ed24146102725780633cebb8231461028a57806340784ebd146102ab57806340b1ad52146102d25780634b09b72a146103015780634e543b261461031657806359ad02091461033757806367d42a8b1461034c5780636f79301d146103645780637195bf231461037c5780637d73b2311461039157806380cd0015146103a65780638382b460146103d0578063860e9b0f146103e85780638cf7b7a4146104005780638f4ffcb11461042457806396bba9a81461049457806398d5fdca146104b857806398f038ff146104cd578063a035b1fe146104e5578063a1454830146104fa578063aacffccf14610512578063afe12e771461052a578063b260c42a1461054e578063b82fedbb14610566578063bc529c4314610590578063c19d93fb146105cf578063c23e61b914610608578063c9b84d4d1461062c578063ddbcf3a114610641578063de10f04b14610656578063e882c3ce14610676578063ebf701e014610697578063f77c4791146106af578063f9e54282146106c4578063fc0c546a146106dc575b600080fd5b3480156101e557600080fd5b506101ee6106f1565b60408051600160a060020a039092168252519081900360200190f35b34801561021657600080fd5b50610222600435610700565b005b34801561023057600080fd5b506102396107ae565b60408051918252519081900360200190f35b34801561025757600080fd5b50610222600160a060020a03600435811690602435166107b4565b34801561027e57600080fd5b50610222600435610a74565b34801561029657600080fd5b50610222600160a060020a0360043516610d60565b3480156102b757600080fd5b50610222602460048035828101929101359035604435610d99565b3480156102de57600080fd5b506102226024600480358281019290820135918135918201910135604435610f78565b34801561030d57600080fd5b506102396110a7565b34801561032257600080fd5b50610222600160a060020a03600435166110ad565b34801561034357600080fd5b506102396110e6565b34801561035857600080fd5b506102226004356110ec565b34801561037057600080fd5b506102396004356117ef565b34801561038857600080fd5b50610239611804565b34801561039d57600080fd5b506101ee61180c565b3480156103b257600080fd5b50610222600435602435604435600160a060020a036064351661181b565b3480156103dc57600080fd5b50610239600435611a09565b3480156103f457600080fd5b50610222600435611a2d565b34801561040c57600080fd5b50610222602460048035828101929101359035611ae7565b34801561043057600080fd5b50604080516020601f60643560048181013592830184900484028501840190955281845261022294600160a060020a03813581169560248035966044359093169536956084949201918190840183828082843750949750611e489650505050505050565b3480156104a057600080fd5b50610222602460048035828101929101359035612091565b3480156104c457600080fd5b5061023961212e565b3480156104d957600080fd5b50610222600435612134565b3480156104f157600080fd5b50610239612346565b34801561050657600080fd5b5061023960043561234c565b34801561051e57600080fd5b506101ee600435612372565b34801561053657600080fd5b50610222600435600160a060020a0360243516612390565b34801561055a57600080fd5b506102226004356125a7565b34801561057257600080fd5b50610239600435600160a060020a0360243516604435606435612703565b34801561059c57600080fd5b506105a860043561271b565b604080519384526020840192909252600160a060020a031682820152519081900360600190f35b3480156105db57600080fd5b506105e4612745565b604051808260028111156105f457fe5b60ff16815260200191505060405180910390f35b34801561061457600080fd5b50610222600435600160a060020a036024351661274e565b34801561063857600080fd5b506101ee612a9c565b34801561064d57600080fd5b50610239612aab565b34801561066257600080fd5b506102226004803560248101910135612ab1565b34801561068257600080fd5b50610222600160a060020a0360043516612e47565b3480156106a357600080fd5b506102396004356130bc565b3480156106bb57600080fd5b506101ee6130ce565b3480156106d057600080fd5b506102226004356130dd565b3480156106e857600080fd5b506101ee61335f565b600354600160a060020a031681565b60008181526006602052604090206001015415610767576040805160e560020a62461bcd02815260206004820152601060248201527f416c726561647920526573657276656400000000000000000000000000000000604482015290519081900360640190fd5b6040805180820182523381524360208083019182526000948552600690529190922091518254600160a060020a031916600160a060020a0390911617825551600190910155565b60085481565b600080548190600160a060020a031633146107ce57600080fd5b600160a060020a038316151561082e576040805160e560020a62461bcd02815260206004820152601160248201527f43616e6e6f74206275726e20746f6b656e000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038416151561087a57604051600160a060020a03841690303180156108fc02916000818181858888f19350505050158015610874573d6000803e3d6000fd5b50610a6e565b604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051859350600160a060020a038416916370a082319160248083019260209291908290030181600087803b1580156108de57600080fd5b505af11580156108f2573d6000803e3d6000fd5b505050506040513d602081101561090857600080fd5b5051600154909150600160a060020a038581169116141561098657600c54811161097c576040805160e560020a62461bcd02815260206004820152600d60248201527f4973206e6f742065786365737300000000000000000000000000000000000000604482015290519081900360640190fd5b600c5490036109de565b600081116109de576040805160e560020a62461bcd02815260206004820152600a60248201527f4e6f2062616c616e636500000000000000000000000000000000000000000000604482015290519081900360640190fd5b81600160a060020a031663a9059cbb84836040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b158015610a4157600080fd5b505af1158015610a55573d6000803e3d6000fd5b505050506040513d6020811015610a6b57600080fd5b50505b50505050565b6009546040805160208082019390935280820184905281518082038301815260609091019182905280516000939192918291908401908083835b60208310610acd5780518252601f199092019160209182019101610aae565b51815160209384036101000a60001901801990921691161790526040805192909401829003822060025460e060020a6302571be3028452600484018290529451909750600160a060020a0390941695506302571be3945060248083019491935090918290030181600087803b158015610b4557600080fd5b505af1158015610b59573d6000803e3d6000fd5b505050506040513d6020811015610b6f57600080fd5b5051600160a060020a03163314610bd0576040805160e560020a62461bcd02815260206004820152601d60248201527f43616c6c6572206e6f74206f776e6572206f6620454e53206e6f64652e000000604482015290519081900360640190fd5b60008281526005602052604081206001015411610c37576040805160e560020a62461bcd02815260206004820152601860248201527f557365726e616d65206e6f7420726567697374657265642e0000000000000000604482015290519081900360640190fd5b6002546009546040805160e060020a6302571be30281526004810192909252513092600160a060020a0316916302571be39160248083019260209291908290030181600087803b158015610c8a57600080fd5b505af1158015610c9e573d6000803e3d6000fd5b505050506040513d6020811015610cb457600080fd5b5051600160a060020a031614610d14576040805160e560020a62461bcd02815260206004820152601f60248201527f5265676973747279206e6f74206f776e6572206f662072656769737472792e00604482015290519081900360640190fd5b6000828152600560209081526040918290206002018054600160a060020a0319163390811790915582519081529151839260008051602061467683398151915292908290030190a25050565b600054600160a060020a03163314610d7757600080fd5b60008054600160a060020a031916600160a060020a0392909216919091179055565b6060600085858080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509150838251111515610e2c576040805160e560020a62461bcd02815260206004820152601160248201527f496e76616c696420706f736974696f6e2e000000000000000000000000000000604482015290519081900360640190fd5b8184815181101515610e3a57fe5b016020015160f860020a908190040290507f3000000000000000000000000000000000000000000000000000000000000000600160f860020a0319821610801590610eaf57507f3900000000000000000000000000000000000000000000000000000000000000600160f860020a0319821611155b80610f1957507f6100000000000000000000000000000000000000000000000000000000000000600160f860020a0319821610801590610f1957507f7a00000000000000000000000000000000000000000000000000000000000000600160f860020a0319821611155b15610f6e576040805160e560020a62461bcd02815260206004820152601660248201527f4e6f7420696e76616c6964206368617261637465722e00000000000000000000604482015290519081900360640190fd5b610a6b828461336e565b606085858080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509050611047848480806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050600854836040518082805190602001908083835b602083106110155780518252601f199092019160209182019101610ff6565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020613a4b565b151561109d576040805160e560020a62461bcd02815260206004820152600e60248201527f496e76616c69642050726f6f662e000000000000000000000000000000000000604482015290519081900360640190fd5b610a6b818361336e565b600c5481565b600054600160a060020a031633146110c457600080fd5b60038054600160a060020a031916600160a060020a0392909216919091179055565b60075481565b60006110f6614633565b6009546040805160208082019390935280820186905281518082038301815260609091019182905280516000939192918291908401908083835b6020831061114f5780518252601f199092019160209182019101611130565b51815160209384036101000a60001901801990921691161790526040805192909401829003822060008b81526005835285812060608501875280548552600181015493850184905260020154600160a060020a031695840195909552985090965091909111925061120d915050576040805160e560020a62461bcd02815260206004820152601860248201527f557365726e616d65206e6f7420726567697374657265642e0000000000000000604482015290519081900360640190fd5b6001600b5460ff16600281111561122057fe5b1415611368576002546040805160e060020a6302571be3028152600481018690529051600160a060020a03909216916302571be3916024808201926020929091908290030181600087803b15801561127757600080fd5b505af115801561128b573d6000803e3d6000fd5b505050506040513d60208110156112a157600080fd5b5051600160a060020a03163314611302576040805160e560020a62461bcd02815260206004820152601660248201527f4e6f74206f776e6572206f6620454e53206e6f64652e00000000000000000000604482015290519081900360640190fd5b60208201516301e13380014211611363576040805160e560020a62461bcd02815260206004820152601b60248201527f52656c6561736520706572696f64206e6f7420726561636865642e0000000000604482015290519081900360640190fd5b6113cc565b6040820151600160a060020a031633146113cc576040805160e560020a62461bcd02815260206004820152601d60248201527f4e6f742074686520666f726d6572206163636f756e74206f776e65722e000000604482015290519081900360640190fd5b6000848152600560205260408120818155600181018290556002018054600160a060020a0319169055825111156114f6578151600c80548290039055600154604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152336004820152602481019390935251600160a060020a039091169163a9059cbb9160448083019260209291908290030181600087803b15801561147457600080fd5b505af1158015611488573d6000803e3d6000fd5b505050506040513d602081101561149e57600080fd5b505115156114f6576040805160e560020a62461bcd02815260206004820152600f60248201527f5472616e73666572206661696c65640000000000000000000000000000000000604482015290519081900360640190fd5b6001600b5460ff16600281111561150957fe5b1415611664576002546009546040805160e060020a6306ab592302815260048101929092526024820187905230604483015251600160a060020a03909216916306ab59239160648082019260009290919082900301818387803b15801561156f57600080fd5b505af1158015611583573d6000803e3d6000fd5b50506002546040805160e160020a630c4b7b85028152600481018890526000602482018190529151600160a060020a039093169450631896f70a93506044808201939182900301818387803b1580156115db57600080fd5b505af11580156115ef573d6000803e3d6000fd5b50506002546040805160e060020a635b0fc9c3028152600481018890526000602482018190529151600160a060020a039093169450635b0fc9c393506044808201939182900301818387803b15801561164757600080fd5b505af115801561165b573d6000803e3d6000fd5b505050506117c4565b6002546009546040805160e060020a6302571be3028152600481019290925251600160a060020a03909216916302571be3916024808201926020929091908290030181600087803b1580156116b857600080fd5b505af11580156116cc573d6000803e3d6000fd5b505050506040513d60208110156116e257600080fd5b505160408051602480820188905282518083039091018152604490910182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff9e542820000000000000000000000000000000000000000000000000000000017815291518151939450600160a060020a038516936201388093829180838360005b83811015611780578181015183820152602001611768565b50505050905090810190601f1680156117ad5780820380516001836020036101000a031916815260200191505b5091505060006040518083038160008787f1505050505b604080516000815290518491600080516020614676833981519152919081900360200190a250505050565b60009081526005602052604090206001015490565b6301e1338081565b600254600160a060020a031681565b600454600160a060020a0316331461187d576040805160e560020a62461bcd02815260206004820152600f60248201527f4d6967726174696f6e206f6e6c792e0000000000000000000000000000000000604482015290519081900360640190fd5b60008311156119b05760015460048054604080517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a039283169381019390935230602484015260448301879052519216916323b872dd916064808201926020929091908290030181600087803b1580156118ff57600080fd5b505af1158015611913573d6000803e3d6000fd5b505050506040513d602081101561192957600080fd5b505115156119a7576040805160e560020a62461bcd02815260206004820152602560248201527f4572726f72206d6f76696e672066756e64732066726f6d206f6c64207265676960448201527f737461722e000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600c8054840190555b604080516060810182529384526020808501938452600160a060020a039283168583019081526000968752600590915294209251835590516001830155915160029091018054600160a060020a03191691909216179055565b60008181526005602052604081205481811115611a27576003810491505b50919050565b600054600160a060020a03163314611a4457600080fd5b6001600b5460ff166002811115611a5757fe5b14611aac576040805160e560020a62461bcd02815260206004820152601260248201527f5265676973747279206e6f74206f776e65640000000000000000000000000000604482015290519081900360640190fd5b600a8190556040805182815290517f45d3cd7c7bd7d211f00610f51660b2f114c7833e0c52ef3603c6d41ed07a74589181900360200190a150565b606060008085858080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509250600c8351111515611ba2576040805160e560020a62461bcd02815260206004820152602260248201527f546f6f20736d616c6c20746f206c6f6f6b206c696b6520616e2061646472657360448201527f732e000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b82517f30000000000000000000000000000000000000000000000000000000000000009084906000908110611bd357fe5b60209101015160f860020a9081900402600160f860020a03191614611c42576040805160e560020a62461bcd02815260206004820152601c60248201527f466972737420636861726163746572206e65656420746f206265203000000000604482015290519081900360640190fd5b82517f78000000000000000000000000000000000000000000000000000000000000009084906001908110611c7357fe5b60209101015160f860020a9081900402600160f860020a03191614611ce2576040805160e560020a62461bcd02815260206004820152601d60248201527f5365636f6e6420636861726163746572206e65656420746f2062652078000000604482015290519081900360640190fd5b600291505b6007821015611e3e578282815181101515611cfe57fe5b016020015160f860020a908190040290507f3000000000000000000000000000000000000000000000000000000000000000600160f860020a0319821610801590611d7357507f3900000000000000000000000000000000000000000000000000000000000000600160f860020a0319821611155b80611ddd57507f6100000000000000000000000000000000000000000000000000000000000000600160f860020a0319821610801590611ddd57507f6600000000000000000000000000000000000000000000000000000000000000600160f860020a0319821611155b1515611e33576040805160e560020a62461bcd02815260206004820152601d60248201527f446f6573206e6f74206c6f6f6b206c696b6520616e2061646472657373000000604482015290519081900360640190fd5b600190910190611ce7565b610a6b838561336e565b6000806000806000600a5488141515611eab576040805160e560020a62461bcd02815260206004820152600b60248201527f57726f6e672076616c7565000000000000000000000000000000000000000000604482015290519081900360640190fd5b600154600160a060020a03888116911614611f10576040805160e560020a62461bcd02815260206004820152600b60248201527f57726f6e6720746f6b656e000000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0387163314611f70576040805160e560020a62461bcd02815260206004820152600a60248201527f57726f6e672063616c6c00000000000000000000000000000000000000000000604482015290519081900360640190fd5b855160841015611fca576040805160e560020a62461bcd02815260206004820152601160248201527f57726f6e672064617461206c656e677468000000000000000000000000000000604482015290519081900360640190fd5b611fd386613b9a565b9398509196509450925090507fffffffff0000000000000000000000000000000000000000000000000000000085167fb82fedbb0000000000000000000000000000000000000000000000000000000014612078576040805160e560020a62461bcd02815260206004820152601560248201527f57726f6e67206d6574686f642073656c6563746f720000000000000000000000604482015290519081900360640190fd5b6120858985858585613bbe565b50505050505050505050565b606083838080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505090506007548151101515612124576040805160e560020a62461bcd02815260206004820152601560248201527f4e6f74206120736d616c6c20757365726e616d652e0000000000000000000000604482015290519081900360640190fd5b610a6e818361336e565b600a5490565b600454600160a060020a03163314612196576040805160e560020a62461bcd02815260206004820152600f60248201527f4d6967726174696f6e206f6e6c792e0000000000000000000000000000000000604482015290519081900360640190fd5b6000600b5460ff1660028111156121a957fe5b146121fe576040805160e560020a62461bcd02815260206004820152600c60248201527f4e6f7420496e6163746976650000000000000000000000000000000000000000604482015290519081900360640190fd5b6002546009546040805160e060020a6302571be30281526004810192909252513092600160a060020a0316916302571be39160248083019260209291908290030181600087803b15801561225157600080fd5b505af1158015612265573d6000803e3d6000fd5b505050506040513d602081101561227b57600080fd5b5051600160a060020a031614612301576040805160e560020a62461bcd02815260206004820152602260248201527f454e53207265676973747279206f776e6572206e6f74207472616e736665726560448201527f642e000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600a81905561231060016143aa565b6040805182815290517f45d3cd7c7bd7d211f00610f51660b2f114c7833e0c52ef3603c6d41ed07a74589181900360200190a150565b600a5481565b60008181526005602052604081206001015481811115611a27576301e133800192915050565b600090815260056020526040902060020154600160a060020a031690565b600054600160a060020a031633146123a757600080fd5b600160a060020a0381161515612407576040805160e560020a62461bcd02815260206004820152601060248201527f43616e6e6f74206275726e206e6f646500000000000000000000000000000000604482015290519081900360640190fd5b600954821415612461576040805160e560020a62461bcd02815260206004820152601960248201527f43616e6e6f74207769746864726177206d61696e206e6f646500000000000000604482015290519081900360640190fd5b6002546040805160e060020a6302571be30281526004810185905290513092600160a060020a0316916302571be39160248083019260209291908290030181600087803b1580156124b157600080fd5b505af11580156124c5573d6000803e3d6000fd5b505050506040513d60208110156124db57600080fd5b5051600160a060020a03161461253b576040805160e560020a62461bcd02815260206004820152601660248201527f4e6f74206f776e6572206f662074686973206e6f646500000000000000000000604482015290519081900360640190fd5b6002546040805160e060020a635b0fc9c302815260048101859052600160a060020a03848116602483015291519190921691635b0fc9c391604480830192600092919082900301818387803b15801561259357600080fd5b505af1158015610a6b573d6000803e3d6000fd5b600054600160a060020a031633146125be57600080fd5b6000600b5460ff1660028111156125d157fe5b14612626576040805160e560020a62461bcd02815260206004820152601e60248201527f5265676973747279207374617465206973206e6f7420496e6163746976650000604482015290519081900360640190fd5b6002546009546040805160e060020a6302571be30281526004810192909252513092600160a060020a0316916302571be39160248083019260209291908290030181600087803b15801561267957600080fd5b505af115801561268d573d6000803e3d6000fd5b505050506040513d60208110156126a357600080fd5b5051600160a060020a031614612301576040805160e560020a62461bcd02815260206004820152601e60248201527f526567697374727920646f6573206e6f74206f776e2072656769737472790000604482015290519081900360640190fd5b60006127123386868686613bbe565b95945050505050565b600560205260009081526040902080546001820154600290920154909190600160a060020a031683565b600b5460ff1681565b612756614633565b6002600b5460ff16600281111561276957fe5b146127be576040805160e560020a62461bcd02815260206004820152601460248201527f57726f6e6720636f6e7472616374207374617465000000000000000000000000604482015290519081900360640190fd5b600083815260056020526040902060020154600160a060020a0316331461282f576040805160e560020a62461bcd02815260206004820152601f60248201527f43616c6c61626c65206f6e6c79206279206163636f756e74206f776e65722e00604482015290519081900360640190fd5b6002546009546040805160e060020a6302571be3028152600481019290925251600160a060020a038086169316916302571be39160248083019260209291908290030181600087803b15801561288457600080fd5b505af1158015612898573d6000803e3d6000fd5b505050506040513d60208110156128ae57600080fd5b5051600160a060020a03161461290e576040805160e560020a62461bcd02815260206004820152600c60248201527f57726f6e67207570646174650000000000000000000000000000000000000000604482015290519081900360640190fd5b5060008281526005602081815260408084208151606081018352815481526001808301805483870152600284018054600160a060020a03808216868901528c8b529888529489905590889055600160a060020a03199093169092559054815183517f095ea7b3000000000000000000000000000000000000000000000000000000008152888716600482015260248101919091529251919594169363095ea7b393604480850194919392918390030190829087803b1580156129cf57600080fd5b505af11580156129e3573d6000803e3d6000fd5b505050506040513d60208110156129f957600080fd5b50508051602082015160408084015181517f80cd00150000000000000000000000000000000000000000000000000000000081526004810188905260248101949094526044840192909252600160a060020a03918216606484015251908416916380cd001591608480830192600092919082900301818387803b158015612a7f57600080fd5b505af1158015612a93573d6000803e3d6000fd5b50505050505050565b600454600160a060020a031681565b60095481565b80600080821515612b0c576040805160e560020a62461bcd02815260206004820152601060248201527f4e6f7468696e6720746f20657261736500000000000000000000000000000000604482015290519081900360640190fd5b84846000198501818110612b1c57fe5b6009546040805160208181019390935292820294909401358285018190528451808403860181526060909301948590528251909650919392508291908401908083835b60208310612b7e5780518252601f199092019160209182019101612b5f565b51815160209384036101000a60001901801990921691161790526040805192909401829003822060025460e060020a6302571be302845260048401829052945190975060009650600160a060020a0390941694506302571be39360248084019450919290919082900301818787803b158015612bf957600080fd5b505af1158015612c0d573d6000803e3d6000fd5b505050506040513d6020811015612c2357600080fd5b5051600160a060020a031614612ca9576040805160e560020a62461bcd02815260206004820152602760248201527f466972737420736c6173682f72656c6561736520746f70206c6576656c20737560448201527f62646f6d61696e00000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6002546009546040805160e060020a6306ab592302815260048101929092526024820185905230604483015251600160a060020a03909216916306ab59239160648082019260009290919082900301818387803b158015612d0957600080fd5b505af1158015612d1d573d6000803e3d6000fd5b505050506001831115612d6657612d6660028403868680806020026020016040519081016040528093929190818152602001838360200280828437508894506144109350505050565b6002546040805160e160020a630c4b7b85028152600481018490526000602482018190529151600160a060020a0390931692631896f70a9260448084019391929182900301818387803b158015612dbc57600080fd5b505af1158015612dd0573d6000803e3d6000fd5b50506002546040805160e060020a635b0fc9c3028152600481018690526000602482018190529151600160a060020a039093169450635b0fc9c393506044808201939182900301818387803b158015612e2857600080fd5b505af1158015612e3c573d6000803e3d6000fd5b505050505050505050565b600054600160a060020a03163314612e5e57600080fd5b600160a060020a038116301415612ebf576040805160e560020a62461bcd02815260206004820152601460248201527f43616e6e6f74206d6f766520746f2073656c662e000000000000000000000000604482015290519081900360640190fd5b6002546009546040805160e060020a6302571be30281526004810192909252513092600160a060020a0316916302571be39160248083019260209291908290030181600087803b158015612f1257600080fd5b505af1158015612f26573d6000803e3d6000fd5b505050506040513d6020811015612f3c57600080fd5b5051600160a060020a031614612f9c576040805160e560020a62461bcd02815260206004820152601b60248201527f5265676973747279206e6f74206f776e656420616e796d6f72652e0000000000604482015290519081900360640190fd5b612fa660026143aa565b6002546009546040805160e060020a635b0fc9c30281526004810192909252600160a060020a0384811660248401529051921691635b0fc9c39160448082019260009290919082900301818387803b15801561300157600080fd5b505af1158015613015573d6000803e3d6000fd5b5050505080600160a060020a03166398f038ff600a546040518263ffffffff1660e060020a02815260040180828152602001915050600060405180830381600087803b15801561306457600080fd5b505af1158015613078573d6000803e3d6000fd5b505060408051600160a060020a038516815290517fce0afb4c27dbd57a3646e2d639557521bfb05a42dc0ec50f9c1fe13d92e3e6d69350908190036020019150a150565b60009081526005602052604090205490565b600054600160a060020a031681565b600454600090600160a060020a03163314613142576040805160e560020a62461bcd02815260206004820152600f60248201527f4d6967726174696f6e206f6e6c792e0000000000000000000000000000000000604482015290519081900360640190fd5b600082815260056020526040902060010154156131a9576040805160e560020a62461bcd02815260206004820152601060248201527f416c7265616479206d6967726174656400000000000000000000000000000000604482015290519081900360640190fd5b60095460408051602080820193909352808201859052815180820383018152606090910191829052805190928291908401908083835b602083106131fe5780518252601f1990920191602091820191016131df565b5181516020939093036101000a60001901801990911692169190911790526040805191909301819003812060025460095460e060020a6306ab59230284526004840152602483018990523060448401529351909650600160a060020a0390931694506306ab59239350606480820193600093509182900301818387803b15801561328757600080fd5b505af115801561329b573d6000803e3d6000fd5b50506002546040805160e160020a630c4b7b85028152600481018690526000602482018190529151600160a060020a039093169450631896f70a93506044808201939182900301818387803b1580156132f357600080fd5b505af1158015613307573d6000803e3d6000fd5b50506002546040805160e060020a635b0fc9c3028152600481018690526000602482018190529151600160a060020a039093169450635b0fc9c393506044808201939182900301818387803b15801561259357600080fd5b600154600160a060020a031681565b600080600080600080600061338161465e565b896040518082805190602001908083835b602083106133b15780518252601f199092019160209182019101613392565b51815160209384036101000a600019018019909216911617905260408051929094018290038220600954838301528285018190528451808403860181526060909301948590528251909e509195509293508392850191508083835b6020831061342b5780518252601f19909201916020918201910161340c565b51815160209384036101000a60001901801990921691161790526040805192909401829003822060008f8152600583528581206001015460025460e060020a6302571be3028652600486018490529651929f50909d509b50600160a060020a0390941695506302571be39450602480830194919350909182900301818c87803b1580156134b757600080fd5b505af11580156134cb573d6000803e3d6000fd5b505050506040513d60208110156134e157600080fd5b505193508415156135f757600160a060020a03841615158061359c5750600254604080517f0178b8bf000000000000000000000000000000000000000000000000000000008152600481018a90529051600092600160a060020a031691630178b8bf91602480830192602092919082900301818787803b15801561356457600080fd5b505af1158015613578573d6000803e3d6000fd5b505050506040513d602081101561358e57600080fd5b5051600160a060020a031614155b15156135f2576040805160e560020a62461bcd02815260206004820152601160248201527f4e6f7468696e6720746f20736c6173682e000000000000000000000000000000604482015290519081900360640190fd5b613630565b4285141561360157fe5b6000888152600560205260408120805482825560018201929092556002018054600160a060020a031916905595505b6002546009546040805160e060020a6306ab59230281526004810192909252602482018b905230604483015251600160a060020a03909216916306ab59239160648082019260009290919082900301818387803b15801561369057600080fd5b505af11580156136a4573d6000803e3d6000fd5b50506002546040805160e160020a630c4b7b85028152600481018c90526000602482018190529151600160a060020a039093169450631896f70a93506044808201939182900301818387803b1580156136fc57600080fd5b505af1158015613710573d6000803e3d6000fd5b50506002546040805160e060020a635b0fc9c3028152600481018c90526000602482018190529151600160a060020a039093169450635b0fc9c393506044808201939182900301818387803b15801561376857600080fd5b505af115801561377c573d6000803e3d6000fd5b505050506000861115613a1a57600c805487900390556040805160208082018a905281830188905260608083018d905283518084039091018152608090920192839052815160026003909a04998a0299965091929182918401908083835b602083106137f95780518252601f1990920191602091820191016137da565b51815160209384036101000a6000190180199092169116179052604080519290940182900382206000818152600683528590208386019095528454600160a060020a0316808452600190950154918301919091529650945050151591506138ac9050576040805160e560020a62461bcd02815260206004820152600d60248201527f4e6f742072657365727665642e00000000000000000000000000000000000000604482015290519081900360640190fd5b60208101514311613907576040805160e560020a62461bcd02815260206004820152601b60248201527f43616e6e6f742072657665616c20696e2073616d6520626c6f636b0000000000604482015290519081900360640190fd5b60008281526006602090815260408083208054600160a060020a0319168155600190810184905554845182517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a039182166004820152602481018c9052925191169363a9059cbb93604480850194919392918390030190829087803b15801561399857600080fd5b505af11580156139ac573d6000803e3d6000fd5b505050506040513d60208110156139c257600080fd5b50511515613a1a576040805160e560020a62461bcd02815260206004820152601260248201527f4572726f7220696e207472616e736665722e0000000000000000000000000000604482015290519081900360640190fd5b604080516000815290518891600080516020614676833981519152919081900360200190a250505050505050505050565b60008181805b8651821015613b8d578682815181101515613a6857fe5b60209081029091010151905080831015613b0157604080516020808201869052818301849052825180830384018152606090920192839052815191929182918401908083835b60208310613acd5780518252601f199092019160209182019101613aae565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209250613b82565b604080516020808201849052818301869052825180830384018152606090920192839052815191929182918401908083835b60208310613b525780518252601f199092019160209182019101613b33565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902092505b600190910190613a51565b5050929092149392505050565b60208101516024820151604483015160648401516084909401519294919390929091565b600080806001600b5460ff166002811115613bd557fe5b14613c2a576040805160e560020a62461bcd02815260206004820152601460248201527f5265676973747279206e6f74206163746976652e000000000000000000000000604482015290519081900360640190fd5b600954604080516020808201939093528082018a9052815180820383018152606090910191829052805190928291908401908083835b60208310613c7f5780518252601f199092019160209182019101613c60565b51815160209384036101000a60001901801990921691161790526040805192909401829003822060025460e060020a6302571be302845260048401829052945190995060009650600160a060020a0390941694506302571be39360248084019450919290919082900301818787803b158015613cfa57600080fd5b505af1158015613d0e573d6000803e3d6000fd5b505050506040513d6020811015613d2457600080fd5b5051600160a060020a031614613d84576040805160e560020a62461bcd02815260206004820152601760248201527f454e53206e6f646520616c7265616479206f776e65642e000000000000000000604482015290519081900360640190fd5b60008781526005602052604090206001015415613deb576040805160e560020a62461bcd02815260206004820152601c60248201527f557365726e616d6520616c726561647920726567697374657265642e00000000604482015290519081900360640190fd5b60408051606081018252600a80548252426020808401918252600160a060020a038d811685870190815260008e815260059093529582209451855591516001850155935160029093018054600160a060020a031916939091169290921790915554111561404d57600a54600154604080517fdd62ed3e000000000000000000000000000000000000000000000000000000008152600160a060020a038c811660048301523060248301529151919092169163dd62ed3e9160448083019260209291908290030181600087803b158015613ec357600080fd5b505af1158015613ed7573d6000803e3d6000fd5b505050506040513d6020811015613eed57600080fd5b50511015613f45576040805160e560020a62461bcd02815260206004820152601360248201527f556e616c6c6f77656420746f207370656e642e00000000000000000000000000604482015290519081900360640190fd5b600154600a54604080517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a038c811660048301523060248301526044820193909352905191909216916323b872dd9160648083019260209291908290030181600087803b158015613fbe57600080fd5b505af1158015613fd2573d6000803e3d6000fd5b505050506040513d6020811015613fe857600080fd5b50511515614040576040805160e560020a62461bcd02815260206004820152600f60248201527f5472616e73666572206661696c65640000000000000000000000000000000000604482015290519081900360640190fd5b600a54600c805490910190555b8415158061405a57508315155b915050600160a060020a038516151581806140725750805b156142f7576002546009546040805160e060020a6306ab59230281526004810192909252602482018a905230604483015251600160a060020a03909216916306ab59239160648082019260009290919082900301818387803b1580156140d757600080fd5b505af11580156140eb573d6000803e3d6000fd5b50506002546003546040805160e160020a630c4b7b8502815260048101899052600160a060020a0392831660248201529051919092169350631896f70a9250604480830192600092919082900301818387803b15801561414a57600080fd5b505af115801561415e573d6000803e3d6000fd5b5050505080156141ef57600354604080517fd5fa2b0000000000000000000000000000000000000000000000000000000000815260048101869052600160a060020a0389811660248301529151919092169163d5fa2b0091604480830192600092919082900301818387803b1580156141d657600080fd5b505af11580156141ea573d6000803e3d6000fd5b505050505b811561428257600354604080517f29cd62ea0000000000000000000000000000000000000000000000000000000081526004810186905260248101889052604481018790529051600160a060020a03909216916329cd62ea9160648082019260009290919082900301818387803b15801561426957600080fd5b505af115801561427d573d6000803e3d6000fd5b505050505b6002546040805160e060020a635b0fc9c302815260048101869052600160a060020a038b8116602483015291519190921691635b0fc9c391604480830192600092919082900301818387803b1580156142da57600080fd5b505af11580156142ee573d6000803e3d6000fd5b50505050614372565b6002546009546040805160e060020a6306ab59230281526004810192909252602482018a9052600160a060020a038b8116604484015290519216916306ab59239160648082019260009290919082900301818387803b15801561435957600080fd5b505af115801561436d573d6000803e3d6000fd5b505050505b60408051600160a060020a038a16815290518491600080516020614676833981519152919081900360200190a2505095945050505050565b600b805482919060ff191660018360028111156143c357fe5b02179055507fee85d4d9a9722e814f07db07f29734cd5a97e0e58781ad41ae4572193b1caea081604051808260028111156143fa57fe5b60ff16815260200191505060405180910390a150565b6002548251600091600160a060020a0316906306ab592390849086908890811061443657fe5b602090810290910101516040805160e060020a63ffffffff86160281526004810193909352602483019190915230604483015251606480830192600092919082900301818387803b15801561448a57600080fd5b505af115801561449e573d6000803e3d6000fd5b505050508183858151811015156144b157fe5b6020908102909101810151604080518084019490945283810191909152805180840382018152606090930190819052825190918291908401908083835b6020831061450d5780518252601f1990920191602091820191016144ee565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209050600084111561455357614553600185038483614410565b6002546040805160e160020a630c4b7b85028152600481018490526000602482018190529151600160a060020a0390931692631896f70a9260448084019391929182900301818387803b1580156145a957600080fd5b505af11580156145bd573d6000803e3d6000fd5b50506002546040805160e060020a635b0fc9c3028152600481018690526000602482018190529151600160a060020a039093169450635b0fc9c393506044808201939182900301818387803b15801561461557600080fd5b505af1158015614629573d6000803e3d6000fd5b5050505050505050565b60606040519081016040528060008152602001600081526020016000600160a060020a031681525090565b6040805180820190915260008082526020820152905600d2da4206c3fa95b8fc1ee48627023d322b59cc7218e14cb95cf0c0fe562f2e4da165627a7a723058209db16656f7d3b4f89964947f476541d102a4453693e08f07e9b8da8da6a5264b0029000000000000000000000000744d70fdbe2ba4cf95131626614a1763df805b9e000000000000000000000000314159265dd8dbb310642f98f50c066173c1259b0000000000000000000000005ffc014343cd971b7eb70732021e26c35b744cc45f7791d31ca0493e9ca7c9ca16695ecd9d5044768674d14d31ab5d8277518fff0000000000000000000000000000000000000000000000000000000000000003b46e19581b371ab0856ee8ffd05b33cbfd264755e18f2d004780bb929970a53e0000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106101d45763ffffffff60e060020a60003504166304f3bcec81146101d957806305c244811461020a57806307f908cb14610224578063307c7a0d1461024b57806332e1ed24146102725780633cebb8231461028a57806340784ebd146102ab57806340b1ad52146102d25780634b09b72a146103015780634e543b261461031657806359ad02091461033757806367d42a8b1461034c5780636f79301d146103645780637195bf231461037c5780637d73b2311461039157806380cd0015146103a65780638382b460146103d0578063860e9b0f146103e85780638cf7b7a4146104005780638f4ffcb11461042457806396bba9a81461049457806398d5fdca146104b857806398f038ff146104cd578063a035b1fe146104e5578063a1454830146104fa578063aacffccf14610512578063afe12e771461052a578063b260c42a1461054e578063b82fedbb14610566578063bc529c4314610590578063c19d93fb146105cf578063c23e61b914610608578063c9b84d4d1461062c578063ddbcf3a114610641578063de10f04b14610656578063e882c3ce14610676578063ebf701e014610697578063f77c4791146106af578063f9e54282146106c4578063fc0c546a146106dc575b600080fd5b3480156101e557600080fd5b506101ee6106f1565b60408051600160a060020a039092168252519081900360200190f35b34801561021657600080fd5b50610222600435610700565b005b34801561023057600080fd5b506102396107ae565b60408051918252519081900360200190f35b34801561025757600080fd5b50610222600160a060020a03600435811690602435166107b4565b34801561027e57600080fd5b50610222600435610a74565b34801561029657600080fd5b50610222600160a060020a0360043516610d60565b3480156102b757600080fd5b50610222602460048035828101929101359035604435610d99565b3480156102de57600080fd5b506102226024600480358281019290820135918135918201910135604435610f78565b34801561030d57600080fd5b506102396110a7565b34801561032257600080fd5b50610222600160a060020a03600435166110ad565b34801561034357600080fd5b506102396110e6565b34801561035857600080fd5b506102226004356110ec565b34801561037057600080fd5b506102396004356117ef565b34801561038857600080fd5b50610239611804565b34801561039d57600080fd5b506101ee61180c565b3480156103b257600080fd5b50610222600435602435604435600160a060020a036064351661181b565b3480156103dc57600080fd5b50610239600435611a09565b3480156103f457600080fd5b50610222600435611a2d565b34801561040c57600080fd5b50610222602460048035828101929101359035611ae7565b34801561043057600080fd5b50604080516020601f60643560048181013592830184900484028501840190955281845261022294600160a060020a03813581169560248035966044359093169536956084949201918190840183828082843750949750611e489650505050505050565b3480156104a057600080fd5b50610222602460048035828101929101359035612091565b3480156104c457600080fd5b5061023961212e565b3480156104d957600080fd5b50610222600435612134565b3480156104f157600080fd5b50610239612346565b34801561050657600080fd5b5061023960043561234c565b34801561051e57600080fd5b506101ee600435612372565b34801561053657600080fd5b50610222600435600160a060020a0360243516612390565b34801561055a57600080fd5b506102226004356125a7565b34801561057257600080fd5b50610239600435600160a060020a0360243516604435606435612703565b34801561059c57600080fd5b506105a860043561271b565b604080519384526020840192909252600160a060020a031682820152519081900360600190f35b3480156105db57600080fd5b506105e4612745565b604051808260028111156105f457fe5b60ff16815260200191505060405180910390f35b34801561061457600080fd5b50610222600435600160a060020a036024351661274e565b34801561063857600080fd5b506101ee612a9c565b34801561064d57600080fd5b50610239612aab565b34801561066257600080fd5b506102226004803560248101910135612ab1565b34801561068257600080fd5b50610222600160a060020a0360043516612e47565b3480156106a357600080fd5b506102396004356130bc565b3480156106bb57600080fd5b506101ee6130ce565b3480156106d057600080fd5b506102226004356130dd565b3480156106e857600080fd5b506101ee61335f565b600354600160a060020a031681565b60008181526006602052604090206001015415610767576040805160e560020a62461bcd02815260206004820152601060248201527f416c726561647920526573657276656400000000000000000000000000000000604482015290519081900360640190fd5b6040805180820182523381524360208083019182526000948552600690529190922091518254600160a060020a031916600160a060020a0390911617825551600190910155565b60085481565b600080548190600160a060020a031633146107ce57600080fd5b600160a060020a038316151561082e576040805160e560020a62461bcd02815260206004820152601160248201527f43616e6e6f74206275726e20746f6b656e000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038416151561087a57604051600160a060020a03841690303180156108fc02916000818181858888f19350505050158015610874573d6000803e3d6000fd5b50610a6e565b604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051859350600160a060020a038416916370a082319160248083019260209291908290030181600087803b1580156108de57600080fd5b505af11580156108f2573d6000803e3d6000fd5b505050506040513d602081101561090857600080fd5b5051600154909150600160a060020a038581169116141561098657600c54811161097c576040805160e560020a62461bcd02815260206004820152600d60248201527f4973206e6f742065786365737300000000000000000000000000000000000000604482015290519081900360640190fd5b600c5490036109de565b600081116109de576040805160e560020a62461bcd02815260206004820152600a60248201527f4e6f2062616c616e636500000000000000000000000000000000000000000000604482015290519081900360640190fd5b81600160a060020a031663a9059cbb84836040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b158015610a4157600080fd5b505af1158015610a55573d6000803e3d6000fd5b505050506040513d6020811015610a6b57600080fd5b50505b50505050565b6009546040805160208082019390935280820184905281518082038301815260609091019182905280516000939192918291908401908083835b60208310610acd5780518252601f199092019160209182019101610aae565b51815160209384036101000a60001901801990921691161790526040805192909401829003822060025460e060020a6302571be3028452600484018290529451909750600160a060020a0390941695506302571be3945060248083019491935090918290030181600087803b158015610b4557600080fd5b505af1158015610b59573d6000803e3d6000fd5b505050506040513d6020811015610b6f57600080fd5b5051600160a060020a03163314610bd0576040805160e560020a62461bcd02815260206004820152601d60248201527f43616c6c6572206e6f74206f776e6572206f6620454e53206e6f64652e000000604482015290519081900360640190fd5b60008281526005602052604081206001015411610c37576040805160e560020a62461bcd02815260206004820152601860248201527f557365726e616d65206e6f7420726567697374657265642e0000000000000000604482015290519081900360640190fd5b6002546009546040805160e060020a6302571be30281526004810192909252513092600160a060020a0316916302571be39160248083019260209291908290030181600087803b158015610c8a57600080fd5b505af1158015610c9e573d6000803e3d6000fd5b505050506040513d6020811015610cb457600080fd5b5051600160a060020a031614610d14576040805160e560020a62461bcd02815260206004820152601f60248201527f5265676973747279206e6f74206f776e6572206f662072656769737472792e00604482015290519081900360640190fd5b6000828152600560209081526040918290206002018054600160a060020a0319163390811790915582519081529151839260008051602061467683398151915292908290030190a25050565b600054600160a060020a03163314610d7757600080fd5b60008054600160a060020a031916600160a060020a0392909216919091179055565b6060600085858080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509150838251111515610e2c576040805160e560020a62461bcd02815260206004820152601160248201527f496e76616c696420706f736974696f6e2e000000000000000000000000000000604482015290519081900360640190fd5b8184815181101515610e3a57fe5b016020015160f860020a908190040290507f3000000000000000000000000000000000000000000000000000000000000000600160f860020a0319821610801590610eaf57507f3900000000000000000000000000000000000000000000000000000000000000600160f860020a0319821611155b80610f1957507f6100000000000000000000000000000000000000000000000000000000000000600160f860020a0319821610801590610f1957507f7a00000000000000000000000000000000000000000000000000000000000000600160f860020a0319821611155b15610f6e576040805160e560020a62461bcd02815260206004820152601660248201527f4e6f7420696e76616c6964206368617261637465722e00000000000000000000604482015290519081900360640190fd5b610a6b828461336e565b606085858080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509050611047848480806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050600854836040518082805190602001908083835b602083106110155780518252601f199092019160209182019101610ff6565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020613a4b565b151561109d576040805160e560020a62461bcd02815260206004820152600e60248201527f496e76616c69642050726f6f662e000000000000000000000000000000000000604482015290519081900360640190fd5b610a6b818361336e565b600c5481565b600054600160a060020a031633146110c457600080fd5b60038054600160a060020a031916600160a060020a0392909216919091179055565b60075481565b60006110f6614633565b6009546040805160208082019390935280820186905281518082038301815260609091019182905280516000939192918291908401908083835b6020831061114f5780518252601f199092019160209182019101611130565b51815160209384036101000a60001901801990921691161790526040805192909401829003822060008b81526005835285812060608501875280548552600181015493850184905260020154600160a060020a031695840195909552985090965091909111925061120d915050576040805160e560020a62461bcd02815260206004820152601860248201527f557365726e616d65206e6f7420726567697374657265642e0000000000000000604482015290519081900360640190fd5b6001600b5460ff16600281111561122057fe5b1415611368576002546040805160e060020a6302571be3028152600481018690529051600160a060020a03909216916302571be3916024808201926020929091908290030181600087803b15801561127757600080fd5b505af115801561128b573d6000803e3d6000fd5b505050506040513d60208110156112a157600080fd5b5051600160a060020a03163314611302576040805160e560020a62461bcd02815260206004820152601660248201527f4e6f74206f776e6572206f6620454e53206e6f64652e00000000000000000000604482015290519081900360640190fd5b60208201516301e13380014211611363576040805160e560020a62461bcd02815260206004820152601b60248201527f52656c6561736520706572696f64206e6f7420726561636865642e0000000000604482015290519081900360640190fd5b6113cc565b6040820151600160a060020a031633146113cc576040805160e560020a62461bcd02815260206004820152601d60248201527f4e6f742074686520666f726d6572206163636f756e74206f776e65722e000000604482015290519081900360640190fd5b6000848152600560205260408120818155600181018290556002018054600160a060020a0319169055825111156114f6578151600c80548290039055600154604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152336004820152602481019390935251600160a060020a039091169163a9059cbb9160448083019260209291908290030181600087803b15801561147457600080fd5b505af1158015611488573d6000803e3d6000fd5b505050506040513d602081101561149e57600080fd5b505115156114f6576040805160e560020a62461bcd02815260206004820152600f60248201527f5472616e73666572206661696c65640000000000000000000000000000000000604482015290519081900360640190fd5b6001600b5460ff16600281111561150957fe5b1415611664576002546009546040805160e060020a6306ab592302815260048101929092526024820187905230604483015251600160a060020a03909216916306ab59239160648082019260009290919082900301818387803b15801561156f57600080fd5b505af1158015611583573d6000803e3d6000fd5b50506002546040805160e160020a630c4b7b85028152600481018890526000602482018190529151600160a060020a039093169450631896f70a93506044808201939182900301818387803b1580156115db57600080fd5b505af11580156115ef573d6000803e3d6000fd5b50506002546040805160e060020a635b0fc9c3028152600481018890526000602482018190529151600160a060020a039093169450635b0fc9c393506044808201939182900301818387803b15801561164757600080fd5b505af115801561165b573d6000803e3d6000fd5b505050506117c4565b6002546009546040805160e060020a6302571be3028152600481019290925251600160a060020a03909216916302571be3916024808201926020929091908290030181600087803b1580156116b857600080fd5b505af11580156116cc573d6000803e3d6000fd5b505050506040513d60208110156116e257600080fd5b505160408051602480820188905282518083039091018152604490910182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff9e542820000000000000000000000000000000000000000000000000000000017815291518151939450600160a060020a038516936201388093829180838360005b83811015611780578181015183820152602001611768565b50505050905090810190601f1680156117ad5780820380516001836020036101000a031916815260200191505b5091505060006040518083038160008787f1505050505b604080516000815290518491600080516020614676833981519152919081900360200190a250505050565b60009081526005602052604090206001015490565b6301e1338081565b600254600160a060020a031681565b600454600160a060020a0316331461187d576040805160e560020a62461bcd02815260206004820152600f60248201527f4d6967726174696f6e206f6e6c792e0000000000000000000000000000000000604482015290519081900360640190fd5b60008311156119b05760015460048054604080517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a039283169381019390935230602484015260448301879052519216916323b872dd916064808201926020929091908290030181600087803b1580156118ff57600080fd5b505af1158015611913573d6000803e3d6000fd5b505050506040513d602081101561192957600080fd5b505115156119a7576040805160e560020a62461bcd02815260206004820152602560248201527f4572726f72206d6f76696e672066756e64732066726f6d206f6c64207265676960448201527f737461722e000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600c8054840190555b604080516060810182529384526020808501938452600160a060020a039283168583019081526000968752600590915294209251835590516001830155915160029091018054600160a060020a03191691909216179055565b60008181526005602052604081205481811115611a27576003810491505b50919050565b600054600160a060020a03163314611a4457600080fd5b6001600b5460ff166002811115611a5757fe5b14611aac576040805160e560020a62461bcd02815260206004820152601260248201527f5265676973747279206e6f74206f776e65640000000000000000000000000000604482015290519081900360640190fd5b600a8190556040805182815290517f45d3cd7c7bd7d211f00610f51660b2f114c7833e0c52ef3603c6d41ed07a74589181900360200190a150565b606060008085858080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509250600c8351111515611ba2576040805160e560020a62461bcd02815260206004820152602260248201527f546f6f20736d616c6c20746f206c6f6f6b206c696b6520616e2061646472657360448201527f732e000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b82517f30000000000000000000000000000000000000000000000000000000000000009084906000908110611bd357fe5b60209101015160f860020a9081900402600160f860020a03191614611c42576040805160e560020a62461bcd02815260206004820152601c60248201527f466972737420636861726163746572206e65656420746f206265203000000000604482015290519081900360640190fd5b82517f78000000000000000000000000000000000000000000000000000000000000009084906001908110611c7357fe5b60209101015160f860020a9081900402600160f860020a03191614611ce2576040805160e560020a62461bcd02815260206004820152601d60248201527f5365636f6e6420636861726163746572206e65656420746f2062652078000000604482015290519081900360640190fd5b600291505b6007821015611e3e578282815181101515611cfe57fe5b016020015160f860020a908190040290507f3000000000000000000000000000000000000000000000000000000000000000600160f860020a0319821610801590611d7357507f3900000000000000000000000000000000000000000000000000000000000000600160f860020a0319821611155b80611ddd57507f6100000000000000000000000000000000000000000000000000000000000000600160f860020a0319821610801590611ddd57507f6600000000000000000000000000000000000000000000000000000000000000600160f860020a0319821611155b1515611e33576040805160e560020a62461bcd02815260206004820152601d60248201527f446f6573206e6f74206c6f6f6b206c696b6520616e2061646472657373000000604482015290519081900360640190fd5b600190910190611ce7565b610a6b838561336e565b6000806000806000600a5488141515611eab576040805160e560020a62461bcd02815260206004820152600b60248201527f57726f6e672076616c7565000000000000000000000000000000000000000000604482015290519081900360640190fd5b600154600160a060020a03888116911614611f10576040805160e560020a62461bcd02815260206004820152600b60248201527f57726f6e6720746f6b656e000000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0387163314611f70576040805160e560020a62461bcd02815260206004820152600a60248201527f57726f6e672063616c6c00000000000000000000000000000000000000000000604482015290519081900360640190fd5b855160841015611fca576040805160e560020a62461bcd02815260206004820152601160248201527f57726f6e672064617461206c656e677468000000000000000000000000000000604482015290519081900360640190fd5b611fd386613b9a565b9398509196509450925090507fffffffff0000000000000000000000000000000000000000000000000000000085167fb82fedbb0000000000000000000000000000000000000000000000000000000014612078576040805160e560020a62461bcd02815260206004820152601560248201527f57726f6e67206d6574686f642073656c6563746f720000000000000000000000604482015290519081900360640190fd5b6120858985858585613bbe565b50505050505050505050565b606083838080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505090506007548151101515612124576040805160e560020a62461bcd02815260206004820152601560248201527f4e6f74206120736d616c6c20757365726e616d652e0000000000000000000000604482015290519081900360640190fd5b610a6e818361336e565b600a5490565b600454600160a060020a03163314612196576040805160e560020a62461bcd02815260206004820152600f60248201527f4d6967726174696f6e206f6e6c792e0000000000000000000000000000000000604482015290519081900360640190fd5b6000600b5460ff1660028111156121a957fe5b146121fe576040805160e560020a62461bcd02815260206004820152600c60248201527f4e6f7420496e6163746976650000000000000000000000000000000000000000604482015290519081900360640190fd5b6002546009546040805160e060020a6302571be30281526004810192909252513092600160a060020a0316916302571be39160248083019260209291908290030181600087803b15801561225157600080fd5b505af1158015612265573d6000803e3d6000fd5b505050506040513d602081101561227b57600080fd5b5051600160a060020a031614612301576040805160e560020a62461bcd02815260206004820152602260248201527f454e53207265676973747279206f776e6572206e6f74207472616e736665726560448201527f642e000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600a81905561231060016143aa565b6040805182815290517f45d3cd7c7bd7d211f00610f51660b2f114c7833e0c52ef3603c6d41ed07a74589181900360200190a150565b600a5481565b60008181526005602052604081206001015481811115611a27576301e133800192915050565b600090815260056020526040902060020154600160a060020a031690565b600054600160a060020a031633146123a757600080fd5b600160a060020a0381161515612407576040805160e560020a62461bcd02815260206004820152601060248201527f43616e6e6f74206275726e206e6f646500000000000000000000000000000000604482015290519081900360640190fd5b600954821415612461576040805160e560020a62461bcd02815260206004820152601960248201527f43616e6e6f74207769746864726177206d61696e206e6f646500000000000000604482015290519081900360640190fd5b6002546040805160e060020a6302571be30281526004810185905290513092600160a060020a0316916302571be39160248083019260209291908290030181600087803b1580156124b157600080fd5b505af11580156124c5573d6000803e3d6000fd5b505050506040513d60208110156124db57600080fd5b5051600160a060020a03161461253b576040805160e560020a62461bcd02815260206004820152601660248201527f4e6f74206f776e6572206f662074686973206e6f646500000000000000000000604482015290519081900360640190fd5b6002546040805160e060020a635b0fc9c302815260048101859052600160a060020a03848116602483015291519190921691635b0fc9c391604480830192600092919082900301818387803b15801561259357600080fd5b505af1158015610a6b573d6000803e3d6000fd5b600054600160a060020a031633146125be57600080fd5b6000600b5460ff1660028111156125d157fe5b14612626576040805160e560020a62461bcd02815260206004820152601e60248201527f5265676973747279207374617465206973206e6f7420496e6163746976650000604482015290519081900360640190fd5b6002546009546040805160e060020a6302571be30281526004810192909252513092600160a060020a0316916302571be39160248083019260209291908290030181600087803b15801561267957600080fd5b505af115801561268d573d6000803e3d6000fd5b505050506040513d60208110156126a357600080fd5b5051600160a060020a031614612301576040805160e560020a62461bcd02815260206004820152601e60248201527f526567697374727920646f6573206e6f74206f776e2072656769737472790000604482015290519081900360640190fd5b60006127123386868686613bbe565b95945050505050565b600560205260009081526040902080546001820154600290920154909190600160a060020a031683565b600b5460ff1681565b612756614633565b6002600b5460ff16600281111561276957fe5b146127be576040805160e560020a62461bcd02815260206004820152601460248201527f57726f6e6720636f6e7472616374207374617465000000000000000000000000604482015290519081900360640190fd5b600083815260056020526040902060020154600160a060020a0316331461282f576040805160e560020a62461bcd02815260206004820152601f60248201527f43616c6c61626c65206f6e6c79206279206163636f756e74206f776e65722e00604482015290519081900360640190fd5b6002546009546040805160e060020a6302571be3028152600481019290925251600160a060020a038086169316916302571be39160248083019260209291908290030181600087803b15801561288457600080fd5b505af1158015612898573d6000803e3d6000fd5b505050506040513d60208110156128ae57600080fd5b5051600160a060020a03161461290e576040805160e560020a62461bcd02815260206004820152600c60248201527f57726f6e67207570646174650000000000000000000000000000000000000000604482015290519081900360640190fd5b5060008281526005602081815260408084208151606081018352815481526001808301805483870152600284018054600160a060020a03808216868901528c8b529888529489905590889055600160a060020a03199093169092559054815183517f095ea7b3000000000000000000000000000000000000000000000000000000008152888716600482015260248101919091529251919594169363095ea7b393604480850194919392918390030190829087803b1580156129cf57600080fd5b505af11580156129e3573d6000803e3d6000fd5b505050506040513d60208110156129f957600080fd5b50508051602082015160408084015181517f80cd00150000000000000000000000000000000000000000000000000000000081526004810188905260248101949094526044840192909252600160a060020a03918216606484015251908416916380cd001591608480830192600092919082900301818387803b158015612a7f57600080fd5b505af1158015612a93573d6000803e3d6000fd5b50505050505050565b600454600160a060020a031681565b60095481565b80600080821515612b0c576040805160e560020a62461bcd02815260206004820152601060248201527f4e6f7468696e6720746f20657261736500000000000000000000000000000000604482015290519081900360640190fd5b84846000198501818110612b1c57fe5b6009546040805160208181019390935292820294909401358285018190528451808403860181526060909301948590528251909650919392508291908401908083835b60208310612b7e5780518252601f199092019160209182019101612b5f565b51815160209384036101000a60001901801990921691161790526040805192909401829003822060025460e060020a6302571be302845260048401829052945190975060009650600160a060020a0390941694506302571be39360248084019450919290919082900301818787803b158015612bf957600080fd5b505af1158015612c0d573d6000803e3d6000fd5b505050506040513d6020811015612c2357600080fd5b5051600160a060020a031614612ca9576040805160e560020a62461bcd02815260206004820152602760248201527f466972737420736c6173682f72656c6561736520746f70206c6576656c20737560448201527f62646f6d61696e00000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6002546009546040805160e060020a6306ab592302815260048101929092526024820185905230604483015251600160a060020a03909216916306ab59239160648082019260009290919082900301818387803b158015612d0957600080fd5b505af1158015612d1d573d6000803e3d6000fd5b505050506001831115612d6657612d6660028403868680806020026020016040519081016040528093929190818152602001838360200280828437508894506144109350505050565b6002546040805160e160020a630c4b7b85028152600481018490526000602482018190529151600160a060020a0390931692631896f70a9260448084019391929182900301818387803b158015612dbc57600080fd5b505af1158015612dd0573d6000803e3d6000fd5b50506002546040805160e060020a635b0fc9c3028152600481018690526000602482018190529151600160a060020a039093169450635b0fc9c393506044808201939182900301818387803b158015612e2857600080fd5b505af1158015612e3c573d6000803e3d6000fd5b505050505050505050565b600054600160a060020a03163314612e5e57600080fd5b600160a060020a038116301415612ebf576040805160e560020a62461bcd02815260206004820152601460248201527f43616e6e6f74206d6f766520746f2073656c662e000000000000000000000000604482015290519081900360640190fd5b6002546009546040805160e060020a6302571be30281526004810192909252513092600160a060020a0316916302571be39160248083019260209291908290030181600087803b158015612f1257600080fd5b505af1158015612f26573d6000803e3d6000fd5b505050506040513d6020811015612f3c57600080fd5b5051600160a060020a031614612f9c576040805160e560020a62461bcd02815260206004820152601b60248201527f5265676973747279206e6f74206f776e656420616e796d6f72652e0000000000604482015290519081900360640190fd5b612fa660026143aa565b6002546009546040805160e060020a635b0fc9c30281526004810192909252600160a060020a0384811660248401529051921691635b0fc9c39160448082019260009290919082900301818387803b15801561300157600080fd5b505af1158015613015573d6000803e3d6000fd5b5050505080600160a060020a03166398f038ff600a546040518263ffffffff1660e060020a02815260040180828152602001915050600060405180830381600087803b15801561306457600080fd5b505af1158015613078573d6000803e3d6000fd5b505060408051600160a060020a038516815290517fce0afb4c27dbd57a3646e2d639557521bfb05a42dc0ec50f9c1fe13d92e3e6d69350908190036020019150a150565b60009081526005602052604090205490565b600054600160a060020a031681565b600454600090600160a060020a03163314613142576040805160e560020a62461bcd02815260206004820152600f60248201527f4d6967726174696f6e206f6e6c792e0000000000000000000000000000000000604482015290519081900360640190fd5b600082815260056020526040902060010154156131a9576040805160e560020a62461bcd02815260206004820152601060248201527f416c7265616479206d6967726174656400000000000000000000000000000000604482015290519081900360640190fd5b60095460408051602080820193909352808201859052815180820383018152606090910191829052805190928291908401908083835b602083106131fe5780518252601f1990920191602091820191016131df565b5181516020939093036101000a60001901801990911692169190911790526040805191909301819003812060025460095460e060020a6306ab59230284526004840152602483018990523060448401529351909650600160a060020a0390931694506306ab59239350606480820193600093509182900301818387803b15801561328757600080fd5b505af115801561329b573d6000803e3d6000fd5b50506002546040805160e160020a630c4b7b85028152600481018690526000602482018190529151600160a060020a039093169450631896f70a93506044808201939182900301818387803b1580156132f357600080fd5b505af1158015613307573d6000803e3d6000fd5b50506002546040805160e060020a635b0fc9c3028152600481018690526000602482018190529151600160a060020a039093169450635b0fc9c393506044808201939182900301818387803b15801561259357600080fd5b600154600160a060020a031681565b600080600080600080600061338161465e565b896040518082805190602001908083835b602083106133b15780518252601f199092019160209182019101613392565b51815160209384036101000a600019018019909216911617905260408051929094018290038220600954838301528285018190528451808403860181526060909301948590528251909e509195509293508392850191508083835b6020831061342b5780518252601f19909201916020918201910161340c565b51815160209384036101000a60001901801990921691161790526040805192909401829003822060008f8152600583528581206001015460025460e060020a6302571be3028652600486018490529651929f50909d509b50600160a060020a0390941695506302571be39450602480830194919350909182900301818c87803b1580156134b757600080fd5b505af11580156134cb573d6000803e3d6000fd5b505050506040513d60208110156134e157600080fd5b505193508415156135f757600160a060020a03841615158061359c5750600254604080517f0178b8bf000000000000000000000000000000000000000000000000000000008152600481018a90529051600092600160a060020a031691630178b8bf91602480830192602092919082900301818787803b15801561356457600080fd5b505af1158015613578573d6000803e3d6000fd5b505050506040513d602081101561358e57600080fd5b5051600160a060020a031614155b15156135f2576040805160e560020a62461bcd02815260206004820152601160248201527f4e6f7468696e6720746f20736c6173682e000000000000000000000000000000604482015290519081900360640190fd5b613630565b4285141561360157fe5b6000888152600560205260408120805482825560018201929092556002018054600160a060020a031916905595505b6002546009546040805160e060020a6306ab59230281526004810192909252602482018b905230604483015251600160a060020a03909216916306ab59239160648082019260009290919082900301818387803b15801561369057600080fd5b505af11580156136a4573d6000803e3d6000fd5b50506002546040805160e160020a630c4b7b85028152600481018c90526000602482018190529151600160a060020a039093169450631896f70a93506044808201939182900301818387803b1580156136fc57600080fd5b505af1158015613710573d6000803e3d6000fd5b50506002546040805160e060020a635b0fc9c3028152600481018c90526000602482018190529151600160a060020a039093169450635b0fc9c393506044808201939182900301818387803b15801561376857600080fd5b505af115801561377c573d6000803e3d6000fd5b505050506000861115613a1a57600c805487900390556040805160208082018a905281830188905260608083018d905283518084039091018152608090920192839052815160026003909a04998a0299965091929182918401908083835b602083106137f95780518252601f1990920191602091820191016137da565b51815160209384036101000a6000190180199092169116179052604080519290940182900382206000818152600683528590208386019095528454600160a060020a0316808452600190950154918301919091529650945050151591506138ac9050576040805160e560020a62461bcd02815260206004820152600d60248201527f4e6f742072657365727665642e00000000000000000000000000000000000000604482015290519081900360640190fd5b60208101514311613907576040805160e560020a62461bcd02815260206004820152601b60248201527f43616e6e6f742072657665616c20696e2073616d6520626c6f636b0000000000604482015290519081900360640190fd5b60008281526006602090815260408083208054600160a060020a0319168155600190810184905554845182517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a039182166004820152602481018c9052925191169363a9059cbb93604480850194919392918390030190829087803b15801561399857600080fd5b505af11580156139ac573d6000803e3d6000fd5b505050506040513d60208110156139c257600080fd5b50511515613a1a576040805160e560020a62461bcd02815260206004820152601260248201527f4572726f7220696e207472616e736665722e0000000000000000000000000000604482015290519081900360640190fd5b604080516000815290518891600080516020614676833981519152919081900360200190a250505050505050505050565b60008181805b8651821015613b8d578682815181101515613a6857fe5b60209081029091010151905080831015613b0157604080516020808201869052818301849052825180830384018152606090920192839052815191929182918401908083835b60208310613acd5780518252601f199092019160209182019101613aae565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209250613b82565b604080516020808201849052818301869052825180830384018152606090920192839052815191929182918401908083835b60208310613b525780518252601f199092019160209182019101613b33565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902092505b600190910190613a51565b5050929092149392505050565b60208101516024820151604483015160648401516084909401519294919390929091565b600080806001600b5460ff166002811115613bd557fe5b14613c2a576040805160e560020a62461bcd02815260206004820152601460248201527f5265676973747279206e6f74206163746976652e000000000000000000000000604482015290519081900360640190fd5b600954604080516020808201939093528082018a9052815180820383018152606090910191829052805190928291908401908083835b60208310613c7f5780518252601f199092019160209182019101613c60565b51815160209384036101000a60001901801990921691161790526040805192909401829003822060025460e060020a6302571be302845260048401829052945190995060009650600160a060020a0390941694506302571be39360248084019450919290919082900301818787803b158015613cfa57600080fd5b505af1158015613d0e573d6000803e3d6000fd5b505050506040513d6020811015613d2457600080fd5b5051600160a060020a031614613d84576040805160e560020a62461bcd02815260206004820152601760248201527f454e53206e6f646520616c7265616479206f776e65642e000000000000000000604482015290519081900360640190fd5b60008781526005602052604090206001015415613deb576040805160e560020a62461bcd02815260206004820152601c60248201527f557365726e616d6520616c726561647920726567697374657265642e00000000604482015290519081900360640190fd5b60408051606081018252600a80548252426020808401918252600160a060020a038d811685870190815260008e815260059093529582209451855591516001850155935160029093018054600160a060020a031916939091169290921790915554111561404d57600a54600154604080517fdd62ed3e000000000000000000000000000000000000000000000000000000008152600160a060020a038c811660048301523060248301529151919092169163dd62ed3e9160448083019260209291908290030181600087803b158015613ec357600080fd5b505af1158015613ed7573d6000803e3d6000fd5b505050506040513d6020811015613eed57600080fd5b50511015613f45576040805160e560020a62461bcd02815260206004820152601360248201527f556e616c6c6f77656420746f207370656e642e00000000000000000000000000604482015290519081900360640190fd5b600154600a54604080517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a038c811660048301523060248301526044820193909352905191909216916323b872dd9160648083019260209291908290030181600087803b158015613fbe57600080fd5b505af1158015613fd2573d6000803e3d6000fd5b505050506040513d6020811015613fe857600080fd5b50511515614040576040805160e560020a62461bcd02815260206004820152600f60248201527f5472616e73666572206661696c65640000000000000000000000000000000000604482015290519081900360640190fd5b600a54600c805490910190555b8415158061405a57508315155b915050600160a060020a038516151581806140725750805b156142f7576002546009546040805160e060020a6306ab59230281526004810192909252602482018a905230604483015251600160a060020a03909216916306ab59239160648082019260009290919082900301818387803b1580156140d757600080fd5b505af11580156140eb573d6000803e3d6000fd5b50506002546003546040805160e160020a630c4b7b8502815260048101899052600160a060020a0392831660248201529051919092169350631896f70a9250604480830192600092919082900301818387803b15801561414a57600080fd5b505af115801561415e573d6000803e3d6000fd5b5050505080156141ef57600354604080517fd5fa2b0000000000000000000000000000000000000000000000000000000000815260048101869052600160a060020a0389811660248301529151919092169163d5fa2b0091604480830192600092919082900301818387803b1580156141d657600080fd5b505af11580156141ea573d6000803e3d6000fd5b505050505b811561428257600354604080517f29cd62ea0000000000000000000000000000000000000000000000000000000081526004810186905260248101889052604481018790529051600160a060020a03909216916329cd62ea9160648082019260009290919082900301818387803b15801561426957600080fd5b505af115801561427d573d6000803e3d6000fd5b505050505b6002546040805160e060020a635b0fc9c302815260048101869052600160a060020a038b8116602483015291519190921691635b0fc9c391604480830192600092919082900301818387803b1580156142da57600080fd5b505af11580156142ee573d6000803e3d6000fd5b50505050614372565b6002546009546040805160e060020a6306ab59230281526004810192909252602482018a9052600160a060020a038b8116604484015290519216916306ab59239160648082019260009290919082900301818387803b15801561435957600080fd5b505af115801561436d573d6000803e3d6000fd5b505050505b60408051600160a060020a038a16815290518491600080516020614676833981519152919081900360200190a2505095945050505050565b600b805482919060ff191660018360028111156143c357fe5b02179055507fee85d4d9a9722e814f07db07f29734cd5a97e0e58781ad41ae4572193b1caea081604051808260028111156143fa57fe5b60ff16815260200191505060405180910390a150565b6002548251600091600160a060020a0316906306ab592390849086908890811061443657fe5b602090810290910101516040805160e060020a63ffffffff86160281526004810193909352602483019190915230604483015251606480830192600092919082900301818387803b15801561448a57600080fd5b505af115801561449e573d6000803e3d6000fd5b505050508183858151811015156144b157fe5b6020908102909101810151604080518084019490945283810191909152805180840382018152606090930190819052825190918291908401908083835b6020831061450d5780518252601f1990920191602091820191016144ee565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209050600084111561455357614553600185038483614410565b6002546040805160e160020a630c4b7b85028152600481018490526000602482018190529151600160a060020a0390931692631896f70a9260448084019391929182900301818387803b1580156145a957600080fd5b505af11580156145bd573d6000803e3d6000fd5b50506002546040805160e060020a635b0fc9c3028152600481018690526000602482018190529151600160a060020a039093169450635b0fc9c393506044808201939182900301818387803b15801561461557600080fd5b505af1158015614629573d6000803e3d6000fd5b5050505050505050565b60606040519081016040528060008152602001600081526020016000600160a060020a031681525090565b6040805180820190915260008082526020820152905600d2da4206c3fa95b8fc1ee48627023d322b59cc7218e14cb95cf0c0fe562f2e4da165627a7a723058209db16656f7d3b4f89964947f476541d102a4453693e08f07e9b8da8da6a5264b0029
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000744d70fdbe2ba4cf95131626614a1763df805b9e000000000000000000000000314159265dd8dbb310642f98f50c066173c1259b0000000000000000000000005ffc014343cd971b7eb70732021e26c35b744cc45f7791d31ca0493e9ca7c9ca16695ecd9d5044768674d14d31ab5d8277518fff0000000000000000000000000000000000000000000000000000000000000003b46e19581b371ab0856ee8ffd05b33cbfd264755e18f2d004780bb929970a53e0000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _token (address): 0x744d70FDBE2Ba4CF95131626614a1763DF805B9E
Arg [1] : _ensRegistry (address): 0x314159265dD8dbb310642f98f50C066173C1259b
Arg [2] : _resolver (address): 0x5FfC014343cd971B7eb70732021E26C35B744cc4
Arg [3] : _ensNode (bytes32): 0x5f7791d31ca0493e9ca7c9ca16695ecd9d5044768674d14d31ab5d8277518fff
Arg [4] : _usernameMinLength (uint256): 3
Arg [5] : _reservedUsernamesMerkleRoot (bytes32): 0xb46e19581b371ab0856ee8ffd05b33cbfd264755e18f2d004780bb929970a53e
Arg [6] : _parentRegistry (address): 0x0000000000000000000000000000000000000000
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 000000000000000000000000744d70fdbe2ba4cf95131626614a1763df805b9e
Arg [1] : 000000000000000000000000314159265dd8dbb310642f98f50c066173c1259b
Arg [2] : 0000000000000000000000005ffc014343cd971b7eb70732021e26c35b744cc4
Arg [3] : 5f7791d31ca0493e9ca7c9ca16695ecd9d5044768674d14d31ab5d8277518fff
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [5] : b46e19581b371ab0856ee8ffd05b33cbfd264755e18f2d004780bb929970a53e
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000000
Swarm Source
bzzr://9db16656f7d3b4f89964947f476541d102a4453693e08f07e9b8da8da6a5264b
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $0.056597 | 62,463.3333 | $3,535.24 |
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.