Contract 0xd01c92937400dd1ece24992b1dc44aeaa47ae72a

 

TxHash Block Age From To Value [TxFee]
0x7068c9c7483574a336908ce9ce1f943d9cc63d62aac5bdd7bc708cdc016f2e5c(pending)13 secs ago0x68d31cb3825e559b1e5c0665f2d65d06a17fce1a  IN  0xd01c92937400dd1ece24992b1dc44aeaa47ae72a0 Ether(Pending)
0x0d613737d07fda06faab7416b5ea0ecdb24068615b023a26f957337b68f0fba372307882 mins ago0x6f2a488e88323b7c95985a42298000bbd0cb55f5  IN   Auctionity0.003 Ether0.000220375
0x9edc58ed6ccec5810b6d1de42ac4972a3f62b308de6a909dc3e4e69c327ef9cf72307813 mins ago0xf8fe321f663a8568b6570423e9a03b9f9c59df3c  IN   Auctionity0 Ether0.000769525
0x05f0e56d5312c86d731621907575246f82af2d7a4e933394feb4917d58f5d9c8723074220 mins ago0xf5aee6d7b838d5ede8aa65d31dbc11116545180c  IN   Auctionity0 Ether0.004475856
0x114905e7b766d063ea6a19e1c91cd4c5f205985abd0ed4398e0952625fb632e7723073225 mins ago0xa21e0974137bf8400eb7dca606d9dcb190d79ed9  IN   Auctionity0 Ether0.003190033
0x6ad47dbd2e8efd163f8f5894bc1994f8a098be95a948b801332d0845a87e7ee2723072127 mins ago0xbfdded9fcc8fbee96a0ecdd7a1b826db886b5994  IN   Auctionity0.014 Ether0.000220375
0xfca587a75f60ca722161c90f39f233a12960526cae8bddef52333f4c0e89fbb0723071430 mins ago0xe738725cdcc41c91f734dd7b5b9659df994d6dda  IN   Auctionity0 Ether0.003848278
0x5a6fc96cd4612c41afadf0bf649ae761ed541d39e37c0d5dfb7d508a1aec2a79723071032 mins ago0xa37e6b46fa8e1a6f1ddbf035c4e0230b8414ff04  IN   Auctionity1.044078 Ether0.000145375
0x9318e6eb38235aee0dc3c50e670ce5b38da9942a6e0ce703f1c18d7d9aecef15723071032 mins ago0x1e7f320cf5a938465d501f6bd6c405feb3a70f6c  IN   Auctionity1.108394 Ether0.000145375
0x5361233698f8dd6cb97852bdccc9115e1bb9ea9fa37e74e5701129e55f421cad723068939 mins ago0x00c9da65b33b4f7034b5f50b90f5f6d8320d6ab8  IN   Auctionity0 Ether0.003650032
0x430567b6a3e8e24888c29b2133ad1541de1eb609117372417e7d2bfe3ad6c88a723066049 mins ago0xc5a137aa9c2563bb1b5a967094d9fdd9874a9502  IN   Auctionity0.056 Ether0.000145375
0x74ae9d88ff0b5dfff3b5c92f0c27c2cc2390e60673489507b144302e34068244723065950 mins ago0x68d31cb3825e559b1e5c0665f2d65d06a17fce1a  IN   Auctionity0 Ether0.003263052
0xebb0d39a652fb2370abd691e00f20b985af210cae0004a8b6ba49c0a23887fd9723064655 mins ago0x838c14eb3eabe4cb6a696d286c7b2a466629d0ee  IN   Auctionity0 Ether0.00329833
0x880c247ff99a902c5964dd6f37a82c1abe39f95670d09d8e7e7604fda4be48db723064057 mins ago0x29745da23604515403b195944749feb826ef4c01  IN   Auctionity0.003 Ether0.000132225
0x56b2f8a54bff473df7a91e3d7c9997a921653b97c4a2a190e408776c5b02f5cf723063759 mins ago0x87b77fabfeb869150b8e1b9462603f9a639c5fae  IN   Auctionity0 Ether0.004045342
0x493eac7796c9bd12a97c8fc4d14e1eb85ec2c4ac8ae90ea51b7b3fc0d0d619c872306351 hr ago0xfa60efdd0c8e25f033be82bc224b2d8a9d28a10f  IN   Auctionity0.017 Ether0.000132225
0x43f1f171212aff7975c9ce1941c6247d06faaf46af51d092e7886efc6e9a736972306021 hr 9 mins ago0x5e8e945f8749a638fec065f38a04a438b259be60  IN   Auctionity0.003 Ether0.000220375
0xb7748b995e91916322360b3382e0a27ba159e458ce63e4757ce493ac545e07be72306021 hr 9 mins ago0x7316e9cf94bef40d4981d66a5c41c38b6b32454c  IN   Auctionity0 Ether0.00273585
0xc16481208bd7181c7947b694276638f90819b7a8b51cbbd49c075f6a3c3f9db972305861 hr 16 mins ago0x7b103b364abbc16d18c7ca8fc3af714db57ff8e0  IN   Auctionity0.003 Ether0.000220375
0x83da7c79a28582001ae4dd3ee2daca230cb0b5fc1b4546e1dd7674671537213472305761 hr 20 mins ago0xf5aee6d7b838d5ede8aa65d31dbc11116545180c  IN   Auctionity0 Ether0.00346782
0xda6d1243e4fd2cfac039b039a02f011b2729c1950fc30b2d5396c575a5ef5a9f72305671 hr 22 mins ago0xc8bcec77786177ff274ce5f0afc24e3bb992c155  IN   Auctionity0.114 Ether0.000145375
0x9dca505f90844cc4594eb12f99dda328c6d7d433086205ef974190c2543bf77672305601 hr 25 mins ago0xbabda06088c242fb2a763aa7cc99706cb77ba735  IN   Auctionity0 Ether0.003194674
0x6ce0055973ceff945e7b5eb2bf82f1e8386dd7ca7a5ea4b480a943184acb6ff372305591 hr 25 mins ago0x34d1a8503ea5a820ff79579ea1b113209d61ffc1  IN   Auctionity0 Ether0.000694845
0xae7c0991b22e332a2efedd8217dde28efb93876a2c6d0b2f2bd5b0046958b0f072305361 hr 33 mins ago0xf448965a1dc374cdb7f2a41944a039a80c1b81a7  IN   Auctionity0 Ether0.000694935
0xc4f7a35752caab8be07db7d5286d05400abcef731369d193c593b0e15950a76272305301 hr 35 mins ago0x00c9da65b33b4f7034b5f50b90f5f6d8320d6ab8  IN   Auctionity0 Ether0.003299292
[ Download CSV Export 

Latest 25 Internal Transaction, Click here to view more Internal Transactions as a result of Contract Execution

Parent TxHash Block Age From To Value
0x9edc58ed6ccec5810b6d1de42ac4972a3f62b308de6a909dc3e4e69c327ef9cf72307813 mins ago0xd01c92937400dd1ece24992b1dc44aeaa47ae72a0xf8fe321f663a8568b6570423e9a03b9f9c59df3c0.003 Ether
0x05f0e56d5312c86d731621907575246f82af2d7a4e933394feb4917d58f5d9c8723074220 mins ago0xd01c92937400dd1ece24992b1dc44aeaa47ae72a0xe18cf576cdb5fc79f9f47f6d733efe3ef2fae9070.001194 Ether
0x05f0e56d5312c86d731621907575246f82af2d7a4e933394feb4917d58f5d9c8723074220 mins ago0xd01c92937400dd1ece24992b1dc44aeaa47ae72a0xf5aee6d7b838d5ede8aa65d31dbc11116545180c0.19303 Ether
0x114905e7b766d063ea6a19e1c91cd4c5f205985abd0ed4398e0952625fb632e7723073225 mins ago0xd01c92937400dd1ece24992b1dc44aeaa47ae72a0xe18cf576cdb5fc79f9f47f6d733efe3ef2fae9070.00048 Ether
0x114905e7b766d063ea6a19e1c91cd4c5f205985abd0ed4398e0952625fb632e7723073225 mins ago0xd01c92937400dd1ece24992b1dc44aeaa47ae72a0xa21e0974137bf8400eb7dca606d9dcb190d79ed90.0176 Ether
0xfca587a75f60ca722161c90f39f233a12960526cae8bddef52333f4c0e89fbb0723071430 mins ago0xd01c92937400dd1ece24992b1dc44aeaa47ae72a0xe18cf576cdb5fc79f9f47f6d733efe3ef2fae9070.00169 Ether
0xfca587a75f60ca722161c90f39f233a12960526cae8bddef52333f4c0e89fbb0723071430 mins ago0xd01c92937400dd1ece24992b1dc44aeaa47ae72a0xe738725cdcc41c91f734dd7b5b9659df994d6dda0.16055 Ether
0x5361233698f8dd6cb97852bdccc9115e1bb9ea9fa37e74e5701129e55f421cad723068939 mins ago0xd01c92937400dd1ece24992b1dc44aeaa47ae72a0xe18cf576cdb5fc79f9f47f6d733efe3ef2fae9070.00237 Ether
0x5361233698f8dd6cb97852bdccc9115e1bb9ea9fa37e74e5701129e55f421cad723068939 mins ago0xd01c92937400dd1ece24992b1dc44aeaa47ae72a0x00c9da65b33b4f7034b5f50b90f5f6d8320d6ab80.06715 Ether
0x74ae9d88ff0b5dfff3b5c92f0c27c2cc2390e60673489507b144302e34068244723065950 mins ago0xd01c92937400dd1ece24992b1dc44aeaa47ae72a0xe18cf576cdb5fc79f9f47f6d733efe3ef2fae9070.0048 Ether
0x74ae9d88ff0b5dfff3b5c92f0c27c2cc2390e60673489507b144302e34068244723065950 mins ago0xd01c92937400dd1ece24992b1dc44aeaa47ae72a0x68d31cb3825e559b1e5c0665f2d65d06a17fce1a0.176 Ether
0xebb0d39a652fb2370abd691e00f20b985af210cae0004a8b6ba49c0a23887fd9723064655 mins ago0xd01c92937400dd1ece24992b1dc44aeaa47ae72a0xe18cf576cdb5fc79f9f47f6d733efe3ef2fae9070.0032 Ether
0xebb0d39a652fb2370abd691e00f20b985af210cae0004a8b6ba49c0a23887fd9723064655 mins ago0xd01c92937400dd1ece24992b1dc44aeaa47ae72a0x838c14eb3eabe4cb6a696d286c7b2a466629d0ee0.184 Ether
0x56b2f8a54bff473df7a91e3d7c9997a921653b97c4a2a190e408776c5b02f5cf723063759 mins ago0xd01c92937400dd1ece24992b1dc44aeaa47ae72a0xe18cf576cdb5fc79f9f47f6d733efe3ef2fae9070.003696 Ether
0x56b2f8a54bff473df7a91e3d7c9997a921653b97c4a2a190e408776c5b02f5cf723063759 mins ago0xd01c92937400dd1ece24992b1dc44aeaa47ae72a0x87b77fabfeb869150b8e1b9462603f9a639c5fae0.13552 Ether
0xb7748b995e91916322360b3382e0a27ba159e458ce63e4757ce493ac545e07be72306021 hr 9 mins ago0xd01c92937400dd1ece24992b1dc44aeaa47ae72a0xe18cf576cdb5fc79f9f47f6d733efe3ef2fae9070.0053 Ether
0xb7748b995e91916322360b3382e0a27ba159e458ce63e4757ce493ac545e07be72306021 hr 9 mins ago0xd01c92937400dd1ece24992b1dc44aeaa47ae72a0x7316e9cf94bef40d4981d66a5c41c38b6b32454c0.2385 Ether
0x83da7c79a28582001ae4dd3ee2daca230cb0b5fc1b4546e1dd7674671537213472305761 hr 20 mins ago0xd01c92937400dd1ece24992b1dc44aeaa47ae72a0xe18cf576cdb5fc79f9f47f6d733efe3ef2fae9070.001352 Ether
0x83da7c79a28582001ae4dd3ee2daca230cb0b5fc1b4546e1dd7674671537213472305761 hr 20 mins ago0xd01c92937400dd1ece24992b1dc44aeaa47ae72a0xf5aee6d7b838d5ede8aa65d31dbc11116545180c0.16224 Ether
0x9dca505f90844cc4594eb12f99dda328c6d7d433086205ef974190c2543bf77672305601 hr 25 mins ago0xd01c92937400dd1ece24992b1dc44aeaa47ae72a0xe18cf576cdb5fc79f9f47f6d733efe3ef2fae9070.0018 Ether
0x9dca505f90844cc4594eb12f99dda328c6d7d433086205ef974190c2543bf77672305601 hr 25 mins ago0xd01c92937400dd1ece24992b1dc44aeaa47ae72a0xbabda06088c242fb2a763aa7cc99706cb77ba7350.051 Ether
0x6ce0055973ceff945e7b5eb2bf82f1e8386dd7ca7a5ea4b480a943184acb6ff372305591 hr 25 mins ago0xd01c92937400dd1ece24992b1dc44aeaa47ae72a0x34d1a8503ea5a820ff79579ea1b113209d61ffc10.078 Ether
0xae7c0991b22e332a2efedd8217dde28efb93876a2c6d0b2f2bd5b0046958b0f072305361 hr 33 mins ago0xd01c92937400dd1ece24992b1dc44aeaa47ae72a0xf448965a1dc374cdb7f2a41944a039a80c1b81a70.007 Ether
0xc4f7a35752caab8be07db7d5286d05400abcef731369d193c593b0e15950a76272305301 hr 35 mins ago0xd01c92937400dd1ece24992b1dc44aeaa47ae72a0xe18cf576cdb5fc79f9f47f6d733efe3ef2fae9070.00224 Ether
0xc4f7a35752caab8be07db7d5286d05400abcef731369d193c593b0e15950a76272305301 hr 35 mins ago0xd01c92937400dd1ece24992b1dc44aeaa47ae72a0x00c9da65b33b4f7034b5f50b90f5f6d8320d6ab80.1288 Ether
[ Download CSV Export 
Warning: The compiled contract might be susceptible to ExpExponentCleanup (medium/high-severity), EventStructWrongData (very low-severity) Solidity Compiler Bugs.

Contract Source Code Verified (Exact Match)
Contract Name: AuctionityDepositEth
Compiler Version: v0.4.24+commit.e67f0147
Optimization Enabled: Yes
Runs (Optimizer):  200


Contract Source Code
pragma solidity ^0.4.24;


/**
 * @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 c) {
    // Gas optimization: this is cheaper than asserting 'a' not being zero, but the
    // benefit is lost if 'b' is also tested.
    // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
    if (a == 0) {
      return 0;
    }

    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 a / b;
  }

  /**
  * @dev Subtracts 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 c) {
    c = a + b;
    assert(c >= a);
    return c;
  }
}

library RLPReader {
    uint8 constant STRING_SHORT_START = 0x80;
    uint8 constant STRING_LONG_START  = 0xb8;
    uint8 constant LIST_SHORT_START   = 0xc0;
    uint8 constant LIST_LONG_START    = 0xf8;

    uint8 constant WORD_SIZE = 32;

    struct RLPItem {
        uint len;
        uint memPtr;
    }

    /*
    * @param item RLP encoded bytes
    */
    function toRlpItem(bytes memory item) internal pure returns (RLPItem memory) {
        if (item.length == 0)
            return RLPItem(0, 0);

        uint memPtr;
        assembly {
            memPtr := add(item, 0x20)
        }

        return RLPItem(item.length, memPtr);
    }

    /*
    * @param item RLP encoded list in bytes
    */
    function toList(RLPItem memory item) internal pure returns (RLPItem[] memory result) {
        require(isList(item));

        uint items = numItems(item);
        result = new RLPItem[](items);

        uint memPtr = item.memPtr + _payloadOffset(item.memPtr);
        uint dataLen;
        for (uint i = 0; i < items; i++) {
            dataLen = _itemLength(memPtr);
            result[i] = RLPItem(dataLen, memPtr);
            memPtr = memPtr + dataLen;
        }
    }

    /*
    * Helpers
    */

    // @return indicator whether encoded payload is a list. negate this function call for isData.
    function isList(RLPItem memory item) internal pure returns (bool) {
        uint8 byte0;
        uint memPtr = item.memPtr;
        assembly {
            byte0 := byte(0, mload(memPtr))
        }

        if (byte0 < LIST_SHORT_START)
            return false;
        return true;
    }

    // @return number of payload items inside an encoded list.
    function numItems(RLPItem memory item) internal pure returns (uint) {
        uint count = 0;
        uint currPtr = item.memPtr + _payloadOffset(item.memPtr);
        uint endPtr = item.memPtr + item.len;
        while (currPtr < endPtr) {
            currPtr = currPtr + _itemLength(currPtr); // skip over an item
            count++;
        }

        return count;
    }

    // @return entire rlp item byte length
    function _itemLength(uint memPtr) internal pure returns (uint len) {
        uint byte0;
        assembly {
            byte0 := byte(0, mload(memPtr))
        }

        if (byte0 < STRING_SHORT_START)
            return 1;

        else if (byte0 < STRING_LONG_START)
            return byte0 - STRING_SHORT_START + 1;

        else if (byte0 < LIST_SHORT_START) {
            assembly {
                let byteLen := sub(byte0, 0xb7) // # of bytes the actual length is
                memPtr := add(memPtr, 1) // skip over the first byte

            /* 32 byte word size */
                let dataLen := div(mload(memPtr), exp(256, sub(32, byteLen))) // right shifting to get the len
                len := add(dataLen, add(byteLen, 1))
            }
        }

        else if (byte0 < LIST_LONG_START) {
            return byte0 - LIST_SHORT_START + 1;
        }

        else {
            assembly {
                let byteLen := sub(byte0, 0xf7)
                memPtr := add(memPtr, 1)

                let dataLen := div(mload(memPtr), exp(256, sub(32, byteLen))) // right shifting to the correct length
                len := add(dataLen, add(byteLen, 1))
            }
        }
    }

    // @return number of bytes until the data
    function _payloadOffset(uint memPtr) internal pure returns (uint) {
        uint byte0;
        assembly {
            byte0 := byte(0, mload(memPtr))
        }

        if (byte0 < STRING_SHORT_START)
            return 0;
        else if (byte0 < STRING_LONG_START || (byte0 >= LIST_SHORT_START && byte0 < LIST_LONG_START))
            return 1;
        else if (byte0 < LIST_SHORT_START)  // being explicit
            return byte0 - (STRING_LONG_START - 1) + 1;
        else
            return byte0 - (LIST_LONG_START - 1) + 1;
    }

    /** RLPItem conversions into data types **/

    function toBoolean(RLPItem memory item) internal pure returns (bool) {
        require(item.len == 1, "Invalid RLPItem. Booleans are encoded in 1 byte");
        uint result;
        uint memPtr = item.memPtr;
        assembly {
            result := byte(0, mload(memPtr))
        }

        return result == 0 ? false : true;
    }

    function toAddress(RLPItem memory item) internal pure returns (address) {
        // 1 byte for the length prefix according to RLP spec
        require(item.len == 21, "Invalid RLPItem. Addresses are encoded in 20 bytes");

        uint memPtr = item.memPtr + 1; // skip the length prefix
        uint addr;
        assembly {
            addr := div(mload(memPtr), exp(256, 12)) // right shift 12 bytes. we want the most significant 20 bytes
        }

        return address(addr);
    }

    function toUint(RLPItem memory item) internal pure returns (uint) {
        uint offset = _payloadOffset(item.memPtr);
        uint len = item.len - offset;
        uint memPtr = item.memPtr + offset;

        uint result;
        assembly {
            result := div(mload(memPtr), exp(256, sub(32, len))) // shift to the correct location
        }

        return result;
    }

    function toBytes(RLPItem memory item) internal pure returns (bytes) {
        uint offset = _payloadOffset(item.memPtr);
        uint len = item.len - offset; // data length
        bytes memory result = new bytes(len);

        uint destPtr;
        assembly {
            destPtr := add(0x20, result)
        }

        copy(item.memPtr + offset, destPtr, len);
        return result;
    }


    /*
    * @param src Pointer to source
    * @param dest Pointer to destination
    * @param len Amount of memory to copy from the source
    */
    function copy(uint src, uint dest, uint len) internal pure {
        // copy as many word sizes as possible
        for (; len >= WORD_SIZE; len -= WORD_SIZE) {
            assembly {
                mstore(dest, mload(src))
            }

            src += WORD_SIZE;
            dest += WORD_SIZE;
        }

        // left over bytes
        uint mask = 256 ** (WORD_SIZE - len) - 1;
        assembly {
            let srcpart := and(mload(src), not(mask)) // zero out src
            let destpart := and(mload(dest), mask) // retrieve the bytes
            mstore(dest, or(destpart, srcpart))
        }
    }
}

library RLPWriter {
    function toRlp(bytes memory _value) internal pure returns (bytes memory _bytes) {
        uint _valuePtr;
        uint _rplPtr;
        uint _valueLength = _value.length;

        assembly {
            _valuePtr := add(_value, 0x20)
            _bytes := mload(0x40)                   // Free memory ptr
            _rplPtr := add(_bytes, 0x20)            // RLP first byte ptr
        }

        // [0x00, 0x7f]
        if (_valueLength == 1 && _value[0] <= 0x7f) {
            assembly {
                mstore(_bytes, 1)                   // Bytes size is 1
                mstore(_rplPtr, mload(_valuePtr))  // Set value as-is
                mstore(0x40, add(_rplPtr, 1))       // Update free ptr
            }
            return;
        }

        // [0x80, 0xb7]
        if (_valueLength <= 55) {
            assembly {
                mstore(_bytes, add(1, _valueLength))            // Bytes size
                mstore8(_rplPtr, add(0x80, _valueLength))       // RLP small string size
                mstore(0x40, add(add(_rplPtr, 1), _valueLength)) // Update free ptr
            }

            copy(_valuePtr, _rplPtr + 1, _valueLength);
            return;
        }

        // [0xb8, 0xbf]
        uint _lengthSize = uintMinimalSize(_valueLength);

        assembly {
            mstore(_bytes, add(add(1, _lengthSize), _valueLength))  // Bytes size
            mstore8(_rplPtr, add(0xb7, _lengthSize))                // RLP long string "size size"
            mstore(add(_rplPtr, 1), mul(_valueLength, exp(256, sub(32, _lengthSize)))) // Bitshift to store the length only _lengthSize bytes
            mstore(0x40, add(add(add(_rplPtr, 1), _lengthSize), _valueLength))  // Update free ptr
        }

        copy(_valuePtr, _rplPtr + 1 + _lengthSize, _valueLength);
        return;
    }

    function toRlp(uint _value) internal pure returns (bytes memory _bytes) {
        uint _size = uintMinimalSize(_value);

        bytes memory _valueBytes = new bytes(_size);

        assembly {
            mstore(add(_valueBytes, 0x20), mul(_value, exp(256, sub(32, _size))))
        }

        return toRlp(_valueBytes);
    }

    function toRlp(bytes[] memory _values) internal pure returns (bytes memory _bytes) {
        uint _ptr;
        uint _size;
        uint i;

        // compute data size
        for(; i < _values.length; ++i)
            _size += _values[i].length;

        // create rlp header
        assembly {
            _bytes := mload(0x40)
            _ptr := add(_bytes, 0x20)
        }

        if (_size <= 55) {
            assembly {
                mstore8(_ptr, add(0xc0, _size))
                _ptr := add(_ptr, 1)
            }
        } else {
            uint _size2 = uintMinimalSize(_size);

            assembly {
                mstore8(_ptr, add(0xf7, _size2))
                _ptr := add(_ptr, 1)
                mstore(_ptr, mul(_size, exp(256, sub(32, _size2))))
                _ptr := add(_ptr, _size2)
            }
        }

        // copy data
        for(i = 0; i < _values.length; ++i) {
            bytes memory _val = _values[i];
            uint _valPtr;

            assembly {
                _valPtr := add(_val, 0x20)
            }

            copy(_valPtr, _ptr, _val.length);

            _ptr += _val.length;
        }

        assembly {
            mstore(0x40, _ptr)
            mstore(_bytes, sub(sub(_ptr, _bytes), 0x20))
        }
    }

    function uintMinimalSize(uint _value) internal pure returns (uint _size) {
        for (; _value != 0; _size++)
            _value /= 256;
    }

    /*
    * @param src Pointer to source
    * @param dest Pointer to destination
    * @param len Amount of memory to copy from the source
    */
    function copy(uint src, uint dest, uint len) internal pure {
        // copy as many word sizes as possible
        for (; len >= 32; len -= 32) {
            assembly {
                mstore(dest, mload(src))
            }

            src += 32;
            dest += 32;
        }

        // left over bytes
        uint mask = 256 ** (32 - len) - 1;
        assembly {
            let srcpart := and(mload(src), not(mask)) // zero out src
            let destpart := and(mload(dest), mask) // retrieve the bytes
            mstore(dest, or(destpart, srcpart))
        }
    }
}


library AuctionityLibraryDecodeRawTx {

    using RLPReader for RLPReader.RLPItem;
    using RLPReader for bytes;

    function decodeRawTxGetBiddingInfo(bytes memory _signedRawTxBidding, uint8 _chainId) internal pure returns (bytes32 _hashRawTxTokenTransfer, address _auctionContractAddress, uint256 _bidAmount, address _signerBid) {

        bytes memory _auctionBidlData;
        RLPReader.RLPItem[] memory _signedRawTxBiddingRLPItem = _signedRawTxBidding.toRlpItem().toList();

        _auctionContractAddress = _signedRawTxBiddingRLPItem[3].toAddress();
        _auctionBidlData = _signedRawTxBiddingRLPItem[5].toBytes();

        bytes4 _selector;
        assembly { _selector := mload(add(_auctionBidlData,0x20))}

        _signerBid = getSignerFromSignedRawTxRLPItemp(_signedRawTxBiddingRLPItem,_chainId);

        // 0x1d03ae68 : bytes4(keccak256('bid(uint256,address,bytes32)'))
        if(_selector == 0x1d03ae68 ) {

            assembly {
                _bidAmount := mload(add(_auctionBidlData,add(4,0x20)))
                _hashRawTxTokenTransfer := mload(add(_auctionBidlData,add(68,0x20)))
            }

        }

    }



    function decodeRawTxGetCreateAuctionInfo(bytes memory _signedRawTxCreateAuction, uint8 _chainId) internal pure returns (
        bytes32 _tokenHash,
        address _auctionFactoryContractAddress,
        address _signerCreate,
        address _tokenContractAddress,
        uint256 _tokenId,
        uint8 _rewardPercent
    ) {

        bytes memory _createAuctionlData;
        RLPReader.RLPItem[] memory _signedRawTxCreateAuctionRLPItem = _signedRawTxCreateAuction.toRlpItem().toList();


        _auctionFactoryContractAddress = _signedRawTxCreateAuctionRLPItem[3].toAddress();
        _createAuctionlData = _signedRawTxCreateAuctionRLPItem[5].toBytes();


        _signerCreate = getSignerFromSignedRawTxRLPItemp(_signedRawTxCreateAuctionRLPItem,_chainId);

        bytes memory _signedRawTxTokenTransfer;

        (_signedRawTxTokenTransfer, _tokenContractAddress,_tokenId,_rewardPercent) = decodeRawTxGetCreateAuctionInfoData( _createAuctionlData);



        _tokenHash = keccak256(_signedRawTxTokenTransfer);

    }

    function decodeRawTxGetCreateAuctionInfoData(bytes memory _createAuctionlData) internal pure returns(
        bytes memory _signedRawTxTokenTransfer,
        address _tokenContractAddress,
        uint256 _tokenId,
        uint8 _rewardPercent
    ) {
        bytes4 _selector;
        assembly { _selector := mload(add(_createAuctionlData,0x20))}

        uint _positionOfSignedRawTxTokenTransfer;
        uint _sizeOfSignedRawTxTokenTransfer;

        // 0xffd6d828 : bytes4(keccak256('create(bytes,address,uint256,bytes,address,uint8)'))
        if(_selector == 0xffd6d828) {

            assembly {
                _positionOfSignedRawTxTokenTransfer := mload(add(_createAuctionlData,add(4,0x20)))
                _sizeOfSignedRawTxTokenTransfer := mload(add(_createAuctionlData,add(add(_positionOfSignedRawTxTokenTransfer,4),0x20)))

            // tokenContractAddress : get 2th param
                _tokenContractAddress := mload(add(_createAuctionlData,add(add(mul(1,32),4),0x20)))
            // tockenId : get 3th param
                _tokenId := mload(add(_createAuctionlData,add(add(mul(2,32),4),0x20)))
            // rewardPercent : get 6th param
                _rewardPercent := mload(add(_createAuctionlData,add(add(mul(5,32),4),0x20)))

            }

            _signedRawTxTokenTransfer = new bytes(_sizeOfSignedRawTxTokenTransfer);

            for (uint i = 0; i < _sizeOfSignedRawTxTokenTransfer; i++) {
                _signedRawTxTokenTransfer[i] = _createAuctionlData[i + _positionOfSignedRawTxTokenTransfer + 4 + 32 ];
            }

        }

    }

    function ecrecoverSigner(
        bytes32 _hashTx,
        bytes _rsvTx,
        uint offset
    ) internal pure returns (address ecrecoverAddress){

        bytes32 r;
        bytes32 s;
        bytes1 v;

        assembly {
            r := mload(add(_rsvTx,add(offset,0x20)))
            s := mload(add(_rsvTx,add(offset,0x40)))
            v := mload(add(_rsvTx,add(offset,0x60)))
        }

        ecrecoverAddress = ecrecover(
            _hashTx,
            uint8(v),
            r,
            s
        );
    }



    function decodeRawTxGetWithdrawalInfo(bytes memory _signedRawTxWithdrawal, uint8 _chainId) internal pure returns (address withdrawalSigner, uint256 withdrawalAmount) {

        bytes4 _selector;
        bytes memory _withdrawalData;
        RLPReader.RLPItem[] memory _signedRawTxWithdrawalRLPItem = _signedRawTxWithdrawal.toRlpItem().toList();

        _withdrawalData = _signedRawTxWithdrawalRLPItem[5].toBytes();

        assembly { _selector := mload(add(_withdrawalData,0x20))}

        withdrawalSigner = getSignerFromSignedRawTxRLPItemp(_signedRawTxWithdrawalRLPItem,_chainId);

        // 0x835fc6ca : bytes4(keccak256('withdrawal(uint256)'))
        if(_selector == 0x835fc6ca ) {

            assembly {
                withdrawalAmount := mload(add(_withdrawalData,add(4,0x20)))
            }

        }

    }



    function getSignerFromSignedRawTxRLPItemp(RLPReader.RLPItem[] memory _signedTxRLPItem, uint8 _chainId) internal pure returns (address ecrecoverAddress) {
        bytes memory _rawTx;
        bytes memory _rsvTx;

        (_rawTx, _rsvTx ) = explodeSignedRawTxRLPItem(_signedTxRLPItem, _chainId);
        return ecrecoverSigner(keccak256(_rawTx), _rsvTx,0);
    }

    function explodeSignedRawTxRLPItem(RLPReader.RLPItem[] memory _signedTxRLPItem, uint8 _chainId) internal pure returns (bytes memory _rawTx,bytes memory _rsvTx){

        bytes[] memory _signedTxRLPItemRaw = new bytes[](9);

        _signedTxRLPItemRaw[0] = RLPWriter.toRlp(_signedTxRLPItem[0].toBytes());
        _signedTxRLPItemRaw[1] = RLPWriter.toRlp(_signedTxRLPItem[1].toBytes());
        _signedTxRLPItemRaw[2] = RLPWriter.toRlp(_signedTxRLPItem[2].toBytes());
        _signedTxRLPItemRaw[3] = RLPWriter.toRlp(_signedTxRLPItem[3].toBytes());
        _signedTxRLPItemRaw[4] = RLPWriter.toRlp(_signedTxRLPItem[4].toBytes());
        _signedTxRLPItemRaw[5] = RLPWriter.toRlp(_signedTxRLPItem[5].toBytes());

        _signedTxRLPItemRaw[6] = RLPWriter.toRlp(_chainId);
        _signedTxRLPItemRaw[7] = RLPWriter.toRlp(0);
        _signedTxRLPItemRaw[8] = RLPWriter.toRlp(0);

        _rawTx = RLPWriter.toRlp(_signedTxRLPItemRaw);

        uint8 i;
        _rsvTx = new bytes(65);

        bytes32 tmp = bytes32(_signedTxRLPItem[7].toUint());
        for (i = 0; i < 32; i++) {
            _rsvTx[i] = tmp[i];
        }

        tmp = bytes32(_signedTxRLPItem[8].toUint());

        for (i = 0; i < 32; i++) {
            _rsvTx[i + 32] = tmp[i];
        }

        _rsvTx[64] = bytes1(_signedTxRLPItem[6].toUint() - uint(_chainId * 2) - 8);

    }

}
library AuctionityLibraryDeposit{

    function sendTransfer(address _tokenContractAddress, bytes memory _transfer, uint _offset) internal returns (bool){

        if(!isContract(_tokenContractAddress)){
            return false;
        }

        uint8 _numberOfTransfer = uint8(_transfer[_offset]);

        _offset += 1;

        bool _success;
        for (uint8 i = 0; i < _numberOfTransfer; i++){
            (_offset,_success) = decodeTransferCall(_tokenContractAddress, _transfer,_offset);
            
            if(!_success) {
                return false;
            }
        }

        return true;

    }

    function decodeTransferCall(address _tokenContractAddress, bytes memory _transfer, uint _offset) internal returns (uint, bool) {


        bytes memory _sizeOfCallBytes;
        bytes memory _callData;

        uint _sizeOfCallUint;

        if(_transfer[_offset] == 0xb8) {
            _sizeOfCallBytes = new bytes(1);
            _sizeOfCallBytes[0] = bytes1(_transfer[_offset + 1]);

            _offset+=2;
        }
        if(_transfer[_offset] == 0xb9) {

            _sizeOfCallBytes = new bytes(2);
            _sizeOfCallBytes[0] = bytes1(_transfer[_offset + 1]);
            _sizeOfCallBytes[1] = bytes1(_transfer[_offset + 2]);
            _offset+=3;
        }

        _sizeOfCallUint = bytesToUint(_sizeOfCallBytes);

        _callData = new bytes(_sizeOfCallUint);
        for (uint j = 0; j < _sizeOfCallUint; j++) {
            _callData[j] = _transfer[(j + _offset)];
        }

        _offset+=_sizeOfCallUint;

        return (_offset, sendCallData(_tokenContractAddress, _sizeOfCallUint, _callData));


    }

    function sendCallData(address _tokenContractAddress, uint _sizeOfCallUint, bytes memory _callData) internal returns (bool) {

        bool _success;
        bytes4 sig;

        assembly {

            let _ptr := mload(0x40)
            sig := mload(add(_callData,0x20))

            mstore(_ptr,sig) //Place signature at begining of empty storage
            for { let i := 0x04 } lt(i, _sizeOfCallUint) { i := add(i, 0x20) } {
                mstore(add(_ptr,i),mload(add(_callData,add(0x20,i)))) //Add each param
            }


            _success := call(      //This is the critical change (Pop the top stack value)
            sub (gas, 10000), // gas
            _tokenContractAddress, //To addr
            0,    //No value
            _ptr,    //Inputs are stored at location _ptr
            _sizeOfCallUint, //Inputs _size
            _ptr,    //Store output over input (saves space)
            0x20) //Outputs are 32 bytes long

        }

        return _success;
    }

    
    function isContract(address _contractAddress) internal view returns (bool) {
        uint _size;
        assembly { _size := extcodesize(_contractAddress) }
        return _size > 0;
    }

    function bytesToUint(bytes b) internal pure returns (uint256){
        uint256 _number;
        for(uint i=0;i<b.length;i++){
            _number = _number + uint(b[i])*(2**(8*(b.length-(i+1))));
        }
        return _number;
    }

}

contract AuctionityDepositEth {
    using SafeMath for uint256;

    string public version = "deposit-eth-v1";

    address public owner;
    address public oracle;
    uint8 public ethereumChainId;
    uint8 public auctionityChainId;
    bool public migrationLock;
    bool public maintenanceLock;

    mapping (address => uint256) public depotEth;  // Depot for users (concatenate struct into uint256)

    bytes32[] public withdrawalVoucherList;                     // List of withdrawal voucher
    mapping (bytes32 => bool) public withdrawalVoucherSubmitted; // is withdrawal voucher is already submitted

    bytes32[] public auctionEndVoucherList;                     // List of auction end voucher
    mapping (bytes32 => bool) public auctionEndVoucherSubmitted; // is auction end voucher is already submitted

    struct InfoFromCreateAuction {
        bytes32 tokenHash;
        address tokenContractAddress;
        address auctionSeller;
        uint8 rewardPercent;
        uint256 tokenId;
    }

    struct InfoFromBidding {
        address auctionContractAddress;
        address signer;
        uint256 amount;
    }

    // events
    event LogDeposed(address user, uint256 amount);
    event LogWithdrawalVoucherSubmitted(address user, uint256 amount, bytes32 withdrawalVoucherHash);

    event LogAuctionEndVoucherSubmitted(
        bytes32 tokenHash,
        address tokenContractAddress,
        uint256 tokenId,
        address indexed seller,
        address indexed winner,
        uint256 amount,
        bytes32 auctionEndVoucherHash
    );
    event LogSentEthToWinner(address auction, address user, uint256 amount);
    event LogSentEthToAuctioneer(address auction, address user, uint256 amount);
    event LogSentDepotEth(address user, uint256 amount);
    event LogSentRewardsDepotEth(address[] user, uint256[] amount);

    event LogError(string version,string error);
    event LogErrorWithData(string version, string error, bytes32[] data);


    constructor(uint8 _ethereumChainId, uint8 _auctionityChainId) public {
        ethereumChainId = _ethereumChainId;
        auctionityChainId = _auctionityChainId;
        owner = msg.sender;
    }

    // Modifier
    modifier isOwner() {
        require(msg.sender == owner, "Sender must be owner");
        _;
    }

    modifier isOracle() {
        require(msg.sender == oracle, "Sender must be oracle");
        _;
    }

    function setOracle(address _oracle) public isOwner {
        oracle = _oracle;
    }

    modifier migrationLockable() {
        require(!migrationLock || msg.sender == owner, "MIGRATION_LOCKED");
        _;
    }

    function setMigrationLock(bool _lock) public isOwner {
        migrationLock = _lock;
    }

    modifier maintenanceLockable() {
        require(!maintenanceLock || msg.sender == owner, "MAINTENANCE_LOCKED");
        _;
    } 

    function setMaintenanceLock(bool _lock) public isOwner {
        maintenanceLock = _lock;
    }

    // add depot from user
    function addDepotEth(address _user, uint256 _amount) private returns (bool) {
        depotEth[_user] = depotEth[_user].add(_amount);
        return true;
    }

    // sub depot from user
    function subDepotEth(address _user, uint256 _amount) private returns (bool) {
        if(depotEth[_user] < _amount){
            return false;
        }

        depotEth[_user] = depotEth[_user].sub(_amount);
        return true;
    }

    // get amount of user's deposit
    function getDepotEth(address _user) public view returns(uint256 _amount) {
        return depotEth[_user];
    }

    // fallback payable function , with revert if is deactivated
    function() public payable {
        return depositEth();
    }

    // payable deposit eth
    function depositEth() public payable migrationLockable maintenanceLockable {
        bytes32[] memory _errorData;
        uint256 _amount = uint256(msg.value);
        require(_amount > 0, "Amount must be greater than 0");

        if(!addDepotEth(msg.sender, _amount)) {
            _errorData = new bytes32[](1);
            _errorData[0] = bytes32(_amount);
            emit LogErrorWithData(version, "DEPOSED_ADD_DATA_FAILED", _errorData);
            return;
        }

        emit LogDeposed(msg.sender, _amount);
    }

    /**
     * withdraw
     * @dev Param
     *      bytes32 r ECDSA signature
     *      bytes32 s ECDSA signature
     *      uint8 v ECDSA signature
     *      address user
     *      uint256 amount
     *      bytes32 key : anti replay
     * @dev Log
     *      LogWithdrawalVoucherSubmitted : successful
     */
    function withdrawalVoucher(
        bytes memory _data,
        bytes memory _signedRawTxWithdrawal
    ) public maintenanceLockable {
        bytes32 _withdrawalVoucherHash = keccak256(_signedRawTxWithdrawal);

        // if withdrawal voucher is already submitted
        if(withdrawalVoucherSubmitted[_withdrawalVoucherHash] == true) {
            emit LogError(version, "WITHDRAWAL_VOUCHER_ALREADY_SUBMITED");
            return;
        }

        address _withdrawalSigner;
        uint _withdrawalAmount;

        (_withdrawalSigner, _withdrawalAmount) = AuctionityLibraryDecodeRawTx.decodeRawTxGetWithdrawalInfo(_signedRawTxWithdrawal, auctionityChainId);
        
        if(_withdrawalAmount == uint256(0)) {
            emit LogError(version,'WITHDRAWAL_VOUCHER_AMOUNT_INVALID');
            return;
        }

        if(_withdrawalSigner == address(0)) {
            emit LogError(version,'WITHDRAWAL_VOUCHER_SIGNER_INVALID');
            return;
        }

        // if depot is smaller than amount
        if(depotEth[_withdrawalSigner] < _withdrawalAmount) {
            emit LogError(version,'WITHDRAWAL_VOUCHER_DEPOT_AMOUNT_TOO_LOW');
            return;
        }

        if(!withdrawalVoucherOracleSignatureVerification(_data, _withdrawalSigner, _withdrawalAmount, _withdrawalVoucherHash)) {
            emit LogError(version,'WITHDRAWAL_VOUCHER_ORACLE_INVALID_SIGNATURE');
            return;
        }

        // send amount
        if(!_withdrawalSigner.send(_withdrawalAmount)) {
            emit LogError(version, "WITHDRAWAL_VOUCHER_ETH_TRANSFER_FAILED");
            return;
        }

        subDepotEth(_withdrawalSigner,_withdrawalAmount);

        withdrawalVoucherList.push(_withdrawalVoucherHash);
        withdrawalVoucherSubmitted[_withdrawalVoucherHash] = true;

        emit LogWithdrawalVoucherSubmitted(_withdrawalSigner,_withdrawalAmount, _withdrawalVoucherHash);
    }

    function withdrawalVoucherOracleSignatureVerification(
        bytes memory _data,
        address _withdrawalSigner,
        uint256 _withdrawalAmount,
        bytes32 _withdrawalVoucherHash
    ) internal view returns (bool)
    {

        // if oracle is the signer of this auction end voucher
        return oracle == AuctionityLibraryDecodeRawTx.ecrecoverSigner(
            keccak256(
                abi.encodePacked(
                    "\x19Ethereum Signed Message:\n32",
                    keccak256(
                        abi.encodePacked(
                            address(this),
                            _withdrawalSigner,
                            _withdrawalAmount,
                            _withdrawalVoucherHash
                        )
                    )
                )
            ),
            _data,
            0
        );
    }

    /**
     * auctionEndVoucher
     * @dev Param
     *      bytes _data is a  concatenate of :
     *            bytes64 biddingHashProof
     *            bytes130 rsv ECDSA signature of oracle validation AEV
     *            bytes transfer token
     *      bytes _signedRawTxCreateAuction raw transaction with rsv of bidding transaction on auction smart contract
     *      bytes _signedRawTxBidding raw transaction with rsv of bidding transaction on auction smart contract
     *      bytes _send list of sending eth
     * @dev Log
     *      LogAuctionEndVoucherSubmitted : successful
     */

    function auctionEndVoucher(
        bytes memory _data,
        bytes memory _signedRawTxCreateAuction,
        bytes memory _signedRawTxBidding,
        bytes memory _send
    ) public maintenanceLockable {
        bytes32 _auctionEndVoucherHash = keccak256(_signedRawTxCreateAuction);
        // if auction end voucher is already submitted
        if(auctionEndVoucherSubmitted[_auctionEndVoucherHash] == true) {
            emit LogError(version, "AUCTION_END_VOUCHER_ALREADY_SUBMITED");
            return;
        }

        InfoFromCreateAuction memory _infoFromCreateAuction = getInfoFromCreateAuction(_signedRawTxCreateAuction);

        address _auctionContractAddress;
        address _winnerSigner;
        uint256 _winnerAmount;

        InfoFromBidding memory _infoFromBidding;

        if(_signedRawTxBidding.length > 1) {
            _infoFromBidding = getInfoFromBidding(_signedRawTxBidding, _infoFromCreateAuction.tokenHash);

            if(!verifyWinnerDepot(_infoFromBidding)) {
                return;
            }
        }

        if(!auctionEndVoucherOracleSignatureVerification(
            _data,
            keccak256(_send),
            _infoFromCreateAuction,
            _infoFromBidding
        )) {
            emit LogError(version, "AUCTION_END_VOUCHER_ORACLE_INVALID_SIGNATURE");
            return;
        }

        if(!AuctionityLibraryDeposit.sendTransfer(_infoFromCreateAuction.tokenContractAddress, _data, 97)){
            if(_data[97] > 0x01) {// if more than 1 transfer function to call
                revert("More than one transfer function to call");
            } else {
                emit LogError(version, "AUCTION_END_VOUCHER_TRANSFER_FAILED");
                return;
            }
        }

        if(_signedRawTxBidding.length > 1) {
            if(!sendExchange(_send, _infoFromCreateAuction, _infoFromBidding)) {
                return;
            }
        }


        auctionEndVoucherList.push(_auctionEndVoucherHash);
        auctionEndVoucherSubmitted[_auctionEndVoucherHash] = true;
        emit LogAuctionEndVoucherSubmitted(
            _infoFromCreateAuction.tokenHash,
            _infoFromCreateAuction.tokenContractAddress,
            _infoFromCreateAuction.tokenId,
            _infoFromCreateAuction.auctionSeller,
            _infoFromBidding.signer,
            _infoFromBidding.amount,
            _auctionEndVoucherHash
        );
    }

    function getInfoFromCreateAuction(bytes _signedRawTxCreateAuction) internal view returns
        (InfoFromCreateAuction memory _infoFromCreateAuction)
    {
        (
            _infoFromCreateAuction.tokenHash,
            ,
            _infoFromCreateAuction.auctionSeller,
            _infoFromCreateAuction.tokenContractAddress,
            _infoFromCreateAuction.tokenId,
            _infoFromCreateAuction.rewardPercent
        ) = AuctionityLibraryDecodeRawTx.decodeRawTxGetCreateAuctionInfo(_signedRawTxCreateAuction,auctionityChainId);
    }

    function getInfoFromBidding(bytes _signedRawTxBidding, bytes32 _hashSignedRawTxTokenTransfer) internal returns (InfoFromBidding memory _infoFromBidding) {
        bytes32 _hashRawTxTokenTransferFromBid;

        (
            _hashRawTxTokenTransferFromBid,
            _infoFromBidding.auctionContractAddress,
            _infoFromBidding.amount,
            _infoFromBidding.signer
        ) = AuctionityLibraryDecodeRawTx.decodeRawTxGetBiddingInfo(_signedRawTxBidding,auctionityChainId);

        if(_hashRawTxTokenTransferFromBid != _hashSignedRawTxTokenTransfer) {
            emit LogError(version, "AUCTION_END_VOUCHER_hashRawTxTokenTransfer_INVALID");
            return;
        }

        if(_infoFromBidding.amount == uint256(0)){
            emit LogError(version, "AUCTION_END_VOUCHER_BIDDING_AMOUNT_INVALID");
            return;
        }

    }    

    function verifyWinnerDepot(InfoFromBidding memory _infoFromBidding) internal returns(bool) {
        // if depot is smaller than amount
        if(depotEth[_infoFromBidding.signer] < _infoFromBidding.amount) {
            emit LogError(version, "AUCTION_END_VOUCHER_DEPOT_AMOUNT_TOO_LOW");
            return false;
        }

        return true;
    }

    function sendExchange(
        bytes memory _send,
        InfoFromCreateAuction memory _infoFromCreateAuction,
        InfoFromBidding memory _infoFromBidding
    ) internal returns(bool) {
        if(!subDepotEth(_infoFromBidding.signer, _infoFromBidding.amount)){
            emit LogError(version, "AUCTION_END_VOUCHER_DEPOT_AMOUNT_TOO_LOW");
            return false;
        }

        uint offset;
        address _sendAddress;
        uint256 _sendAmount;
        bytes12 _sendAmountGwei;
        uint256 _sentAmount;

        assembly {
            _sendAddress := mload(add(_send,add(offset,0x14)))
            _sendAmount := mload(add(_send,add(add(offset,20),0x20)))
        }

        if(_sendAddress != _infoFromCreateAuction.auctionSeller){
            emit LogError(version, "AUCTION_END_VOUCHER_SEND_TO_SELLER_INVALID");
            return false;
        }

        _sentAmount += _sendAmount;
        offset += 52;

        if(!_sendAddress.send(_sendAmount)) {
            revert("Failed to send funds");
        }

        emit LogSentEthToWinner(_infoFromBidding.auctionContractAddress, _sendAddress, _sendAmount);

        if(_infoFromCreateAuction.rewardPercent > 0) {
            assembly {
                _sendAddress := mload(add(_send,add(offset,0x14)))
                _sendAmount := mload(add(_send,add(add(offset,20),0x20)))
            }

            _sentAmount += _sendAmount;
            offset += 52;

            if(!_sendAddress.send(_sendAmount)) {
                revert("Failed to send funds");
            }

            emit LogSentEthToAuctioneer(_infoFromBidding.auctionContractAddress, _sendAddress, _sendAmount);

            bytes2 _numberOfSendDepositBytes2;
            assembly {
                _numberOfSendDepositBytes2 := mload(add(_send,add(offset,0x20)))
            }

            offset += 2;

            address[] memory _rewardsAddress = new address[](uint16(_numberOfSendDepositBytes2));
            uint256[] memory _rewardsAmount = new uint256[](uint16(_numberOfSendDepositBytes2));

            for (uint16 i = 0; i < uint16(_numberOfSendDepositBytes2); i++){

                assembly {
                    _sendAddress := mload(add(_send,add(offset,0x14)))
                    _sendAmountGwei := mload(add(_send,add(add(offset,20),0x20)))
                }

                _sendAmount = uint96(_sendAmountGwei) * 1000000000;
                _sentAmount += _sendAmount;
                offset += 32;

                if(!addDepotEth(_sendAddress, _sendAmount)) {
                    revert("Can't add deposit");
                }

                _rewardsAddress[i] = _sendAddress;
                _rewardsAmount[i] = uint256(_sendAmount);
            }

            emit LogSentRewardsDepotEth(_rewardsAddress, _rewardsAmount);
        }

        if(uint256(_infoFromBidding.amount) != _sentAmount) {
            revert("Bidding amount is not equal to sent amount");
        }

        return true;
    }

    function getTransferDataHash(bytes memory _data) internal returns (bytes32 _transferDataHash){
        bytes memory _transferData = new bytes(_data.length - 97);

        for (uint i = 0; i < (_data.length - 97); i++) {
            _transferData[i] = _data[i + 97];
        }
        return keccak256(_transferData);

    }

    function auctionEndVoucherOracleSignatureVerification(
        bytes memory _data,
        bytes32 _sendDataHash,
        InfoFromCreateAuction memory _infoFromCreateAuction,
        InfoFromBidding memory _infoFromBidding
    ) internal returns (bool) {
        bytes32 _biddingHashProof;
        assembly { _biddingHashProof := mload(add(_data,add(0,0x20))) }

        bytes32 _transferDataHash = getTransferDataHash(_data);

        // if oracle is the signer of this auction end voucher
        return oracle == AuctionityLibraryDecodeRawTx.ecrecoverSigner(
            keccak256(
                abi.encodePacked(
                    "\x19Ethereum Signed Message:\n32",
                    keccak256(
                        abi.encodePacked(
                            address(this),
                            _infoFromCreateAuction.tokenContractAddress,
                            _infoFromCreateAuction.tokenId,
                            _infoFromCreateAuction.auctionSeller,
                            _infoFromBidding.signer,
                            _infoFromBidding.amount,
                            _biddingHashProof,
                            _infoFromCreateAuction.rewardPercent,
                            _transferDataHash,
                            _sendDataHash
                        )
                    )
                )
            ),
            _data,
            32
        );

    }
}

Contract ABI
[{"constant":true,"inputs":[],"name":"ethereumChainId","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"auctionEndVoucherSubmitted","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_user","type":"address"}],"name":"getDepotEth","outputs":[{"name":"_amount","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"migrationLock","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"depositEth","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"version","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_data","type":"bytes"},{"name":"_signedRawTxWithdrawal","type":"bytes"}],"name":"withdrawalVoucher","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"depotEth","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"maintenanceLock","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"auctionEndVoucherList","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_oracle","type":"address"}],"name":"setOracle","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"oracle","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_data","type":"bytes"},{"name":"_signedRawTxCreateAuction","type":"bytes"},{"name":"_signedRawTxBidding","type":"bytes"},{"name":"_send","type":"bytes"}],"name":"auctionEndVoucher","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"withdrawalVoucherSubmitted","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"auctionityChainId","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"withdrawalVoucherList","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_lock","type":"bool"}],"name":"setMaintenanceLock","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_lock","type":"bool"}],"name":"setMigrationLock","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_ethereumChainId","type":"uint8"},{"name":"_auctionityChainId","type":"uint8"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"user","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"LogDeposed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"user","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"withdrawalVoucherHash","type":"bytes32"}],"name":"LogWithdrawalVoucherSubmitted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"tokenHash","type":"bytes32"},{"indexed":false,"name":"tokenContractAddress","type":"address"},{"indexed":false,"name":"tokenId","type":"uint256"},{"indexed":true,"name":"seller","type":"address"},{"indexed":true,"name":"winner","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"auctionEndVoucherHash","type":"bytes32"}],"name":"LogAuctionEndVoucherSubmitted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"auction","type":"address"},{"indexed":false,"name":"user","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"LogSentEthToWinner","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"auction","type":"address"},{"indexed":false,"name":"user","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"LogSentEthToAuctioneer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"user","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"LogSentDepotEth","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"user","type":"address[]"},{"indexed":false,"name":"amount","type":"uint256[]"}],"name":"LogSentRewardsDepotEth","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"version","type":"string"},{"indexed":false,"name":"error","type":"string"}],"name":"LogError","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"version","type":"string"},{"indexed":false,"name":"error","type":"string"},{"indexed":false,"name":"data","type":"bytes32[]"}],"name":"LogErrorWithData","type":"event"}]

Contract Creation Code
60c0604052600e60808190527f6465706f7369742d6574682d763100000000000000000000000000000000000060a0908152620000409160009190620000d9565b503480156200004e57600080fd5b5060405160408062003e878339810160405280516020909101516002805460a060020a60ff0219167401000000000000000000000000000000000000000060ff948516021760a860020a60ff021916750100000000000000000000000000000000000000000093909216929092021790556001805433600160a060020a03199091161790556200017e565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200011c57805160ff19168380011785556200014c565b828001600101855582156200014c579182015b828111156200014c5782518255916020019190600101906200012f565b506200015a9291506200015e565b5090565b6200017b91905b808211156200015a576000815560010162000165565b90565b613cf9806200018e6000396000f3006080604052600436106101065763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166301890df681146101105780630b77a7151461013b5780630dc16a561461016757806313484ff21461019a578063439370b11461010657806354fd4d50146101af5780635bf96478146102395780635cc27614146102d05780637421859f146102f1578063745ffb41146103065780637adbf9731461031e5780637dc0d1d01461033f5780638da5cb5b146103705780639009d9b714610385578063966d714814610498578063a0709812146104b0578063abdecf52146104c5578063c75bc4fb146104dd578063c8149cbc146104f7575b61010e610511565b005b34801561011c57600080fd5b50610125610837565b6040805160ff9092168252519081900360200190f35b34801561014757600080fd5b50610153600435610858565b604080519115158252519081900360200190f35b34801561017357600080fd5b50610188600160a060020a036004351661086d565b60408051918252519081900360200190f35b3480156101a657600080fd5b5061015361088c565b3480156101bb57600080fd5b506101c46108af565b6040805160208082528351818301528351919283929083019185019080838360005b838110156101fe5781810151838201526020016101e6565b50505050905090810190601f16801561022b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561024557600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261010e94369492936024939284019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375094975061093d9650505050505050565b3480156102dc57600080fd5b50610188600160a060020a0360043516611178565b3480156102fd57600080fd5b5061015361118a565b34801561031257600080fd5b5061018860043561119a565b34801561032a57600080fd5b5061010e600160a060020a03600435166111b9565b34801561034b57600080fd5b5061035461124a565b60408051600160a060020a039092168252519081900360200190f35b34801561037c57600080fd5b50610354611259565b34801561039157600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261010e94369492936024939284019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a9998810197919650918201945092508291508401838280828437509497506112689650505050505050565b3480156104a457600080fd5b506101536004356118c9565b3480156104bc57600080fd5b506101256118de565b3480156104d157600080fd5b50610188600435611900565b3480156104e957600080fd5b5061010e600435151561190e565b34801561050357600080fd5b5061010e60043515156119a2565b600254606090600090760100000000000000000000000000000000000000000000900460ff16158061054d5750600154600160a060020a031633145b15156105a3576040805160e560020a62461bcd02815260206004820152601060248201527f4d4947524154494f4e5f4c4f434b454400000000000000000000000000000000604482015290519081900360640190fd5b60025460b860020a900460ff1615806105c65750600154600160a060020a031633145b151561061c576040805160e560020a62461bcd02815260206004820152601260248201527f4d41494e54454e414e43455f4c4f434b45440000000000000000000000000000604482015290519081900360640190fd5b503460008111610676576040805160e560020a62461bcd02815260206004820152601d60248201527f416d6f756e74206d7573742062652067726561746572207468616e2030000000604482015290519081900360640190fd5b6106803382611a48565b15156107f757604080516001808252818301909252906020808301908038833950508151919350829184915060009081106106b757fe5b602090810290910181019190915260408051606080825260008054600261010060018316150260001901909116049183018290527f2402453bc4a11926f5926f6269f13ed19cb34b0500b502792d8049d765f57272949093879392839283019183019060808401908790801561076e5780601f106107435761010080835404028352916020019161076e565b820191906000526020600020905b81548152906001019060200180831161075157829003601f168201915b5050848103835260178152602001807f4445504f5345445f4144445f444154415f4641494c4544000000000000000000815250602001848103825285818151815260200191508051906020019060200280838360005b838110156107dc5781810151838201526020016107c4565b505050509050019550505050505060405180910390a1610833565b604080513381526020810183905281517f69d8ef4af6b253bc5befb88d3f648efada0f0e5d4550764eaa18b633342b1cba929181900390910190a15b5050565b60025474010000000000000000000000000000000000000000900460ff1681565b60076020526000908152604090205460ff1681565b600160a060020a0381166000908152600360205260409020545b919050565b600254760100000000000000000000000000000000000000000000900460ff1681565b6000805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156109355780601f1061090a57610100808354040283529160200191610935565b820191906000526020600020905b81548152906001019060200180831161091857829003601f168201915b505050505081565b6000806000600260179054906101000a900460ff1615806109685750600154600160a060020a031633145b15156109be576040805160e560020a62461bcd02815260206004820152601260248201527f4d41494e54454e414e43455f4c4f434b45440000000000000000000000000000604482015290519081900360640190fd5b836040518082805190602001908083835b602083106109ee5780518252601f1990920191602091820191016109cf565b51815160001960209485036101000a019081169019919091161790526040805194909201849003909320600081815260059094529220549196505060ff161515600114159150610b38905057604080518181526000805460026000196101006001841615020190911604928201839052600080516020613cae8339815191529290919081906020820190606083019085908015610acc5780601f10610aa157610100808354040283529160200191610acc565b820191906000526020600020905b815481529060010190602001808311610aaf57829003601f168201915b5050928303905250602381527f5749544844524157414c5f564f55434845525f414c52454144595f5355424d4960208201527f544544000000000000000000000000000000000000000000000000000000000060408083019190915251908190036060019150a1611171565b600254610b629085907501000000000000000000000000000000000000000000900460ff16611a94565b9092509050801515610c6c57604080518181526000805460026000196101006001841615020190911604928201839052600080516020613cae8339815191529290919081906020820190606083019085908015610c005780601f10610bd557610100808354040283529160200191610c00565b820191906000526020600020905b815481529060010190602001808311610be357829003601f168201915b5050928303905250602181527f5749544844524157414c5f564f55434845525f414d4f554e545f494e56414c4960208201527f440000000000000000000000000000000000000000000000000000000000000060408083019190915251908190036060019150a1611171565b600160a060020a0382161515610d7a57604080518181526000805460026000196101006001841615020190911604928201839052600080516020613cae8339815191529290919081906020820190606083019085908015610d0e5780601f10610ce357610100808354040283529160200191610d0e565b820191906000526020600020905b815481529060010190602001808311610cf157829003601f168201915b5050928303905250602181527f5749544844524157414c5f564f55434845525f5349474e45525f494e56414c4960208201527f440000000000000000000000000000000000000000000000000000000000000060408083019190915251908190036060019150a1611171565b600160a060020a038216600090815260036020526040902054811115610e9857604080518181526000805460026000196101006001841615020190911604928201839052600080516020613cae8339815191529290919081906020820190606083019085908015610e2c5780601f10610e0157610100808354040283529160200191610e2c565b820191906000526020600020905b815481529060010190602001808311610e0f57829003601f168201915b5050928303905250602781527f5749544844524157414c5f564f55434845525f4445504f545f414d4f554e545f60208201527f544f4f5f4c4f570000000000000000000000000000000000000000000000000060408083019190915251908190036060019150a1611171565b610ea485838386611b3e565b1515610fa857604080518181526000805460026000196101006001841615020190911604928201839052600080516020613cae8339815191529290919081906020820190606083019085908015610f3c5780601f10610f1157610100808354040283529160200191610f3c565b820191906000526020600020905b815481529060010190602001808311610f1f57829003601f168201915b5050928303905250602b81527f5749544844524157414c5f564f55434845525f4f5241434c455f494e56414c4960208201527f445f5349474e415455524500000000000000000000000000000000000000000060408083019190915251908190036060019150a1611171565b604051600160a060020a0383169082156108fc029083906000818181858888f1935050505015156110d157604080518181526000805460026000196101006001841615020190911604928201839052600080516020613cae83398151915292909190819060208201906060830190859080156110655780601f1061103a57610100808354040283529160200191611065565b820191906000526020600020905b81548152906001019060200180831161104857829003601f168201915b5050928303905250602681527f5749544844524157414c5f564f55434845525f4554485f5452414e534645525f60208201527f4641494c4544000000000000000000000000000000000000000000000000000060408083019190915251908190036060019150a1611171565b6110db8282611cac565b506004805460018181019092557f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b01849055600084815260056020908152604091829020805460ff19169093179092558051600160a060020a0385168152918201839052818101859052517f526d1df19f1af5c7650ac415ee16f9f80a969540293cbbf325276bd1c71cbe729181900360600190a15b5050505050565b60036020526000908152604090205481565b60025460b860020a900460ff1681565b60068054829081106111a857fe5b600091825260209091200154905081565b600154600160a060020a0316331461121b576040805160e560020a62461bcd02815260206004820152601460248201527f53656e646572206d757374206265206f776e6572000000000000000000000000604482015290519081900360640190fd5b6002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600254600160a060020a031681565b600154600160a060020a031681565b6000611272613c48565b600080600061127f613c76565b60025460b860020a900460ff1615806112a25750600154600160a060020a031633145b15156112f8576040805160e560020a62461bcd02815260206004820152601260248201527f4d41494e54454e414e43455f4c4f434b45440000000000000000000000000000604482015290519081900360640190fd5b886040518082805190602001908083835b602083106113285780518252601f199092019160209182019101611309565b51815160001960209485036101000a019081169019919091161790526040805194909201849003909320600081815260079094529220549199505060ff161515600114159150611472905057604080518181526000805460026000196101006001841615020190911604928201839052600080516020613cae83398151915292909190819060208201906060830190859080156114065780601f106113db57610100808354040283529160200191611406565b820191906000526020600020905b8154815290600101906020018083116113e957829003601f168201915b5050928303905250602481527f41554354494f4e5f454e445f564f55434845525f414c52454144595f5355424d60208201527f495445440000000000000000000000000000000000000000000000000000000060408083019190915251908190036060019150a16118bd565b61147b89611cfd565b94506001885111156114ab57611495888660000151611d5a565b90506114a081611fab565b15156114ab576118bd565b6115138a886040518082805190602001908083835b602083106114df5780518252601f1990920191602091820191016114c0565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902087846120dd565b151561161757604080518181526000805460026000196101006001841615020190911604928201839052600080516020613cae83398151915292909190819060208201906060830190859080156115ab5780601f10611580576101008083540402835291602001916115ab565b820191906000526020600020905b81548152906001019060200180831161158e57829003601f168201915b5050928303905250602c81527f41554354494f4e5f454e445f564f55434845525f4f5241434c455f494e56414c60208201527f49445f5349474e4154555245000000000000000000000000000000000000000060408083019190915251908190036060019150a16118bd565b61162785602001518b60616122b5565b15156117d957895160f860020a908b90606190811061164257fe5b90602001015160f860020a900460f860020a02600160f860020a03191611156116db576040805160e560020a62461bcd02815260206004820152602760248201527f4d6f7265207468616e206f6e65207472616e736665722066756e6374696f6e2060448201527f746f2063616c6c00000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b604080518181526000805460026000196101006001841615020190911604928201839052600080516020613cae833981519152929091908190602082019060608301908590801561176d5780601f106117425761010080835404028352916020019161176d565b820191906000526020600020905b81548152906001019060200180831161175057829003601f168201915b5050928303905250602381527f41554354494f4e5f454e445f564f55434845525f5452414e534645525f46414960208201527f4c4544000000000000000000000000000000000000000000000000000000000060408083019190915251908190036060019150a16118bd565b6001885111156117f9576117ee87868361234d565b15156117f9576118bd565b6006805460018181019092557ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f01879055600087815260076020908152604091829020805460ff191690931790925582820151878201518851898501516080808c0151888701518751948552600160a060020a03938416988501989098528387015260608301969096529481018b905292519184169316917f4a019ca24b28fbd88f049010e51779834bb31fc994106e98f10c315789f0e768919081900360a00190a35b50505050505050505050565b60056020526000908152604090205460ff1681565b6002547501000000000000000000000000000000000000000000900460ff1681565b60048054829081106111a857fe5b600154600160a060020a03163314611970576040805160e560020a62461bcd02815260206004820152601460248201527f53656e646572206d757374206265206f776e6572000000000000000000000000604482015290519081900360640190fd5b6002805491151560b860020a0277ff000000000000000000000000000000000000000000000019909216919091179055565b600154600160a060020a03163314611a04576040805160e560020a62461bcd02815260206004820152601460248201527f53656e646572206d757374206265206f776e6572000000000000000000000000604482015290519081900360640190fd5b600280549115157601000000000000000000000000000000000000000000000276ff0000000000000000000000000000000000000000000019909216919091179055565b600160a060020a038216600090815260036020526040812054611a71908363ffffffff612a5016565b600160a060020a0384166000908152600360205260409020555060015b92915050565b6000806000606080611aad611aa888612a5d565b612aae565b9050611ad0816005815181101515611ac157fe5b90602001906020020151612b81565b915060208201519250611ae38187612bf3565b94507f835fc6ca000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1984161415611b3457602482015193505b5050509250929050565b604080516c01000000000000000000000000308102602080840191909152600160a060020a0387169091026034830152604882018590526068808301859052835180840390910181526088909201928390528151600093611c929392909182918401908083835b60208310611bc45780518252601f199092019160209182019101611ba5565b51815160209384036101000a6000190180199092169116179052604080519290940182900382207f19457468657265756d205369676e6564204d6573736167653a0a33320000000083830152603c8084019190915284518084039091018152605c9092019384905281519195509293508392850191508083835b60208310611c5d5780518252601f199092019160209182019101611c3e565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020866000612c7b565b600254600160a060020a0391821691161495945050505050565b600160a060020a038216600090815260036020526040812054821115611cd457506000611a8e565b600160a060020a038316600090815260036020526040902054611a71908363ffffffff612d0716565b611d05613c48565b600254611d2f9083907501000000000000000000000000000000000000000000900460ff16612d19565b60ff1660608701526080860152600160a060020a039081166020860152166040840152508152919050565b611d62613c76565b6000611d7d84600260159054906101000a900460ff16612dfa565b600160a060020a03908116602087015260408601919091521683529050828114611e9f57604080518181526000805460026000196101006001841615020190911604928201839052600080516020613cae8339815191529290919081906020820190606083019085908015611e335780601f10611e0857610100808354040283529160200191611e33565b820191906000526020600020905b815481529060010190602001808311611e1657829003601f168201915b5050928303905250603281527f41554354494f4e5f454e445f564f55434845525f686173685261775478546f6b60208201527f656e5472616e736665725f494e56414c4944000000000000000000000000000060408083019190915251908190036060019150a1611fa4565b60408201511515611fa457604080518181526000805460026000196101006001841615020190911604928201839052600080516020613cae8339815191529290919081906020820190606083019085908015611f3c5780601f10611f1157610100808354040283529160200191611f3c565b820191906000526020600020905b815481529060010190602001808311611f1f57829003601f168201915b5050928303905250602a81527f41554354494f4e5f454e445f564f55434845525f42494444494e475f414d4f5560208201527f4e545f494e56414c49440000000000000000000000000000000000000000000060408083019190915251908190036060019150a15b5092915050565b604080820151602080840151600160a060020a0316600090815260039091529182205410156120d557604080518181526000805460026000196101006001841615020190911604928201839052600080516020613cae83398151915292909190819060208201906060830190859080156120665780601f1061203b57610100808354040283529160200191612066565b820191906000526020600020905b81548152906001019060200180831161204957829003601f168201915b5050928303905250602881527f41554354494f4e5f454e445f564f55434845525f4445504f545f414d4f554e5460208201527f5f544f4f5f4c4f5700000000000000000000000000000000000000000000000060408083019190915251908190036060019150a1506000610887565b506001919050565b6020840151600090816120ef87612eb0565b60208681015160808801516040808a0151898501518a83015160608d01518451306c01000000000000000000000000908102828b0152600160a060020a039889168102603483015260488201979097529387168602606885015295909116909302607c820152609081019290925260b0820187905260ff90921660f860020a0260d082015260d1810184905260f18082018b9052825180830390910181526101119091019182905280519394506122999390928291908401908083835b602083106121cb5780518252601f1990920191602091820191016121ac565b51815160209384036101000a6000190180199092169116179052604080519290940182900382207f19457468657265756d205369676e6564204d6573736167653a0a33320000000083830152603c8084019190915284518084039091018152605c9092019384905281519195509293508392850191508083835b602083106122645780518252601f199092019160209182019101612245565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020886020612c7b565b600254600160a060020a03918216911614979650505050505050565b6000806000806122c487612fb5565b15156122d35760009350612343565b85858151811015156122e157fe5b90602001015160f860020a900460f860020a0260f860020a90049250600185019450600090505b8260ff168160ff16101561233e57612321878787612fbd565b90955091508115156123365760009350612343565b600101612308565b600193505b5050509392505050565b6000806000806000806000606080600061236f8b602001518c60400151611cac565b151561247757604080518181526000805460026000196101006001841615020190911604928201839052600080516020613cae83398151915292909190819060208201906060830190859080156124075780601f106123dc57610100808354040283529160200191612407565b820191906000526020600020905b8154815290600101906020018083116123ea57829003601f168201915b5050928303905250602881527f41554354494f4e5f454e445f564f55434845525f4445504f545f414d4f554e5460208201527f5f544f4f5f4c4f5700000000000000000000000000000000000000000000000060408083019190915251908190036060019150a160009950612a40565b8c8901601481015160349091015160408e01519199509750600160a060020a03808a169116146125a357604080518181526000805460026000196101006001841615020190911604928201839052600080516020613cae83398151915292909190819060208201906060830190859080156125335780601f1061250857610100808354040283529160200191612533565b820191906000526020600020905b81548152906001019060200180831161251657829003601f168201915b5050928303905250602a81527f41554354494f4e5f454e445f564f55434845525f53454e445f544f5f53454c4c60208201527f45525f494e56414c49440000000000000000000000000000000000000000000060408083019190915251908190036060019150a160009950612a40565b6040516034999099019894870194600160a060020a0389169088156108fc029089906000818181858888f193505050501515612629576040805160e560020a62461bcd02815260206004820152601460248201527f4661696c656420746f2073656e642066756e6473000000000000000000000000604482015290519081900360640190fd5b8a5160408051600160a060020a039283168152918a166020830152818101899052517f4d2d8d41fb501add0a2a27393c3b7c3e4cb75ec17b8b7c573ab8d45ad4691ace9181900360600190a160008c6060015160ff1611156129ba578c8901601481015160349182015160405192909b019a909950975094870194600160a060020a0389169088156108fc029089906000818181858888f19350505050151561271c576040805160e560020a62461bcd02815260206004820152601460248201527f4661696c656420746f2073656e642066756e6473000000000000000000000000604482015290519081900360640190fd5b8a5160408051600160a060020a039283168152918a166020830152818101899052517f389aca95cfffc505215454000ac1a21c007291c50b94fffb45059a7cbb86d8d59181900360600190a1602089018d015193506002890198508360f060020a900461ffff166040519080825280602002602001820160405280156127ac578160200160208202803883390190505b5092508360f060020a900461ffff166040519080825280602002602001820160405280156127e4578160200160208202803883390190505b509150600090505b8360f060020a900461ffff168161ffff1610156128fe578c890160148101516034909101516020909a01999098506bffffffffffffffffffffffff633b9aca00740100000000000000000000000000000000000000008304021697509550938601936128588888611a48565b15156128ae576040805160e560020a62461bcd02815260206004820152601160248201527f43616e277420616464206465706f736974000000000000000000000000000000604482015290519081900360640190fd5b87838261ffff168151811015156128c157fe5b600160a060020a0390921660209283029091019091015281518790839061ffff84169081106128ec57fe5b602090810290910101526001016127ec565b7f7de9940f74e0c14fb9a311c4ed7443a04627b31f270a83a8b46bfe9e3d99d6308383604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561296557818101518382015260200161294d565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156129a457818101518382015260200161298c565b5050505090500194505050505060405180910390a15b60408b01518514612a3b576040805160e560020a62461bcd02815260206004820152602a60248201527f42696464696e6720616d6f756e74206973206e6f7420657175616c20746f207360448201527f656e7420616d6f756e7400000000000000000000000000000000000000000000606482015290519081900360840190fd5b600199505b5050505050505050509392505050565b81810182811015611a8e57fe5b612a65613c96565b6000825160001415612a8c5760408051808201909152600080825260208201529150612aa8565b5050604080518082019091528151815260208281019082018190525b50919050565b6060600080600080612abf86613220565b1515612aca57600080fd5b612ad38661324d565b935083604051908082528060200260200182016040528015612b0f57816020015b612afc613c96565b815260200190600190039081612af45790505b509450612b1f866020015161329d565b8660200151019250600090505b83811015612b7857612b3d83613300565b91506040805190810160405280838152602001848152508582815181101515612b6257fe5b6020908102909101015291810191600101612b2c565b50505050919050565b606060008060606000612b97866020015161329d565b9350838660000151039250826040519080825280601f01601f191660200182016040528015612bd0578160200160208202803883390190505b509150816020019050612bea848760200151018285613391565b50949350505050565b6000606080612c0285856133d8565b8092508193505050612c72826040518082805190602001908083835b60208310612c3d5780518252601f199092019160209182019101612c1e565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020826000612c7b565b95945050505050565b818101602081810151604080840151606094850151825160008082528187018086528b905260ff60f860020a8404168286015296810185905260808101839052925193949193909260019260a0808301939192601f19830192908190039091019089865af1158015612cf1573d6000803e3d6000fd5b5050604051601f19015198975050505050505050565b600082821115612d1357fe5b50900390565b6000806000806000806060806060612d33611aa88c612a5d565b9150612d56826003815181101515612d4757fe5b90602001906020020151613715565b9750612d6a826005815181101515611ac157fe5b9250612d76828b612bf3565b9650612d81836137b9565b6040518451939a509198509650919250829190819060208401908083835b60208310612dbe5780518252601f199092019160209182019101612d9f565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902098505050509295509295509295565b6000806000806060806000612e11611aa88a612a5d565b9150612e25826003815181101515612d4757fe5b9550612e39826005815181101515611ac157fe5b925060208301519050612e4c8289612bf3565b93507f1d03ae68000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1982161415612ea45760248301516064840151975094505b50505092959194509250565b60006060600060618451036040519080825280601f01601f191660200182016040528015612ee8578160200160208202803883390190505b509150600090505b6061845103811015612f4e578381606101815181101515612f0d57fe5b90602001015160f860020a900460f860020a028282815181101515612f2e57fe5b906020010190600160f860020a031916908160001a905350600101612ef0565b816040518082805190602001908083835b60208310612f7e5780518252601f199092019160209182019101612f5f565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902092505b5050919050565b6000903b1190565b6000806060806000808787815181101515612fd457fe5b90602001015160f860020a900460f860020a02600160f860020a03191660b860f860020a021415613071576040805160018082528183019092529060208083019080388339019050509350878760010181518110151561303057fe5b90602001015160f860020a900460f860020a0284600081518110151561305257fe5b906020010190600160f860020a031916908160001a9053506002870196505b878781518110151561307f57fe5b90602001015160f860020a900460f860020a02600160f860020a03191660b960f860020a021415613166576040805160028082528183018352909160208301908038833901905050935087876001018151811015156130da57fe5b90602001015160f860020a900460f860020a028460008151811015156130fc57fe5b906020010190600160f860020a031916908160001a905350878760020181518110151561312557fe5b90602001015160f860020a900460f860020a0284600181518110151561314757fe5b906020010190600160f860020a031916908160001a9053506003870196505b61316f846138d8565b9150816040519080825280601f01601f19166020018201604052801561319f578160200160208202803883390190505b509250600090505b8181101561320057878782018151811015156131bf57fe5b90602001015160f860020a900460f860020a0283828151811015156131e057fe5b906020010190600160f860020a031916908160001a9053506001016131a7565b95810195866132108a8486613920565b9550955050505050935093915050565b6020810151805160009190821a9060c060ff831610156132435760009250612fae565b5060019392505050565b60008060008060009250613264856020015161329d565b6020860151865191810193500190505b808210156132945761328582613300565b60019093019290910190613274565b50909392505050565b8051600090811a60808110156132b65760009150612aa8565b60b88110806132d1575060c081108015906132d1575060f881105b156132df5760019150612aa8565b60c08110156132f45760b51981019150612aa8565b60f51981019150612aa8565b8051600090811a60808110156133195760019150612aa8565b60b881101561332e57607e1981019150612aa8565b60c081101561335b5760b78103600184019350806020036101000a84510460018201810193505050612aa8565b60f88110156133705760be1981019150612aa8565b60019290920151602083900360f7016101000a900490910160f51901919050565b60005b602082106133b6578351835260209384019390920191601f1990910190613394565b50915181516020939093036101000a6000190180199091169216919091179052565b6040805160098082526101408201909252606091829182916000918291816020015b60608152602001906001900390816133fa57905050925061342b613426886000815181101515611ac157fe5b613969565b83600081518110151561343a57fe5b9060200190602002018190525061345c613426886001815181101515611ac157fe5b83600181518110151561346b57fe5b9060200190602002018190525061348d613426886002815181101515611ac157fe5b83600281518110151561349c57fe5b906020019060200201819052506134be613426886003815181101515611ac157fe5b8360038151811015156134cd57fe5b906020019060200201819052506134ef613426886004815181101515611ac157fe5b8360048151811015156134fe57fe5b90602001906020020181905250613520613426886005815181101515611ac157fe5b83600581518110151561352f57fe5b6020908102909101015261354560ff8716613a63565b83600681518110151561355457fe5b602090810290910101526135686000613a63565b83600781518110151561357757fe5b6020908102909101015261358b6000613a63565b83600881518110151561359a57fe5b602090810290910101526135ad83613ac5565b6040805160418082526080820190925291965060208201610820803883390190505093506135f28760078151811015156135e357fe5b90602001906020020151613bb2565b6000925090505b60208260ff16101561364f578060ff83166020811061361457fe5b1a60f860020a02848360ff1681518110151561362c57fe5b906020010190600160f860020a031916908160001a9053506001909101906135f9565b6136618760088151811015156135e357fe5b6000925090505b60208260ff1610156136c1578060ff83166020811061368357fe5b1a60f860020a02848360200160ff1681518110151561369e57fe5b906020010190600160f860020a031916908160001a905350600190910190613668565b60088660020260ff166136dc8960068151811015156135e357fe5b030360f860020a028460408151811015156136f357fe5b906020010190600160f860020a031916908160001a9053505050509250929050565b80516000908190819060151461379b576040805160e560020a62461bcd02815260206004820152603260248201527f496e76616c696420524c504974656d2e2041646472657373657320617265206560448201527f6e636f64656420696e2032302062797465730000000000000000000000000000606482015290519081900360840190fd5b50505060200151600101516c01000000000000000000000000900490565b6020810151606090600090819081908180807fffd6d828000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19851614156138cd57602489810151808b019091015160448b015160648c015160c48d015160408051858152601f19601f8701168101602001909152929b5090995097509194509250828015613869578160200160208202803883390190505b509750600090505b818110156138cd578851899060248386010190811061388c57fe5b90602001015160f860020a900460f860020a0288828151811015156138ad57fe5b906020010190600160f860020a031916908160001a905350600101613871565b505050509193509193565b600080805b8351811015611fa4578060010184510360080260020a848281518110151561390157fe5b016020015160f860020a908190048102040291909101906001016138dd565b60008060006040516020850151915081815260045b8681101561394f5760208187018101518383015201613935565b50602081878360008b6127105a03f1979650505050505050565b8051604051906020808401919083019060006001821480156139d7575085517f7f0000000000000000000000000000000000000000000000000000000000000090879060009081106139b757fe5b90602001015160f860020a900460f860020a02600160f860020a03191611155b156139f057600185528351835260018301604052612b78565b60378211613a2057816001018552816080018353816001840101604052613a1b848460010184613be8565b612b78565b613a2982613c30565b905081816001010185528060b7018353806020036101000a820260018401528181600185010101604052612b788482856001010184613be8565b606060006060613a7284613c30565b9150816040519080825280601f01601f191660200182016040528015613aa2578160200160208202803883390190505b509050816020036101000a84026020820152613abd81613969565b949350505050565b6060600080600080606060005b8751841015613b03578784815181101515613ae957fe5b906020019060200201515185019450836001019350613ad2565b604051965060208701955060378511613b27578460c0018653600186019550613b50565b613b3085613c30565b92508260f7018653600186019550826020036101000a8502865282860195505b600093505b8751841015613b9b578784815181101515613b6c57fe5b906020019060200201519150602082019050613b8a81878451613be8565b815186019550836001019350613b55565b856040526020878703038752505050505050919050565b6000806000806000613bc7866020015161329d565b86516020978801518201519190039096036101000a90950495945050505050565b60005b60208210613c0d578351835260209384019390920191601f1990910190613beb565b6001826020036101000a0390508019845116818451168181178552505050505050565b60005b81156108875761010082049150600101613c33565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915290565b604080516060810182526000808252602082018190529181019190915290565b6040805180820190915260008082526020820152905600b070cb3e4fef70e12d8e599444f6395a8ff59f4db70ac633f9d5c5db734a4d37a165627a7a723058209591a40582295deaaf533c3ef9e1460865ad0bfc2048312238b73b1a207f812c00290000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000003f


    Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000003f

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [1] : 000000000000000000000000000000000000000000000000000000000000003f


   Swarm Source:
bzzr://9591a40582295deaaf533c3ef9e1460865ad0bfc2048312238b73b1a207f812c
Block Age transaction Difficulty GasUsed Reward
Block Age Uncle Number Difficulty GasUsed Reward
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.