Contract Overview
Balance: 0.01100000000001 Ether
Transactions: 3237 txns
 Latest 25 transactions from a total of 3237 transactions

TxHash Age From To Value [TxFee]
0x95f94a73b6302fa2d85fcfc9e2a96377f1944ceeee53280268bf1c9e68bfb7b1113 days 1 hr ago0xa555c5bab1d1e0776a617c8efe695f898d63aa2e  IN   0xdccaf6aaca691ca8d9097480cd157707e8ad049f0 Ether0.00071488
0x281eb76358947442ca1be30061a32076fc0d30659303ee7d9c3e5f18e4c2dd07113 days 1 hr ago0xa555c5bab1d1e0776a617c8efe695f898d63aa2e  IN   0xdccaf6aaca691ca8d9097480cd157707e8ad049f0 Ether0.00071488
0xcc8c30c615d506fbce7d941bd18065cf3ab5f84726e7309c8aefdd5b9de531d0113 days 1 hr ago0xa555c5bab1d1e0776a617c8efe695f898d63aa2e  IN   0xdccaf6aaca691ca8d9097480cd157707e8ad049f0 Ether0.00071488
0x5903f63c4cd8f4527b3481c4dcbae40d2c8ece78d7a618428ee166bb9249210f113 days 1 hr ago0xa555c5bab1d1e0776a617c8efe695f898d63aa2e  IN   0xdccaf6aaca691ca8d9097480cd157707e8ad049f0 Ether0.00071488
0xd4c889cdf212e78d7758d9fa4f90056e6d737b4a9463794c5213136929c2c505113 days 1 hr ago0xa555c5bab1d1e0776a617c8efe695f898d63aa2e  IN   0xdccaf6aaca691ca8d9097480cd157707e8ad049f0 Ether0.00071488
0x2bbb1c690e2d020ab9589420d5309014a1e33812a6d607605658d705053eb079113 days 1 hr ago0xa555c5bab1d1e0776a617c8efe695f898d63aa2e  IN   0xdccaf6aaca691ca8d9097480cd157707e8ad049f0 Ether0.00071488
0xbc739ae35458110d87ac5b55d03e83a5ecc8ce7b804e7540b26f298d9564f40c113 days 1 hr ago0xa555c5bab1d1e0776a617c8efe695f898d63aa2e  IN   0xdccaf6aaca691ca8d9097480cd157707e8ad049f0 Ether0.00071424
0x99e6f6fd86bab8f7f62dbebd48080becf2c3c316c549d76f442d7aa6b92e42a4113 days 1 hr ago0xa555c5bab1d1e0776a617c8efe695f898d63aa2e  IN   0xdccaf6aaca691ca8d9097480cd157707e8ad049f0 Ether0.00071488
0xb18e170af78069aa3269002273d5e58609d7777438325334e933d657171a8ad6113 days 1 hr ago0xa555c5bab1d1e0776a617c8efe695f898d63aa2e  IN   0xdccaf6aaca691ca8d9097480cd157707e8ad049f0 Ether0.00071488
0xf24a181c50c784cec14a43b3c920eac4e2809dcac22b1d4d9311e17cf693b4b2113 days 1 hr ago0xa555c5bab1d1e0776a617c8efe695f898d63aa2e  IN   0xdccaf6aaca691ca8d9097480cd157707e8ad049f0 Ether0.00071488
0x9a98431bd8a8f1e7b020a8301471f99ee2c2b3a66eef080f1146c9d952f0d0f3113 days 1 hr ago0xa555c5bab1d1e0776a617c8efe695f898d63aa2e  IN   0xdccaf6aaca691ca8d9097480cd157707e8ad049f0 Ether0.00071488
0x4f21f07cf6673d6a21bfb477ccbdbab4f2d5a288bc22132ddbd0bc6c1520cc0d113 days 1 hr ago0xa555c5bab1d1e0776a617c8efe695f898d63aa2e  IN   0xdccaf6aaca691ca8d9097480cd157707e8ad049f0 Ether0.00071488
0x2a3fe7ce69ee51f30dafd644a5209f76f4a9d5a0c40ebacfd690fa54725566a5113 days 1 hr ago0xa555c5bab1d1e0776a617c8efe695f898d63aa2e  IN   0xdccaf6aaca691ca8d9097480cd157707e8ad049f0 Ether0.00071488
0x9dc6b4650a861c1c80cd881722403a28b623871c5efc97ac655662625cfe72ad113 days 1 hr ago0xa555c5bab1d1e0776a617c8efe695f898d63aa2e  IN   0xdccaf6aaca691ca8d9097480cd157707e8ad049f0 Ether0.00071424
0xa015a8f6afad04fc60a9abc15ed22b27c7d22246283514685426b27c989f790f113 days 1 hr ago0xa555c5bab1d1e0776a617c8efe695f898d63aa2e  IN   0xdccaf6aaca691ca8d9097480cd157707e8ad049f0 Ether0.00071488
0x1d23fd927a3dbe62732fb0dfb87cbf51da61924bb27237c76da21737289f77ac113 days 1 hr ago0xa555c5bab1d1e0776a617c8efe695f898d63aa2e  IN   0xdccaf6aaca691ca8d9097480cd157707e8ad049f0 Ether0.00071488
0x2c6d0b2a7cd1c604d204e2fab6cd681623888bb63e6911c393b9ab9cb82d2249113 days 1 hr ago0xa555c5bab1d1e0776a617c8efe695f898d63aa2e  IN   0xdccaf6aaca691ca8d9097480cd157707e8ad049f0 Ether0.00071488
0xc7ae7cad47306881dcff744ee7b0e835cba17f71f1b5c4e5c8df06a8b17e6a12113 days 1 hr ago0xa555c5bab1d1e0776a617c8efe695f898d63aa2e  IN   0xdccaf6aaca691ca8d9097480cd157707e8ad049f0 Ether0.00071424
0x11b08b5b3fe9f5ea4350f231e0b851df486863a1342d594153010f875ceb82ec113 days 1 hr ago0xa555c5bab1d1e0776a617c8efe695f898d63aa2e  IN   0xdccaf6aaca691ca8d9097480cd157707e8ad049f0 Ether0.00071488
0x7dd85fa193cd91049c56ffd34f38cfd7a19b611163e75d7854560274a124123c113 days 1 hr ago0xa555c5bab1d1e0776a617c8efe695f898d63aa2e  IN   0xdccaf6aaca691ca8d9097480cd157707e8ad049f0 Ether0.00071488
0x3521fee5b07987bc5a2cee5d81a64ad1fbb608eb3b77c581611a651445b07ea0113 days 1 hr ago0xa555c5bab1d1e0776a617c8efe695f898d63aa2e  IN   0xdccaf6aaca691ca8d9097480cd157707e8ad049f0 Ether0.00071424
0xa26665fd6e2da1786684c8a65eaa1d1a3e16882947641d58ca02052240bf4cf3113 days 1 hr ago0xa555c5bab1d1e0776a617c8efe695f898d63aa2e  IN   0xdccaf6aaca691ca8d9097480cd157707e8ad049f0 Ether0.00071488
0x135e27e31ffa609c693da39d383477c0589dcfec06f3867adb96e2745b2279e3113 days 1 hr ago0xa555c5bab1d1e0776a617c8efe695f898d63aa2e  IN   0xdccaf6aaca691ca8d9097480cd157707e8ad049f0 Ether0.0007136
0x1b9656ccb40fa24c38fc0b994167f30ef2da7cc01741d84d1418e9240c9c003c113 days 1 hr ago0xa555c5bab1d1e0776a617c8efe695f898d63aa2e  IN   0xdccaf6aaca691ca8d9097480cd157707e8ad049f0 Ether0.00071488
0x71361c8d00cf620b84d0e27933bc42df5a09535c24c95b3994d43690992ca8f3113 days 1 hr ago0xa555c5bab1d1e0776a617c8efe695f898d63aa2e  IN   0xdccaf6aaca691ca8d9097480cd157707e8ad049f0 Ether0.00071488
[ Download CSV Export  ] 
 Internal Transactions as a result of Contract Execution
 Latest 1 Internal Transaction

ParentTxHash Block Age From To Value
0x2fb05efa4f61b954a8b3af3bc8be0722d67a80b6eb2d7f9f12ff4c77a5180ba43237212115 days 23 hrs ago0xdccaf6aaca691ca8d9097480cd157707e8ad049f  Contract Creation0 Ether
[ Download CSV Export  ] 
Warning: The Compiled Contract might be susceptible to ExpExponentCleanup (medium/high-severity), EventStructWrongData (very low-severity) SolidityCompiler Bugs.

Contract Source Code Verified (Exact Match)
Contract Name: Plasma
Compiler Version: v0.4.24+commit.e67f0147
Optimization Enabled: No
Runs (Optimiser):  200



  Contract Source Code   Find Similiar Contracts

pragma solidity 0.4.24;
// produced by the Solididy File Flattener (c) David Appleton 2018
// contact : [email protected]
// released under Apache 2.0 licence
library RLP {

 uint constant DATA_SHORT_START = 0x80;
 uint constant DATA_LONG_START = 0xB8;
 uint constant LIST_SHORT_START = 0xC0;
 uint constant LIST_LONG_START = 0xF8;

 uint constant DATA_LONG_OFFSET = 0xB7;
 uint constant LIST_LONG_OFFSET = 0xF7;


 struct RLPItem {
     uint _unsafe_memPtr;    // Pointer to the RLP-encoded bytes.
     uint _unsafe_length;    // Number of bytes. This is the full length of the string.
 }

 struct Iterator {
     RLPItem _unsafe_item;   // Item that's being iterated over.
     uint _unsafe_nextPtr;   // Position of the next item in the list.
 }

 /* Iterator */

 function next(Iterator memory self) internal constant returns (RLPItem memory subItem) {
     if(hasNext(self)) {
         uint ptr = self._unsafe_nextPtr;
         uint itemLength = _itemLength(ptr);
         subItem._unsafe_memPtr = ptr;
         subItem._unsafe_length = itemLength;
         self._unsafe_nextPtr = ptr + itemLength;
     }
     else
         revert();
 }

 function next(Iterator memory self, bool strict) internal constant returns (RLPItem memory subItem) {
     subItem = next(self);
     if(strict && !_validate(subItem))
         revert();
     return;
 }

 function hasNext(Iterator memory self) internal constant returns (bool) {
     RLPItem memory item = self._unsafe_item;
     return self._unsafe_nextPtr < item._unsafe_memPtr + item._unsafe_length;
 }

 /* RLPItem */

 /// @dev Creates an RLPItem from an array of RLP encoded bytes.
 /// @param self The RLP encoded bytes.
 /// @return An RLPItem
 function toRLPItem(bytes memory self) internal constant returns (RLPItem memory) {
     uint len = self.length;
     if (len == 0) {
         return RLPItem(0, 0);
     }
     uint memPtr;
     assembly {
         memPtr := add(self, 0x20)
     }
     return RLPItem(memPtr, len);
 }

 /// @dev Creates an RLPItem from an array of RLP encoded bytes.
 /// @param self The RLP encoded bytes.
 /// @param strict Will throw if the data is not RLP encoded.
 /// @return An RLPItem
 function toRLPItem(bytes memory self, bool strict) internal constant returns (RLPItem memory) {
     RLPItem memory item = toRLPItem(self);
     if(strict) {
         uint len = self.length;
         if(_payloadOffset(item) > len)
             revert();
         if(_itemLength(item._unsafe_memPtr) != len)
             revert();
         if(!_validate(item))
             revert();
     }
     return item;
 }

 /// @dev Check if the RLP item is null.
 /// @param self The RLP item.
 /// @return 'true' if the item is null.
 function isNull(RLPItem memory self) internal constant returns (bool ret) {
     return self._unsafe_length == 0;
 }

 /// @dev Check if the RLP item is a list.
 /// @param self The RLP item.
 /// @return 'true' if the item is a list.
 function isList(RLPItem memory self) internal constant returns (bool ret) {
     if (self._unsafe_length == 0)
         return false;
     uint memPtr = self._unsafe_memPtr;
     assembly {
         ret := iszero(lt(byte(0, mload(memPtr)), 0xC0))
     }
 }

 /// @dev Check if the RLP item is data.
 /// @param self The RLP item.
 /// @return 'true' if the item is data.
 function isData(RLPItem memory self) internal constant returns (bool ret) {
     if (self._unsafe_length == 0)
         return false;
     uint memPtr = self._unsafe_memPtr;
     assembly {
         ret := lt(byte(0, mload(memPtr)), 0xC0)
     }
 }

 /// @dev Check if the RLP item is empty (string or list).
 /// @param self The RLP item.
 /// @return 'true' if the item is null.
 function isEmpty(RLPItem memory self) internal constant returns (bool ret) {
     if(isNull(self))
         return false;
     uint b0;
     uint memPtr = self._unsafe_memPtr;
     assembly {
         b0 := byte(0, mload(memPtr))
     }
     return (b0 == DATA_SHORT_START || b0 == LIST_SHORT_START);
 }

 /// @dev Get the number of items in an RLP encoded list.
 /// @param self The RLP item.
 /// @return The number of items.
 function items(RLPItem memory self) internal constant returns (uint) {
     if (!isList(self))
         return 0;
     uint b0;
     uint memPtr = self._unsafe_memPtr;
     assembly {
         b0 := byte(0, mload(memPtr))
     }
     uint pos = memPtr + _payloadOffset(self);
     uint last = memPtr + self._unsafe_length - 1;
     uint itms;
     while(pos <= last) {
         pos += _itemLength(pos);
         itms++;
     }
     return itms;
 }

 /// @dev Create an iterator.
 /// @param self The RLP item.
 /// @return An 'Iterator' over the item.
 function iterator(RLPItem memory self) internal constant returns (Iterator memory it) {
     if (!isList(self))
         revert();
     uint ptr = self._unsafe_memPtr + _payloadOffset(self);
     it._unsafe_item = self;
     it._unsafe_nextPtr = ptr;
 }

 /// @dev Return the RLP encoded bytes.
 /// @param self The RLPItem.
 /// @return The bytes.
 function toBytes(RLPItem memory self) internal constant returns (bytes memory bts) {
     uint len = self._unsafe_length;
     if (len == 0)
         return;
     bts = new bytes(len);
     _copyToBytes(self._unsafe_memPtr, bts, len);
 }

 /// @dev Decode an RLPItem into bytes. This will not work if the
 /// RLPItem is a list.
 /// @param self The RLPItem.
 /// @return The decoded string.
 function toData(RLPItem memory self) internal constant returns (bytes memory bts) {
     if(!isData(self))
         revert();
     (uint rStartPos, uint len) = _decode(self);
     bts = new bytes(len);
     _copyToBytes(rStartPos, bts, len);
 }

 /// @dev Get the list of sub-items from an RLP encoded list.
 /// Warning: This is inefficient, as it requires that the list is read twice.
 /// @param self The RLP item.
 /// @return Array of RLPItems.
 function toList(RLPItem memory self) internal constant returns (RLPItem[] memory list) {
     if(!isList(self))
         revert();
     uint numItems = items(self);
     list = new RLPItem[](numItems);
     Iterator memory it = iterator(self);
     uint idx;
     while(hasNext(it)) {
         list[idx] = next(it);
         idx++;
     }
 }

 /// @dev Decode an RLPItem into an ascii string. This will not work if the
 /// RLPItem is a list.
 /// @param self The RLPItem.
 /// @return The decoded string.
 function toAscii(RLPItem memory self) internal constant returns (string memory str) {
     if(!isData(self))
         revert();
     (uint rStartPos, uint len) = _decode(self);
     bytes memory bts = new bytes(len);
     _copyToBytes(rStartPos, bts, len);
     str = string(bts);
 }

 /// @dev Decode an RLPItem into a uint. This will not work if the
 /// RLPItem is a list.
 /// @param self The RLPItem.
 /// @return The decoded string.
 function toUint(RLPItem memory self) internal constant returns (uint data) {
     if(!isData(self))
         revert();
     (uint rStartPos, uint len) = _decode(self);
     if (len > 32)
         revert();
     assembly {
         data := div(mload(rStartPos), exp(256, sub(32, len)))
     }
 }

 /// @dev Decode an RLPItem into a boolean. This will not work if the
 /// RLPItem is a list.
 /// @param self The RLPItem.
 /// @return The decoded string.
 function toBool(RLPItem memory self) internal constant returns (bool data) {
     if(!isData(self))
         revert();
     (uint rStartPos, uint len) = _decode(self);
     if (len != 1)
         revert();
     uint temp;
     assembly {
         temp := byte(0, mload(rStartPos))
     }
     if (temp > 1)
         revert();
     return temp == 1 ? true : false;
 }

    /// @dev Decode an RLPItem into a byte. This will not work if the
    /// RLPItem is a list.
    /// @param self The RLPItem.
    /// @return The decoded string.
    function toByte(RLPItem memory self)
        internal
        view
        returns (byte data)
    {
        require(isData(self));
        (uint rStartPos, uint len) = _decode(self);
        if (len != 1)
            revert();
        uint temp;
        assembly {
            temp := byte(0, mload(rStartPos))
        }
        return byte(temp);
    }

    /// @dev Decode an RLPItem into an int. This will not work if the
    /// RLPItem is a list.
    /// @param self The RLPItem.
    /// @return The decoded string.
    function toInt(RLPItem memory self)
        internal
        view
        returns (int data)
    {
        return int(toUint(self));
    }

    /// @dev Decode an RLPItem into a bytes32. This will not work if the
    /// RLPItem is a list.
    /// @param self The RLPItem.
    /// @return The decoded string.
    function toBytes32(RLPItem memory self)
        internal
        view
        returns (bytes32 data)
    {
        return bytes32(toUint(self));
    }

    /// @dev Decode an RLPItem into an address. This will not work if the
    /// RLPItem is a list.
    /// @param self The RLPItem.
    /// @return The decoded string.
    function toAddress(RLPItem memory self)
        internal
        view
        returns (address data)
    {
        require(isData(self));
        (uint rStartPos, uint len) = _decode(self);
        if (len != 20)
            revert();
        assembly {
            data := div(mload(rStartPos), exp(256, 12))
        }
    }

    // Get the payload offset.
    function _payloadOffset(RLPItem memory self)
        private
        view
        returns (uint)
    {
        if(self._unsafe_length == 0)
            return 0;
        uint b0;
        uint memPtr = self._unsafe_memPtr;
        assembly {
            b0 := byte(0, mload(memPtr))
        }
        if(b0 < DATA_SHORT_START)
            return 0;
        if(b0 < DATA_LONG_START || (b0 >= LIST_SHORT_START && b0 < LIST_LONG_START))
            return 1;
        if(b0 < LIST_SHORT_START)
            return b0 - DATA_LONG_OFFSET + 1;
        return b0 - LIST_LONG_OFFSET + 1;
    }

    // Get the full length of an RLP item.
    function _itemLength(uint memPtr)
        private
        view
        returns (uint len)
    {
        uint b0;
        assembly {
            b0 := byte(0, mload(memPtr))
        }
        if (b0 < DATA_SHORT_START)
            len = 1;
        else if (b0 < DATA_LONG_START)
            len = b0 - DATA_SHORT_START + 1;
        else if (b0 < LIST_SHORT_START) {
            assembly {
                let bLen := sub(b0, 0xB7) // bytes length (DATA_LONG_OFFSET)
                let dLen := div(mload(add(memPtr, 1)), exp(256, sub(32, bLen))) // data length
                len := add(1, add(bLen, dLen)) // total length
            }
        } else if (b0 < LIST_LONG_START) {
            len = b0 - LIST_SHORT_START + 1;
        } else {
            assembly {
                let bLen := sub(b0, 0xF7) // bytes length (LIST_LONG_OFFSET)
                let dLen := div(mload(add(memPtr, 1)), exp(256, sub(32, bLen))) // data length
                len := add(1, add(bLen, dLen)) // total length
            }
        }
    }

    // Get start position and length of the data.
    function _decode(RLPItem memory self)
        private
        view
        returns (uint memPtr, uint len)
    {
        require(isData(self));
        uint b0;
        uint start = self._unsafe_memPtr;
        assembly {
            b0 := byte(0, mload(start))
        }
        if (b0 < DATA_SHORT_START) {
            memPtr = start;
            len = 1;
            return;
        }
        if (b0 < DATA_LONG_START) {
            len = self._unsafe_length - 1;
            memPtr = start + 1;
        } else {
            uint bLen;
            assembly {
                bLen := sub(b0, 0xB7) // DATA_LONG_OFFSET
            }
            len = self._unsafe_length - 1 - bLen;
            memPtr = start + bLen + 1;
        }
        return;
    }

    // Assumes that enough memory has been allocated to store in target.
    function _copyToBytes(uint btsPtr, bytes memory tgt, uint btsLen)
        private
        view
    {
        // Exploiting the fact that 'tgt' was the last thing to be allocated,
        // we can write entire words, and just overwrite any excess.
        assembly {
            {
                    let i := 0 // Start at arr + 0x20
                    let words := div(add(btsLen, 31), 32)
                    let rOffset := btsPtr
                    let wOffset := add(tgt, 0x20)
                tag_loop:
                    jumpi(end, eq(i, words))
                    {
                        let offset := mul(i, 0x20)
                        mstore(add(wOffset, offset), mload(add(rOffset, offset)))
                        i := add(i, 1)
                    }
                    jump(tag_loop)
                end:
                    mstore(add(tgt, add(0x20, mload(tgt))), 0)
            }
        }
    }

    // Check that an RLP item is valid.
    function _validate(RLPItem memory self)
        private
        pure
        returns (bool ret)
    {
        // Check that RLP is well-formed.
        uint b0;
        uint b1;
        uint memPtr = self._unsafe_memPtr;
        assembly {
            b0 := byte(0, mload(memPtr))
            b1 := byte(1, mload(memPtr))
        }
        if(b0 == DATA_SHORT_START + 1 && b1 < DATA_SHORT_START)
            return false;
        return true;
    }
}

library SafeMath {
    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;
    }

    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;
    }

    function sub(uint256 a, uint256 b)
        internal
        pure
        returns (uint256) 
    {
        assert(b <= a);
        return a - b;
    }

    function add(uint256 a, uint256 b)
        internal
        pure
        returns (uint256) 
    {
        uint256 c = a + b;
        assert(c >= a);
        return c;
    }

    function pow(uint256 a, uint256 b)
        internal
        pure
        returns (uint256)
    {
        // This means we have a uint overflow
        if (a > 0) {
            assert(a**b > 0);
        }
        
        return a**b;
    }

    function max()
        internal
        pure
        returns (uint256)
    {
        return 2**256-1;
    }
}

library ByteUtils {
    function slice(bytes _bytes, uint _start, uint _length)
        internal
        pure
        returns (bytes)
    {

        bytes memory tempBytes;

        assembly {
            tempBytes := mload(0x40)

            let lengthmod := and(_length, 31)

            let mc := add(tempBytes, lengthmod)
            let end := add(mc, _length)

            for {
                let cc := add(add(_bytes, lengthmod), _start)
            } lt(mc, end) {
                mc := add(mc, 0x20)
                cc := add(cc, 0x20)
            } {
                mstore(mc, mload(cc))
            }

            mstore(tempBytes, _length)

            //update free-memory pointer
            //allocating the array padded to 32 bytes like the compiler does now
            mstore(0x40, and(add(mc, 31), not(31)))
        }

        return tempBytes;
    }

    function concat(bytes memory _preBytes, bytes memory _postBytes) internal pure returns (bytes) {
        bytes memory tempBytes;

        assembly {
            // Get a location of some free memory and store it in tempBytes as
            // Solidity does for memory variables.
            tempBytes := mload(0x40)

            // Store the length of the first bytes array at the beginning of
            // the memory for tempBytes.
            let length := mload(_preBytes)
            mstore(tempBytes, length)

            // Maintain a memory counter for the current write location in the
            // temp bytes array by adding the 32 bytes for the array length to
            // the starting location.
            let mc := add(tempBytes, 0x20)
            // Stop copying when the memory counter reaches the length of the
            // first bytes array.
            let end := add(mc, length)

            for {
                // Initialize a copy counter to the start of the _preBytes data,
                // 32 bytes into its memory.
                let cc := add(_preBytes, 0x20)
            } lt(mc, end) {
                // Increase both counters by 32 bytes each iteration.
                mc := add(mc, 0x20)
                cc := add(cc, 0x20)
            } {
                // Write the _preBytes data into the tempBytes memory 32 bytes
                // at a time.
                mstore(mc, mload(cc))
            }

            // Add the length of _postBytes to the current length of tempBytes
            // and store it as the new length in the first 32 bytes of the
            // tempBytes memory.
            length := mload(_postBytes)
            mstore(tempBytes, add(length, mload(tempBytes)))

            // Move the memory counter back from a multiple of 0x20 to the
            // actual end of the _preBytes data.
            mc := end
            // Stop copying when the memory counter reaches the new combined
            // length of the arrays.
            end := add(mc, length)

            for {
                let cc := add(_postBytes, 0x20)
            } lt(mc, end) {
                mc := add(mc, 0x20)
                cc := add(cc, 0x20)
            } {
                mstore(mc, mload(cc))
            }

            // Update the free-memory pointer by padding our last write location
            // to 32 bytes: add 31 bytes to the end of tempBytes to move to the
            // next 32 byte block, then round down to the nearest multiple of
            // 32. If the sum of the length of the two arrays is zero then add
            // one before rounding down to leave a blank 32 bytes (the length block with 0).
            mstore(0x40, and(
              add(add(end, iszero(add(length, mload(_preBytes)))), 31),
              not(31) // Round down to the nearest 32 bytes.
            ))
        }

        return tempBytes;
    }
}

contract PriorityQueue {
    event DebugUint(address sender, uint item);

    uint256[] public priorities;
    uint256 public max = 2**256-1;

    function add(uint256 priority) {
        assert(priority != SafeMath.max());
        // TODO: Throws an invalid opcode for some reason.
        // uint256 length = priorities.length + 1;
        priorities[priorities.length++] = priority;
        bubbleUp();
    }

    function getPriorities() {
        DebugUint(msg.sender, priorities.length);

        for (uint256 i = 0; i < priorities.length; i++) {
            DebugUint(msg.sender, priorities[i]);
        }
    }

    function bubbleUp() {
        uint256[] storage p = priorities;

        uint256 i = p.length - 1;

        while (i > 0) {
            // Parent
            uint256 j;

            if (i % 2 == 1) {
                j = i / 2;
            } else {
                j = i / 2 - 1;
            }

            if (p[i] < p[j]) {
                uint256 tmp = p[i];
                p[i] = p[j];
                p[j] = tmp;
            }
            else {
                break;
            }

            i = j;
        }
    }

    function remove(uint256 id) returns (bool) {
        uint256[] storage p = priorities;
        uint256 i = 0;
        while (p[i] != id && i < priorities.length) {
            i++;
        }

        // We didn't find a match.
        if (i >= priorities.length) {
            return false;
        }

        p[i] = SafeMath.max();
        bubbleDown(i);
        return true;
    }

    function pop() returns (uint256) {
        uint256[] storage p = priorities;

        if (p.length == 0) {
            return SafeMath.max();
        }

        uint256 res = p[0];
        p[0] = SafeMath.max();
        bubbleDown(0);
        return res;
    }

    function bubbleDown(uint256 i) {
        uint256[] storage p = priorities;

        while(i * 2 + 1 < p.length) {
            uint256 j = i * 2 + 1;
            uint256 k = i * 2 + 2;

            uint256 parent = p[i];
            uint256 left = p[j];

            if(k >= p.length) {
                p[i] = left;
                p[j] = parent;
                break;
            }

            uint256 right = p[k];

            if (left < right) {
                p[i] = left;
                p[j] = parent;
                i = j;
            }
            else {
                // If we're equal and both are maxes
                // Then we move right which makes the
                // maxes right heavy.
                p[i] = right;
                p[k] = parent;
                i = k;
            }
        }

        prune();
    }

    function prune() {
        uint256[] storage p = priorities;
        uint256 i = p.length - 1;

        while(i > 0 && p[i] == SafeMath.max()) {
            p.length--;
            i--;
        }

        if (i == 0 && p[i] == SafeMath.max()) {
            p.length = 0;
        }
    }
}
contract Plasma {
    using SafeMath for uint64;
    using RLP for bytes;
    using RLP for RLP.RLPItem;
    using RLP for RLP.Iterator;

    event Deposit(address sender, uint value);
    event SubmitBlock(address sender, bytes32 root);
    event ExitStarted(address sender, uint64 exitId);
    event ChallengeSuccess(address sender, uint64 exitId);
    event ChallengeFailure(address sender, uint64 exitId);
    event FinalizeExit(address sender, uint64 exitId);
    event DebugBytes32(address sender, bytes32 item);
    event DebugBytes(address sender, bytes item);
    event DebugAddress(address sender, address item);
    event DebugUint(address sender, uint item);
    event DebugBool(address sender, bool item);

    address public authority;
    mapping(uint64  => ChildBlock) public childChain;
    mapping(uint256 => Exit) public exits;
    uint64 public currentChildBlock;
    PriorityQueue public exitQueue;
    uint256 public lastFinalizedTime;

    struct ChildBlock {
        bytes32 root;
        uint256 created_at;
    }

    struct Exit {
        address owner;
        uint256 amount;
        uint64  blocknum;
        uint32  txindex;
        uint8   oindex;
        uint256 started_at;
    }

    constructor() {
        authority = msg.sender;
        currentChildBlock = 1;
        lastFinalizedTime = block.timestamp;
        exitQueue = new PriorityQueue();
    }

    function submitBlock(bytes32 root) public {
        require(msg.sender == authority);
        childChain[currentChildBlock] = ChildBlock({
            root: root,
            created_at: block.timestamp
        });
        currentChildBlock = currentChildBlock + 1;

        SubmitBlock(msg.sender, root);
    }

    function getBlock(uint64 blocknum)
        public
        view
        returns (bytes32, uint256)
    {
        ChildBlock memory blk = childChain[blocknum];
        return (blk.root, blk.created_at);
    }

    function deposit(bytes txBytes) public payable {
        RLP.RLPItem memory txItem = txBytes.toRLPItem();
        RLP.RLPItem[] memory txList = txItem.toList();

        uint newOwnerIdx = 8;
        uint amountIdx = 9;
        require(msg.sender == txList[newOwnerIdx].toAddress());
        require(msg.value == txList[amountIdx].toUint());

        bytes32 root = createSimpleMerkleRoot(txBytes);

        childChain[currentChildBlock] = ChildBlock({
            root: root,
            created_at: block.timestamp
        });

        currentChildBlock = currentChildBlock + 1;

        Deposit(msg.sender, msg.value);
    }

    function createSimpleMerkleRoot(bytes txBytes) returns (bytes32) {
        // TODO: We may want a different null value.
        bytes32 zeroHash = keccak256(hex"0000000000000000000000000000000000000000000000000000000000000000");
        bytes32 root = keccak256(txBytes);
        
        for (uint i = 0; i < 15; i++) {
            root = keccak256(root, zeroHash);
        }

        return root;
    }

    function startExit(
        uint64 blocknum,
        uint32 txindex,
        uint8  oindex,
        bytes  txBytes,
        bytes  proof
    ) public
    {
        RLP.RLPItem memory txItem = txBytes.toRLPItem();
        RLP.RLPItem[] memory txList = txItem.toList();

        uint baseIndex = 8 + (oindex * 2);

        require(msg.sender == txList[baseIndex].toAddress());

        uint amount = txList[baseIndex + 1].toUint();
        // Simplify contract by only allowing exits > 0
        require(amount > 0);

        bool exists = checkProof(blocknum, txindex, txBytes, proof);

        require(exists);

        // TODO: check that the sigs given to the utxo owner from the input owner
        // are legit from the side chain.

        uint256 priority = calcPriority(blocknum, txindex, oindex);
        exitQueue.add(priority);
        
        exits[priority] = Exit({
            owner: msg.sender,
            amount: amount,
            // These are necessary for challenges.
            blocknum: blocknum,
            txindex: txindex,
            oindex: oindex,
            started_at: block.timestamp
        });

        ExitStarted(msg.sender, uint64(priority));
    }

    function getExit(uint64 exitId)
        public
        view
        returns (address, uint256, uint64, uint32, uint8, uint256)
    {
        Exit memory exit = exits[exitId];

        return (exit.owner, exit.amount, exit.blocknum, exit.txindex, exit.oindex, exit.started_at);
    }

    function challengeExit(
        uint64 exitId,
        uint64 blocknum,
        uint32 txindex,
        bytes  txBytes,
        bytes  proof
    ) public
    {
        Exit memory currExit = exits[exitId];
        RLP.RLPItem memory txItem = txBytes.toRLPItem();
        RLP.RLPItem[] memory txList = txItem.toList();

        bool firstInput = txList[0].toUint() == currExit.blocknum && txList[1].toUint() == currExit.txindex && txList[2].toUint() == currExit.oindex;
        bool secondInput = txList[3].toUint() == currExit.blocknum && txList[4].toUint() == currExit.txindex && txList[5].toUint() == currExit.oindex;

        if(!firstInput && !secondInput) {
            ChallengeFailure(msg.sender, exitId);
            return;
        }

        bool exists = checkProof(blocknum, txindex, txBytes, proof);

        if (exists) {
            require(currExit.amount > 0);

            uint256 burn;
            if (currExit.owner.balance < currExit.amount) {
                burn = currExit.owner.balance;
            } else {
                burn = currExit.amount;
            }

            currExit.owner.send(-burn);

            exits[exitId] = Exit({
                owner: address(0),
                amount: 0,
                blocknum: 0,
                txindex: 0,
                oindex: 0,
                started_at: 0
            });

            exitQueue.remove(exitId);

            ChallengeSuccess(msg.sender, exitId);
        } else {
            ChallengeFailure(msg.sender, exitId);
        }
    }

    // TODO: move into merkle file.
    function checkProof(
        uint64 blocknum,
        uint32 txindex,
        bytes txBytes,
        bytes proof
    ) returns (bool)
    {

        require(proof.length == 16 * 32);

        bytes32 root = childChain[blocknum].root;

        bytes32 otherRoot = keccak256(txBytes);

        // Offset for bytes assembly starts at 32
        uint j = 32;

        for(uint i = 0; i < 16; i++) {
            bytes32 sibling;
            assembly {
                sibling := mload(add(proof, j))
            }
            j += 32;

            if (txindex % 2 == 0) {
                otherRoot = keccak256(otherRoot, sibling);
            } else {
                otherRoot = keccak256(sibling, otherRoot);
            }
            
            txindex = txindex / 2;
        }

        return otherRoot == root;
    }

    // TODO: passively finalize.
    // If root node doesn't finalize, and validators finalize,
    // validators have to pay.
    // Finalizing is an expensive operation if the queue is large.
    function finalize() {
        if (!shouldFinalize()) {
            return;
        }

        lastFinalizedTime = block.timestamp;
        uint256 exitId = exitQueue.pop();
        while(exitId != SafeMath.max()) {
            Exit memory currExit = exits[exitId];

            if (
                isFinalizableTime(currExit.started_at) &&
                currExit.owner != address(0) &&
                currExit.amount > 0
            ) {
                currExit.owner.send(currExit.amount);
                
                exits[exitId] = Exit({
                    owner: address(0),
                    amount: 0,
                    blocknum: 0,
                    txindex: 0,
                    oindex: 0,
                    started_at: 0
                });
                FinalizeExit(msg.sender, uint64(exitId));
            }

            exitId = exitQueue.pop();
        }
    }

    // Periodically monitor if we should finalize
    function shouldFinalize() constant returns (bool) {
        // Not used for testing
        // return block.timestamp > lastFinalizedTime + 2 days;
        return true;
    }

    function isFinalizableTime(uint256 timestamp) constant returns (bool) {
        // Not used for testing
        // return block.timestamp > timestamp + 14 days;
        return true;
    }

    function calcPriority(
        uint64 blocknum,
        uint32 txindex,
        uint8  oindex
    ) constant returns (uint256) {
        // For now always allow the earliest block to be in the front
        // of the queue.  Don't care about 7 day cliff.
        return blocknum * 1000000000 + txindex * 10000 + oindex;
    }
}

    Contract ABI  
[{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"exits","outputs":[{"name":"owner","type":"address"},{"name":"amount","type":"uint256"},{"name":"blocknum","type":"uint64"},{"name":"txindex","type":"uint32"},{"name":"oindex","type":"uint8"},{"name":"started_at","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"blocknum","type":"uint64"},{"name":"txindex","type":"uint32"},{"name":"txBytes","type":"bytes"},{"name":"proof","type":"bytes"}],"name":"checkProof","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"finalize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"blocknum","type":"uint64"}],"name":"getBlock","outputs":[{"name":"","type":"bytes32"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint64"}],"name":"childChain","outputs":[{"name":"root","type":"bytes32"},{"name":"created_at","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"txBytes","type":"bytes"}],"name":"createSimpleMerkleRoot","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"currentChildBlock","outputs":[{"name":"","type":"uint64"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"blocknum","type":"uint64"},{"name":"txindex","type":"uint32"},{"name":"oindex","type":"uint8"},{"name":"txBytes","type":"bytes"},{"name":"proof","type":"bytes"}],"name":"startExit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"txBytes","type":"bytes"}],"name":"deposit","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"exitId","type":"uint64"},{"name":"blocknum","type":"uint64"},{"name":"txindex","type":"uint32"},{"name":"txBytes","type":"bytes"},{"name":"proof","type":"bytes"}],"name":"challengeExit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"root","type":"bytes32"}],"name":"submitBlock","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"authority","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lastFinalizedTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"timestamp","type":"uint256"}],"name":"isFinalizableTime","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"exitId","type":"uint64"}],"name":"getExit","outputs":[{"name":"","type":"address"},{"name":"","type":"uint256"},{"name":"","type":"uint64"},{"name":"","type":"uint32"},{"name":"","type":"uint8"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"blocknum","type":"uint64"},{"name":"txindex","type":"uint32"},{"name":"oindex","type":"uint8"}],"name":"calcPriority","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"shouldFinalize","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"exitQueue","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"sender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"sender","type":"address"},{"indexed":false,"name":"root","type":"bytes32"}],"name":"SubmitBlock","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"sender","type":"address"},{"indexed":false,"name":"exitId","type":"uint64"}],"name":"ExitStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"sender","type":"address"},{"indexed":false,"name":"exitId","type":"uint64"}],"name":"ChallengeSuccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"sender","type":"address"},{"indexed":false,"name":"exitId","type":"uint64"}],"name":"ChallengeFailure","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"sender","type":"address"},{"indexed":false,"name":"exitId","type":"uint64"}],"name":"FinalizeExit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"sender","type":"address"},{"indexed":false,"name":"item","type":"bytes32"}],"name":"DebugBytes32","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"sender","type":"address"},{"indexed":false,"name":"item","type":"bytes"}],"name":"DebugBytes","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"sender","type":"address"},{"indexed":false,"name":"item","type":"address"}],"name":"DebugAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"sender","type":"address"},{"indexed":false,"name":"item","type":"uint256"}],"name":"DebugUint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"sender","type":"address"},{"indexed":false,"name":"item","type":"bool"}],"name":"DebugBool","type":"event"}]

  Contract Creation Code Switch To Opcodes View
60806040523480156200001157600080fd5b50336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600360006101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550426004819055506200008d620000f1565b604051809103906000f080158015620000aa573d6000803e3d6000fd5b50600360086101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000102565b604051610902806200288a83390190565b61277880620001126000396000f3006080604052600436106100fc576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063342de17914610101578063363c4ab0146101b75780634bb278f3146102a25780635fa15e79146102b95780636434693a14610313578063751f4c0f1461036d5780637a95f1e8146103f25780638bf8053c1461043157806398b1e06a14610511578063a422f7821461056d578063baa4769414610654578063bf7e214f14610685578063ca3f64c1146106dc578063ccf390a914610707578063d157796e1461074c578063e681702f1461080c578063ee1da6a214610874578063ffed4bf5146108a3575b600080fd5b34801561010d57600080fd5b5061012c600480360381019080803590602001909291905050506108fa565b604051808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018681526020018567ffffffffffffffff1667ffffffffffffffff1681526020018463ffffffff1663ffffffff1681526020018360ff1660ff168152602001828152602001965050505050505060405180910390f35b3480156101c357600080fd5b50610288600480360381019080803567ffffffffffffffff169060200190929190803563ffffffff169060200190929190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050610987565b604051808215151515815260200191505060405180910390f35b3480156102ae57600080fd5b506102b7610b14565b005b3480156102c557600080fd5b506102ee600480360381019080803567ffffffffffffffff16906020019092919050505061103b565b6040518083600019166000191681526020018281526020019250505060405180910390f35b34801561031f57600080fd5b50610348600480360381019080803567ffffffffffffffff1690602001909291905050506110aa565b6040518083600019166000191681526020018281526020019250505060405180910390f35b34801561037957600080fd5b506103d4600480360381019080803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091929192905050506110ce565b60405180826000191660001916815260200191505060405180910390f35b3480156103fe57600080fd5b506104076111a8565b604051808267ffffffffffffffff1667ffffffffffffffff16815260200191505060405180910390f35b34801561043d57600080fd5b5061050f600480360381019080803567ffffffffffffffff169060200190929190803563ffffffff169060200190929190803560ff169060200190929190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091929192905050506111c2565b005b61056b600480360381019080803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929050505061151c565b005b34801561057957600080fd5b50610652600480360381019080803567ffffffffffffffff169060200190929190803567ffffffffffffffff169060200190929190803563ffffffff169060200190929190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050611702565b005b34801561066057600080fd5b506106836004803603810190808035600019169060200190929190505050611df2565b005b34801561069157600080fd5b5061069a611f78565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156106e857600080fd5b506106f1611f9d565b6040518082815260200191505060405180910390f35b34801561071357600080fd5b5061073260048036038101908080359060200190929190505050611fa3565b604051808215151515815260200191505060405180910390f35b34801561075857600080fd5b50610781600480360381019080803567ffffffffffffffff169060200190929190505050611fae565b604051808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018681526020018567ffffffffffffffff1667ffffffffffffffff1681526020018463ffffffff1663ffffffff1681526020018360ff1660ff168152602001828152602001965050505050505060405180910390f35b34801561081857600080fd5b5061085e600480360381019080803567ffffffffffffffff169060200190929190803563ffffffff169060200190929190803560ff1690602001909291905050506120fd565b6040518082815260200191505060405180910390f35b34801561088057600080fd5b5061088961212a565b604051808215151515815260200191505060405180910390f35b3480156108af57600080fd5b506108b8612133565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60026020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020160009054906101000a900467ffffffffffffffff16908060020160089054906101000a900463ffffffff169080600201600c9054906101000a900460ff16908060030154905086565b60008060008060008061020087511415156109a157600080fd5b600160008b67ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020600001549450876040518082805190602001908083835b602083101515610a0457805182526020820191506020810190506020830392506109df565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020935060209250600091505b6010821015610afa57828701519050602083019250600060028a63ffffffff16811515610a6557fe5b0663ffffffff161415610aa757838160405180836000191660001916815260200182600019166000191681526020019250505060405180910390209350610ad8565b8084604051808360001916600019168152602001826000191660001916815260200192505050604051809103902093505b60028963ffffffff16811515610aea57fe5b0498508180600101925050610a3c565b846000191684600019161495505050505050949350505050565b6000610b1e61267a565b610b2661212a565b1515610b3157611037565b42600481905550600360089054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a4ece52c6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015610bbe57600080fd5b505af1158015610bd2573d6000803e3d6000fd5b505050506040513d6020811015610be857600080fd5b810190808051906020019092919050505091505b610c04612159565b82141515611036576002600083815260200190815260200160002060c060405190810160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481526020016002820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016002820160089054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160028201600c9054906101000a900460ff1660ff1660ff1681526020016003820154815250509050610d198160a00151611fa3565b8015610d565750600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614155b8015610d66575060008160200151115b15610f6e57806000015173ffffffffffffffffffffffffffffffffffffffff166108fc82602001519081150290604051600060405180830381858888f193505050505060c060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600067ffffffffffffffff168152602001600063ffffffff168152602001600060ff16815260200160008152506002600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160020160086101000a81548163ffffffff021916908363ffffffff160217905550608082015181600201600c6101000a81548160ff021916908360ff16021790555060a082015181600301559050507fc52203d147436e1e90cde004c1b06d0e52b33273c35dfb03e97d6b684154ffd23383604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018267ffffffffffffffff1667ffffffffffffffff1681526020019250505060405180910390a15b600360089054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a4ece52c6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015610ff457600080fd5b505af1158015611008573d6000803e3d6000fd5b505050506040513d602081101561101e57600080fd5b81019080805190602001909291905050509150610bfc565b5b5050565b6000806110466126da565b600160008567ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000206040805190810160405290816000820154600019166000191681526020016001820154815250509050806000015181602001519250925050915091565b60016020528060005260406000206000915090508060000154908060010154905082565b60008060008060405180806000815250602001905060405180910390209250846040518082805190602001908083835b60208310151561112357805182526020820191506020810190506020830392506110fe565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209150600090505b600f81101561119d578183604051808360001916600019168152602001826000191660001916815260200192505050604051809103902091508080600101915050611157565b819350505050919050565b600360009054906101000a900467ffffffffffffffff1681565b6111ca6126f7565b60606000806000806111db88612181565b95506111e6866121dc565b94506002890260080160ff169350611214858581518110151561120557fe5b90602001906020020151612299565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561124d57600080fd5b611270856001860181518110151561126157fe5b906020019060200201516122e0565b925060008311151561128157600080fd5b61128d8b8b8a8a610987565b915081151561129b57600080fd5b6112a68b8b8b6120fd565b9050600360089054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631003e2d2826040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b15801561133957600080fd5b505af115801561134d573d6000803e3d6000fd5b5050505060c0604051908101604052803373ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018c67ffffffffffffffff1681526020018b63ffffffff1681526020018a60ff168152602001428152506002600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160020160086101000a81548163ffffffff021916908363ffffffff160217905550608082015181600201600c6101000a81548160ff021916908360ff16021790555060a082015181600301559050507fe30b26e88c2e9381e59a221e2e9e24dcadf013b275ded0332260918b645118303382604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018267ffffffffffffffff1667ffffffffffffffff1681526020019250505060405180910390a15050505050505050505050565b6115246126f7565b6060600080600061153486612181565b945061153f856121dc565b93506008925060099150611569848481518110151561155a57fe5b90602001906020020151612299565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156115a257600080fd5b6115c284838151811015156115b357fe5b906020019060200201516122e0565b341415156115cf57600080fd5b6115d8866110ce565b90506040805190810160405280826000191681526020014281525060016000600360009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008201518160000190600019169055602082015181600101559050506001600360009054906101000a900467ffffffffffffffff1601600360006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c3334604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a1505050505050565b61170a61267a565b6117126126f7565b6060600080600080600260008d67ffffffffffffffff16815260200190815260200160002060c060405190810160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481526020016002820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016002820160089054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160028201600c9054906101000a900460ff1660ff1660ff168152602001600382015481525050965061182d89612181565b9550611838866121dc565b9450866040015167ffffffffffffffff1661186a86600081518110151561185b57fe5b906020019060200201516122e0565b1480156118a05750866060015163ffffffff1661189e86600181518110151561188f57fe5b906020019060200201516122e0565b145b80156118d25750866080015160ff166118d08660028151811015156118c157fe5b906020019060200201516122e0565b145b9350866040015167ffffffffffffffff166119048660038151811015156118f557fe5b906020019060200201516122e0565b14801561193a5750866060015163ffffffff1661193886600481518110151561192957fe5b906020019060200201516122e0565b145b801561196c5750866080015160ff1661196a86600581518110151561195b57fe5b906020019060200201516122e0565b145b92508315801561197a575082155b15611a03577f3e4c9e12f3ba473d5e1de12c7f04adaebd5e5f0e101d031fb750be158bfc5428338d604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018267ffffffffffffffff1667ffffffffffffffff1681526020019250505060405180910390a1611de4565b611a0f8b8b8b8b610987565b91508115611d635760008760200151111515611a2a57600080fd5b8660200151876000015173ffffffffffffffffffffffffffffffffffffffff16311015611a7457866000015173ffffffffffffffffffffffffffffffffffffffff16319050611a7c565b866020015190505b866000015173ffffffffffffffffffffffffffffffffffffffff166108fc826000039081150290604051600060405180830381858888f193505050505060c060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600067ffffffffffffffff168152602001600063ffffffff168152602001600060ff1681526020016000815250600260008e67ffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160020160086101000a81548163ffffffff021916908363ffffffff160217905550608082015181600201600c6101000a81548160ff021916908360ff16021790555060a08201518160030155905050600360089054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634cc822158d6040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808267ffffffffffffffff168152602001915050602060405180830381600087803b158015611ca357600080fd5b505af1158015611cb7573d6000803e3d6000fd5b505050506040513d6020811015611ccd57600080fd5b8101908080519060200190929190505050507fe5278408258b881cab1240a0bd9da7547c6fd223c50a6356ff0272dbabc2f405338d604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018267ffffffffffffffff1667ffffffffffffffff1681526020019250505060405180910390a1611de3565b7f3e4c9e12f3ba473d5e1de12c7f04adaebd5e5f0e101d031fb750be158bfc5428338d604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018267ffffffffffffffff1667ffffffffffffffff1681526020019250505060405180910390a15b5b505050505050505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611e4d57600080fd5b6040805190810160405280826000191681526020014281525060016000600360009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008201518160000190600019169055602082015181600101559050506001600360009054906101000a900467ffffffffffffffff1601600360006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507fc9c86cbe968b46caad5b3d440a9afa668cc1cb3ba8253cfc499ca7f3d0811e3c3382604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182600019166000191681526020019250505060405180910390a150565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60045481565b600060019050919050565b600080600080600080611fbf61267a565b600260008967ffffffffffffffff16815260200190815260200160002060c060405190810160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481526020016002820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016002820160089054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160028201600c9054906101000a900460ff1660ff1660ff1681526020016003820154815250509050806000015181602001518260400151836060015184608001518560a001519650965096509650965096505091939550919395565b60008160ff16612710840263ffffffff16633b9aca008602010167ffffffffffffffff1690509392505050565b60006001905090565b600360089054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff905090565b6121896126f7565b6000808351915060008214156121b757604080519081016040528060008152602001600081525092506121d5565b60208401905060408051908101604052808281526020018381525092505b5050919050565b606060006121e8612711565b60006121f385612328565b15156121fe57600080fd5b6122078561235a565b92508260405190808252806020026020018201604052801561224357816020015b612230612732565b8152602001906001900390816122285790505b50935061224f856123d4565b91505b61225b8261241c565b156122915761226982612446565b848281518110151561227757fe5b906020019060200201819052508080600101915050612252565b505050919050565b60008060006122a7846124a2565b15156122b257600080fd5b6122bb846124d3565b915091506014811415156122ce57600080fd5b600c6101000a82510492505050919050565b60008060006122ee846124a2565b15156122f957600080fd5b612302846124d3565b91509150602081111561231457600080fd5b806020036101000a82510492505050919050565b6000806000836020015114156123415760009150612354565b8260000151905060c0815160001a101591505b50919050565b60008060008060008061236c87612328565b151561237b57600095506123ca565b86600001519350835160001a945061239287612554565b840192506001876020015185010391505b81831115156123c6576123b5836125e0565b8301925080806001019150506123a3565b8095505b5050505050919050565b6123dc612711565b60006123e783612328565b15156123f257600080fd5b6123fb83612554565b83600001510190508282600001819052508082602001818152505050919050565b60006124266126f7565b826000015190508060200151816000015101836020015110915050919050565b61244e6126f7565b60008061245a8461241c565b15612496578360200151915061246f826125e0565b9050818360000181815250508083602001818152505080820184602001818152505061249b565b600080fd5b5050919050565b6000806000836020015114156124bb57600091506124cd565b8260000151905060c0815160001a1091505b50919050565b60008060008060006124e4866124a2565b15156124ef57600080fd5b85600001519150815160001a92506080831015612512578194506001935061254c565b60b8831015612530576001866020015103935060018201945061254b565b60b78303905080600187602001510303935060018183010194505b5b505050915091565b6000806000808460200151141561256e57600092506125d9565b83600001519050805160001a9150608082101561258e57600092506125d9565b60b88210806125aa575060c082101580156125a9575060f882105b5b156125b857600192506125d9565b60c08210156125cf57600160b783030192506125d9565b600160f783030192505b5050919050565b600080825160001a905060808110156125fc5760019150612674565b60b881101561261357600160808203019150612673565b60c081101561263d5760b78103806020036101000a60018501510480820160010193505050612672565b60f881101561265457600160c08203019150612671565b60f78103806020036101000a600185015104808201600101935050505b5b5b5b50919050565b60c060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600067ffffffffffffffff168152602001600063ffffffff168152602001600060ff168152602001600081525090565b604080519081016040528060008019168152602001600081525090565b604080519081016040528060008152602001600081525090565b606060405190810160405280612725612732565b8152602001600081525090565b6040805190810160405280600081526020016000815250905600a165627a7a72305820dd8eec603c03a60831f4c0824b6c35ea48cc8f173658c1078dfe25ea16a128aa002960806040527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60015534801561003457600080fd5b506108be806100446000396000f300608060405260043610610099576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680631003e2d21461009e5780634062def3146100cb5780634cc82215146100e25780636ac5db19146101275780639f2b315414610152578063a0daeed214610169578063a4ece52c14610180578063b1b3c085146101ab578063b36f923e146101d8575b600080fd5b3480156100aa57600080fd5b506100c960048036038101908080359060200190929190505050610219565b005b3480156100d757600080fd5b506100e0610267565b005b3480156100ee57600080fd5b5061010d6004803603810190808035906020019092919050505061037e565b604051808215151515815260200191505060405180910390f35b34801561013357600080fd5b5061013c610419565b6040518082815260200191505060405180910390f35b34801561015e57600080fd5b5061016761041f565b005b34801561017557600080fd5b5061017e6104ce565b005b34801561018c57600080fd5b506101956105e6565b6040518082815260200191505060405180910390f35b3480156101b757600080fd5b506101d66004803603810190808035906020019092919050505061065e565b005b3480156101e457600080fd5b50610203600480360381019080803590602001909291905050506107ca565b6040518082815260200191505060405180910390f35b6102216107ed565b811415151561022c57fe5b8060008080548091906001016102429190610815565b81548110151561024e57fe5b9060005260206000200181905550610264610267565b50565b60008060008060009350600184805490500392505b600083111561037857600160028481151561029357fe5b0614156102ae576002838115156102a657fe5b0491506102c1565b60016002848115156102bc57fe5b040391505b83828154811015156102cf57fe5b906000526020600020015484848154811015156102e857fe5b9060005260206000200154101561036b57838381548110151561030757fe5b90600052602060002001549050838281548110151561032257fe5b9060005260206000200154848481548110151561033b57fe5b906000526020600020018190555080848381548110151561035857fe5b9060005260206000200181905550610370565b610378565b81925061027c565b50505050565b6000806000809150600090505b83828281548110151561039a57fe5b9060005260206000200154141580156103b7575060008054905081105b156103c957808060010191505061038b565b600080549050811015156103e05760009250610412565b6103e86107ed565b82828154811015156103f657fe5b906000526020600020018190555061040d8161065e565b600192505b5050919050565b60015481565b60008060009150600182805490500390505b60008111801561045f57506104446107ed565b828281548110151561045257fe5b9060005260206000200154145b1561048757818054809190600190036104789190610841565b50808060019003915050610431565b6000811480156104b5575061049a6107ed565b82828154811015156104a857fe5b9060005260206000200154145b156104ca57600082816104c89190610841565b505b5050565b60007feb3fd3624cedb01be2e0078746766b8487dd5fb1923b6d1721838f1eebb7c79233600080549050604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a1600090505b6000805490508110156105e3577feb3fd3624cedb01be2e0078746766b8487dd5fb1923b6d1721838f1eebb7c7923360008381548110151561058357fe5b9060005260206000200154604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a18080600101915050610545565b50565b600080600080915060008280549050141561060a576106036107ed565b9250610659565b81600081548110151561061957fe5b9060005260206000200154905061062e6107ed565b82600081548110151561063d57fe5b9060005260206000200181905550610655600061065e565b8092505b505090565b600080600080600080600095505b85805490506001600289020110156107b9576001600288020194506002808802019350858781548110151561069d57fe5b9060005260206000200154925085858154811015156106b857fe5b90600052602060002001549150858054905084101515610711578186888154811015156106e157fe5b90600052602060002001819055508286868154811015156106fe57fe5b90600052602060002001819055506107b9565b858481548110151561071f57fe5b90600052602060002001549050808210156107765781868881548110151561074357fe5b906000526020600020018190555082868681548110151561076057fe5b90600052602060002001819055508496506107b4565b80868881548110151561078557fe5b90600052602060002001819055508286858154811015156107a257fe5b90600052602060002001819055508396505b61066c565b6107c161041f565b50505050505050565b6000818154811015156107d957fe5b906000526020600020016000915090505481565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff905090565b81548183558181111561083c5781836000526020600020918201910161083b919061086d565b5b505050565b81548183558181111561086857818360005260206000209182019101610867919061086d565b5b505050565b61088f91905b8082111561088b576000816000905550600101610873565b5090565b905600a165627a7a723058205ae0496f7d9c369357f4f3c31aae95e451c9c18bfebed9f3705fd670366586fc0029

   Swarm Source:
bzzr://5ae0496f7d9c369357f4f3c31aae95e451c9c18bfebed9f3705fd670366586fc

 

View All
Block Age transaction Difficulty GasUsed Reward
View All
Block Age UncleNumber Difficulty GasUsed Reward