ETH Price: $2,571.99 (+1.13%)

Contract

0xc4BF277257C140A799b785C6C5096c6Da7ef6A62
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

Transactions Sent

Latest: N/A First: N/A

Funded By

N/A

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Kill69886462019-01-01 0:08:042090 days ago1546301284IN
0xc4BF2772...Da7ef6A62
0 ETH0.000040783
Transfer Owner65226332018-10-16 0:08:582167 days ago1539648538IN
0xc4BF2772...Da7ef6A62
0 ETH0.000153565
Finish Issuing65207682018-10-15 16:53:402168 days ago1539622420IN
0xc4BF2772...Da7ef6A62
0 ETH0.00014415
Transfer65043222018-10-13 0:39:152170 days ago1539391155IN
0xc4BF2772...Da7ef6A62
0 ETH0.0015376818
Transfer65042492018-10-13 0:22:522170 days ago1539390172IN
0xc4BF2772...Da7ef6A62
0 ETH0.0018490318
Transfer65042492018-10-13 0:22:522170 days ago1539390172IN
0xc4BF2772...Da7ef6A62
0 ETH0.0018490318
Transfer65042492018-10-13 0:22:522170 days ago1539390172IN
0xc4BF2772...Da7ef6A62
0 ETH0.0018478818
Transfer65042492018-10-13 0:22:522170 days ago1539390172IN
0xc4BF2772...Da7ef6A62
0 ETH0.0018478818
Transfer65042492018-10-13 0:22:522170 days ago1539390172IN
0xc4BF2772...Da7ef6A62
0 ETH0.0018478818
Transfer65042382018-10-13 0:20:262170 days ago1539390026IN
0xc4BF2772...Da7ef6A62
0 ETH0.0018478818
Transfer65042382018-10-13 0:20:262170 days ago1539390026IN
0xc4BF2772...Da7ef6A62
0 ETH0.0018467218
Transfer65042382018-10-13 0:20:262170 days ago1539390026IN
0xc4BF2772...Da7ef6A62
0 ETH0.0018467218
Transfer65042382018-10-13 0:20:262170 days ago1539390026IN
0xc4BF2772...Da7ef6A62
0 ETH0.0018478818
Transfer65042382018-10-13 0:20:262170 days ago1539390026IN
0xc4BF2772...Da7ef6A62
0 ETH0.0018478818
Transfer65042382018-10-13 0:20:262170 days ago1539390026IN
0xc4BF2772...Da7ef6A62
0 ETH0.0018478818
Transfer65042382018-10-13 0:20:262170 days ago1539390026IN
0xc4BF2772...Da7ef6A62
0 ETH0.0018478818
Transfer65042382018-10-13 0:20:262170 days ago1539390026IN
0xc4BF2772...Da7ef6A62
0 ETH0.0018478818
Transfer65042382018-10-13 0:20:262170 days ago1539390026IN
0xc4BF2772...Da7ef6A62
0 ETH0.0018478818
Transfer65042382018-10-13 0:20:262170 days ago1539390026IN
0xc4BF2772...Da7ef6A62
0 ETH0.0018478818
Transfer65042382018-10-13 0:20:262170 days ago1539390026IN
0xc4BF2772...Da7ef6A62
0 ETH0.0018478818
Transfer65042382018-10-13 0:20:262170 days ago1539390026IN
0xc4BF2772...Da7ef6A62
0 ETH0.0018478818
Transfer65042382018-10-13 0:20:262170 days ago1539390026IN
0xc4BF2772...Da7ef6A62
0 ETH0.0018478818
Transfer65042382018-10-13 0:20:262170 days ago1539390026IN
0xc4BF2772...Da7ef6A62
0 ETH0.0018478818
Transfer65042382018-10-13 0:20:262170 days ago1539390026IN
0xc4BF2772...Da7ef6A62
0 ETH0.0018478818
Transfer65042382018-10-13 0:20:262170 days ago1539390026IN
0xc4BF2772...Da7ef6A62
0 ETH0.0018467218
View all transactions

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Block From To
69886462019-01-01 0:08:042090 days ago1546301284
0xc4BF2772...Da7ef6A62
0 ETH
Loading...
Loading
Contract Self Destruct called at Txn Hash 0xebebeb58c4137ae8191e1c9b219ee9f1065d4c2973885566b446af90b93f69fb


Contract Source Code Verified (Exact Match)

Contract Name:
T0ken

Compiler Version
v0.4.25+commit.59dbf8f1

Optimization Enabled:
Yes with 1000 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2018-10-16
*/

pragma solidity >=0.4.24 <0.5.0;

/**
 *
 *  @title AddressMap
 *  @dev Map of unique indexed addresseses.
 *
 *  **NOTE**
 *    The internal collections are one-based.
 *    This is simply because null values are expressed as zero,
 *    which makes it hard to check for the existence of items within the array,
 *    or grabbing the first item of an array for non-existent items.
 *
 *    This is only exposed internally, so callers still use zero-based indices.
 *
 */
library AddressMap {
    address constant ZERO_ADDRESS = address(0);

    struct Data {
        int256 count;
        mapping(address => int256) indices;
        mapping(int256 => address) items;
    }

    /**
     *  Appends the address to the end of the map, if the addres is not
     *  zero and the address doesn't currently exist.
     *  @param addr The address to append.
     *  @return true if the address was added.
     */
    function append(Data storage self, address addr)
    internal
    returns (bool) {
        if (addr == ZERO_ADDRESS) {
            return false;
        }

        int256 index = self.indices[addr] - 1;
        if (index >= 0 && index < self.count) {
            return false;
        }

        self.count++;
        self.indices[addr] = self.count;
        self.items[self.count] = addr;
        return true;
    }

    /**
     *  Removes the given address from the map.
     *  @param addr The address to remove from the map.
     *  @return true if the address was removed.
     */
    function remove(Data storage self, address addr)
    internal
    returns (bool) {
        int256 oneBasedIndex = self.indices[addr];
        if (oneBasedIndex < 1 || oneBasedIndex > self.count) {
            return false;  // address doesn't exist, or zero.
        }

        // When the item being removed is not the last item in the collection,
        // replace that item with the last one, otherwise zero it out.
        //
        //  If {2} is the item to be removed
        //     [0, 1, 2, 3, 4]
        //  The result would be:
        //     [0, 1, 4, 3]
        //
        if (oneBasedIndex < self.count) {
            // Replace with last item
            address last = self.items[self.count];  // Get the last item
            self.indices[last] = oneBasedIndex;     // Update last items index to current index
            self.items[oneBasedIndex] = last;       // Update current index to last item
            delete self.items[self.count];          // Delete the last item, since it's moved
        } else {
            // Delete the address
            delete self.items[oneBasedIndex];
        }

        delete self.indices[addr];
        self.count--;
        return true;
    }

    /**
     *  Retrieves the address at the given index.
     *  THROWS when the index is invalid.
     *  @param index The index of the item to retrieve.
     *  @return The address of the item at the given index.
     */
    function at(Data storage self, int256 index)
    internal
    view
    returns (address) {
        require(index >= 0 && index < self.count, "Index outside of bounds.");
        return self.items[index + 1];
    }

    /**
     *  Gets the index of the given address.
     *  @param addr The address of the item to get the index for.
     *  @return The index of the given address.
     */
    function indexOf(Data storage self, address addr)
    internal
    view
    returns (int256) {
        if (addr == ZERO_ADDRESS) {
            return -1;
        }

        int256 index = self.indices[addr] - 1;
        if (index < 0 || index >= self.count) {
            return -1;
        }
        return index;
    }

    /**
     *  Returns whether or not the given address exists within the map.
     *  @param addr The address to check for existence.
     *  @return If the given address exists or not.
     */
    function exists(Data storage self, address addr)
    internal
    view
    returns (bool) {
        int256 index = self.indices[addr] - 1;
        return index >= 0 && index < self.count;
    }

    /**
     * Clears all items within the map.
     */
    function clear(Data storage self)
    internal {
        self.count = 0;
    }

}

/**
 *
 *  @title AccountMap
 *  @dev Map of unique indexed accounts.
 *
 *  **NOTE**
 *    The internal collections are one-based.
 *    This is simply because null values are expressed as zero,
 *    which makes it hard to check for the existence of items within the array,
 *    or grabbing the first item of an array for non-existent items.
 *
 *    This is only exposed internally, so callers still use zero-based indices.
 *
 */
library AccountMap {
    address constant ZERO_ADDRESS = address(0);

    struct Account {
        address addr;
        uint8 kind;
        bool frozen;
        address parent;
    }

    struct Data {
        int256 count;
        mapping(address => int256) indices;
        mapping(int256 => Account) items;
    }

    /**
     *  Appends the address to the end of the map, if the addres is not
     *  zero and the address doesn't currently exist.
     *  @param addr The address to append.
     *  @return true if the address was added.
     */
    function append(Data storage self, address addr, uint8 kind, bool isFrozen, address parent)
    internal
    returns (bool) {
        if (addr == ZERO_ADDRESS) {
            return false;
        }

        int256 index = self.indices[addr] - 1;
        if (index >= 0 && index < self.count) {
            return false;
        }

        self.count++;
        self.indices[addr] = self.count;
        self.items[self.count] = Account(addr, kind, isFrozen, parent);
        return true;
    }

    /**
     *  Removes the given address from the map.
     *  @param addr The address to remove from the map.
     *  @return true if the address was removed.
     */
    function remove(Data storage self, address addr)
    internal
    returns (bool) {
        int256 oneBasedIndex = self.indices[addr];
        if (oneBasedIndex < 1 || oneBasedIndex > self.count) {
            return false;  // address doesn't exist, or zero.
        }

        // When the item being removed is not the last item in the collection,
        // replace that item with the last one, otherwise zero it out.
        //
        //  If {2} is the item to be removed
        //     [0, 1, 2, 3, 4]
        //  The result would be:
        //     [0, 1, 4, 3]
        //
        if (oneBasedIndex < self.count) {
            // Replace with last item
            Account storage last = self.items[self.count];  // Get the last item
            self.indices[last.addr] = oneBasedIndex;        // Update last items index to current index
            self.items[oneBasedIndex] = last;               // Update current index to last item
            delete self.items[self.count];                  // Delete the last item, since it's moved
        } else {
            // Delete the account
            delete self.items[oneBasedIndex];
        }

        delete self.indices[addr];
        self.count--;
        return true;
    }

    /**
     *  Retrieves the address at the given index.
     *  THROWS when the index is invalid.
     *  @param index The index of the item to retrieve.
     *  @return The address of the item at the given index.
     */
    function at(Data storage self, int256 index)
    internal
    view
    returns (Account) {
        require(index >= 0 && index < self.count, "Index outside of bounds.");
        return self.items[index + 1];
    }

    /**
     *  Gets the index of the given address.
     *  @param addr The address of the item to get the index for.
     *  @return The index of the given address.
     */
    function indexOf(Data storage self, address addr)
    internal
    view
    returns (int256) {
        if (addr == ZERO_ADDRESS) {
            return -1;
        }

        int256 index = self.indices[addr] - 1;
        if (index < 0 || index >= self.count) {
            return -1;
        }
        return index;
    }

    /**
     *  Gets the Account for the given address.
     *  THROWS when an account doesn't exist for the given address.
     *  @param addr The address of the item to get.
     *  @return The account of the given address.
     */
    function get(Data storage self, address addr)
    internal
    view
    returns (Account) {
        return at(self, indexOf(self, addr));
    }

    /**
     *  Returns whether or not the given address exists within the map.
     *  @param addr The address to check for existence.
     *  @return If the given address exists or not.
     */
    function exists(Data storage self, address addr)
    internal
    view
    returns (bool) {
        int256 index = self.indices[addr] - 1;
        return index >= 0 && index < self.count;
    }

    /**
     * Clears all items within the map.
     */
    function clear(Data storage self)
    internal {
        self.count = 0;
    }

}

/**
 *  @title Ownable
 *  @dev Provides a modifier that requires the caller to be the owner of the contract.
 */
contract Ownable {
    address public owner;

    event OwnerTransferred(
        address indexed oldOwner,
        address indexed newOwner
    );

    constructor() public {
        owner = msg.sender;
    }

    modifier onlyOwner() {
        require(msg.sender == owner, "Owner account is required");
        _;
    }

    /**
     * @dev Allows the current owner to transfer control of the contract to newOwner.
     * @param newOwner The address to transfer ownership to.
     */
    function transferOwner(address newOwner)
    public
    onlyOwner {
        require(newOwner != owner, "New Owner cannot be the current owner");
        require(newOwner != address(0), "New Owner cannot be zero address");
        address prevOwner = owner;
        owner = newOwner;
        emit OwnerTransferred(prevOwner, newOwner);
    }
}

/**
 *  @title Lockable
 *  @dev The Lockable contract adds the ability for the contract owner to set the lock status
 *  of the account. A modifier is provided that checks the throws when the contract is
 *  in the locked state.
 */
contract Lockable is Ownable {
    bool public isLocked;

    constructor() public {
        isLocked = false;
    }

    modifier isUnlocked() {
        require(!isLocked, "Contract is currently locked for modification");
        _;
    }

    /**
     *  Set the contract to a read-only state.
     *  @param locked The locked state to set the contract to.
     */
    function setLocked(bool locked)
    onlyOwner
    external {
        require(isLocked != locked, "Contract already in requested lock state");

        isLocked = locked;
    }
}

/**
 *  @title Destroyable
 *  @dev The Destroyable contract alows the owner address to `selfdestruct` the contract.
 */
contract Destroyable is Ownable {
    /**
     *  Allow the owner to destroy this contract.
     */
    function kill()
    onlyOwner
    external {
        selfdestruct(owner);
    }
}

/**
 *  Contract to facilitate locking and self destructing.
 */
contract LockableDestroyable is Lockable, Destroyable { }

/**
 *  @title Registry Storage
 */
contract Storage is Ownable, LockableDestroyable {
    struct Mapping {
        address key;
        address value;
    }

    using AccountMap for AccountMap.Data;
    using AddressMap for AddressMap.Data;

    // ------------------------------- Variables -------------------------------
    // Nmber of data slots available for accounts
    uint8 MAX_DATA = 30;

    // Accounts
    AccountMap.Data public accounts;

    // Account Data
    //   - mapping of:
    //     (address        => (index =>    data))
    mapping(address => mapping(uint8 => bytes32)) public data;

    // Address write permissions
    //     (kind  => address)
    mapping(uint8 => AddressMap.Data) public permissions;


    // ------------------------------- Modifiers -------------------------------
    /**
     *  Ensures the `msg.sender` has permission for the given kind/type of account.
     *  
     *    - The `owner` account is always allowed
     *    - Addresses/Contracts must have a corresponding entry, for the given kind
     */
    modifier isAllowed(uint8 kind) {
        require(kind > 0, "Invalid, or missing permission");
        if (msg.sender != owner) {
            require(permissions[kind].exists(msg.sender), "Missing permission");
        }
        _;
    }


    // ---------------------------- Address Getters ----------------------------
    /**
     *  Gets the account at the given index
     *  THROWS when the index is out-of-bounds
     *  @param index The index of the item to retrieve
     *  @return The address, kind, frozen status, and parent of the account at the given index
     */
    function accountAt(int256 index)
    external
    view
    returns(address, uint8, bool, address) {
        AccountMap.Account memory acct = accounts.at(index);
        return (acct.addr, acct.kind, acct.frozen, acct.parent);
    }

    /**
     *  Gets the account for the given address
     *  THROWS when the account doesn't exist
     *  @param addr The address of the item to retrieve
     *  @return The address, kind, frozen status, and parent of the account at the given index
     */
    function accountGet(address addr)
    external
    view
    returns(uint8, bool, address) {
        AccountMap.Account memory acct = accounts.get(addr);
        return (acct.kind, acct.frozen, acct.parent);
    }

    /**
     *  Gets the parent address for the given account address
     *  THROWS when the account doesn't exist
     *  @param addr The address of the account
     *  @return The parent address
     */
    function accountParent(address addr)
    external
    view
    returns(address) {
        return accounts.get(addr).parent;
    }

    /**
     *  Gets the account kind, for the given account address
     *  THROWS when the account doesn't exist
     *  @param addr The address of the account
     *  @return The kind of account
     */
    function accountKind(address addr)
    external
    view
    returns(uint8) {
        return accounts.get(addr).kind;
    }

    /**
     *  Gets the frozen status of the account
     *  THROWS when the account doesn't exist
     *  @param addr The address of the account
     *  @return The frozen status of the account
     */
    function accountFrozen(address addr)
    external
    view
    returns(bool) {
        return accounts.get(addr).frozen;
    }

    /**
     *  Gets the index of the account
     *  Returns -1 for missing accounts
     *  @param addr The address of the account to get the index for
     *  @return The index of the given account address
     */
    function accountIndexOf(address addr)
    external
    view
    returns(int256) {
        return accounts.indexOf(addr);
    }

    /**
     *  Returns wether or not the given address exists
     *  @param addr The account address
     *  @return If the given address exists
     */
    function accountExists(address addr)
    external
    view
    returns(bool) {
        return accounts.exists(addr);
    }

    /**
     *  Returns wether or not the given address exists for the given kind
     *  @param addr The account address
     *  @param kind The kind of address
     *  @return If the given address exists with the given kind
     */
    function accountExists(address addr, uint8 kind)
    external
    view
    returns(bool) {
        int256 index = accounts.indexOf(addr);
        if (index < 0) {
            return false;
        }
        return accounts.at(index).kind == kind;
    }


    // -------------------------- Permission Getters ---------------------------
    /**
     *  Retrieves the permission address at the index for the given type
     *  THROWS when the index is out-of-bounds
     *  @param kind The kind of permission
     *  @param index The index of the item to retrieve
     *  @return The permission address of the item at the given index
     */
    function permissionAt(uint8 kind, int256 index)
    external
    view
    returns(address) {
        return permissions[kind].at(index);
    }

    /**
     *  Gets the index of the permission address for the given type
     *  Returns -1 for missing permission
     *  @param kind The kind of perission
     *  @param addr The address of the permission to get the index for
     *  @return The index of the given permission address
     */
    function permissionIndexOf(uint8 kind, address addr)
    external
    view
    returns(int256) {
        return permissions[kind].indexOf(addr);
    }

    /**
     *  Returns wether or not the given permission address exists for the given type
     *  @param kind The kind of permission
     *  @param addr The address to check for permission
     *  @return If the given address has permission or not
     */
    function permissionExists(uint8 kind, address addr)
    external
    view
    returns(bool) {
        return permissions[kind].exists(addr);
    }

    // -------------------------------------------------------------------------

    /**
     *  Adds an account to storage
     *  THROWS when `msg.sender` doesn't have permission
     *  THROWS when the account already exists
     *  @param addr The address of the account
     *  @param kind The kind of account
     *  @param isFrozen The frozen status of the account
     *  @param parent The account parent/owner
     */
    function addAccount(address addr, uint8 kind, bool isFrozen, address parent)
    isUnlocked
    isAllowed(kind)
    external {
        require(accounts.append(addr, kind, isFrozen, parent), "Account already exists");
    }

    /**
     *  Sets an account's frozen status
     *  THROWS when the account doesn't exist
     *  @param addr The address of the account
     *  @param frozen The frozen status of the account
     */
    function setAccountFrozen(address addr, bool frozen)
    isUnlocked
    isAllowed(accounts.get(addr).kind)
    external {
        // NOTE: Not bounds checking `index` here, as `isAllowed` ensures the address exists.
        //       Indices are one-based internally, so we need to add one to compensate.
        int256 index = accounts.indexOf(addr) + 1;
        accounts.items[index].frozen = frozen;
    }

    /**
     *  Removes an account from storage
     *  THROWS when the account doesn't exist
     *  @param addr The address of the account
     */
    function removeAccount(address addr)
    isUnlocked
    isAllowed(accounts.get(addr).kind)
    external {
        bytes32 ZERO_BYTES = bytes32(0);
        mapping(uint8 => bytes32) accountData = data[addr];

        // Remove data
        for (uint8 i = 0; i < MAX_DATA; i++) {
            if (accountData[i] != ZERO_BYTES) {
                delete accountData[i];
            }
        }

        // Remove account
        accounts.remove(addr);
    }

    /**
     *  Sets data for an address/caller
     *  THROWS when the account doesn't exist
     *  @param addr The address
     *  @param index The index of the data
     *  @param customData The data store set
     */
    function setAccountData(address addr, uint8 index, bytes32 customData)
    isUnlocked
    isAllowed(accounts.get(addr).kind)
    external {
        require(index < MAX_DATA, "index outside of bounds");
        data[addr][index] = customData;
    }

    /**
     *  Grants the address permission for the given kind
     *  @param kind The kind of address
     *  @param addr The address
     */
    function grantPermission(uint8 kind, address addr)
    isUnlocked
    isAllowed(kind)
    external {
        permissions[kind].append(addr);
    }

    /**
     *  Revokes the address permission for the given kind
     *  @param kind The kind of address
     *  @param addr The address
     */
    function revokePermission(uint8 kind, address addr)
    isUnlocked
    isAllowed(kind)
    external {
        permissions[kind].remove(addr);
    }

}

interface ERC20 {
    event Approval(address indexed owner, address indexed spender, uint256 value);
    event Transfer(address indexed from, address indexed to, uint256 value);

    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 value) external returns (bool);
    function balanceOf(address who) external view returns (uint256);
    function totalSupply() external view returns (uint256);
    function transfer(address to, uint256 value) external returns (bool);
    function transferFrom(address from, address to, uint256 value) external returns (bool);
}

library AdditiveMath {
    /**
     *  Adds two numbers and returns the result
     *  THROWS when the result overflows
     *  @return The sum of the arguments
     */
    function add(uint256 x, uint256 y)
    internal
    pure
    returns (uint256) {
        uint256 sum = x + y;
        require(sum >= x, "Results in overflow");
        return sum;
    }

    /**
     *  Subtracts two numbers and returns the result
     *  THROWS when the result underflows
     *  @return The difference of the arguments
     */
    function subtract(uint256 x, uint256 y)
    internal
    pure
    returns (uint256) {
        require(y <= x, "Results in underflow");
        return x - y;
    }
}

interface ComplianceRule {

    /**
     * @param from The address of the sender
     * @param to The address of the receiver
     * @param toKind The kind of the to address
     * @param store The Storage contract
     * @return true if transfer is allowed
     */
    function canTransfer(address from, address to, uint8 toKind, Storage store)
    external
    view
    returns(bool);
}

interface Compliance {

    /**
     * This event is emitted when an address's frozen status has changed.
     * @param addr The address whose frozen status has been updated.
     * @param isFrozen Whether the custodian is being frozen.
     * @param owner The address that updated the frozen status.
     */
    event AddressFrozen(
        address indexed addr,
        bool indexed isFrozen,
        address indexed owner
    );

    /**
     *  Sets an address frozen status for this token
     *  @param addr The address to update frozen status.
     *  @param freeze Frozen status of the address.
     */
    function setAddressFrozen(address addr, bool freeze)
    external;

    /**
     *  Returns all of the current compliance rules for this token
     *  @param kind The bucket of rules to get.
     *  @return List of all compliance rules.
     */
    function getRules(uint8 kind)
    view
    external
    returns(ComplianceRule[]);

    /**
     *  Replaces all of the existing rules with the given ones
     *  @param kind The bucket of rules to set.
     *  @param rules New compliance rules.
     */
    function setRules(uint8 kind, ComplianceRule[] rules)
    external;

    /**
     *  Checks if a transfer can occur between the from/to addresses.
     *  Both addressses must be valid, unfrozen, and pass all compliance rule checks.
     *  @param from The address of the sender.
     *  @param to The address of the receiver.
     *  @return If a transfer can occure between the from/to addresses.
     */
    function canTransfer(address from, address to)
    view
    external
    returns(bool);

}

contract T0ken is ERC20, Ownable, LockableDestroyable {
    // ------------------------------- Variables -------------------------------
    using AdditiveMath for uint256;

    using AddressMap for AddressMap.Data;
    AddressMap.Data public shareholders;

    mapping(address => address) public cancellations;
    mapping(address => uint256) internal balances;
    mapping (address => mapping (address => uint256)) private allowed;

    address public issuer;
    bool public issuingFinished = false;
    uint256 internal totalSupplyTokens;
    address constant internal ZERO_ADDRESS = address(0);
    Compliance public compliance;
    Storage public store;

    // Possible 3rd party integration variables
    string public constant name = "TZERO PREFERRED";
    string public constant symbol = "TZROP";
    uint8 public constant decimals = 0;

    // ------------------------------- Modifiers -------------------------------
    modifier transferCheck(uint256 value, address fromAddr) {
        require(value <= balances[fromAddr], "Balance is more than from address has");
        _;
    }

    modifier isNotCancelled(address addr) {
        require(cancellations[addr] == ZERO_ADDRESS, "Address has been cancelled");
        _;
    }

    modifier onlyIssuer() {
        require(msg.sender == issuer, "Only issuer allowed");
        _;
    }

    modifier canIssue() {
        require(!issuingFinished, "Issuing is already finished");
        _;
    }

    modifier canTransfer(address fromAddress, address toAddress) {
        if(fromAddress == issuer) {
            require(store.accountExists(toAddress), "The to address does not exist");
        }
        else {
            require(compliance.canTransfer(fromAddress, toAddress), "Address cannot transfer");
        }
        _;
    }

    modifier canTransferFrom(address fromAddress, address toAddress) {
        if(msg.sender == owner) {
            require(store.accountExists(toAddress), "The to address does not exist");
        }
        else {
            require(compliance.canTransfer(fromAddress, toAddress), "Address cannot transfer");
        }
        _;
    }

    // -------------------------- Events -------------------------------

    /**
     *  This event is emitted when an address is cancelled and replaced with
     *  a new address.  This happens in the case where a shareholder has
     *  lost access to their original address and needs to have their share
     *  reissued to a new address.  This is the equivalent of issuing replacement
     *  share certificates.
     *  @param original The address being superseded.
     *  @param replacement The new address.
     *  @param sender The address that caused the address to be superseded.
    */
    event VerifiedAddressSuperseded(address indexed original, address indexed replacement, address indexed sender);
    event IssuerSet(address indexed previousIssuer, address indexed newIssuer);
    event Issue(address indexed to, uint256 amount);
    event IssueFinished();


    // ---------------------------- Getters ----------------------------

    /**
    * @return total number of tokens in existence
    */
    function totalSupply()
    external
    view
    returns (uint256) {
        return totalSupplyTokens;
    }

    /**
    * @dev Gets the balance of the specified address.
    * @param addr The address to query the the balance of.
    * @return An uint256 representing the amount owned by the passed address.
    */
    function balanceOf(address addr)
    external
    view
    returns (uint256) {
        return balances[addr];
    }

    /**
     * @dev Function to check the amount of tokens that an owner allowed to a spender.
     * @param addrOwner address The address which owns the funds.
     * @param spender address The address which will spend the funds.
     * @return A uint256 specifying the amount of tokens still available for the spender.
     */
    function allowance(address addrOwner, address spender)
    isUnlocked
    external
    view
    returns (uint256) {
        return allowed[addrOwner][spender];
    }

    /**
     *  By counting the number of token holders using `holderCount`
     *  you can retrieve the complete list of token holders, one at a time.
     *  It MUST throw if `index >= holderCount()`.
     *  @param index The zero-based index of the holder.
     *  @return the address of the token holder with the given index.
     */
    function holderAt(int256 index)
    external
    view
    returns (address){
        return shareholders.at(index);
    }

    /**
     *  Checks to see if the supplied address is a share holder.
     *  @param addr The address to check.
     *  @return true if the supplied address owns a token.
     */
    function isHolder(address addr)
    external
    view
    returns (bool) {
        return shareholders.exists(addr);
    }

    /**
     *  Checks to see if the supplied address was superseded.
     *  @param addr The address to check.
     *  @return true if the supplied address was superseded by another address.
     */
    function isSuperseded(address addr)
    onlyOwner
    external
    view
    returns (bool) {
        return cancellations[addr] != ZERO_ADDRESS;
    }

    /**
     *  Gets the most recent address, given a superseded one.
     *  Addresses may be superseded multiple times, so this function needs to
     *  follow the chain of addresses until it reaches the final, verified address.
     *  @param addr The superseded address.
     *  @return the verified address that ultimately holds the share.
     */
    function getSuperseded(address addr)
    onlyOwner
    public
    view
    returns (address) {
        require(addr != ZERO_ADDRESS, "Non-zero address required");
        address candidate = cancellations[addr];
        if (candidate == ZERO_ADDRESS) {
            return ZERO_ADDRESS;
        }
        return candidate;
    }

    // -----------------------------------------------------------------

    function setCompliance(address newComplianceAddress)
    isUnlocked
    onlyOwner
    external {
        compliance = Compliance(newComplianceAddress);
    }

    function setStorage(Storage s)
    isUnlocked
    onlyOwner
    external {
        store = s;
    }

    /**
    * @dev transfer token for a specified address
    * @param to The address to transfer to.
    * @param value The amount to be transferred.
    *  The `transfer` function MUST NOT allow transfers to addresses that
    *  have not been verified and added to the contract.
    *  If the `to` address is not currently a shareholder then it MUST become one.
    *  If the transfer will reduce `msg.sender`'s balance to 0 then that address
    *  MUST be removed from the list of shareholders.
    */
    function transfer(address to, uint256 value)
    isUnlocked
    isNotCancelled(to)
    transferCheck(value, msg.sender)
    canTransfer(msg.sender, to)
    public
    returns (bool) {
        balances[msg.sender] = balances[msg.sender].subtract(value);
        balances[to] = balances[to].add(value);

        // Adds the shareholder, if they don't already exist.
        shareholders.append(to);

        // Remove the shareholder if they no longer hold tokens.
        if (balances[msg.sender] == 0) {
            shareholders.remove(msg.sender);
        }

        emit Transfer(msg.sender, to, value);
        return true;
    }

    /**
     * @dev Transfer tokens from one address to another
     * @param from address The address which you want to send tokens from
     * @param to address The address which you want to transfer to
     * @param value uint256 the amount of tokens to be transferred
     *  The `transferFrom` function MUST NOT allow transfers to addresses that
     *  have not been verified and added to the contract.
     *  If the `to` address is not currently a shareholder then it MUST become one.
     *  If the transfer will reduce `from`'s balance to 0 then that address
     *  MUST be removed from the list of shareholders.
     */
    function transferFrom(address from, address to, uint256 value)
    public
    transferCheck(value, from)
    isNotCancelled(to)
    canTransferFrom(from, to)
    isUnlocked
    returns (bool) {
        if(msg.sender != owner) {
            require(value <= allowed[from][msg.sender], "Value exceeds what is allowed to transfer");
            allowed[from][msg.sender] = allowed[from][msg.sender].subtract(value);
        }

        balances[from] = balances[from].subtract(value);
        balances[to] = balances[to].add(value);

        // Adds the shareholder, if they don't already exist.
        shareholders.append(to);

        // Remove the shareholder if they no longer hold tokens.
        if (balances[msg.sender] == 0) {
            shareholders.remove(from);
        }

        emit Transfer(from, to, value);
        return true;
    }

    /**
     * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.
     *
     * Beware that changing an allowance with this method brings the risk that someone may use both the old
     * and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this
     * race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     * @param spender The address which will spend the funds.
     * @param value The amount of tokens to be spent.
     */
    function approve(address spender, uint256 value)
    isUnlocked
    external
    returns (bool) {
        allowed[msg.sender][spender] = value;
        emit Approval(msg.sender, spender, value);
        return true;
    }

    function setIssuer(address newIssuer)
    isUnlocked
    onlyOwner
    external {
        issuer = newIssuer;
        emit IssuerSet(issuer, newIssuer);
    }

    /**
     * Tokens will be issued only to the issuer's address
     * @param quantity The amount of tokens to mint.
     * @return A boolean that indicates if the operation was successful.
     */
    function issueTokens(uint256 quantity)
    isUnlocked
    onlyIssuer
    canIssue
    public
    returns (bool) {
        address issuer = msg.sender;
        totalSupplyTokens = totalSupplyTokens.add(quantity);
        balances[issuer] = balances[issuer].add(quantity);
        shareholders.append(issuer);
        emit Issue(issuer, quantity);
        return true;
    }

    function finishIssuing()
    isUnlocked
    onlyIssuer
    canIssue
    public
    returns (bool) {
        issuingFinished = true;
        emit IssueFinished();
        return issuingFinished;
    }

    /**
     *  Cancel the original address and reissue the Tokens to the replacement address.
     *
     *  ***It's on the issuer to make sure the replacement address belongs to a verified investor.***
     *
     *  Access to this function MUST be strictly controlled.
     *  The `original` address MUST be removed from the set of verified addresses.
     *  Throw if the `original` address supplied is not a shareholder.
     *  Throw if the replacement address is not a verified address.
     *  This function MUST emit the `VerifiedAddressSuperseded` event.
     *  @param original The address to be superseded. This address MUST NOT be reused.
     *  @param replacement The address  that supersedes the original. This address MUST be verified.
     */
    function cancelAndReissue(address original, address replacement)
    isUnlocked
    onlyOwner
    isNotCancelled(replacement)
    external {
        // replace the original address in the shareholders mapping
        // and update all the associated mappings
        require(shareholders.exists(original) && !shareholders.exists(replacement), "Original doesn't exist or replacement does");
        shareholders.remove(original);
        shareholders.append(replacement);
        cancellations[original] = replacement;
        balances[replacement] = balances[original];
        balances[original] = 0;
        emit VerifiedAddressSuperseded(original, replacement, msg.sender);
    }

}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"issuer","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"locked","type":"bool"}],"name":"setLocked","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"addr","type":"address"}],"name":"isSuperseded","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"cancellations","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"shareholders","outputs":[{"name":"count","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"kill","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"issuingFinished","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newIssuer","type":"address"}],"name":"setIssuer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"compliance","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"addr","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"original","type":"address"},{"name":"replacement","type":"address"}],"name":"cancelAndReissue","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"finishIssuing","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"index","type":"int256"}],"name":"holderAt","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"s","type":"address"}],"name":"setStorage","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"store","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isLocked","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"quantity","type":"uint256"}],"name":"issueTokens","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"value","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"addr","type":"address"}],"name":"isHolder","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"addrOwner","type":"address"},{"name":"spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"addr","type":"address"}],"name":"getSuperseded","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newComplianceAddress","type":"address"}],"name":"setCompliance","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"original","type":"address"},{"indexed":true,"name":"replacement","type":"address"},{"indexed":true,"name":"sender","type":"address"}],"name":"VerifiedAddressSuperseded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousIssuer","type":"address"},{"indexed":true,"name":"newIssuer","type":"address"}],"name":"IssuerSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"Issue","type":"event"},{"anonymous":false,"inputs":[],"name":"IssueFinished","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"oldOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnerTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"}]

60806040526007805460a060020a60ff021990811690915560008054600160a060020a031916331790911690556125c48061003b6000396000f30060806040526004361061017f5763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde038114610184578063095ea7b31461020e57806318160ddd146102465780631d1438481461026d578063211e28b61461029e57806323b872dd146102ba5780632da7293e146102e4578063313ce5671461030557806334a84827146103305780633723bc0e1461035157806341c0e1b5146103665780634ef05a711461037b5780634fb2e45d1461039057806355cc4e57146103b15780636290865d146103d257806370a08231146103e757806379f64720146104085780637e8d1a391461042f5780638082a929146104445780638da5cb5b1461045c5780639137c1a71461047157806395d89b4114610492578063975057e7146104a7578063a4e2d634146104bc578063a5820daa146104d1578063a9059cbb146104e9578063d4d7b19a1461050d578063dd62ed3e1461052e578063e37ccac714610555578063f898178914610576575b600080fd5b34801561019057600080fd5b50610199610597565b6040805160208082528351818301528351919283929083019185019080838360005b838110156101d35781810151838201526020016101bb565b50505050905090810190601f1680156102005780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561021a57600080fd5b50610232600160a060020a03600435166024356105ce565b604080519115158252519081900360200190f35b34801561025257600080fd5b5061025b6106cf565b60408051918252519081900360200190f35b34801561027957600080fd5b506102826106d5565b60408051600160a060020a039092168252519081900360200190f35b3480156102aa57600080fd5b506102b860043515156106e4565b005b3480156102c657600080fd5b50610232600160a060020a0360043581169060243516604435610826565b3480156102f057600080fd5b50610232600160a060020a0360043516610ddb565b34801561031157600080fd5b5061031a610e5f565b6040805160ff9092168252519081900360200190f35b34801561033c57600080fd5b50610282600160a060020a0360043516610e64565b34801561035d57600080fd5b5061025b610e7f565b34801561037257600080fd5b506102b8610e85565b34801561038757600080fd5b50610232610ef5565b34801561039c57600080fd5b506102b8600160a060020a0360043516610f16565b3480156103bd57600080fd5b506102b8600160a060020a03600435166110c3565b3480156103de57600080fd5b5061028261121b565b3480156103f357600080fd5b5061025b600160a060020a036004351661122a565b34801561041457600080fd5b506102b8600160a060020a0360043581169060243516611245565b34801561043b57600080fd5b506102326114fe565b34801561045057600080fd5b506102826004356116ed565b34801561046857600080fd5b50610282611706565b34801561047d57600080fd5b506102b8600160a060020a0360043516611715565b34801561049e57600080fd5b5061019961183f565b3480156104b357600080fd5b50610282611876565b3480156104c857600080fd5b50610232611885565b3480156104dd57600080fd5b506102326004356118a6565b3480156104f557600080fd5b50610232600160a060020a0360043516602435611ace565b34801561051957600080fd5b50610232600160a060020a0360043516611f56565b34801561053a57600080fd5b5061025b600160a060020a0360043581169060243516611f69565b34801561056157600080fd5b50610282600160a060020a036004351661202f565b34801561058257600080fd5b506102b8600160a060020a0360043516612120565b60408051808201909152600f81527f545a45524f205052454645525245440000000000000000000000000000000000602082015281565b6000805474010000000000000000000000000000000000000000900460ff1615610668576040805160e560020a62461bcd02815260206004820152602d60248201527f436f6e74726163742069732063757272656e746c79206c6f636b656420666f7260448201527f206d6f64696669636174696f6e00000000000000000000000000000000000000606482015290519081900360840190fd5b336000818152600660209081526040808320600160a060020a03881680855290835292819020869055805186815290519293927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a350600192915050565b60085490565b600754600160a060020a031681565b600054600160a060020a03163314610746576040805160e560020a62461bcd02815260206004820152601960248201527f4f776e6572206163636f756e7420697320726571756972656400000000000000604482015290519081900360640190fd5b60005460ff7401000000000000000000000000000000000000000090910416151581151514156107e6576040805160e560020a62461bcd02815260206004820152602860248201527f436f6e747261637420616c726561647920696e20726571756573746564206c6f60448201527f636b207374617465000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60008054911515740100000000000000000000000000000000000000000274ff000000000000000000000000000000000000000019909216919091179055565b600160a060020a038316600090815260056020526040812054829085908211156108c0576040805160e560020a62461bcd02815260206004820152602560248201527f42616c616e6365206973206d6f7265207468616e2066726f6d2061646472657360448201527f7320686173000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a0380861660009081526004602052604090205486911615610932576040805160e560020a62461bcd02815260206004820152601a60248201527f4164647265737320686173206265656e2063616e63656c6c6564000000000000604482015290519081900360640190fd5b60005487908790600160a060020a0316331415610a3857600a54604080517f75cd51ed000000000000000000000000000000000000000000000000000000008152600160a060020a038481166004830152915191909216916375cd51ed9160248083019260209291908290030181600087803b1580156109b157600080fd5b505af11580156109c5573d6000803e3d6000fd5b505050506040513d60208110156109db57600080fd5b50511515610a33576040805160e560020a62461bcd02815260206004820152601d60248201527f54686520746f206164647265737320646f6573206e6f74206578697374000000604482015290519081900360640190fd5b610b2a565b600954604080517f6c85cf67000000000000000000000000000000000000000000000000000000008152600160a060020a038581166004830152848116602483015291519190921691636c85cf679160448083019260209291908290030181600087803b158015610aa857600080fd5b505af1158015610abc573d6000803e3d6000fd5b505050506040513d6020811015610ad257600080fd5b50511515610b2a576040805160e560020a62461bcd02815260206004820152601760248201527f416464726573732063616e6e6f74207472616e73666572000000000000000000604482015290519081900360640190fd5b60005474010000000000000000000000000000000000000000900460ff1615610bc3576040805160e560020a62461bcd02815260206004820152602d60248201527f436f6e74726163742069732063757272656e746c79206c6f636b656420666f7260448201527f206d6f64696669636174696f6e00000000000000000000000000000000000000606482015290519081900360840190fd5b600054600160a060020a03163314610ccf57600160a060020a0389166000908152600660209081526040808320338452909152902054871115610c76576040805160e560020a62461bcd02815260206004820152602960248201527f56616c75652065786365656473207768617420697320616c6c6f77656420746f60448201527f207472616e736665720000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a0389166000908152600660209081526040808320338452909152902054610caa908863ffffffff61224a16565b600160a060020a038a1660009081526006602090815260408083203384529091529020555b600160a060020a038916600090815260056020526040902054610cf8908863ffffffff61224a16565b600160a060020a03808b1660009081526005602052604080822093909355908a1681522054610d2d908863ffffffff6122aa16565b600160a060020a038916600090815260056020526040902055610d5760018963ffffffff61231216565b50336000908152600560205260409020541515610d8157610d7f60018a63ffffffff6123c916565b505b87600160a060020a031689600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef896040518082815260200191505060405180910390a350600198975050505050505050565b60008054600160a060020a03163314610e3e576040805160e560020a62461bcd02815260206004820152601960248201527f4f776e6572206163636f756e7420697320726571756972656400000000000000604482015290519081900360640190fd5b50600160a060020a0390811660009081526004602052604090205416151590565b600081565b600460205260009081526040902054600160a060020a031681565b60015481565b600054600160a060020a03163314610ee7576040805160e560020a62461bcd02815260206004820152601960248201527f4f776e6572206163636f756e7420697320726571756972656400000000000000604482015290519081900360640190fd5b600054600160a060020a0316ff5b60075474010000000000000000000000000000000000000000900460ff1681565b60008054600160a060020a03163314610f79576040805160e560020a62461bcd02815260206004820152601960248201527f4f776e6572206163636f756e7420697320726571756972656400000000000000604482015290519081900360640190fd5b600054600160a060020a0383811691161415611005576040805160e560020a62461bcd02815260206004820152602560248201527f4e6577204f776e65722063616e6e6f74206265207468652063757272656e742060448201527f6f776e6572000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a0382161515611065576040805160e560020a62461bcd02815260206004820181905260248201527f4e6577204f776e65722063616e6e6f74206265207a65726f2061646472657373604482015290519081900360640190fd5b5060008054600160a060020a0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8934ce4adea8d9ce0d714d2c22b86790e41b7731c84b926fbbdc1d40ff6533c99190a35050565b60005474010000000000000000000000000000000000000000900460ff161561115c576040805160e560020a62461bcd02815260206004820152602d60248201527f436f6e74726163742069732063757272656e746c79206c6f636b656420666f7260448201527f206d6f64696669636174696f6e00000000000000000000000000000000000000606482015290519081900360840190fd5b600054600160a060020a031633146111be576040805160e560020a62461bcd02815260206004820152601960248201527f4f776e6572206163636f756e7420697320726571756972656400000000000000604482015290519081900360640190fd5b6007805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383811691821792839055604051919216907ff7189b85d7899f5a32d733e6584c4f1dcdff0274f09d969d186c1797673ede1190600090a350565b600954600160a060020a031681565b600160a060020a031660009081526005602052604090205490565b60005474010000000000000000000000000000000000000000900460ff16156112de576040805160e560020a62461bcd02815260206004820152602d60248201527f436f6e74726163742069732063757272656e746c79206c6f636b656420666f7260448201527f206d6f64696669636174696f6e00000000000000000000000000000000000000606482015290519081900360840190fd5b600054600160a060020a03163314611340576040805160e560020a62461bcd02815260206004820152601960248201527f4f776e6572206163636f756e7420697320726571756972656400000000000000604482015290519081900360640190fd5b600160a060020a03808216600090815260046020526040902054829116156113b2576040805160e560020a62461bcd02815260206004820152601a60248201527f4164647265737320686173206265656e2063616e63656c6c6564000000000000604482015290519081900360640190fd5b6113c360018463ffffffff6124d616565b80156113dd57506113db60018363ffffffff6124d616565b155b1515611459576040805160e560020a62461bcd02815260206004820152602a60248201527f4f726967696e616c20646f65736e2774206578697374206f72207265706c616360448201527f656d656e7420646f657300000000000000000000000000000000000000000000606482015290519081900360840190fd5b61146a60018463ffffffff6123c916565b5061147c60018363ffffffff61231216565b50600160a060020a038381166000818152600460209081526040808320805473ffffffffffffffffffffffffffffffffffffffff19169588169586179055600590915280822080548584528284205583835282905551339392917fb64971100522354f3d25283cb14e2eefcb0dd26a757482ccfe42479d0a68685791a4505050565b6000805474010000000000000000000000000000000000000000900460ff1615611598576040805160e560020a62461bcd02815260206004820152602d60248201527f436f6e74726163742069732063757272656e746c79206c6f636b656420666f7260448201527f206d6f64696669636174696f6e00000000000000000000000000000000000000606482015290519081900360840190fd5b600754600160a060020a031633146115fa576040805160e560020a62461bcd02815260206004820152601360248201527f4f6e6c792069737375657220616c6c6f77656400000000000000000000000000604482015290519081900360640190fd5b60075474010000000000000000000000000000000000000000900460ff161561166d576040805160e560020a62461bcd02815260206004820152601b60248201527f49737375696e6720697320616c72656164792066696e69736865640000000000604482015290519081900360640190fd5b6007805474ff00000000000000000000000000000000000000001916740100000000000000000000000000000000000000001790556040517f7bc15082cf539fecd9e12596dc8e4e77c17a81fccc2c267b626af583162232a290600090a15060075474010000000000000000000000000000000000000000900460ff1690565b600061170060018363ffffffff61250d16565b92915050565b600054600160a060020a031681565b60005474010000000000000000000000000000000000000000900460ff16156117ae576040805160e560020a62461bcd02815260206004820152602d60248201527f436f6e74726163742069732063757272656e746c79206c6f636b656420666f7260448201527f206d6f64696669636174696f6e00000000000000000000000000000000000000606482015290519081900360840190fd5b600054600160a060020a03163314611810576040805160e560020a62461bcd02815260206004820152601960248201527f4f776e6572206163636f756e7420697320726571756972656400000000000000604482015290519081900360640190fd5b600a805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60408051808201909152600581527f545a524f50000000000000000000000000000000000000000000000000000000602082015281565b600a54600160a060020a031681565b60005474010000000000000000000000000000000000000000900460ff1681565b60008054819074010000000000000000000000000000000000000000900460ff1615611942576040805160e560020a62461bcd02815260206004820152602d60248201527f436f6e74726163742069732063757272656e746c79206c6f636b656420666f7260448201527f206d6f64696669636174696f6e00000000000000000000000000000000000000606482015290519081900360840190fd5b600754600160a060020a031633146119a4576040805160e560020a62461bcd02815260206004820152601360248201527f4f6e6c792069737375657220616c6c6f77656400000000000000000000000000604482015290519081900360640190fd5b60075474010000000000000000000000000000000000000000900460ff1615611a17576040805160e560020a62461bcd02815260206004820152601b60248201527f49737375696e6720697320616c72656164792066696e69736865640000000000604482015290519081900360640190fd5b506008543390611a2d908463ffffffff6122aa16565b600855600160a060020a038116600090815260056020526040902054611a59908463ffffffff6122aa16565b600160a060020a038216600090815260056020526040902055611a8360018263ffffffff61231216565b50604080518481529051600160a060020a038316917fc65a3f767206d2fdcede0b094a4840e01c0dd0be1888b5ba800346eaa0123c16919081900360200190a2600191505b50919050565b6000805474010000000000000000000000000000000000000000900460ff1615611b68576040805160e560020a62461bcd02815260206004820152602d60248201527f436f6e74726163742069732063757272656e746c79206c6f636b656420666f7260448201527f206d6f64696669636174696f6e00000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a0380841660009081526004602052604090205484911615611bda576040805160e560020a62461bcd02815260206004820152601a60248201527f4164647265737320686173206265656e2063616e63656c6c6564000000000000604482015290519081900360640190fd5b33600081815260056020526040902054849190821115611c6a576040805160e560020a62461bcd02815260206004820152602560248201527f42616c616e6365206973206d6f7265207468616e2066726f6d2061646472657360448201527f7320686173000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60075433908790600160a060020a0316821415611d7057600a54604080517f75cd51ed000000000000000000000000000000000000000000000000000000008152600160a060020a038481166004830152915191909216916375cd51ed9160248083019260209291908290030181600087803b158015611ce957600080fd5b505af1158015611cfd573d6000803e3d6000fd5b505050506040513d6020811015611d1357600080fd5b50511515611d6b576040805160e560020a62461bcd02815260206004820152601d60248201527f54686520746f206164647265737320646f6573206e6f74206578697374000000604482015290519081900360640190fd5b611e62565b600954604080517f6c85cf67000000000000000000000000000000000000000000000000000000008152600160a060020a038581166004830152848116602483015291519190921691636c85cf679160448083019260209291908290030181600087803b158015611de057600080fd5b505af1158015611df4573d6000803e3d6000fd5b505050506040513d6020811015611e0a57600080fd5b50511515611e62576040805160e560020a62461bcd02815260206004820152601760248201527f416464726573732063616e6e6f74207472616e73666572000000000000000000604482015290519081900360640190fd5b33600090815260056020526040902054611e82908863ffffffff61224a16565b3360009081526005602052604080822092909255600160a060020a038a1681522054611eb4908863ffffffff6122aa16565b600160a060020a038916600090815260056020526040902055611ede60018963ffffffff61231216565b50336000908152600560205260409020541515611f0857611f0660013363ffffffff6123c916565b505b604080518881529051600160a060020a038a169133917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a3506001979650505050505050565b600061170060018363ffffffff6124d616565b6000805474010000000000000000000000000000000000000000900460ff1615612003576040805160e560020a62461bcd02815260206004820152602d60248201527f436f6e74726163742069732063757272656e746c79206c6f636b656420666f7260448201527f206d6f64696669636174696f6e00000000000000000000000000000000000000606482015290519081900360840190fd5b50600160a060020a03918216600090815260066020908152604080832093909416825291909152205490565b600080548190600160a060020a03163314612094576040805160e560020a62461bcd02815260206004820152601960248201527f4f776e6572206163636f756e7420697320726571756972656400000000000000604482015290519081900360640190fd5b600160a060020a03831615156120f4576040805160e560020a62461bcd02815260206004820152601960248201527f4e6f6e2d7a65726f206164647265737320726571756972656400000000000000604482015290519081900360640190fd5b50600160a060020a03808316600090815260046020526040902054168015156117005760009150611ac8565b60005474010000000000000000000000000000000000000000900460ff16156121b9576040805160e560020a62461bcd02815260206004820152602d60248201527f436f6e74726163742069732063757272656e746c79206c6f636b656420666f7260448201527f206d6f64696669636174696f6e00000000000000000000000000000000000000606482015290519081900360840190fd5b600054600160a060020a0316331461221b576040805160e560020a62461bcd02815260206004820152601960248201527f4f776e6572206163636f756e7420697320726571756972656400000000000000604482015290519081900360640190fd5b6009805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b6000828211156122a4576040805160e560020a62461bcd02815260206004820152601460248201527f526573756c747320696e20756e646572666c6f77000000000000000000000000604482015290519081900360640190fd5b50900390565b600082820183811015612307576040805160e560020a62461bcd02815260206004820152601360248201527f526573756c747320696e206f766572666c6f7700000000000000000000000000604482015290519081900360640190fd5b8091505b5092915050565b600080600160a060020a038316151561232e576000915061230b565b50600160a060020a03821660009081526001840160205260408120546000190190811280159061235e5750835481125b1561236c576000915061230b565b83546001908101808655600160a060020a03851660008181528388016020908152604080832085905593825260028901905291909120805473ffffffffffffffffffffffffffffffffffffffff1916909117905591505092915050565b600160a060020a0381166000908152600180840160205260408220549082908212806123f55750845482135b1561240357600092506124ce565b8454821215612478575083546000908152600285016020818152604080842054600160a060020a031680855260018901835281852086905585855292909152808320805473ffffffffffffffffffffffffffffffffffffffff19908116841790915587548452922080549092169091556124a4565b60008281526002860160205260409020805473ffffffffffffffffffffffffffffffffffffffff191690555b600160a060020a038416600090815260018087016020526040822091909155855460001901865592505b505092915050565b600160a060020a0381166000908152600183016020526040812054600019018181128015906125055750835481125b949350505050565b600080821215801561251f5750825482125b1515612575576040805160e560020a62461bcd02815260206004820152601860248201527f496e646578206f757473696465206f6620626f756e64732e0000000000000000604482015290519081900360640190fd5b5060010160009081526002919091016020526040902054600160a060020a0316905600a165627a7a7230582099c8ad7cc21c5fd4dc66bc38990d6bcfed48314768acc1ce8462c6936dbc69690029

Deployed Bytecode

0x60806040526004361061017f5763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde038114610184578063095ea7b31461020e57806318160ddd146102465780631d1438481461026d578063211e28b61461029e57806323b872dd146102ba5780632da7293e146102e4578063313ce5671461030557806334a84827146103305780633723bc0e1461035157806341c0e1b5146103665780634ef05a711461037b5780634fb2e45d1461039057806355cc4e57146103b15780636290865d146103d257806370a08231146103e757806379f64720146104085780637e8d1a391461042f5780638082a929146104445780638da5cb5b1461045c5780639137c1a71461047157806395d89b4114610492578063975057e7146104a7578063a4e2d634146104bc578063a5820daa146104d1578063a9059cbb146104e9578063d4d7b19a1461050d578063dd62ed3e1461052e578063e37ccac714610555578063f898178914610576575b600080fd5b34801561019057600080fd5b50610199610597565b6040805160208082528351818301528351919283929083019185019080838360005b838110156101d35781810151838201526020016101bb565b50505050905090810190601f1680156102005780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561021a57600080fd5b50610232600160a060020a03600435166024356105ce565b604080519115158252519081900360200190f35b34801561025257600080fd5b5061025b6106cf565b60408051918252519081900360200190f35b34801561027957600080fd5b506102826106d5565b60408051600160a060020a039092168252519081900360200190f35b3480156102aa57600080fd5b506102b860043515156106e4565b005b3480156102c657600080fd5b50610232600160a060020a0360043581169060243516604435610826565b3480156102f057600080fd5b50610232600160a060020a0360043516610ddb565b34801561031157600080fd5b5061031a610e5f565b6040805160ff9092168252519081900360200190f35b34801561033c57600080fd5b50610282600160a060020a0360043516610e64565b34801561035d57600080fd5b5061025b610e7f565b34801561037257600080fd5b506102b8610e85565b34801561038757600080fd5b50610232610ef5565b34801561039c57600080fd5b506102b8600160a060020a0360043516610f16565b3480156103bd57600080fd5b506102b8600160a060020a03600435166110c3565b3480156103de57600080fd5b5061028261121b565b3480156103f357600080fd5b5061025b600160a060020a036004351661122a565b34801561041457600080fd5b506102b8600160a060020a0360043581169060243516611245565b34801561043b57600080fd5b506102326114fe565b34801561045057600080fd5b506102826004356116ed565b34801561046857600080fd5b50610282611706565b34801561047d57600080fd5b506102b8600160a060020a0360043516611715565b34801561049e57600080fd5b5061019961183f565b3480156104b357600080fd5b50610282611876565b3480156104c857600080fd5b50610232611885565b3480156104dd57600080fd5b506102326004356118a6565b3480156104f557600080fd5b50610232600160a060020a0360043516602435611ace565b34801561051957600080fd5b50610232600160a060020a0360043516611f56565b34801561053a57600080fd5b5061025b600160a060020a0360043581169060243516611f69565b34801561056157600080fd5b50610282600160a060020a036004351661202f565b34801561058257600080fd5b506102b8600160a060020a0360043516612120565b60408051808201909152600f81527f545a45524f205052454645525245440000000000000000000000000000000000602082015281565b6000805474010000000000000000000000000000000000000000900460ff1615610668576040805160e560020a62461bcd02815260206004820152602d60248201527f436f6e74726163742069732063757272656e746c79206c6f636b656420666f7260448201527f206d6f64696669636174696f6e00000000000000000000000000000000000000606482015290519081900360840190fd5b336000818152600660209081526040808320600160a060020a03881680855290835292819020869055805186815290519293927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a350600192915050565b60085490565b600754600160a060020a031681565b600054600160a060020a03163314610746576040805160e560020a62461bcd02815260206004820152601960248201527f4f776e6572206163636f756e7420697320726571756972656400000000000000604482015290519081900360640190fd5b60005460ff7401000000000000000000000000000000000000000090910416151581151514156107e6576040805160e560020a62461bcd02815260206004820152602860248201527f436f6e747261637420616c726561647920696e20726571756573746564206c6f60448201527f636b207374617465000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60008054911515740100000000000000000000000000000000000000000274ff000000000000000000000000000000000000000019909216919091179055565b600160a060020a038316600090815260056020526040812054829085908211156108c0576040805160e560020a62461bcd02815260206004820152602560248201527f42616c616e6365206973206d6f7265207468616e2066726f6d2061646472657360448201527f7320686173000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a0380861660009081526004602052604090205486911615610932576040805160e560020a62461bcd02815260206004820152601a60248201527f4164647265737320686173206265656e2063616e63656c6c6564000000000000604482015290519081900360640190fd5b60005487908790600160a060020a0316331415610a3857600a54604080517f75cd51ed000000000000000000000000000000000000000000000000000000008152600160a060020a038481166004830152915191909216916375cd51ed9160248083019260209291908290030181600087803b1580156109b157600080fd5b505af11580156109c5573d6000803e3d6000fd5b505050506040513d60208110156109db57600080fd5b50511515610a33576040805160e560020a62461bcd02815260206004820152601d60248201527f54686520746f206164647265737320646f6573206e6f74206578697374000000604482015290519081900360640190fd5b610b2a565b600954604080517f6c85cf67000000000000000000000000000000000000000000000000000000008152600160a060020a038581166004830152848116602483015291519190921691636c85cf679160448083019260209291908290030181600087803b158015610aa857600080fd5b505af1158015610abc573d6000803e3d6000fd5b505050506040513d6020811015610ad257600080fd5b50511515610b2a576040805160e560020a62461bcd02815260206004820152601760248201527f416464726573732063616e6e6f74207472616e73666572000000000000000000604482015290519081900360640190fd5b60005474010000000000000000000000000000000000000000900460ff1615610bc3576040805160e560020a62461bcd02815260206004820152602d60248201527f436f6e74726163742069732063757272656e746c79206c6f636b656420666f7260448201527f206d6f64696669636174696f6e00000000000000000000000000000000000000606482015290519081900360840190fd5b600054600160a060020a03163314610ccf57600160a060020a0389166000908152600660209081526040808320338452909152902054871115610c76576040805160e560020a62461bcd02815260206004820152602960248201527f56616c75652065786365656473207768617420697320616c6c6f77656420746f60448201527f207472616e736665720000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a0389166000908152600660209081526040808320338452909152902054610caa908863ffffffff61224a16565b600160a060020a038a1660009081526006602090815260408083203384529091529020555b600160a060020a038916600090815260056020526040902054610cf8908863ffffffff61224a16565b600160a060020a03808b1660009081526005602052604080822093909355908a1681522054610d2d908863ffffffff6122aa16565b600160a060020a038916600090815260056020526040902055610d5760018963ffffffff61231216565b50336000908152600560205260409020541515610d8157610d7f60018a63ffffffff6123c916565b505b87600160a060020a031689600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef896040518082815260200191505060405180910390a350600198975050505050505050565b60008054600160a060020a03163314610e3e576040805160e560020a62461bcd02815260206004820152601960248201527f4f776e6572206163636f756e7420697320726571756972656400000000000000604482015290519081900360640190fd5b50600160a060020a0390811660009081526004602052604090205416151590565b600081565b600460205260009081526040902054600160a060020a031681565b60015481565b600054600160a060020a03163314610ee7576040805160e560020a62461bcd02815260206004820152601960248201527f4f776e6572206163636f756e7420697320726571756972656400000000000000604482015290519081900360640190fd5b600054600160a060020a0316ff5b60075474010000000000000000000000000000000000000000900460ff1681565b60008054600160a060020a03163314610f79576040805160e560020a62461bcd02815260206004820152601960248201527f4f776e6572206163636f756e7420697320726571756972656400000000000000604482015290519081900360640190fd5b600054600160a060020a0383811691161415611005576040805160e560020a62461bcd02815260206004820152602560248201527f4e6577204f776e65722063616e6e6f74206265207468652063757272656e742060448201527f6f776e6572000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a0382161515611065576040805160e560020a62461bcd02815260206004820181905260248201527f4e6577204f776e65722063616e6e6f74206265207a65726f2061646472657373604482015290519081900360640190fd5b5060008054600160a060020a0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8934ce4adea8d9ce0d714d2c22b86790e41b7731c84b926fbbdc1d40ff6533c99190a35050565b60005474010000000000000000000000000000000000000000900460ff161561115c576040805160e560020a62461bcd02815260206004820152602d60248201527f436f6e74726163742069732063757272656e746c79206c6f636b656420666f7260448201527f206d6f64696669636174696f6e00000000000000000000000000000000000000606482015290519081900360840190fd5b600054600160a060020a031633146111be576040805160e560020a62461bcd02815260206004820152601960248201527f4f776e6572206163636f756e7420697320726571756972656400000000000000604482015290519081900360640190fd5b6007805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383811691821792839055604051919216907ff7189b85d7899f5a32d733e6584c4f1dcdff0274f09d969d186c1797673ede1190600090a350565b600954600160a060020a031681565b600160a060020a031660009081526005602052604090205490565b60005474010000000000000000000000000000000000000000900460ff16156112de576040805160e560020a62461bcd02815260206004820152602d60248201527f436f6e74726163742069732063757272656e746c79206c6f636b656420666f7260448201527f206d6f64696669636174696f6e00000000000000000000000000000000000000606482015290519081900360840190fd5b600054600160a060020a03163314611340576040805160e560020a62461bcd02815260206004820152601960248201527f4f776e6572206163636f756e7420697320726571756972656400000000000000604482015290519081900360640190fd5b600160a060020a03808216600090815260046020526040902054829116156113b2576040805160e560020a62461bcd02815260206004820152601a60248201527f4164647265737320686173206265656e2063616e63656c6c6564000000000000604482015290519081900360640190fd5b6113c360018463ffffffff6124d616565b80156113dd57506113db60018363ffffffff6124d616565b155b1515611459576040805160e560020a62461bcd02815260206004820152602a60248201527f4f726967696e616c20646f65736e2774206578697374206f72207265706c616360448201527f656d656e7420646f657300000000000000000000000000000000000000000000606482015290519081900360840190fd5b61146a60018463ffffffff6123c916565b5061147c60018363ffffffff61231216565b50600160a060020a038381166000818152600460209081526040808320805473ffffffffffffffffffffffffffffffffffffffff19169588169586179055600590915280822080548584528284205583835282905551339392917fb64971100522354f3d25283cb14e2eefcb0dd26a757482ccfe42479d0a68685791a4505050565b6000805474010000000000000000000000000000000000000000900460ff1615611598576040805160e560020a62461bcd02815260206004820152602d60248201527f436f6e74726163742069732063757272656e746c79206c6f636b656420666f7260448201527f206d6f64696669636174696f6e00000000000000000000000000000000000000606482015290519081900360840190fd5b600754600160a060020a031633146115fa576040805160e560020a62461bcd02815260206004820152601360248201527f4f6e6c792069737375657220616c6c6f77656400000000000000000000000000604482015290519081900360640190fd5b60075474010000000000000000000000000000000000000000900460ff161561166d576040805160e560020a62461bcd02815260206004820152601b60248201527f49737375696e6720697320616c72656164792066696e69736865640000000000604482015290519081900360640190fd5b6007805474ff00000000000000000000000000000000000000001916740100000000000000000000000000000000000000001790556040517f7bc15082cf539fecd9e12596dc8e4e77c17a81fccc2c267b626af583162232a290600090a15060075474010000000000000000000000000000000000000000900460ff1690565b600061170060018363ffffffff61250d16565b92915050565b600054600160a060020a031681565b60005474010000000000000000000000000000000000000000900460ff16156117ae576040805160e560020a62461bcd02815260206004820152602d60248201527f436f6e74726163742069732063757272656e746c79206c6f636b656420666f7260448201527f206d6f64696669636174696f6e00000000000000000000000000000000000000606482015290519081900360840190fd5b600054600160a060020a03163314611810576040805160e560020a62461bcd02815260206004820152601960248201527f4f776e6572206163636f756e7420697320726571756972656400000000000000604482015290519081900360640190fd5b600a805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60408051808201909152600581527f545a524f50000000000000000000000000000000000000000000000000000000602082015281565b600a54600160a060020a031681565b60005474010000000000000000000000000000000000000000900460ff1681565b60008054819074010000000000000000000000000000000000000000900460ff1615611942576040805160e560020a62461bcd02815260206004820152602d60248201527f436f6e74726163742069732063757272656e746c79206c6f636b656420666f7260448201527f206d6f64696669636174696f6e00000000000000000000000000000000000000606482015290519081900360840190fd5b600754600160a060020a031633146119a4576040805160e560020a62461bcd02815260206004820152601360248201527f4f6e6c792069737375657220616c6c6f77656400000000000000000000000000604482015290519081900360640190fd5b60075474010000000000000000000000000000000000000000900460ff1615611a17576040805160e560020a62461bcd02815260206004820152601b60248201527f49737375696e6720697320616c72656164792066696e69736865640000000000604482015290519081900360640190fd5b506008543390611a2d908463ffffffff6122aa16565b600855600160a060020a038116600090815260056020526040902054611a59908463ffffffff6122aa16565b600160a060020a038216600090815260056020526040902055611a8360018263ffffffff61231216565b50604080518481529051600160a060020a038316917fc65a3f767206d2fdcede0b094a4840e01c0dd0be1888b5ba800346eaa0123c16919081900360200190a2600191505b50919050565b6000805474010000000000000000000000000000000000000000900460ff1615611b68576040805160e560020a62461bcd02815260206004820152602d60248201527f436f6e74726163742069732063757272656e746c79206c6f636b656420666f7260448201527f206d6f64696669636174696f6e00000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a0380841660009081526004602052604090205484911615611bda576040805160e560020a62461bcd02815260206004820152601a60248201527f4164647265737320686173206265656e2063616e63656c6c6564000000000000604482015290519081900360640190fd5b33600081815260056020526040902054849190821115611c6a576040805160e560020a62461bcd02815260206004820152602560248201527f42616c616e6365206973206d6f7265207468616e2066726f6d2061646472657360448201527f7320686173000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60075433908790600160a060020a0316821415611d7057600a54604080517f75cd51ed000000000000000000000000000000000000000000000000000000008152600160a060020a038481166004830152915191909216916375cd51ed9160248083019260209291908290030181600087803b158015611ce957600080fd5b505af1158015611cfd573d6000803e3d6000fd5b505050506040513d6020811015611d1357600080fd5b50511515611d6b576040805160e560020a62461bcd02815260206004820152601d60248201527f54686520746f206164647265737320646f6573206e6f74206578697374000000604482015290519081900360640190fd5b611e62565b600954604080517f6c85cf67000000000000000000000000000000000000000000000000000000008152600160a060020a038581166004830152848116602483015291519190921691636c85cf679160448083019260209291908290030181600087803b158015611de057600080fd5b505af1158015611df4573d6000803e3d6000fd5b505050506040513d6020811015611e0a57600080fd5b50511515611e62576040805160e560020a62461bcd02815260206004820152601760248201527f416464726573732063616e6e6f74207472616e73666572000000000000000000604482015290519081900360640190fd5b33600090815260056020526040902054611e82908863ffffffff61224a16565b3360009081526005602052604080822092909255600160a060020a038a1681522054611eb4908863ffffffff6122aa16565b600160a060020a038916600090815260056020526040902055611ede60018963ffffffff61231216565b50336000908152600560205260409020541515611f0857611f0660013363ffffffff6123c916565b505b604080518881529051600160a060020a038a169133917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a3506001979650505050505050565b600061170060018363ffffffff6124d616565b6000805474010000000000000000000000000000000000000000900460ff1615612003576040805160e560020a62461bcd02815260206004820152602d60248201527f436f6e74726163742069732063757272656e746c79206c6f636b656420666f7260448201527f206d6f64696669636174696f6e00000000000000000000000000000000000000606482015290519081900360840190fd5b50600160a060020a03918216600090815260066020908152604080832093909416825291909152205490565b600080548190600160a060020a03163314612094576040805160e560020a62461bcd02815260206004820152601960248201527f4f776e6572206163636f756e7420697320726571756972656400000000000000604482015290519081900360640190fd5b600160a060020a03831615156120f4576040805160e560020a62461bcd02815260206004820152601960248201527f4e6f6e2d7a65726f206164647265737320726571756972656400000000000000604482015290519081900360640190fd5b50600160a060020a03808316600090815260046020526040902054168015156117005760009150611ac8565b60005474010000000000000000000000000000000000000000900460ff16156121b9576040805160e560020a62461bcd02815260206004820152602d60248201527f436f6e74726163742069732063757272656e746c79206c6f636b656420666f7260448201527f206d6f64696669636174696f6e00000000000000000000000000000000000000606482015290519081900360840190fd5b600054600160a060020a0316331461221b576040805160e560020a62461bcd02815260206004820152601960248201527f4f776e6572206163636f756e7420697320726571756972656400000000000000604482015290519081900360640190fd5b6009805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b6000828211156122a4576040805160e560020a62461bcd02815260206004820152601460248201527f526573756c747320696e20756e646572666c6f77000000000000000000000000604482015290519081900360640190fd5b50900390565b600082820183811015612307576040805160e560020a62461bcd02815260206004820152601360248201527f526573756c747320696e206f766572666c6f7700000000000000000000000000604482015290519081900360640190fd5b8091505b5092915050565b600080600160a060020a038316151561232e576000915061230b565b50600160a060020a03821660009081526001840160205260408120546000190190811280159061235e5750835481125b1561236c576000915061230b565b83546001908101808655600160a060020a03851660008181528388016020908152604080832085905593825260028901905291909120805473ffffffffffffffffffffffffffffffffffffffff1916909117905591505092915050565b600160a060020a0381166000908152600180840160205260408220549082908212806123f55750845482135b1561240357600092506124ce565b8454821215612478575083546000908152600285016020818152604080842054600160a060020a031680855260018901835281852086905585855292909152808320805473ffffffffffffffffffffffffffffffffffffffff19908116841790915587548452922080549092169091556124a4565b60008281526002860160205260409020805473ffffffffffffffffffffffffffffffffffffffff191690555b600160a060020a038416600090815260018087016020526040822091909155855460001901865592505b505092915050565b600160a060020a0381166000908152600183016020526040812054600019018181128015906125055750835481125b949350505050565b600080821215801561251f5750825482125b1515612575576040805160e560020a62461bcd02815260206004820152601860248201527f496e646578206f757473696465206f6620626f756e64732e0000000000000000604482015290519081900360640190fd5b5060010160009081526002919091016020526040902054600160a060020a0316905600a165627a7a7230582099c8ad7cc21c5fd4dc66bc38990d6bcfed48314768acc1ce8462c6936dbc69690029

Swarm Source

bzzr://99c8ad7cc21c5fd4dc66bc38990d6bcfed48314768acc1ce8462c6936dbc6969

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.