ETH Price: $2,388.33 (+2.43%)

Contract

0x15dD447B5eCf63432909A4655037B43898Fabf19
 

Overview

ETH Balance

0.009560907446923991 ETH

Eth Value

$22.83 (@ $2,388.33/ETH)

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Purchase154006062022-08-24 3:39:23756 days ago1661312363IN
0x15dD447B...898Fabf19
0.00443213 ETH0.000614295
Purchase154005452022-08-24 3:28:28756 days ago1661311708IN
0x15dD447B...898Fabf19
0.00443213 ETH0.001259629
Set Emoji Msg67272272018-11-18 11:51:442131 days ago1542541904IN
0x15dD447B...898Fabf19
0 ETH0.000138263
Set Emoji Msg66715882018-11-09 9:34:162140 days ago1541756056IN
0x15dD447B...898Fabf19
0 ETH0.000365928
Set Emoji Msg66715842018-11-09 9:33:072140 days ago1541755987IN
0x15dD447B...898Fabf19
0 ETH0.000377088
Set Emoji Msg66715742018-11-09 9:30:502140 days ago1541755850IN
0x15dD447B...898Fabf19
0 ETH0.000374298
Set Emoji Msg66715702018-11-09 9:30:062140 days ago1541755806IN
0x15dD447B...898Fabf19
0 ETH0.000391048
Set Emoji Msg66715682018-11-09 9:29:542140 days ago1541755794IN
0x15dD447B...898Fabf19
0 ETH0.000374298
Set Emoji Msg66715612018-11-09 9:28:432140 days ago1541755723IN
0x15dD447B...898Fabf19
0 ETH0.000297476
Purchase66672912018-11-08 16:31:532141 days ago1541694713IN
0x15dD447B...898Fabf19
0.00210526 ETH0.001166710
Purchase66672782018-11-08 16:28:562141 days ago1541694536IN
0x15dD447B...898Fabf19
0.00443213 ETH0.001166710
Purchase66672652018-11-08 16:26:482141 days ago1541694408IN
0x15dD447B...898Fabf19
0.00443213 ETH0.001050039
Purchase66672522018-11-08 16:23:492141 days ago1541694229IN
0x15dD447B...898Fabf19
0.00210526 ETH0.001185039
Purchase66672372018-11-08 16:20:172141 days ago1541694017IN
0x15dD447B...898Fabf19
0.00210526 ETH0.000921697
Purchase65572582018-10-21 16:03:152159 days ago1540137795IN
0x15dD447B...898Fabf19
0.0093308 ETH0.000700026
Purchase65572512018-10-21 16:02:222159 days ago1540137742IN
0x15dD447B...898Fabf19
0.00443213 ETH0.000790026
Create Emoji Sto...65345832018-10-17 22:57:172163 days ago1539817037IN
0x15dD447B...898Fabf19
0 ETH0.00051843
Purchase65150742018-10-14 18:34:512166 days ago1539542091IN
0x15dD447B...898Fabf19
0.0093308 ETH0.000466684
Purchase65150742018-10-14 18:34:512166 days ago1539542091IN
0x15dD447B...898Fabf19
0.00886426 ETH0.00020383.1
Purchase65150622018-10-14 18:32:002166 days ago1539541920IN
0x15dD447B...898Fabf19
0.00443213 ETH0.000454673.1
Create Emoji Sto...64951592018-10-11 13:01:342169 days ago1539262894IN
0x15dD447B...898Fabf19
0 ETH0.00051843
Set Emoji Msg56469272018-05-20 15:47:262313 days ago1526831246IN
0x15dD447B...898Fabf19
0 ETH0.000449929
Purchase56468942018-05-20 15:39:572313 days ago1526830797IN
0x15dD447B...898Fabf19
0.00443213 ETH0.001185039
Purchase56362712018-05-18 18:30:362315 days ago1526668236IN
0x15dD447B...898Fabf19
0.0196438 ETH0.0023450620.1
Purchase56362642018-05-18 18:28:562315 days ago1526668136IN
0x15dD447B...898Fabf19
0.08706394 ETH0.0023483220.1
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
154006062022-08-24 3:39:23756 days ago1661312363
0x15dD447B...898Fabf19
0.00421052 ETH
154005452022-08-24 3:28:28756 days ago1661311708
0x15dD447B...898Fabf19
0.00421052 ETH
66672912018-11-08 16:31:532141 days ago1541694713
0x15dD447B...898Fabf19
0.00199999 ETH
66672782018-11-08 16:28:562141 days ago1541694536
0x15dD447B...898Fabf19
0.00421052 ETH
66672652018-11-08 16:26:482141 days ago1541694408
0x15dD447B...898Fabf19
0.00421052 ETH
66672522018-11-08 16:23:492141 days ago1541694229
0x15dD447B...898Fabf19
0.00199999 ETH
66672372018-11-08 16:20:172141 days ago1541694017
0x15dD447B...898Fabf19
0.00199999 ETH
65572582018-10-21 16:03:152159 days ago1540137795
0x15dD447B...898Fabf19
0.00886426 ETH
65572512018-10-21 16:02:222159 days ago1540137742
0x15dD447B...898Fabf19
0.00421052 ETH
65150742018-10-14 18:34:512166 days ago1539542091
0x15dD447B...898Fabf19
0.00886426 ETH
65150742018-10-14 18:34:512166 days ago1539542091
0x15dD447B...898Fabf19
0.00842105 ETH
65150622018-10-14 18:32:002166 days ago1539541920
0x15dD447B...898Fabf19
0.00421052 ETH
56468942018-05-20 15:39:572313 days ago1526830797
0x15dD447B...898Fabf19
0.00421052 ETH
56362712018-05-18 18:30:362315 days ago1526668236
0x15dD447B...898Fabf19
0.01866161 ETH
56362642018-05-18 18:28:562315 days ago1526668136
0x15dD447B...898Fabf19
0.08271074 ETH
56362612018-05-18 18:28:292315 days ago1526668109
0x15dD447B...898Fabf19
0.01866161 ETH
55042222018-04-25 16:29:222338 days ago1524673762
0x15dD447B...898Fabf19
1.88321904 ETH
52441142018-03-12 20:59:182382 days ago1520888358
0x15dD447B...898Fabf19
0.79584574 ETH
52245642018-03-09 13:17:152385 days ago1520601435
0x15dD447B...898Fabf19
0.00199999 ETH
52088162018-03-06 21:09:082388 days ago1520370548
0x15dD447B...898Fabf19
0.00199999 ETH
52088162018-03-06 21:09:082388 days ago1520370548
0x15dD447B...898Fabf19
0.00421052 ETH
52070292018-03-06 13:59:122388 days ago1520344752
0x15dD447B...898Fabf19
0.00421052 ETH
52069572018-03-06 13:44:032388 days ago1520343843
0x15dD447B...898Fabf19
0.00421052 ETH
52061552018-03-06 10:19:482388 days ago1520331588
0x15dD447B...898Fabf19
0.00199999 ETH
52061542018-03-06 10:19:422388 days ago1520331582
0x15dD447B...898Fabf19
0.00199999 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
EmojiToken

Compiler Version
v0.4.19+commit.c4cbbb05

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2018-02-17
*/

pragma solidity ^0.4.18;

/*
 * @title String & slice utility library for Solidity contracts.
 * @author Nick Johnson <[email protected]>
 *
 * @dev Functionality in this library is largely implemented using an
 *      abstraction called a 'slice'. A slice represents a part of a string -
 *      anything from the entire string to a single character, or even no
 *      characters at all (a 0-length slice). Since a slice only has to specify
 *      an offset and a length, copying and manipulating slices is a lot less
 *      expensive than copying and manipulating the strings they reference.
 *
 *      To further reduce gas costs, most functions on slice that need to return
 *      a slice modify the original one instead of allocating a new one; for
 *      instance, `s.split(".")` will return the text up to the first '.',
 *      modifying s to only contain the remainder of the string after the '.'.
 *      In situations where you do not want to modify the original slice, you
 *      can make a copy first with `.copy()`, for example:
 *      `s.copy().split(".")`. Try and avoid using this idiom in loops; since
 *      Solidity has no memory management, it will result in allocating many
 *      short-lived slices that are later discarded.
 *
 *      Functions that return two slices come in two versions: a non-allocating
 *      version that takes the second slice as an argument, modifying it in
 *      place, and an allocating version that allocates and returns the second
 *      slice; see `nextRune` for example.
 *
 *      Functions that have to copy string data will return strings rather than
 *      slices; these can be cast back to slices for further processing if
 *      required.
 *
 *      For convenience, some functions are provided with non-modifying
 *      variants that create a new slice and return both; for instance,
 *      `s.splitNew('.')` leaves s unmodified, and returns two values
 *      corresponding to the left and right parts of the string.
 */
 


library strings {
    struct slice {
        uint _len;
        uint _ptr;
    }

    function memcpy(uint dest, uint src, uint len) private {
        // Copy word-length chunks while possible
        for(; len >= 32; len -= 32) {
            assembly {
                mstore(dest, mload(src))
            }
            dest += 32;
            src += 32;
        }

        // Copy remaining bytes
        uint mask = 256 ** (32 - len) - 1;
        assembly {
            let srcpart := and(mload(src), not(mask))
            let destpart := and(mload(dest), mask)
            mstore(dest, or(destpart, srcpart))
        }
    }

    /*
     * @dev Returns a slice containing the entire string.
     * @param self The string to make a slice from.
     * @return A newly allocated slice containing the entire string.
     */
    function toSlice(string self) internal returns (slice) {
        uint ptr;
        assembly {
            ptr := add(self, 0x20)
        }
        return slice(bytes(self).length, ptr);
    }

    /*
     * @dev Returns the length of a null-terminated bytes32 string.
     * @param self The value to find the length of.
     * @return The length of the string, from 0 to 32.
     */
    function len(bytes32 self) internal returns (uint) {
        uint ret;
        if (self == 0)
            return 0;
        if (self & 0xffffffffffffffffffffffffffffffff == 0) {
            ret += 16;
            self = bytes32(uint(self) / 0x100000000000000000000000000000000);
        }
        if (self & 0xffffffffffffffff == 0) {
            ret += 8;
            self = bytes32(uint(self) / 0x10000000000000000);
        }
        if (self & 0xffffffff == 0) {
            ret += 4;
            self = bytes32(uint(self) / 0x100000000);
        }
        if (self & 0xffff == 0) {
            ret += 2;
            self = bytes32(uint(self) / 0x10000);
        }
        if (self & 0xff == 0) {
            ret += 1;
        }
        return 32 - ret;
    }

    /*
     * @dev Returns a slice containing the entire bytes32, interpreted as a
     *      null-termintaed utf-8 string.
     * @param self The bytes32 value to convert to a slice.
     * @return A new slice containing the value of the input argument up to the
     *         first null.
     */
    function toSliceB32(bytes32 self) internal returns (slice ret) {
        // Allocate space for `self` in memory, copy it there, and point ret at it
        assembly {
            let ptr := mload(0x40)
            mstore(0x40, add(ptr, 0x20))
            mstore(ptr, self)
            mstore(add(ret, 0x20), ptr)
        }
        ret._len = len(self);
    }

    /*
     * @dev Returns a new slice containing the same data as the current slice.
     * @param self The slice to copy.
     * @return A new slice containing the same data as `self`.
     */
    function copy(slice self) internal returns (slice) {
        return slice(self._len, self._ptr);
    }

    /*
     * @dev Copies a slice to a new string.
     * @param self The slice to copy.
     * @return A newly allocated string containing the slice's text.
     */
    function toString(slice self) internal returns (string) {
        var ret = new string(self._len);
        uint retptr;
        assembly { retptr := add(ret, 32) }

        memcpy(retptr, self._ptr, self._len);
        return ret;
    }

    /*
     * @dev Returns the length in runes of the slice. Note that this operation
     *      takes time proportional to the length of the slice; avoid using it
     *      in loops, and call `slice.empty()` if you only need to know whether
     *      the slice is empty or not.
     * @param self The slice to operate on.
     * @return The length of the slice in runes.
     */
    function len(slice self) internal returns (uint l) {
        // Starting at ptr-31 means the LSB will be the byte we care about
        var ptr = self._ptr - 31;
        var end = ptr + self._len;
        for (l = 0; ptr < end; l++) {
            uint8 b;
            assembly { b := and(mload(ptr), 0xFF) }
            if (b < 0x80) {
                ptr += 1;
            } else if(b < 0xE0) {
                ptr += 2;
            } else if(b < 0xF0) {
                ptr += 3;
            } else if(b < 0xF8) {
                ptr += 4;
            } else if(b < 0xFC) {
                ptr += 5;
            } else {
                ptr += 6;
            }
        }
    }

    /*
     * @dev Returns true if the slice is empty (has a length of 0).
     * @param self The slice to operate on.
     * @return True if the slice is empty, False otherwise.
     */
    function empty(slice self) internal returns (bool) {
        return self._len == 0;
    }

    /*
     * @dev Returns a positive number if `other` comes lexicographically after
     *      `self`, a negative number if it comes before, or zero if the
     *      contents of the two slices are equal. Comparison is done per-rune,
     *      on unicode codepoints.
     * @param self The first slice to compare.
     * @param other The second slice to compare.
     * @return The result of the comparison.
     */
    function compare(slice self, slice other) internal returns (int) {
        uint shortest = self._len;
        if (other._len < self._len)
            shortest = other._len;

        var selfptr = self._ptr;
        var otherptr = other._ptr;
        for (uint idx = 0; idx < shortest; idx += 32) {
            uint a;
            uint b;
            assembly {
                a := mload(selfptr)
                b := mload(otherptr)
            }
            if (a != b) {
                // Mask out irrelevant bytes and check again
                uint mask = ~(2 ** (8 * (32 - shortest + idx)) - 1);
                var diff = (a & mask) - (b & mask);
                if (diff != 0)
                    return int(diff);
            }
            selfptr += 32;
            otherptr += 32;
        }
        return int(self._len) - int(other._len);
    }

    /*
     * @dev Returns true if the two slices contain the same text.
     * @param self The first slice to compare.
     * @param self The second slice to compare.
     * @return True if the slices are equal, false otherwise.
     */
    function equals(slice self, slice other) internal returns (bool) {
        return compare(self, other) == 0;
    }

    /*
     * @dev Extracts the first rune in the slice into `rune`, advancing the
     *      slice to point to the next rune and returning `self`.
     * @param self The slice to operate on.
     * @param rune The slice that will contain the first rune.
     * @return `rune`.
     */
    function nextRune(slice self, slice rune) internal returns (slice) {
        rune._ptr = self._ptr;

        if (self._len == 0) {
            rune._len = 0;
            return rune;
        }

        uint len;
        uint b;
        // Load the first byte of the rune into the LSBs of b
        assembly { b := and(mload(sub(mload(add(self, 32)), 31)), 0xFF) }
        if (b < 0x80) {
            len = 1;
        } else if(b < 0xE0) {
            len = 2;
        } else if(b < 0xF0) {
            len = 3;
        } else {
            len = 4;
        }

        // Check for truncated codepoints
        if (len > self._len) {
            rune._len = self._len;
            self._ptr += self._len;
            self._len = 0;
            return rune;
        }

        self._ptr += len;
        self._len -= len;
        rune._len = len;
        return rune;
    }

    /*
     * @dev Returns the first rune in the slice, advancing the slice to point
     *      to the next rune.
     * @param self The slice to operate on.
     * @return A slice containing only the first rune from `self`.
     */
    function nextRune(slice self) internal returns (slice ret) {
        nextRune(self, ret);
    }

    /*
     * @dev Returns the number of the first codepoint in the slice.
     * @param self The slice to operate on.
     * @return The number of the first codepoint in the slice.
     */
    function ord(slice self) internal returns (uint ret) {
        if (self._len == 0) {
            return 0;
        }

        uint word;
        uint length;
        uint divisor = 2 ** 248;

        // Load the rune into the MSBs of b
        assembly { word:= mload(mload(add(self, 32))) }
        var b = word / divisor;
        if (b < 0x80) {
            ret = b;
            length = 1;
        } else if(b < 0xE0) {
            ret = b & 0x1F;
            length = 2;
        } else if(b < 0xF0) {
            ret = b & 0x0F;
            length = 3;
        } else {
            ret = b & 0x07;
            length = 4;
        }

        // Check for truncated codepoints
        if (length > self._len) {
            return 0;
        }

        for (uint i = 1; i < length; i++) {
            divisor = divisor / 256;
            b = (word / divisor) & 0xFF;
            if (b & 0xC0 != 0x80) {
                // Invalid UTF-8 sequence
                return 0;
            }
            ret = (ret * 64) | (b & 0x3F);
        }

        return ret;
    }

    /*
     * @dev Returns the keccak-256 hash of the slice.
     * @param self The slice to hash.
     * @return The hash of the slice.
     */
    function keccak(slice self) internal returns (bytes32 ret) {
        assembly {
            ret := keccak256(mload(add(self, 32)), mload(self))
        }
    }

    /*
     * @dev Returns true if `self` starts with `needle`.
     * @param self The slice to operate on.
     * @param needle The slice to search for.
     * @return True if the slice starts with the provided text, false otherwise.
     */
    function startsWith(slice self, slice needle) internal returns (bool) {
        if (self._len < needle._len) {
            return false;
        }

        if (self._ptr == needle._ptr) {
            return true;
        }

        bool equal;
        assembly {
            let length := mload(needle)
            let selfptr := mload(add(self, 0x20))
            let needleptr := mload(add(needle, 0x20))
            equal := eq(keccak256(selfptr, length), keccak256(needleptr, length))
        }
        return equal;
    }

    /*
     * @dev If `self` starts with `needle`, `needle` is removed from the
     *      beginning of `self`. Otherwise, `self` is unmodified.
     * @param self The slice to operate on.
     * @param needle The slice to search for.
     * @return `self`
     */
    function beyond(slice self, slice needle) internal returns (slice) {
        if (self._len < needle._len) {
            return self;
        }

        bool equal = true;
        if (self._ptr != needle._ptr) {
            assembly {
                let length := mload(needle)
                let selfptr := mload(add(self, 0x20))
                let needleptr := mload(add(needle, 0x20))
                equal := eq(sha3(selfptr, length), sha3(needleptr, length))
            }
        }

        if (equal) {
            self._len -= needle._len;
            self._ptr += needle._len;
        }

        return self;
    }

    /*
     * @dev Returns true if the slice ends with `needle`.
     * @param self The slice to operate on.
     * @param needle The slice to search for.
     * @return True if the slice starts with the provided text, false otherwise.
     */
    function endsWith(slice self, slice needle) internal returns (bool) {
        if (self._len < needle._len) {
            return false;
        }

        var selfptr = self._ptr + self._len - needle._len;

        if (selfptr == needle._ptr) {
            return true;
        }

        bool equal;
        assembly {
            let length := mload(needle)
            let needleptr := mload(add(needle, 0x20))
            equal := eq(keccak256(selfptr, length), keccak256(needleptr, length))
        }

        return equal;
    }

    /*
     * @dev If `self` ends with `needle`, `needle` is removed from the
     *      end of `self`. Otherwise, `self` is unmodified.
     * @param self The slice to operate on.
     * @param needle The slice to search for.
     * @return `self`
     */
    function until(slice self, slice needle) internal returns (slice) {
        if (self._len < needle._len) {
            return self;
        }

        var selfptr = self._ptr + self._len - needle._len;
        bool equal = true;
        if (selfptr != needle._ptr) {
            assembly {
                let length := mload(needle)
                let needleptr := mload(add(needle, 0x20))
                equal := eq(keccak256(selfptr, length), keccak256(needleptr, length))
            }
        }

        if (equal) {
            self._len -= needle._len;
        }

        return self;
    }

    // Returns the memory address of the first byte of the first occurrence of
    // `needle` in `self`, or the first byte after `self` if not found.
    function findPtr(uint selflen, uint selfptr, uint needlelen, uint needleptr) private returns (uint) {
        uint ptr;
        uint idx;

        if (needlelen <= selflen) {
            if (needlelen <= 32) {
                // Optimized assembly for 68 gas per byte on short strings
                assembly {
                    let mask := not(sub(exp(2, mul(8, sub(32, needlelen))), 1))
                    let needledata := and(mload(needleptr), mask)
                    let end := add(selfptr, sub(selflen, needlelen))
                    ptr := selfptr
                    loop:
                    jumpi(exit, eq(and(mload(ptr), mask), needledata))
                    ptr := add(ptr, 1)
                    jumpi(loop, lt(sub(ptr, 1), end))
                    ptr := add(selfptr, selflen)
                    exit:
                }
                return ptr;
            } else {
                // For long needles, use hashing
                bytes32 hash;
                assembly { hash := sha3(needleptr, needlelen) }
                ptr = selfptr;
                for (idx = 0; idx <= selflen - needlelen; idx++) {
                    bytes32 testHash;
                    assembly { testHash := sha3(ptr, needlelen) }
                    if (hash == testHash)
                        return ptr;
                    ptr += 1;
                }
            }
        }
        return selfptr + selflen;
    }

    // Returns the memory address of the first byte after the last occurrence of
    // `needle` in `self`, or the address of `self` if not found.
    function rfindPtr(uint selflen, uint selfptr, uint needlelen, uint needleptr) private returns (uint) {
        uint ptr;

        if (needlelen <= selflen) {
            if (needlelen <= 32) {
                // Optimized assembly for 69 gas per byte on short strings
                assembly {
                    let mask := not(sub(exp(2, mul(8, sub(32, needlelen))), 1))
                    let needledata := and(mload(needleptr), mask)
                    ptr := add(selfptr, sub(selflen, needlelen))
                    loop:
                    jumpi(ret, eq(and(mload(ptr), mask), needledata))
                    ptr := sub(ptr, 1)
                    jumpi(loop, gt(add(ptr, 1), selfptr))
                    ptr := selfptr
                    jump(exit)
                    ret:
                    ptr := add(ptr, needlelen)
                    exit:
                }
                return ptr;
            } else {
                // For long needles, use hashing
                bytes32 hash;
                assembly { hash := sha3(needleptr, needlelen) }
                ptr = selfptr + (selflen - needlelen);
                while (ptr >= selfptr) {
                    bytes32 testHash;
                    assembly { testHash := sha3(ptr, needlelen) }
                    if (hash == testHash)
                        return ptr + needlelen;
                    ptr -= 1;
                }
            }
        }
        return selfptr;
    }

    /*
     * @dev Modifies `self` to contain everything from the first occurrence of
     *      `needle` to the end of the slice. `self` is set to the empty slice
     *      if `needle` is not found.
     * @param self The slice to search and modify.
     * @param needle The text to search for.
     * @return `self`.
     */
    function find(slice self, slice needle) internal returns (slice) {
        uint ptr = findPtr(self._len, self._ptr, needle._len, needle._ptr);
        self._len -= ptr - self._ptr;
        self._ptr = ptr;
        return self;
    }

    /*
     * @dev Modifies `self` to contain the part of the string from the start of
     *      `self` to the end of the first occurrence of `needle`. If `needle`
     *      is not found, `self` is set to the empty slice.
     * @param self The slice to search and modify.
     * @param needle The text to search for.
     * @return `self`.
     */
    function rfind(slice self, slice needle) internal returns (slice) {
        uint ptr = rfindPtr(self._len, self._ptr, needle._len, needle._ptr);
        self._len = ptr - self._ptr;
        return self;
    }

    /*
     * @dev Splits the slice, setting `self` to everything after the first
     *      occurrence of `needle`, and `token` to everything before it. If
     *      `needle` does not occur in `self`, `self` is set to the empty slice,
     *      and `token` is set to the entirety of `self`.
     * @param self The slice to split.
     * @param needle The text to search for in `self`.
     * @param token An output parameter to which the first token is written.
     * @return `token`.
     */
    function split(slice self, slice needle, slice token) internal returns (slice) {
        uint ptr = findPtr(self._len, self._ptr, needle._len, needle._ptr);
        token._ptr = self._ptr;
        token._len = ptr - self._ptr;
        if (ptr == self._ptr + self._len) {
            // Not found
            self._len = 0;
        } else {
            self._len -= token._len + needle._len;
            self._ptr = ptr + needle._len;
        }
        return token;
    }

    /*
     * @dev Splits the slice, setting `self` to everything after the first
     *      occurrence of `needle`, and returning everything before it. If
     *      `needle` does not occur in `self`, `self` is set to the empty slice,
     *      and the entirety of `self` is returned.
     * @param self The slice to split.
     * @param needle The text to search for in `self`.
     * @return The part of `self` up to the first occurrence of `delim`.
     */
    function split(slice self, slice needle) internal returns (slice token) {
        split(self, needle, token);
    }

    /*
     * @dev Splits the slice, setting `self` to everything before the last
     *      occurrence of `needle`, and `token` to everything after it. If
     *      `needle` does not occur in `self`, `self` is set to the empty slice,
     *      and `token` is set to the entirety of `self`.
     * @param self The slice to split.
     * @param needle The text to search for in `self`.
     * @param token An output parameter to which the first token is written.
     * @return `token`.
     */
    function rsplit(slice self, slice needle, slice token) internal returns (slice) {
        uint ptr = rfindPtr(self._len, self._ptr, needle._len, needle._ptr);
        token._ptr = ptr;
        token._len = self._len - (ptr - self._ptr);
        if (ptr == self._ptr) {
            // Not found
            self._len = 0;
        } else {
            self._len -= token._len + needle._len;
        }
        return token;
    }

    /*
     * @dev Splits the slice, setting `self` to everything before the last
     *      occurrence of `needle`, and returning everything after it. If
     *      `needle` does not occur in `self`, `self` is set to the empty slice,
     *      and the entirety of `self` is returned.
     * @param self The slice to split.
     * @param needle The text to search for in `self`.
     * @return The part of `self` after the last occurrence of `delim`.
     */
    function rsplit(slice self, slice needle) internal returns (slice token) {
        rsplit(self, needle, token);
    }

    /*
     * @dev Counts the number of nonoverlapping occurrences of `needle` in `self`.
     * @param self The slice to search.
     * @param needle The text to search for in `self`.
     * @return The number of occurrences of `needle` found in `self`.
     */
    function count(slice self, slice needle) internal returns (uint cnt) {
        uint ptr = findPtr(self._len, self._ptr, needle._len, needle._ptr) + needle._len;
        while (ptr <= self._ptr + self._len) {
            cnt++;
            ptr = findPtr(self._len - (ptr - self._ptr), ptr, needle._len, needle._ptr) + needle._len;
        }
    }

    /*
     * @dev Returns True if `self` contains `needle`.
     * @param self The slice to search.
     * @param needle The text to search for in `self`.
     * @return True if `needle` is found in `self`, false otherwise.
     */
    function contains(slice self, slice needle) internal returns (bool) {
        return rfindPtr(self._len, self._ptr, needle._len, needle._ptr) != self._ptr;
    }

    /*
     * @dev Returns a newly allocated string containing the concatenation of
     *      `self` and `other`.
     * @param self The first slice to concatenate.
     * @param other The second slice to concatenate.
     * @return The concatenation of the two strings.
     */
    function concat(slice self, slice other) internal returns (string) {
        var ret = new string(self._len + other._len);
        uint retptr;
        assembly { retptr := add(ret, 32) }
        memcpy(retptr, self._ptr, self._len);
        memcpy(retptr + self._len, other._ptr, other._len);
        return ret;
    }

    /*
     * @dev Joins an array of slices, using `self` as a delimiter, returning a
     *      newly allocated string.
     * @param self The delimiter to use.
     * @param parts A list of slices to join.
     * @return A newly allocated string containing all the slices in `parts`,
     *         joined with `self`.
     */
    function join(slice self, slice[] parts) internal returns (string) {
        if (parts.length == 0)
            return "";

        uint length = self._len * (parts.length - 1);
        for(uint i = 0; i < parts.length; i++)
            length += parts[i]._len;

        var ret = new string(length);
        uint retptr;
        assembly { retptr := add(ret, 32) }

        for(i = 0; i < parts.length; i++) {
            memcpy(retptr, parts[i]._ptr, parts[i]._len);
            retptr += parts[i]._len;
            if (i < parts.length - 1) {
                memcpy(retptr, self._ptr, self._len);
                retptr += self._len;
            }
        }

        return ret;
    }
}

/**
 * @title SafeMath
 * @dev Math operations with safety checks that throw on error
 */
library SafeMath {

  /**
  * @dev Multiplies two numbers, throws on overflow.
  */
  function mul(uint256 a, uint256 b) internal pure returns (uint256) {
    if (a == 0) {
      return 0;
    }
    uint256 c = a * b;
    assert(c / a == b);
    return c;
  }

  /**
  * @dev Integer division of two numbers, truncating the quotient.
  */
  function div(uint256 a, uint256 b) internal pure returns (uint256) {
    // assert(b > 0); // Solidity automatically throws when dividing by 0
    uint256 c = a / b;
    // assert(a == b * c + a % b); // There is no case in which this doesn't hold
    return c;
  }

  /**
  * @dev Substracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
  */
  function sub(uint256 a, uint256 b) internal pure returns (uint256) {
    assert(b <= a);
    return a - b;
  }

  /**
  * @dev Adds two numbers, throws on overflow.
  */
  function add(uint256 a, uint256 b) internal pure returns (uint256) {
    uint256 c = a + b;
    assert(c >= a);
    return c;
  }
}

/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 */
contract Ownable {
  address public owner;


  event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);


  /**
   * @dev The Ownable constructor sets the original `owner` of the contract to the sender
   * account.
   */
  function Ownable() public {
    owner = msg.sender;
  }

  /**
   * @dev Throws if called by any account other than the owner.
   */
  modifier onlyOwner() {
    require(msg.sender == owner);
    _;
  }

  /**
   * @dev Allows the current owner to transfer control of the contract to a newOwner.
   * @param newOwner The address to transfer ownership to.
   */
  function transferOwnership(address newOwner) public onlyOwner {
    require(newOwner != address(0));
    OwnershipTransferred(owner, newOwner);
    owner = newOwner;
  }

}

/// @title Interface for contracts conforming to ERC-721: Non-Fungible Tokens
/// @author Dieter Shirley <[email protected]> (https://github.com/dete)
contract ERC721 {
  // Required methods
  function approve(address _to, uint256 _tokenId) public;
  function balanceOf(address _owner) public view returns (uint256 balance);
  function implementsERC721() public pure returns (bool);
  function ownerOf(uint256 _tokenId) public view returns (address addr);
  function takeOwnership(uint256 _tokenId) public;
  function totalSupply() public view returns (uint256 total);
  function transferFrom(address _from, address _to, uint256 _tokenId) public;
  function transfer(address _to, uint256 _tokenId) public;

  event Transfer(address indexed from, address indexed to, uint256 tokenId);
  event Approval(address indexed owner, address indexed approved, uint256 tokenId);

  // Optional
  // function name() public view returns (string name);
  // function symbol() public view returns (string symbol);
  // function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256 tokenId);
  // function tokenMetadata(uint256 _tokenId) public view returns (string infoUrl);
}

contract ERC20 {
  function allowance(address owner, address spender) public view returns (uint256);
  function transferFrom(address from, address to, uint256 value) public returns (bool);
  function approve(address spender, uint256 value) public returns (bool);

  function totalSupply() public view returns (uint256);
  function balanceOf(address who) public view returns (uint256);
  function transfer(address to, uint256 value) public returns (bool);

  event Approval(address indexed owner, address indexed spender, uint256 value);
  event Transfer(address indexed from, address indexed to, uint256 value);
}

/**
 * @title Basic token
 * @dev Basic version of StandardToken, with no allowances.
 */
contract BasicToken is ERC20 {
  using SafeMath for uint256;

  mapping(address => uint256) balances;

  uint256 totalSupply_;

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

  /**
  * @dev transfer token for a specified address
  * @param _to The address to transfer to.
  * @param _value The amount to be transferred.
  */
  function transfer(address _to, uint256 _value) public returns (bool) {
    require(_to != address(0));
    require(_value <= balances[msg.sender]);

    // SafeMath.sub will throw if there is not enough balance.
    balances[msg.sender] = balances[msg.sender].sub(_value);
    balances[_to] = balances[_to].add(_value);
    Transfer(msg.sender, _to, _value);
    return true;
  }

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

}

contract StandardToken is ERC20, BasicToken {

  mapping (address => mapping (address => uint256)) internal allowed;


  /**
   * @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
   */
  function transferFrom(address _from, address _to, uint256 _value) public returns (bool) {
    require(_to != address(0));
    require(_value <= balances[_from]);
    require(_value <= allowed[_from][msg.sender]);

    balances[_from] = balances[_from].sub(_value);
    balances[_to] = balances[_to].add(_value);
    allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);
    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) public returns (bool) {
    allowed[msg.sender][_spender] = _value;
    Approval(msg.sender, _spender, _value);
    return true;
  }

  /**
   * @dev Function to check the amount of tokens that an owner allowed to a spender.
   * @param _owner 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 _owner, address _spender) public view returns (uint256) {
    return allowed[_owner][_spender];
  }

  /**
   * @dev Increase the amount of tokens that an owner allowed to a spender.
   *
   * approve should be called when allowed[_spender] == 0. To increment
   * allowed value is better to use this function to avoid 2 calls (and wait until
   * the first transaction is mined)
   * From MonolithDAO Token.sol
   * @param _spender The address which will spend the funds.
   * @param _addedValue The amount of tokens to increase the allowance by.
   */
  function increaseApproval(address _spender, uint _addedValue) public returns (bool) {
    allowed[msg.sender][_spender] = allowed[msg.sender][_spender].add(_addedValue);
    Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
    return true;
  }

  /**
   * @dev Decrease the amount of tokens that an owner allowed to a spender.
   *
   * approve should be called when allowed[_spender] == 0. To decrement
   * allowed value is better to use this function to avoid 2 calls (and wait until
   * the first transaction is mined)
   * From MonolithDAO Token.sol
   * @param _spender The address which will spend the funds.
   * @param _subtractedValue The amount of tokens to decrease the allowance by.
   */
  function decreaseApproval(address _spender, uint _subtractedValue) public returns (bool) {
    uint oldValue = allowed[msg.sender][_spender];
    if (_subtractedValue > oldValue) {
      allowed[msg.sender][_spender] = 0;
    } else {
      allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue);
    }
    Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
    return true;
  }

}

contract MutableToken is StandardToken, Ownable {
  event Mint(address indexed to, uint256 amount, uint256 balance, uint256 totalSupply);
  event Burn(address indexed burner, uint256 value, uint256 balance, uint256 totalSupply);

  address master;

  function setContractMaster(address _newMaster) onlyOwner public {
    require(_newMaster != address(0));
    require(EmojiToken(_newMaster).isEmoji());
    master = _newMaster;
  }

  /**
   * @dev Function to mint tokens
   * @param _to The address that will receive the minted tokens.
   * @param _amount The amount of tokens to mint.
   * @return A boolean that indicates if the operation was successful.
   */
  function mint(address _to, uint256 _amount) public returns (bool) {
    require(master == msg.sender);
    totalSupply_ = totalSupply_.add(_amount);
    balances[_to] = balances[_to].add(_amount);
    Mint(_to, _amount, balances[_to], totalSupply_);
    Transfer(address(0), _to, _amount);
    return true;
  }

  /**
   * @dev Burns a specific amount of tokens.
   * @param _value The amount of token to be burned.
   */
  function burn(uint256 _value, address _owner) public {
    require(master == msg.sender);
    require(_value <= balances[_owner]);
    // no need to require value <= totalSupply, since that would imply the
    // sender's balance is greater than the totalSupply, which *should* be an assertion failure

    address burner = _owner;
    balances[burner] = balances[burner].sub(_value);
    totalSupply_ = totalSupply_.sub(_value);
    Burn(burner, _value, balances[burner], totalSupply_);
  }

}

/* Base contract for ERC-20 Craft Token Collectibles. 
 * @title Crypto Emoji - #Emojinomics
 * @author Fazri Zubair & Farhan Khwaja (Lucid Sight, Inc.)
 */
contract CraftToken is MutableToken {
  string public name;
  string public symbol;
  uint8 public decimals;

  function CraftToken(string emoji, string symb) public {
    require(EmojiToken(msg.sender).isEmoji());
    master = msg.sender;
    name = emoji;
    symbol = symb;
    decimals = 8;
  }
}


/* Base contract for ERC-721 Emoji Token Collectibles. 
 * @title Crypto Emoji - #Emojinomics
 * @author Fazri Zubair & Farhan Khwaja (Lucid Sight, Inc.)
 */
contract EmojiToken is ERC721 {
  using strings for *;

  /*** EVENTS ***/
  event Birth(uint256 tokenId, string name, address owner);

  event TokenSold(uint256 tokenId, uint256 oldPrice, uint256 newPrice, address prevOwner, address winner, string name);

  event Transfer(address from, address to, uint256 tokenId);

  event EmojiMessageUpdated(address from, uint256 tokenId, string message);

  event TokenBurnt(uint256 tokenId, address master);

  /*** CONSTANTS ***/

  /// @notice Name and symbol of the non fungible token, as defined in ERC721.
  string public constant NAME = "CryptoEmoji";
  string public constant SYMBOL = "CE";

  uint256 private constant PROMO_CREATION_LIMIT = 1000;

  uint256 private startingPrice = 0.001 ether;
  uint256 private firstStepLimit =  0.063 ether;
  uint256 private secondStepLimit = 0.52 ether;

  //5% to contract
  uint256 ownerCut = 5;

  bool ownerCutIsLocked;

  //One Craft token 1 has 8 decimals
  uint256 oneCraftToken = 100000000;

  /*** STORAGE ***/

  /// @dev A mapping from EMOJI IDs to the address that owns them. All emojis must have
  ///  some valid owner address.
  mapping (uint256 => address) public emojiIndexToOwner;

  // @dev A mapping from owner address to count of tokens that address owns.
  //  Used internally inside balanceOf() to resolve ownership count.
  mapping (address => uint256) private ownershipTokenCount;

  /// @dev A mapping from Emojis to an address that has been approved to call
  ///  transferFrom(). Each Emoji can only have one approved address for transfer
  ///  at any time. A zero value means no approval is outstanding.
  mapping (uint256 => address) public emojiIndexToApproved;

  // @dev A mapping from emojis to the price of the token.
  mapping (uint256 => uint256) private emojiIndexToPrice;

  // @dev A mapping from emojis in existence 
  mapping (string => bool) private emojiCreated;

  mapping (uint256 => address) private emojiCraftTokenAddress;

  // The addresses of the accounts (or contracts) that can execute actions within each roles.
  address public ceoAddress;
  address public cooAddress;

  uint256 public promoCreatedCount;

  /*** DATATYPES ***/
  struct Emoji {
    string name;
    string msg;
  }

  struct MemoryHolder {
    mapping(uint256 => uint256) bal;
    mapping(uint256 => uint256) used;
  }


  Emoji[] private emojis;

  /*** ACCESS MODIFIERS ***/
  /// @dev Access modifier for CEO-only functionality
  modifier onlyCEO() {
    require(msg.sender == ceoAddress);
    _;
  }

  /// @dev Access modifier for COO-only functionality
  modifier onlyCOO() {
    require(msg.sender == cooAddress);
    _;
  }
  
  /// Access modifier for contract owner only functionality
  modifier onlyCLevel() {
    require(
      msg.sender == ceoAddress ||
      msg.sender == cooAddress
    );
    _;
  }
  
  /*** CONSTRUCTOR ***/
  function EmojiToken() public {
    ceoAddress = msg.sender;
    cooAddress = msg.sender;
  }

  function isEmoji() public returns (bool) {
    return true;
  }

  /// @notice Here for bug related migration
  function migrateCraftTokenMaster(uint tokenId, address newMasterContract) public onlyCLevel {
    CraftToken(emojiCraftTokenAddress[tokenId]).setContractMaster(newMasterContract);
  }

  /*** PUBLIC FUNCTIONS ***/
  /// @notice Grant another address the right to transfer token via takeOwnership() and transferFrom().
  /// @param _to The address to be granted transfer approval. Pass address(0) to
  ///  clear all approvals.
  /// @param _tokenId The ID of the Token that can be transferred if this call succeeds.
  /// @dev Required for ERC-721 compliance.
  function approve(
    address _to,
    uint256 _tokenId
  ) public {
    // Caller must own token.
    require(_owns(msg.sender, _tokenId));

    emojiIndexToApproved[_tokenId] = _to;

    Approval(msg.sender, _to, _tokenId);
  }

  /// For querying balance of a particular account
  /// @param _owner The address for balance query
  /// @dev Required for ERC-721 compliance.
  function balanceOf(address _owner) public view returns (uint256 balance) {
    return ownershipTokenCount[_owner];
  }

  
  /// @dev Creates a new promo Emoji with the given name, with given _price and assignes it to an address.
  function createPromoEmoji(address _owner, string _name, string _symb, uint256 _price) public onlyCLevel {
    require(promoCreatedCount < PROMO_CREATION_LIMIT);

    address emojiOwner = _owner;
    if (emojiOwner == address(0)) {
      emojiOwner = cooAddress;
    }

    if (_price <= 0) {
      _price = startingPrice;
    }

    promoCreatedCount++;

    uint256 indx = _createEmoji(_name, emojiOwner, _price);
    //Creates token contract
    emojiCraftTokenAddress[indx] = new CraftToken(_name, _symb);
  }

  /// @dev Creates a new Emoji with the given name.
  function createBaseEmoji(string _name, string _symb) public onlyCLevel {
    uint256 indx = _createEmoji(_name, address(this), startingPrice);
    //Creates token contract
    emojiCraftTokenAddress[indx] = new CraftToken(_name, _symb);
  }

  function createEmojiStory(uint[] _parts) public {
    MemoryHolder storage memD;

    string memory mashUp = "";
    uint price;

    for(uint i = 0; i < _parts.length; i++) {

      if(memD.bal[_parts[i]] == 0) {
        memD.bal[_parts[i]] = CraftToken(emojiCraftTokenAddress[_parts[i]]).balanceOf(msg.sender);
      }
      memD.used[_parts[i]]++;

      require(CraftToken(emojiCraftTokenAddress[_parts[i]]).balanceOf(msg.sender) >= memD.used[_parts[i]]);

      price += emojiIndexToPrice[_parts[i]];
      mashUp = mashUp.toSlice().concat(emojis[_parts[i]].name.toSlice()); 
    }
      
    //Creates Mash Up
    _createEmoji(mashUp,msg.sender,price);

    //BURN
    for(uint iii = 0; iii < _parts.length; iii++) {
      CraftToken(emojiCraftTokenAddress[_parts[iii]]).burn(oneCraftToken, msg.sender);
      TokenBurnt(_parts[iii], emojiCraftTokenAddress[_parts[iii]]);
    }
    
  }

   /// @notice Returns all the relevant information about a specific emoji.
  /// @param _tokenId The tokenId of the emoji of interest.
  function getCraftTokenAddress(uint256 _tokenId) public view returns (
    address masterErc20
  ) {
    masterErc20 = emojiCraftTokenAddress[_tokenId];
  }

  /// @notice Returns all the relevant information about a specific emoji.
  /// @param _tokenId The tokenId of the emoji of interest.
  function getEmoji(uint256 _tokenId) public view returns (
    string emojiName,
    string emojiMsg,
    uint256 sellingPrice,
    address owner
  ) {
    Emoji storage emojiObj = emojis[_tokenId];
    emojiName = emojiObj.name;
    emojiMsg = emojiObj.msg;
    sellingPrice = emojiIndexToPrice[_tokenId];
    owner = emojiIndexToOwner[_tokenId];
  }

  function implementsERC721() public pure returns (bool) {
    return true;
  }

  /// @dev Required for ERC-721 compliance.
  function name() public pure returns (string) {
    return NAME;
  }

  /// For querying owner of token
  /// @param _tokenId The tokenID for owner inquiry
  /// @dev Required for ERC-721 compliance.
  function ownerOf(uint256 _tokenId)
    public
    view
    returns (address owner)
  {
    owner = emojiIndexToOwner[_tokenId];
    require(owner != address(0));
  }

  function payout(address _to) public onlyCLevel {
    _payout(_to);
  }

  // Allows someone to send ether and obtain the token
  function purchase(uint256 _tokenId) public payable {
    address oldOwner = emojiIndexToOwner[_tokenId];
    uint sellingPrice = emojiIndexToPrice[_tokenId];
    address newOwner = msg.sender;

    // Making sure token owner is not sending to self
    require(oldOwner != newOwner);

    // Safety check to prevent against an unexpected 0x0 default.
    require(_addressNotNull(newOwner));

    // Making sure sent amount is greater than or equal to the sellingPrice
    require(msg.value >= sellingPrice);

    uint256 percentage = SafeMath.sub(100, ownerCut);
    uint256 payment = uint256(SafeMath.div(SafeMath.mul(sellingPrice, percentage), 100));
    uint256 purchaseExcess = SafeMath.sub(msg.value, sellingPrice);

    // Update prices
    if (sellingPrice < firstStepLimit) {
      // first stage
      emojiIndexToPrice[_tokenId] = SafeMath.div(SafeMath.mul(sellingPrice, 200), percentage);
    } else if (sellingPrice < secondStepLimit) {
      // second stage
      emojiIndexToPrice[_tokenId] = SafeMath.div(SafeMath.mul(sellingPrice, 130), percentage);
    } else {
      // third stage
      emojiIndexToPrice[_tokenId] = SafeMath.div(SafeMath.mul(sellingPrice, 115), percentage);
    }

    _transfer(oldOwner, newOwner, _tokenId);

    // Pay previous tokenOwner if owner is not contract
    if (oldOwner != address(this)) {
      oldOwner.transfer(payment); //(1-0.06)
    }

    TokenSold(_tokenId, sellingPrice, emojiIndexToPrice[_tokenId], oldOwner, newOwner, emojis[_tokenId].name);

    msg.sender.transfer(purchaseExcess);

    //if Non-Story
    if(emojiCraftTokenAddress[_tokenId] != address(0)) {
      CraftToken(emojiCraftTokenAddress[_tokenId]).mint(oldOwner,oneCraftToken);
      CraftToken(emojiCraftTokenAddress[_tokenId]).mint(msg.sender,oneCraftToken);
    }
    
  }

  function transferTokenToCEO(uint256 _tokenId, uint qty) public onlyCLevel {
    CraftToken(emojiCraftTokenAddress[_tokenId]).transfer(ceoAddress,qty);
  }

  function priceOf(uint256 _tokenId) public view returns (uint256 price) {
    return emojiIndexToPrice[_tokenId];
  }

  /// @dev Assigns a new address to act as the CEO. Only available to the current CEO.
  /// @param _newCEO The address of the new CEO
  function setCEO(address _newCEO) public onlyCEO {
    require(_newCEO != address(0));

    ceoAddress = _newCEO;
  }

  /// @dev Assigns a new address to act as the COO. Only available to the current CEO.
  /// @param _newCOO The address of the new COO
  function setCOO(address _newCOO) public onlyCOO {
    require(_newCOO != address(0));

    cooAddress = _newCOO;
  }

  /// @dev Required for ERC-721 compliance.
  function symbol() public pure returns (string) {
    return SYMBOL;
  }

  /// @notice Allow pre-approved user to take ownership of a token
  /// @param _tokenId The ID of the Token that can be transferred if this call succeeds.
  /// @dev Required for ERC-721 compliance.
  function takeOwnership(uint256 _tokenId) public {
    address newOwner = msg.sender;
    address oldOwner = emojiIndexToOwner[_tokenId];

    // Safety check to prevent against an unexpected 0x0 default.
    require(_addressNotNull(newOwner));

    // Making sure transfer is approved
    require(_approved(newOwner, _tokenId));

    _transfer(oldOwner, newOwner, _tokenId);
  }

  function setEmojiMsg(uint256 _tokenId, string message) public {
    require(_owns(msg.sender, _tokenId));
    Emoji storage item = emojis[_tokenId];
    item.msg = bytes32ToString(stringToBytes32(message));

    EmojiMessageUpdated(msg.sender, _tokenId, item.msg);
  }

  function stringToBytes32(string memory source) internal returns (bytes32 result) {
        bytes memory tempEmptyStringTest = bytes(source);
        if (tempEmptyStringTest.length == 0) {
            return 0x0;
        }
    
        assembly {
            result := mload(add(source, 32))
        }
    }

  function bytes32ToString(bytes32 x) constant internal returns (string) {
        bytes memory bytesString = new bytes(32);
        uint charCount = 0;
        for (uint j = 0; j < 32; j++) {
            byte char = byte(bytes32(uint(x) * 2 ** (8 * j)));
            if (char != 0) {
                bytesString[charCount] = char;
                charCount++;
            }
        }
        bytes memory bytesStringTrimmed = new bytes(charCount);
        for (j = 0; j < charCount; j++) {
            bytesStringTrimmed[j] = bytesString[j];
        }
        return string(bytesStringTrimmed);
    }

  /// @param _owner The owner whose emoji tokens we are interested in.
  /// @dev This method MUST NEVER be called by smart contract code. First, it's fairly
  ///  expensive (it walks the entire Emojis array looking for emojis belonging to owner),
  ///  but it also returns a dynamic array, which is only supported for web3 calls, and
  ///  not contract-to-contract calls.
  function tokensOfOwner(address _owner) public view returns(uint256[] ownerTokens) {
    uint256 tokenCount = balanceOf(_owner);
    if (tokenCount == 0) {
        // Return an empty array
      return new uint256[](0);
    } else {
      uint256[] memory result = new uint256[](tokenCount);
      uint256 totalEmojis = totalSupply();
      uint256 resultIndex = 0;

      uint256 emojiId;
      for (emojiId = 0; emojiId <= totalEmojis; emojiId++) {
        if (emojiIndexToOwner[emojiId] == _owner) {
          result[resultIndex] = emojiId;
          resultIndex++;
        }
      }
      return result;
    }
  }

  /// For querying totalSupply of token
  /// @dev Required for ERC-721 compliance.
  function totalSupply() public view returns (uint256 total) {
    return emojis.length;
  }

  /// Owner initates the transfer of the token to another account
  /// @param _to The address for the token to be transferred to.
  /// @param _tokenId The ID of the Token that can be transferred if this call succeeds.
  /// @dev Required for ERC-721 compliance.
  function transfer(
    address _to,
    uint256 _tokenId
  ) public {
    require(_owns(msg.sender, _tokenId));
    require(_addressNotNull(_to));

    _transfer(msg.sender, _to, _tokenId);
  }

  /// Third-party initiates transfer of token from address _from to address _to
  /// @param _from The address for the token to be transferred from.
  /// @param _to The address for the token to be transferred to.
  /// @param _tokenId The ID of the Token that can be transferred if this call succeeds.
  /// @dev Required for ERC-721 compliance.
  function transferFrom(
    address _from,
    address _to,
    uint256 _tokenId
  ) public {
    require(_owns(_from, _tokenId));
    require(_approved(_to, _tokenId));
    require(_addressNotNull(_to));

    _transfer(_from, _to, _tokenId);
  }

  /*** PRIVATE FUNCTIONS ***/
  /// Safety check on _to address to prevent against an unexpected 0x0 default.
  function _addressNotNull(address _to) private pure returns (bool) {
    return _to != address(0);
  }

  /// For checking approval of transfer for address _to
  function _approved(address _to, uint256 _tokenId) private view returns (bool) {
    return emojiIndexToApproved[_tokenId] == _to;
  }

  /// For creating Emoji
  function _createEmoji(string _name, address _owner, uint256 _price) private returns(uint256) {
    require(emojiCreated[_name] == false);
    Emoji memory _emoji = Emoji({
      name: _name,
      msg: "💥New💥"
    });
    uint256 newEmojiId = emojis.push(_emoji) - 1;

    // It's probably never going to happen, 4 billion tokens are A LOT, but
    // let's just be 100% sure we never let this happen.
    require(newEmojiId == uint256(uint32(newEmojiId)));

    Birth(newEmojiId, _name, _owner);

    emojiIndexToPrice[newEmojiId] = _price;

    // This will assign ownership, and also emit the Transfer event as
    // per ERC721 draft
    _transfer(address(0), _owner, newEmojiId);
    emojiCreated[_name] = true;

    return newEmojiId;
  }

  /// Check for token ownership
  function _owns(address claimant, uint256 _tokenId) private view returns (bool) {
    return claimant == emojiIndexToOwner[_tokenId];
  }

  /// For paying out balance on contract
  function _payout(address _to) private {
    if (_to == address(0)) {
      ceoAddress.transfer(this.balance);
    }
  }

  /// @dev Assigns ownership of a specific Emoji to an address.
  function _transfer(address _from, address _to, uint256 _tokenId) private {
    // Since the number of emojis is capped to 2^32 we can't overflow this
    ownershipTokenCount[_to]++;
    //transfer ownership
    emojiIndexToOwner[_tokenId] = _to;

    // When creating new emojis _from is 0x0, but we can't account that address.
    if (_from != address(0)) {
      ownershipTokenCount[_from]--;
      // clear any previously approved ownership exchange
      delete emojiIndexToApproved[_tokenId];
    }

    // Emit the transfer event.
    Transfer(_from, _to, _tokenId);
  }

  /// @dev Updates ownerCut
  function updateOwnerCut(uint256 _newCut) external onlyCLevel{
    require(ownerCut <= 9);
    require(ownerCutIsLocked == false);
    ownerCut = _newCut;
  }

  /// @dev Lock ownerCut
  function lockOwnerCut(uint confirmCode) external onlyCLevel{
    /// Not a secert just to make sure we don't accidentally submit this function
    if(confirmCode == 197428124) {
    ownerCutIsLocked = true;
    }
  }
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[],"name":"promoCreatedCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"ceoAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"}],"name":"payout","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"implementsERC721","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"total","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_owner","type":"address"},{"name":"_name","type":"string"},{"name":"_symb","type":"string"},{"name":"_price","type":"uint256"}],"name":"createPromoEmoji","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newCEO","type":"address"}],"name":"setCEO","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newCOO","type":"address"}],"name":"setCOO","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"confirmCode","type":"uint256"}],"name":"lockOwnerCut","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"emojiIndexToApproved","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"emojiIndexToOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"tokenId","type":"uint256"},{"name":"newMasterContract","type":"address"}],"name":"migrateCraftTokenMaster","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"name":"owner","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"name":"ownerTokens","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"NAME","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"transfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"isEmoji","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"cooAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"takeOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"priceOf","outputs":[{"name":"price","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"getEmoji","outputs":[{"name":"emojiName","type":"string"},{"name":"emojiMsg","type":"string"},{"name":"sellingPrice","type":"uint256"},{"name":"owner","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"string"},{"name":"_symb","type":"string"}],"name":"createBaseEmoji","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"},{"name":"message","type":"string"}],"name":"setEmojiMsg","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newCut","type":"uint256"}],"name":"updateOwnerCut","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"getCraftTokenAddress","outputs":[{"name":"masterErc20","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"},{"name":"qty","type":"uint256"}],"name":"transferTokenToCEO","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"purchase","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"SYMBOL","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_parts","type":"uint256[]"}],"name":"createEmojiStory","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"tokenId","type":"uint256"},{"indexed":false,"name":"name","type":"string"},{"indexed":false,"name":"owner","type":"address"}],"name":"Birth","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"tokenId","type":"uint256"},{"indexed":false,"name":"oldPrice","type":"uint256"},{"indexed":false,"name":"newPrice","type":"uint256"},{"indexed":false,"name":"prevOwner","type":"address"},{"indexed":false,"name":"winner","type":"address"},{"indexed":false,"name":"name","type":"string"}],"name":"TokenSold","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"from","type":"address"},{"indexed":false,"name":"to","type":"address"},{"indexed":false,"name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"from","type":"address"},{"indexed":false,"name":"tokenId","type":"uint256"},{"indexed":false,"name":"message","type":"string"}],"name":"EmojiMessageUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"tokenId","type":"uint256"},{"indexed":false,"name":"master","type":"address"}],"name":"TokenBurnt","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"approved","type":"address"},{"indexed":false,"name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"}]

606060405266038d7ea4c6800060005566dfd22a8cd98000600155670737693eb334000060025560056003556305f5e100600555341561003e57600080fd5b600c8054600160a060020a033316600160a060020a03199182168117909255600d80549091169091179055613794806100786000396000f300606060405260043610620001b55763ffffffff60e060020a60003504166305e455468114620001ba57806306fdde0314620001e2578063095ea7b314620002725780630a0f816814620002995780630b7e9c4414620002cb5780631051db3414620002ed57806318160ddd14620003175780632112afe6146200032d57806323b872dd14620003d357806327d7874c14620003fe5780632ba73c1514620004205780634071e94e14620004425780634d8a5a57146200045b5780634ea409fa1462000474578063541e8515146200048d5780636352211e14620004b257806370a0823114620004cb5780638462151c14620004ed57806395d89b411462000564578063a3f4df7e146200057a578063a9059cbb1462000590578063aa8f027b14620002ed578063b047fb5014620005b5578063b2e6ceeb14620005cb578063b9186d7d14620005e4578063be7d97b314620005fd578063c721e51b1462000715578063cef13a3414620007ab578063d905bf921462000804578063e55db1e3146200081d578063ef7e81d91462000836578063efef39a11462000852578063f76f8d78146200085f578063fa84cb021462000875575b600080fd5b3415620001c657600080fd5b620001d0620008c7565b60405190815260200160405180910390f35b3415620001ee57600080fd5b620001f8620008cd565b60405160208082528190810183818151815260200191508051906020019080838360005b83811015620002365780820151838201526020016200021c565b50505050905090810190601f168015620002645780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156200027e57600080fd5b62000297600160a060020a036004351660243562000911565b005b3415620002a557600080fd5b620002af62000993565b604051600160a060020a03909116815260200160405180910390f35b3415620002d757600080fd5b62000297600160a060020a0360043516620009a2565b3415620002f957600080fd5b62000303620009e8565b604051901515815260200160405180910390f35b34156200032357600080fd5b620001d0620009ed565b34156200033957600080fd5b6200029760048035600160a060020a03169060446024803590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284378201915050505050509190803590602001908201803590602001908080601f0160208091040260200160405190810160405281815292919060208401838380828437509496505093359350620009f392505050565b3415620003df57600080fd5b62000297600160a060020a036004358116906024351660443562000bbd565b34156200040a57600080fd5b62000297600160a060020a036004351662000c16565b34156200042c57600080fd5b62000297600160a060020a036004351662000c6a565b34156200044e57600080fd5b6200029760043562000cbe565b34156200046757600080fd5b620002af60043562000d13565b34156200048057600080fd5b620002af60043562000d2e565b34156200049957600080fd5b62000297600435600160a060020a036024351662000d49565b3415620004be57600080fd5b620002af60043562000dfa565b3415620004d757600080fd5b620001d0600160a060020a036004351662000e24565b3415620004f957600080fd5b6200050f600160a060020a036004351662000e3f565b60405160208082528190810183818151815260200191508051906020019060200280838360005b838110156200055057808201518382015260200162000536565b505050509050019250505060405180910390f35b34156200057057600080fd5b620001f862000f30565b34156200058657600080fd5b620001f862000f73565b34156200059c57600080fd5b62000297600160a060020a036004351660243562000faa565b3415620005c157600080fd5b620002af62000fea565b3415620005d757600080fd5b6200029760043562000ff9565b3415620005f057600080fd5b620001d06004356200104f565b34156200060957600080fd5b6200061660043562001061565b60405160408101839052600160a060020a0382166060820152608080825281906020820190820187818151815260200191508051906020019080838360005b838110156200066f57808201518382015260200162000655565b50505050905090810190601f1680156200069d5780820380516001836020036101000a031916815260200191505b50838103825286818151815260200191508051906020019080838360005b83811015620006d5578082015183820152602001620006bb565b50505050905090810190601f168015620007035780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390f35b34156200072157600080fd5b6200029760046024813581810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284378201915050505050509190803590602001908201803590602001908080601f0160208091040260200160405190810160405281815292919060208401838380828437509496506200120f95505050505050565b3415620007b757600080fd5b62000297600480359060446024803590810190830135806020601f820181900481020160405190810160405281815292919060208401838380828437509496506200138995505050505050565b34156200081057600080fd5b62000297600435620014be565b34156200082957600080fd5b620002af6004356200151e565b34156200084257600080fd5b6200029760043560243562001539565b6200029760043562001606565b34156200086b57600080fd5b620001f8620019fd565b34156200088157600080fd5b62000297600460248135818101908301358060208181020160405190810160405280939291908181526020018383602002808284375094965062001a3495505050505050565b600e5481565b620008d76200264f565b60408051908101604052600b81527f43727970746f456d6f6a69000000000000000000000000000000000000000000602082015290505b90565b6200091d338262001f10565b15156200092957600080fd5b600081815260086020526040908190208054600160a060020a031916600160a060020a038581169182179092559133909116907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259084905190815260200160405180910390a35050565b600c54600160a060020a031681565b600c5433600160a060020a0390811691161480620009ce5750600d5433600160a060020a039081169116145b1515620009da57600080fd5b620009e58162001f30565b50565b600190565b600f5490565b600c54600090819033600160a060020a039081169116148062000a245750600d5433600160a060020a039081169116145b151562000a3057600080fd5b600e546103e8901062000a4257600080fd5b859150600160a060020a038216151562000a6557600d54600160a060020a031691505b6000831162000a745760005492505b600e8054600101905562000a8a85838562001f7b565b9050848462000a9862002661565b808060200180602001838103835285818151815260200191508051906020019080838360005b8381101562000ad857808201518382015260200162000abe565b50505050905090810190601f16801562000b065780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b8381101562000b3e57808201518382015260200162000b24565b50505050905090810190601f16801562000b6c5780820380516001836020036101000a031916815260200191505b50945050505050604051809103906000f080151562000b8a57600080fd5b6000918252600b60205260409091208054600160a060020a031916600160a060020a039092169190911790555050505050565b62000bc9838262001f10565b151562000bd557600080fd5b62000be1828262002210565b151562000bed57600080fd5b62000bf88262002230565b151562000c0457600080fd5b62000c118383836200223e565b505050565b600c5433600160a060020a0390811691161462000c3257600080fd5b600160a060020a038116151562000c4857600080fd5b600c8054600160a060020a031916600160a060020a0392909216919091179055565b600d5433600160a060020a0390811691161462000c8657600080fd5b600160a060020a038116151562000c9c57600080fd5b600d8054600160a060020a031916600160a060020a0392909216919091179055565b600c5433600160a060020a039081169116148062000cea5750600d5433600160a060020a039081169116145b151562000cf657600080fd5b80630bc4839c1415620009e5576004805460ff1916600117905550565b600860205260009081526040902054600160a060020a031681565b600660205260009081526040902054600160a060020a031681565b600c5433600160a060020a039081169116148062000d755750600d5433600160a060020a039081169116145b151562000d8157600080fd5b6000828152600b60205260409081902054600160a060020a03169063e906e15c9083905160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b151562000de157600080fd5b6102c65a03f1151562000df357600080fd5b5050505050565b600081815260066020526040902054600160a060020a031680151562000e1f57600080fd5b919050565b600160a060020a031660009081526007602052604090205490565b62000e496200264f565b600062000e556200264f565b600080600062000e658762000e24565b945084151562000e9857600060405180591062000e7f5750595b9080825280602002602001820160405250955062000f26565b8460405180591062000ea75750595b9080825280602002602001820160405250935062000ec4620009ed565b925060009150600090505b82811162000f2257600081815260066020526040902054600160a060020a038881169116141562000f19578084838151811062000f0857fe5b602090810290910101526001909101905b60010162000ecf565b8395505b5050505050919050565b62000f3a6200264f565b60408051908101604052600281527f43450000000000000000000000000000000000000000000000000000000000006020820152905090565b60408051908101604052600b81527f43727970746f456d6f6a69000000000000000000000000000000000000000000602082015281565b62000fb6338262001f10565b151562000fc257600080fd5b62000fcd8262002230565b151562000fd957600080fd5b62000fe63383836200223e565b5050565b600d54600160a060020a031681565b6000818152600660205260409020543390600160a060020a03166200101e8262002230565b15156200102a57600080fd5b62001036828462002210565b15156200104257600080fd5b62000c118183856200223e565b60009081526009602052604090205490565b6200106b6200264f565b620010756200264f565b6000806000600f868154811015156200108a57fe5b90600052602060002090600202019050806000018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015620011365780601f106200110a5761010080835404028352916020019162001136565b820191906000526020600020905b8154815290600101906020018083116200111857829003601f168201915b50505050509450806001018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015620011d95780601f10620011ad57610100808354040283529160200191620011d9565b820191906000526020600020905b815481529060010190602001808311620011bb57829003601f168201915b50505060009889525050600960209081526040808920546006909252909720549597909695600160a060020a0316945092505050565b600c5460009033600160a060020a03908116911614806200123e5750600d5433600160a060020a039081169116145b15156200124a57600080fd5b62001259833060005462001f7b565b905082826200126762002661565b808060200180602001838103835285818151815260200191508051906020019080838360005b83811015620012a75780820151838201526020016200128d565b50505050905090810190601f168015620012d55780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b838110156200130d578082015183820152602001620012f3565b50505050905090810190601f1680156200133b5780820380516001836020036101000a031916815260200191505b50945050505050604051809103906000f08015156200135957600080fd5b6000918252600b60205260409091208054600160a060020a031916600160a060020a039092169190911790555050565b600062001397338462001f10565b1515620013a357600080fd5b600f805484908110620013b257fe5b90600052602060002090600202019050620013d7620013d18362002315565b62002344565b81600101908051620013ee92916020019062002672565b507f634b5460846831c24a814503a12dd9565272ed6455da326222526dee8b9117df338483600101604051600160a060020a03841681526020810183905260606040820181815283546002600019610100600184161502019091160491830182905290608083019084908015620014a95780601f106200147d57610100808354040283529160200191620014a9565b820191906000526020600020905b8154815290600101906020018083116200148b57829003601f168201915b505094505050505060405180910390a1505050565b600c5433600160a060020a0390811691161480620014ea5750600d5433600160a060020a039081169116145b1515620014f657600080fd5b60035460099011156200150857600080fd5b60045460ff16156200151957600080fd5b600355565b6000908152600b6020526040902054600160a060020a031690565b600c5433600160a060020a0390811691161480620015655750600d5433600160a060020a039081169116145b15156200157157600080fd5b6000828152600b602052604080822054600c54600160a060020a039182169363a9059cbb9391909216918591516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515620015e657600080fd5b6102c65a03f11515620015f857600080fd5b505050604051805150505050565b6000818152600660209081526040808320546009909252822054600160a060020a039182169290913391908190819084168614156200164457600080fd5b6200164f8462002230565b15156200165b57600080fd5b34859010156200166a57600080fd5b62001679606460035462002504565b9250620016936200168b868562002517565b606462002551565b9150620016a1348662002504565b9050600154851015620016db57620016c6620016bf8660c862002517565b8462002551565b60008881526009602052604090205562001718565b600254851015620016f757620016c6620016bf86608262002517565b62001708620016bf86607362002517565b6000888152600960205260409020555b620017258685896200223e565b30600160a060020a031686600160a060020a03161415156200177357600160a060020a03861682156108fc0283604051600060405180830381858888f1935050505015156200177357600080fd5b7e8201e7bcbf010c2c07de59d6e97cb7e3cf67a46125c49cbc89b9d2cde1f48f8786600960008b8152602001908152602001600020548988600f8d815481101515620017bb57fe5b90600052602060002090600202016000016040518681526020810186905260408101859052600160a060020a0380851660608301528316608082015260c060a082018181528354600260001961010060018416150201909116049183018290529060e083019084908015620018745780601f10620018485761010080835404028352916020019162001874565b820191906000526020600020905b8154815290600101906020018083116200185657829003601f168201915b505097505050505050505060405180910390a1600160a060020a03331681156108fc0282604051600060405180830381858888f193505050501515620018b957600080fd5b6000878152600b6020526040902054600160a060020a031615620019f4576000878152600b602052604080822054600554600160a060020a03909116926340c10f19928a929190516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b15156200194957600080fd5b6102c65a03f115156200195b57600080fd5b505050604051805150506000878152600b602052604080822054600554600160a060020a03909116926340c10f199233929190516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515620019d757600080fd5b6102c65a03f11515620019e957600080fd5b505050604051805150505b50505050505050565b60408051908101604052600281527f4345000000000000000000000000000000000000000000000000000000000000602082015281565b600062001a406200264f565b60008060006020604051908101604052600080825290945091505b855182101562001dab5784600087848151811062001a7557fe5b906020019060200201518152602001908152602001600020546000141562001b6557600b600087848151811062001aa857fe5b90602001906020020151815260208101919091526040908101600090812054600160a060020a0316916370a08231913391516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151562001b1d57600080fd5b6102c65a03f1151562001b2f57600080fd5b5050506040518051905085600088858151811062001b4957fe5b9060200190602002015181526020810191909152604001600020555b84600101600087848151811062001b7857fe5b906020019060200201518152602081019190915260400160009081208054600190810190915586019087848151811062001bae57fe5b90602001906020020151815260200190815260200160002054600b600088858151811062001bd857fe5b90602001906020020151815260208101919091526040908101600090812054600160a060020a0316916370a08231913391516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151562001c4d57600080fd5b6102c65a03f1151562001c5f57600080fd5b505050604051805190501015151562001c7757600080fd5b6009600087848151811062001c8857fe5b906020019060200201518152602001908152602001600020548301925062001d9d62001d85600f88858151811062001cbc57fe5b906020019060200201518154811062001cd157fe5b90600052602060002090600202016000018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801562001d7a5780601f1062001d4e5761010080835404028352916020019162001d7a565b820191906000526020600020905b81548152906001019060200180831162001d5c57829003601f168201915b505050505062002569565b62001d908662002569565b9063ffffffff6200259316565b935060019091019062001a5b565b62001db884338562001f7b565b50600090505b855181101562001f0857600b600087838151811062001dd957fe5b90602001906020020151815260200190815260200160002060009054906101000a9004600160a060020a0316600160a060020a031663fcd3533c6005543360405160e060020a63ffffffff85160281526004810192909252600160a060020a03166024820152604401600060405180830381600087803b151562001e5c57600080fd5b6102c65a03f1151562001e6e57600080fd5b5050507f41b05bf655882bc27017be44e8216d1059cbc6b9668d754f5a745dcce690a9d486828151811062001e9f57fe5b90602001906020020151600b600089858151811062001eba57fe5b9060200190602002015181526020810191909152604090810160002054600160a060020a03169051918252600160a060020a031660208201526040908101905180910390a160010162001dbe565b505050505050565b600090815260066020526040902054600160a060020a0390811691161490565b600160a060020a0381161515620009e557600c54600160a060020a039081169030163180156108fc0290604051600060405180830381858888f193505050501515620009e557600080fd5b600062001f87620026f7565b6000600a866040518082805190602001908083835b6020831062001fbd5780518252601f19909201916020918201910162001f9c565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040519081900390205460ff16156200200057600080fd5b604080519081016040528087815260200160408051908101604052600b81527ff09f92a54e6577f09f92a500000000000000000000000000000000000000000060208201529052600f805491935060019180830162002060838262002720565b600092835260209092208591600202018151819080516200208692916020019062002672565b50602082015181600101908051620020a392916020019062002672565b50505003905063ffffffff81168114620020bc57600080fd5b7fb3b0cf861f168bcdb275c69da97b2543631552ba562628aa3c7317d4a6089ef2818787604051838152600160a060020a038216604082015260606020820181815290820184818151815260200191508051906020019080838360005b838110156200213357808201518382015260200162002119565b50505050905090810190601f168015620021615780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a160008181526009602052604081208590556200218e9086836200223e565b6001600a876040518082805190602001908083835b60208310620021c45780518252601f199092019160209182019101620021a3565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051908190039020805460ff191691151591909117905595945050505050565b600090815260086020526040902054600160a060020a0391821691161490565b600160a060020a0316151590565b600160a060020a03808316600081815260076020908152604080832080546001019055858352600690915290208054600160a060020a0319169091179055831615620022c057600160a060020a03831660009081526007602090815260408083208054600019019055838352600890915290208054600160a060020a03191690555b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef838383604051600160a060020a039384168152919092166020820152604080820192909252606001905180910390a1505050565b6000620023216200264f565b5081805115156200233657600091506200233e565b602083015191505b50919050565b6200234e6200264f565b620023586200264f565b6000806000620023676200264f565b6020604051805910620023775750595b818152601f19601f83011681016020016040529050945060009350600092505b602083101562002426576008830260020a870291507fff000000000000000000000000000000000000000000000000000000000000008216156200241a5781858581518110620023e357fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506001909301925b60019092019162002397565b83604051805910620024355750595b818152601f19601f830116810160200160405290509050600092505b83831015620024fa578483815181106200246757fe5b01602001517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002818481518110620024be57fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060019092019162002451565b9695505050505050565b6000828211156200251157fe5b50900390565b6000808315156200252c57600091506200254a565b508282028284828115156200253d57fe5b04146200254657fe5b8091505b5092915050565b60008082848115156200256057fe5b04949350505050565b620025736200274f565b602082016040805190810160405280845181526020019190915292915050565b6200259d6200264f565b620025a76200264f565b60008351855101604051805910620025bc5750595b818152601f19601f830116810160200160405290509150602082019050620025eb818660200151875162002608565b62002600855182018560200151865162002608565b509392505050565b60005b602082106200263057825184526020840193506020830192506020820391506200260b565b6001826020036101000a03905080198351168185511617909352505050565b60206040519081016040526000815290565b604051610f65806200280483390190565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620026b557805160ff1916838001178555620026e5565b82800160010185558215620026e5579182015b82811115620026e5578251825591602001919060010190620026c8565b50620026f392915062002766565b5090565b60408051908101604052806200270c6200264f565b81526020016200271b6200264f565b905290565b81548183558181151162000c115760020281600202836000526020600020918201910162000c11919062002783565b604080519081016040526000808252602082015290565b6200090e91905b80821115620026f357600081556001016200276d565b6200090e91905b80821115620026f3576000620027a18282620027bb565b620027b1600183016000620027bb565b506002016200278a565b50805460018160011615610100020316600290046000825580601f10620027e35750620009e5565b601f016020900490600052602060002090810190620009e59190620027665600606060405234156200001057600080fd5b60405162000f6538038062000f658339810160405280805182019190602001805160038054600160a060020a03191633600160a060020a0316908117909155920191905063aa8f027b6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515620000aa57600080fd5b6102c65a03f11515620000bc57600080fd5b505050604051805190501515620000d257600080fd5b60048054600160a060020a03191633600160a060020a03161790556005828051620001029291602001906200012e565b506006818051620001189291602001906200012e565b50506007805460ff1916600817905550620001d3565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200017157805160ff1916838001178555620001a1565b82800160010185558215620001a1579182015b82811115620001a157825182559160200191906001019062000184565b50620001af929150620001b3565b5090565b620001d091905b80821115620001af5760008155600101620001ba565b90565b610d8280620001e36000396000f3006060604052600436106100e55763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde0381146100ea578063095ea7b31461017457806318160ddd146101aa57806323b872dd146101cf578063313ce567146101f757806340c10f1914610220578063661884631461024257806370a08231146102645780638da5cb5b1461028357806395d89b41146102b2578063a9059cbb146102c5578063d73dd623146102e7578063dd62ed3e14610309578063e906e15c1461032e578063f2fde38b1461034f578063fcd3533c1461036e575b600080fd5b34156100f557600080fd5b6100fd610390565b60405160208082528190810183818151815260200191508051906020019080838360005b83811015610139578082015183820152602001610121565b50505050905090810190601f1680156101665780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561017f57600080fd5b610196600160a060020a036004351660243561042e565b604051901515815260200160405180910390f35b34156101b557600080fd5b6101bd61049a565b60405190815260200160405180910390f35b34156101da57600080fd5b610196600160a060020a03600435811690602435166044356104a0565b341561020257600080fd5b61020a610620565b60405160ff909116815260200160405180910390f35b341561022b57600080fd5b610196600160a060020a0360043516602435610629565b341561024d57600080fd5b610196600160a060020a0360043516602435610735565b341561026f57600080fd5b6101bd600160a060020a036004351661082f565b341561028e57600080fd5b61029661084a565b604051600160a060020a03909116815260200160405180910390f35b34156102bd57600080fd5b6100fd610859565b34156102d057600080fd5b610196600160a060020a03600435166024356108c4565b34156102f257600080fd5b610196600160a060020a03600435166024356109d6565b341561031457600080fd5b6101bd600160a060020a0360043581169060243516610a7a565b341561033957600080fd5b61034d600160a060020a0360043516610aa5565b005b341561035a57600080fd5b61034d600160a060020a0360043516610b89565b341561037957600080fd5b61034d600435600160a060020a0360243516610c24565b60058054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156104265780601f106103fb57610100808354040283529160200191610426565b820191906000526020600020905b81548152906001019060200180831161040957829003601f168201915b505050505081565b600160a060020a03338116600081815260026020908152604080832094871680845294909152808220859055909291907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259085905190815260200160405180910390a350600192915050565b60015490565b6000600160a060020a03831615156104b757600080fd5b600160a060020a0384166000908152602081905260409020548211156104dc57600080fd5b600160a060020a038085166000908152600260209081526040808320339094168352929052205482111561050f57600080fd5b600160a060020a038416600090815260208190526040902054610538908363ffffffff610d2e16565b600160a060020a03808616600090815260208190526040808220939093559085168152205461056d908363ffffffff610d4016565b600160a060020a03808516600090815260208181526040808320949094558783168252600281528382203390931682529190915220546105b3908363ffffffff610d2e16565b600160a060020a03808616600081815260026020908152604080832033861684529091529081902093909355908516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9085905190815260200160405180910390a35060019392505050565b60075460ff1681565b60045460009033600160a060020a0390811691161461064757600080fd5b60015461065a908363ffffffff610d4016565b600155600160a060020a038316600090815260208190526040902054610686908363ffffffff610d4016565b600160a060020a0384166000818152602081905260409081902083905560015491927fb4c03061fb5b7fed76389d5af8f2e0ddb09f8c70d1333abbb62582835e10accb9286925180848152602001838152602001828152602001935050505060405180910390a2600160a060020a03831660007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405190815260200160405180910390a350600192915050565b600160a060020a0333811660009081526002602090815260408083209386168352929052908120548083111561079257600160a060020a0333811660009081526002602090815260408083209388168352929052908120556107c9565b6107a2818463ffffffff610d2e16565b600160a060020a033381166000908152600260209081526040808320938916835292905220555b600160a060020a0333811660008181526002602090815260408083209489168084529490915290819020547f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925915190815260200160405180910390a35060019392505050565b600160a060020a031660009081526020819052604090205490565b600354600160a060020a031681565b60068054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156104265780601f106103fb57610100808354040283529160200191610426565b6000600160a060020a03831615156108db57600080fd5b600160a060020a03331660009081526020819052604090205482111561090057600080fd5b600160a060020a033316600090815260208190526040902054610929908363ffffffff610d2e16565b600160a060020a03338116600090815260208190526040808220939093559085168152205461095e908363ffffffff610d4016565b60008085600160a060020a0316600160a060020a031681526020019081526020016000208190555082600160a060020a031633600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405190815260200160405180910390a350600192915050565b600160a060020a033381166000908152600260209081526040808320938616835292905290812054610a0e908363ffffffff610d4016565b600160a060020a0333811660008181526002602090815260408083209489168084529490915290819020849055919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591905190815260200160405180910390a350600192915050565b600160a060020a03918216600090815260026020908152604080832093909416825291909152205490565b60035433600160a060020a03908116911614610ac057600080fd5b600160a060020a0381161515610ad557600080fd5b80600160a060020a031663aa8f027b6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610b3457600080fd5b6102c65a03f11515610b4557600080fd5b505050604051805190501515610b5a57600080fd5b6004805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60035433600160a060020a03908116911614610ba457600080fd5b600160a060020a0381161515610bb957600080fd5b600354600160a060020a0380831691167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36003805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60045460009033600160a060020a03908116911614610c4257600080fd5b600160a060020a038216600090815260208190526040902054831115610c6757600080fd5b50600160a060020a0381166000908152602081905260409020548190610c93908463ffffffff610d2e16565b600160a060020a038216600090815260208190526040902055600154610cbf908463ffffffff610d2e16565b6001819055600160a060020a038216600081815260208190526040908190205491927f743033787f4738ff4d6a7225ce2bd0977ee5f86b91a902a58f5e4d0b297b46449287929091905180848152602001838152602001828152602001935050505060405180910390a2505050565b600082821115610d3a57fe5b50900390565b600082820183811015610d4f57fe5b93925050505600a165627a7a723058206e27d0f59e9af9aa87e91752c1b5894219165844983bed9ba56c4941f45971640029a165627a7a7230582050907e595da7a55c70586f1e0379ae7487c7514553935a8ce236a8b052faa0c40029

Deployed Bytecode

0x606060405260043610620001b55763ffffffff60e060020a60003504166305e455468114620001ba57806306fdde0314620001e2578063095ea7b314620002725780630a0f816814620002995780630b7e9c4414620002cb5780631051db3414620002ed57806318160ddd14620003175780632112afe6146200032d57806323b872dd14620003d357806327d7874c14620003fe5780632ba73c1514620004205780634071e94e14620004425780634d8a5a57146200045b5780634ea409fa1462000474578063541e8515146200048d5780636352211e14620004b257806370a0823114620004cb5780638462151c14620004ed57806395d89b411462000564578063a3f4df7e146200057a578063a9059cbb1462000590578063aa8f027b14620002ed578063b047fb5014620005b5578063b2e6ceeb14620005cb578063b9186d7d14620005e4578063be7d97b314620005fd578063c721e51b1462000715578063cef13a3414620007ab578063d905bf921462000804578063e55db1e3146200081d578063ef7e81d91462000836578063efef39a11462000852578063f76f8d78146200085f578063fa84cb021462000875575b600080fd5b3415620001c657600080fd5b620001d0620008c7565b60405190815260200160405180910390f35b3415620001ee57600080fd5b620001f8620008cd565b60405160208082528190810183818151815260200191508051906020019080838360005b83811015620002365780820151838201526020016200021c565b50505050905090810190601f168015620002645780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156200027e57600080fd5b62000297600160a060020a036004351660243562000911565b005b3415620002a557600080fd5b620002af62000993565b604051600160a060020a03909116815260200160405180910390f35b3415620002d757600080fd5b62000297600160a060020a0360043516620009a2565b3415620002f957600080fd5b62000303620009e8565b604051901515815260200160405180910390f35b34156200032357600080fd5b620001d0620009ed565b34156200033957600080fd5b6200029760048035600160a060020a03169060446024803590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284378201915050505050509190803590602001908201803590602001908080601f0160208091040260200160405190810160405281815292919060208401838380828437509496505093359350620009f392505050565b3415620003df57600080fd5b62000297600160a060020a036004358116906024351660443562000bbd565b34156200040a57600080fd5b62000297600160a060020a036004351662000c16565b34156200042c57600080fd5b62000297600160a060020a036004351662000c6a565b34156200044e57600080fd5b6200029760043562000cbe565b34156200046757600080fd5b620002af60043562000d13565b34156200048057600080fd5b620002af60043562000d2e565b34156200049957600080fd5b62000297600435600160a060020a036024351662000d49565b3415620004be57600080fd5b620002af60043562000dfa565b3415620004d757600080fd5b620001d0600160a060020a036004351662000e24565b3415620004f957600080fd5b6200050f600160a060020a036004351662000e3f565b60405160208082528190810183818151815260200191508051906020019060200280838360005b838110156200055057808201518382015260200162000536565b505050509050019250505060405180910390f35b34156200057057600080fd5b620001f862000f30565b34156200058657600080fd5b620001f862000f73565b34156200059c57600080fd5b62000297600160a060020a036004351660243562000faa565b3415620005c157600080fd5b620002af62000fea565b3415620005d757600080fd5b6200029760043562000ff9565b3415620005f057600080fd5b620001d06004356200104f565b34156200060957600080fd5b6200061660043562001061565b60405160408101839052600160a060020a0382166060820152608080825281906020820190820187818151815260200191508051906020019080838360005b838110156200066f57808201518382015260200162000655565b50505050905090810190601f1680156200069d5780820380516001836020036101000a031916815260200191505b50838103825286818151815260200191508051906020019080838360005b83811015620006d5578082015183820152602001620006bb565b50505050905090810190601f168015620007035780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390f35b34156200072157600080fd5b6200029760046024813581810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284378201915050505050509190803590602001908201803590602001908080601f0160208091040260200160405190810160405281815292919060208401838380828437509496506200120f95505050505050565b3415620007b757600080fd5b62000297600480359060446024803590810190830135806020601f820181900481020160405190810160405281815292919060208401838380828437509496506200138995505050505050565b34156200081057600080fd5b62000297600435620014be565b34156200082957600080fd5b620002af6004356200151e565b34156200084257600080fd5b6200029760043560243562001539565b6200029760043562001606565b34156200086b57600080fd5b620001f8620019fd565b34156200088157600080fd5b62000297600460248135818101908301358060208181020160405190810160405280939291908181526020018383602002808284375094965062001a3495505050505050565b600e5481565b620008d76200264f565b60408051908101604052600b81527f43727970746f456d6f6a69000000000000000000000000000000000000000000602082015290505b90565b6200091d338262001f10565b15156200092957600080fd5b600081815260086020526040908190208054600160a060020a031916600160a060020a038581169182179092559133909116907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259084905190815260200160405180910390a35050565b600c54600160a060020a031681565b600c5433600160a060020a0390811691161480620009ce5750600d5433600160a060020a039081169116145b1515620009da57600080fd5b620009e58162001f30565b50565b600190565b600f5490565b600c54600090819033600160a060020a039081169116148062000a245750600d5433600160a060020a039081169116145b151562000a3057600080fd5b600e546103e8901062000a4257600080fd5b859150600160a060020a038216151562000a6557600d54600160a060020a031691505b6000831162000a745760005492505b600e8054600101905562000a8a85838562001f7b565b9050848462000a9862002661565b808060200180602001838103835285818151815260200191508051906020019080838360005b8381101562000ad857808201518382015260200162000abe565b50505050905090810190601f16801562000b065780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b8381101562000b3e57808201518382015260200162000b24565b50505050905090810190601f16801562000b6c5780820380516001836020036101000a031916815260200191505b50945050505050604051809103906000f080151562000b8a57600080fd5b6000918252600b60205260409091208054600160a060020a031916600160a060020a039092169190911790555050505050565b62000bc9838262001f10565b151562000bd557600080fd5b62000be1828262002210565b151562000bed57600080fd5b62000bf88262002230565b151562000c0457600080fd5b62000c118383836200223e565b505050565b600c5433600160a060020a0390811691161462000c3257600080fd5b600160a060020a038116151562000c4857600080fd5b600c8054600160a060020a031916600160a060020a0392909216919091179055565b600d5433600160a060020a0390811691161462000c8657600080fd5b600160a060020a038116151562000c9c57600080fd5b600d8054600160a060020a031916600160a060020a0392909216919091179055565b600c5433600160a060020a039081169116148062000cea5750600d5433600160a060020a039081169116145b151562000cf657600080fd5b80630bc4839c1415620009e5576004805460ff1916600117905550565b600860205260009081526040902054600160a060020a031681565b600660205260009081526040902054600160a060020a031681565b600c5433600160a060020a039081169116148062000d755750600d5433600160a060020a039081169116145b151562000d8157600080fd5b6000828152600b60205260409081902054600160a060020a03169063e906e15c9083905160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b151562000de157600080fd5b6102c65a03f1151562000df357600080fd5b5050505050565b600081815260066020526040902054600160a060020a031680151562000e1f57600080fd5b919050565b600160a060020a031660009081526007602052604090205490565b62000e496200264f565b600062000e556200264f565b600080600062000e658762000e24565b945084151562000e9857600060405180591062000e7f5750595b9080825280602002602001820160405250955062000f26565b8460405180591062000ea75750595b9080825280602002602001820160405250935062000ec4620009ed565b925060009150600090505b82811162000f2257600081815260066020526040902054600160a060020a038881169116141562000f19578084838151811062000f0857fe5b602090810290910101526001909101905b60010162000ecf565b8395505b5050505050919050565b62000f3a6200264f565b60408051908101604052600281527f43450000000000000000000000000000000000000000000000000000000000006020820152905090565b60408051908101604052600b81527f43727970746f456d6f6a69000000000000000000000000000000000000000000602082015281565b62000fb6338262001f10565b151562000fc257600080fd5b62000fcd8262002230565b151562000fd957600080fd5b62000fe63383836200223e565b5050565b600d54600160a060020a031681565b6000818152600660205260409020543390600160a060020a03166200101e8262002230565b15156200102a57600080fd5b62001036828462002210565b15156200104257600080fd5b62000c118183856200223e565b60009081526009602052604090205490565b6200106b6200264f565b620010756200264f565b6000806000600f868154811015156200108a57fe5b90600052602060002090600202019050806000018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015620011365780601f106200110a5761010080835404028352916020019162001136565b820191906000526020600020905b8154815290600101906020018083116200111857829003601f168201915b50505050509450806001018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015620011d95780601f10620011ad57610100808354040283529160200191620011d9565b820191906000526020600020905b815481529060010190602001808311620011bb57829003601f168201915b50505060009889525050600960209081526040808920546006909252909720549597909695600160a060020a0316945092505050565b600c5460009033600160a060020a03908116911614806200123e5750600d5433600160a060020a039081169116145b15156200124a57600080fd5b62001259833060005462001f7b565b905082826200126762002661565b808060200180602001838103835285818151815260200191508051906020019080838360005b83811015620012a75780820151838201526020016200128d565b50505050905090810190601f168015620012d55780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b838110156200130d578082015183820152602001620012f3565b50505050905090810190601f1680156200133b5780820380516001836020036101000a031916815260200191505b50945050505050604051809103906000f08015156200135957600080fd5b6000918252600b60205260409091208054600160a060020a031916600160a060020a039092169190911790555050565b600062001397338462001f10565b1515620013a357600080fd5b600f805484908110620013b257fe5b90600052602060002090600202019050620013d7620013d18362002315565b62002344565b81600101908051620013ee92916020019062002672565b507f634b5460846831c24a814503a12dd9565272ed6455da326222526dee8b9117df338483600101604051600160a060020a03841681526020810183905260606040820181815283546002600019610100600184161502019091160491830182905290608083019084908015620014a95780601f106200147d57610100808354040283529160200191620014a9565b820191906000526020600020905b8154815290600101906020018083116200148b57829003601f168201915b505094505050505060405180910390a1505050565b600c5433600160a060020a0390811691161480620014ea5750600d5433600160a060020a039081169116145b1515620014f657600080fd5b60035460099011156200150857600080fd5b60045460ff16156200151957600080fd5b600355565b6000908152600b6020526040902054600160a060020a031690565b600c5433600160a060020a0390811691161480620015655750600d5433600160a060020a039081169116145b15156200157157600080fd5b6000828152600b602052604080822054600c54600160a060020a039182169363a9059cbb9391909216918591516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515620015e657600080fd5b6102c65a03f11515620015f857600080fd5b505050604051805150505050565b6000818152600660209081526040808320546009909252822054600160a060020a039182169290913391908190819084168614156200164457600080fd5b6200164f8462002230565b15156200165b57600080fd5b34859010156200166a57600080fd5b62001679606460035462002504565b9250620016936200168b868562002517565b606462002551565b9150620016a1348662002504565b9050600154851015620016db57620016c6620016bf8660c862002517565b8462002551565b60008881526009602052604090205562001718565b600254851015620016f757620016c6620016bf86608262002517565b62001708620016bf86607362002517565b6000888152600960205260409020555b620017258685896200223e565b30600160a060020a031686600160a060020a03161415156200177357600160a060020a03861682156108fc0283604051600060405180830381858888f1935050505015156200177357600080fd5b7e8201e7bcbf010c2c07de59d6e97cb7e3cf67a46125c49cbc89b9d2cde1f48f8786600960008b8152602001908152602001600020548988600f8d815481101515620017bb57fe5b90600052602060002090600202016000016040518681526020810186905260408101859052600160a060020a0380851660608301528316608082015260c060a082018181528354600260001961010060018416150201909116049183018290529060e083019084908015620018745780601f10620018485761010080835404028352916020019162001874565b820191906000526020600020905b8154815290600101906020018083116200185657829003601f168201915b505097505050505050505060405180910390a1600160a060020a03331681156108fc0282604051600060405180830381858888f193505050501515620018b957600080fd5b6000878152600b6020526040902054600160a060020a031615620019f4576000878152600b602052604080822054600554600160a060020a03909116926340c10f19928a929190516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b15156200194957600080fd5b6102c65a03f115156200195b57600080fd5b505050604051805150506000878152600b602052604080822054600554600160a060020a03909116926340c10f199233929190516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515620019d757600080fd5b6102c65a03f11515620019e957600080fd5b505050604051805150505b50505050505050565b60408051908101604052600281527f4345000000000000000000000000000000000000000000000000000000000000602082015281565b600062001a406200264f565b60008060006020604051908101604052600080825290945091505b855182101562001dab5784600087848151811062001a7557fe5b906020019060200201518152602001908152602001600020546000141562001b6557600b600087848151811062001aa857fe5b90602001906020020151815260208101919091526040908101600090812054600160a060020a0316916370a08231913391516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151562001b1d57600080fd5b6102c65a03f1151562001b2f57600080fd5b5050506040518051905085600088858151811062001b4957fe5b9060200190602002015181526020810191909152604001600020555b84600101600087848151811062001b7857fe5b906020019060200201518152602081019190915260400160009081208054600190810190915586019087848151811062001bae57fe5b90602001906020020151815260200190815260200160002054600b600088858151811062001bd857fe5b90602001906020020151815260208101919091526040908101600090812054600160a060020a0316916370a08231913391516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151562001c4d57600080fd5b6102c65a03f1151562001c5f57600080fd5b505050604051805190501015151562001c7757600080fd5b6009600087848151811062001c8857fe5b906020019060200201518152602001908152602001600020548301925062001d9d62001d85600f88858151811062001cbc57fe5b906020019060200201518154811062001cd157fe5b90600052602060002090600202016000018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801562001d7a5780601f1062001d4e5761010080835404028352916020019162001d7a565b820191906000526020600020905b81548152906001019060200180831162001d5c57829003601f168201915b505050505062002569565b62001d908662002569565b9063ffffffff6200259316565b935060019091019062001a5b565b62001db884338562001f7b565b50600090505b855181101562001f0857600b600087838151811062001dd957fe5b90602001906020020151815260200190815260200160002060009054906101000a9004600160a060020a0316600160a060020a031663fcd3533c6005543360405160e060020a63ffffffff85160281526004810192909252600160a060020a03166024820152604401600060405180830381600087803b151562001e5c57600080fd5b6102c65a03f1151562001e6e57600080fd5b5050507f41b05bf655882bc27017be44e8216d1059cbc6b9668d754f5a745dcce690a9d486828151811062001e9f57fe5b90602001906020020151600b600089858151811062001eba57fe5b9060200190602002015181526020810191909152604090810160002054600160a060020a03169051918252600160a060020a031660208201526040908101905180910390a160010162001dbe565b505050505050565b600090815260066020526040902054600160a060020a0390811691161490565b600160a060020a0381161515620009e557600c54600160a060020a039081169030163180156108fc0290604051600060405180830381858888f193505050501515620009e557600080fd5b600062001f87620026f7565b6000600a866040518082805190602001908083835b6020831062001fbd5780518252601f19909201916020918201910162001f9c565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040519081900390205460ff16156200200057600080fd5b604080519081016040528087815260200160408051908101604052600b81527ff09f92a54e6577f09f92a500000000000000000000000000000000000000000060208201529052600f805491935060019180830162002060838262002720565b600092835260209092208591600202018151819080516200208692916020019062002672565b50602082015181600101908051620020a392916020019062002672565b50505003905063ffffffff81168114620020bc57600080fd5b7fb3b0cf861f168bcdb275c69da97b2543631552ba562628aa3c7317d4a6089ef2818787604051838152600160a060020a038216604082015260606020820181815290820184818151815260200191508051906020019080838360005b838110156200213357808201518382015260200162002119565b50505050905090810190601f168015620021615780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a160008181526009602052604081208590556200218e9086836200223e565b6001600a876040518082805190602001908083835b60208310620021c45780518252601f199092019160209182019101620021a3565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051908190039020805460ff191691151591909117905595945050505050565b600090815260086020526040902054600160a060020a0391821691161490565b600160a060020a0316151590565b600160a060020a03808316600081815260076020908152604080832080546001019055858352600690915290208054600160a060020a0319169091179055831615620022c057600160a060020a03831660009081526007602090815260408083208054600019019055838352600890915290208054600160a060020a03191690555b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef838383604051600160a060020a039384168152919092166020820152604080820192909252606001905180910390a1505050565b6000620023216200264f565b5081805115156200233657600091506200233e565b602083015191505b50919050565b6200234e6200264f565b620023586200264f565b6000806000620023676200264f565b6020604051805910620023775750595b818152601f19601f83011681016020016040529050945060009350600092505b602083101562002426576008830260020a870291507fff000000000000000000000000000000000000000000000000000000000000008216156200241a5781858581518110620023e357fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506001909301925b60019092019162002397565b83604051805910620024355750595b818152601f19601f830116810160200160405290509050600092505b83831015620024fa578483815181106200246757fe5b01602001517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002818481518110620024be57fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060019092019162002451565b9695505050505050565b6000828211156200251157fe5b50900390565b6000808315156200252c57600091506200254a565b508282028284828115156200253d57fe5b04146200254657fe5b8091505b5092915050565b60008082848115156200256057fe5b04949350505050565b620025736200274f565b602082016040805190810160405280845181526020019190915292915050565b6200259d6200264f565b620025a76200264f565b60008351855101604051805910620025bc5750595b818152601f19601f830116810160200160405290509150602082019050620025eb818660200151875162002608565b62002600855182018560200151865162002608565b509392505050565b60005b602082106200263057825184526020840193506020830192506020820391506200260b565b6001826020036101000a03905080198351168185511617909352505050565b60206040519081016040526000815290565b604051610f65806200280483390190565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620026b557805160ff1916838001178555620026e5565b82800160010185558215620026e5579182015b82811115620026e5578251825591602001919060010190620026c8565b50620026f392915062002766565b5090565b60408051908101604052806200270c6200264f565b81526020016200271b6200264f565b905290565b81548183558181151162000c115760020281600202836000526020600020918201910162000c11919062002783565b604080519081016040526000808252602082015290565b6200090e91905b80821115620026f357600081556001016200276d565b6200090e91905b80821115620026f3576000620027a18282620027bb565b620027b1600183016000620027bb565b506002016200278a565b50805460018160011615610100020316600290046000825580601f10620027e35750620009e5565b601f016020900490600052602060002090810190620009e59190620027665600606060405234156200001057600080fd5b60405162000f6538038062000f658339810160405280805182019190602001805160038054600160a060020a03191633600160a060020a0316908117909155920191905063aa8f027b6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515620000aa57600080fd5b6102c65a03f11515620000bc57600080fd5b505050604051805190501515620000d257600080fd5b60048054600160a060020a03191633600160a060020a03161790556005828051620001029291602001906200012e565b506006818051620001189291602001906200012e565b50506007805460ff1916600817905550620001d3565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200017157805160ff1916838001178555620001a1565b82800160010185558215620001a1579182015b82811115620001a157825182559160200191906001019062000184565b50620001af929150620001b3565b5090565b620001d091905b80821115620001af5760008155600101620001ba565b90565b610d8280620001e36000396000f3006060604052600436106100e55763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde0381146100ea578063095ea7b31461017457806318160ddd146101aa57806323b872dd146101cf578063313ce567146101f757806340c10f1914610220578063661884631461024257806370a08231146102645780638da5cb5b1461028357806395d89b41146102b2578063a9059cbb146102c5578063d73dd623146102e7578063dd62ed3e14610309578063e906e15c1461032e578063f2fde38b1461034f578063fcd3533c1461036e575b600080fd5b34156100f557600080fd5b6100fd610390565b60405160208082528190810183818151815260200191508051906020019080838360005b83811015610139578082015183820152602001610121565b50505050905090810190601f1680156101665780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561017f57600080fd5b610196600160a060020a036004351660243561042e565b604051901515815260200160405180910390f35b34156101b557600080fd5b6101bd61049a565b60405190815260200160405180910390f35b34156101da57600080fd5b610196600160a060020a03600435811690602435166044356104a0565b341561020257600080fd5b61020a610620565b60405160ff909116815260200160405180910390f35b341561022b57600080fd5b610196600160a060020a0360043516602435610629565b341561024d57600080fd5b610196600160a060020a0360043516602435610735565b341561026f57600080fd5b6101bd600160a060020a036004351661082f565b341561028e57600080fd5b61029661084a565b604051600160a060020a03909116815260200160405180910390f35b34156102bd57600080fd5b6100fd610859565b34156102d057600080fd5b610196600160a060020a03600435166024356108c4565b34156102f257600080fd5b610196600160a060020a03600435166024356109d6565b341561031457600080fd5b6101bd600160a060020a0360043581169060243516610a7a565b341561033957600080fd5b61034d600160a060020a0360043516610aa5565b005b341561035a57600080fd5b61034d600160a060020a0360043516610b89565b341561037957600080fd5b61034d600435600160a060020a0360243516610c24565b60058054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156104265780601f106103fb57610100808354040283529160200191610426565b820191906000526020600020905b81548152906001019060200180831161040957829003601f168201915b505050505081565b600160a060020a03338116600081815260026020908152604080832094871680845294909152808220859055909291907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259085905190815260200160405180910390a350600192915050565b60015490565b6000600160a060020a03831615156104b757600080fd5b600160a060020a0384166000908152602081905260409020548211156104dc57600080fd5b600160a060020a038085166000908152600260209081526040808320339094168352929052205482111561050f57600080fd5b600160a060020a038416600090815260208190526040902054610538908363ffffffff610d2e16565b600160a060020a03808616600090815260208190526040808220939093559085168152205461056d908363ffffffff610d4016565b600160a060020a03808516600090815260208181526040808320949094558783168252600281528382203390931682529190915220546105b3908363ffffffff610d2e16565b600160a060020a03808616600081815260026020908152604080832033861684529091529081902093909355908516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9085905190815260200160405180910390a35060019392505050565b60075460ff1681565b60045460009033600160a060020a0390811691161461064757600080fd5b60015461065a908363ffffffff610d4016565b600155600160a060020a038316600090815260208190526040902054610686908363ffffffff610d4016565b600160a060020a0384166000818152602081905260409081902083905560015491927fb4c03061fb5b7fed76389d5af8f2e0ddb09f8c70d1333abbb62582835e10accb9286925180848152602001838152602001828152602001935050505060405180910390a2600160a060020a03831660007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405190815260200160405180910390a350600192915050565b600160a060020a0333811660009081526002602090815260408083209386168352929052908120548083111561079257600160a060020a0333811660009081526002602090815260408083209388168352929052908120556107c9565b6107a2818463ffffffff610d2e16565b600160a060020a033381166000908152600260209081526040808320938916835292905220555b600160a060020a0333811660008181526002602090815260408083209489168084529490915290819020547f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925915190815260200160405180910390a35060019392505050565b600160a060020a031660009081526020819052604090205490565b600354600160a060020a031681565b60068054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156104265780601f106103fb57610100808354040283529160200191610426565b6000600160a060020a03831615156108db57600080fd5b600160a060020a03331660009081526020819052604090205482111561090057600080fd5b600160a060020a033316600090815260208190526040902054610929908363ffffffff610d2e16565b600160a060020a03338116600090815260208190526040808220939093559085168152205461095e908363ffffffff610d4016565b60008085600160a060020a0316600160a060020a031681526020019081526020016000208190555082600160a060020a031633600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405190815260200160405180910390a350600192915050565b600160a060020a033381166000908152600260209081526040808320938616835292905290812054610a0e908363ffffffff610d4016565b600160a060020a0333811660008181526002602090815260408083209489168084529490915290819020849055919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591905190815260200160405180910390a350600192915050565b600160a060020a03918216600090815260026020908152604080832093909416825291909152205490565b60035433600160a060020a03908116911614610ac057600080fd5b600160a060020a0381161515610ad557600080fd5b80600160a060020a031663aa8f027b6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610b3457600080fd5b6102c65a03f11515610b4557600080fd5b505050604051805190501515610b5a57600080fd5b6004805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60035433600160a060020a03908116911614610ba457600080fd5b600160a060020a0381161515610bb957600080fd5b600354600160a060020a0380831691167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36003805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60045460009033600160a060020a03908116911614610c4257600080fd5b600160a060020a038216600090815260208190526040902054831115610c6757600080fd5b50600160a060020a0381166000908152602081905260409020548190610c93908463ffffffff610d2e16565b600160a060020a038216600090815260208190526040902055600154610cbf908463ffffffff610d2e16565b6001819055600160a060020a038216600081815260208190526040908190205491927f743033787f4738ff4d6a7225ce2bd0977ee5f86b91a902a58f5e4d0b297b46449287929091905180848152602001838152602001828152602001935050505060405180910390a2505050565b600082821115610d3a57fe5b50900390565b600082820183811015610d4f57fe5b93925050505600a165627a7a723058206e27d0f59e9af9aa87e91752c1b5894219165844983bed9ba56c4941f45971640029a165627a7a7230582050907e595da7a55c70586f1e0379ae7487c7514553935a8ce236a8b052faa0c40029

Swarm Source

bzzr://50907e595da7a55c70586f1e0379ae7487c7514553935a8ce236a8b052faa0c4

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.