Source Code
Latest 25 from a total of 71 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Set Pubkey | 23082170 | 101 days ago | IN | 0 ETH | 0.00000913 | ||||
| Set Pubkey | 23082129 | 101 days ago | IN | 0 ETH | 0.00000748 | ||||
| Set Pubkey | 23082071 | 101 days ago | IN | 0 ETH | 0.00001137 | ||||
| Set Pubkey | 23082029 | 101 days ago | IN | 0 ETH | 0.0000111 | ||||
| Set Pubkey | 23082011 | 101 days ago | IN | 0 ETH | 0.0000123 | ||||
| Set Pubkey | 23081862 | 101 days ago | IN | 0 ETH | 0.00000625 | ||||
| Set Pubkey | 23077245 | 102 days ago | IN | 0 ETH | 0.00002815 | ||||
| Set Pubkey | 23077233 | 102 days ago | IN | 0 ETH | 0.00003115 | ||||
| Release | 19648680 | 581 days ago | IN | 0 ETH | 0.00321686 | ||||
| Release | 18144564 | 791 days ago | IN | 0 ETH | 0.00035818 | ||||
| Release | 18047910 | 805 days ago | IN | 0 ETH | 0.00139384 | ||||
| Release | 15987445 | 1094 days ago | IN | 0 ETH | 0.00184311 | ||||
| Slash Small User... | 15659133 | 1140 days ago | IN | 0 ETH | 0.00075482 | ||||
| Reserve Slash | 15659130 | 1140 days ago | IN | 0 ETH | 0.00028047 | ||||
| Slash Small User... | 15659082 | 1140 days ago | IN | 0 ETH | 0.00034654 | ||||
| Reserve Slash | 15659054 | 1140 days ago | IN | 0 ETH | 0.00026194 | ||||
| Release | 15282703 | 1198 days ago | IN | 0 ETH | 0.00197836 | ||||
| Release | 15257387 | 1202 days ago | IN | 0 ETH | 0.00095224 | ||||
| Transfer | 15246056 | 1203 days ago | IN | 0.0005 ETH | 0.00016066 | ||||
| Release | 14035406 | 1396 days ago | IN | 0 ETH | 0.01302921 | ||||
| Release | 13003059 | 1557 days ago | IN | 0 ETH | 0.00765163 | ||||
| Release | 13003046 | 1557 days ago | IN | 0 ETH | 0.00765163 | ||||
| Release | 13002742 | 1557 days ago | IN | 0 ETH | 0.00173365 | ||||
| Release | 12894957 | 1574 days ago | IN | 0 ETH | 0.00090697 | ||||
| Release | 12721097 | 1601 days ago | IN | 0 ETH | 0.00046896 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Cross-Chain Transactions
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
Contract ABI
API[{"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 | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| ETH | 100.00% | $0.016984 | 62,783.3333 | $1,066.3 |
Loading...
Loading
Loading...
Loading
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.