Submission e979e71d...

ChallengeHex decoder
Submitterzac.creditmint.eth
Submitted at2018-18-16
Gas used34515
pragma solidity ^0.4.23;

contract HexDecoder {
    /**
     * @dev Decodes a hex-encoded input string, returning it in binary.
     *
     * Input strings may be of any length, but will always be a multiple of two
     * bytes long, and will not contain any non-hexadecimal characters.
     *
     * @return The decoded output.
     */
    function decode(string) external view returns(bytes) {
        assembly {
            mstore(0x40, 0x00)
            0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
            0xEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF
            0x9000000000000000000000000000000000000000000000000000000000000000
            0x0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F

            0x40
            msize
            2 0x24 calldataload div
            dup1 iszero no_bytes jumpi



            dup3 4 eq four_byte jumpi
            dup3 0x80 eq four_words jumpi

            0x44
            dup1 calldataload

            loop_start:

                dup9
                dup2 dup10 or not
                dup9 mulmod add
                dup6 and
                272 mul // 4352 mul
                0x20 mstore
                0x03 mload 0x05 mload 0x07 mload 0x09 mload 0x0b mload
                0x0d mload 0x0f mload 0x11 mload 0x13 mload 0x15 mload
                0x17 mload 0x19 mload 0x1b mload 0x1d mload 0x1f mload
                0x2f mstore8 0x2e mstore8 0x2d mstore8 0x2c mstore8 0x2b mstore8 0x2a mstore8 0x29 mstore8 0x28 mstore8
                0x27 mstore8 0x26 mstore8 0x25 mstore8 0x24 mstore8 0x23 mstore8 0x22 mstore8 0x21 mstore8

                0x20 dup2 add calldataload
                dup9
                dup2 dup10 or not
                dup9 mulmod add
                dup6 and
                272 mul
                0x30 mstore
                0x13 mload 0x15 mload 0x17 mload 0x19 mload 0x1b mload
                0x1d mload 0x1f mload 0x21 mload 0x23 mload 0x25 mload
                0x27 mload 0x29 mload 0x2b mload 0x2d mload 0x2f mload                0x3f mstore8 0x3e mstore8 0x3d mstore8 0x3c mstore8 0x3b mstore8 0x3a mstore8 0x39 mstore8 0x38 mstore8
                0x37 mstore8 0x36 mstore8 0x35 mstore8 0x34 mstore8 0x33 mstore8 0x32 mstore8 0x31 mstore8
                0x20 mload msize mstore
    
                0x40 add
                dup1 calldataload dup1
                loop_start jumpi

            loop_end:
            pop pop                // s m'
            0x0 dup2 dup4 add mstore
            0x20 dup3 sub mstore // store length
            
                                // m' 0x40
            sub
            0x20 dup2 mstore

            dup1 0x20 msize sub sub // size start
            swap1
            return
            
            /* 0x40 sub            // start numBytes
            0x20 dup2 mstore    // start numbytes
            dup2 dup2 0x20 add mstore
            
            dup1 dup3 0x40 add add // 
            dup1 0x1f and iszero
            skip jumpi
            0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 and
            skip:
            0x10
            return*/
            pop pop
            
        no_bytes:
            0x40 0x00 return

        four_byte:
            pop pop 0x44
            dup2 calldataload
            dup8
            dup2 dup9 or not
            dup8 mulmod add
            dup5 and
            16 dup2 div or
            0x20 mstore
            4 mload 6 mload 8 mload
            36 mstore8 35 mstore8 34 mstore8
            33 mload dup2 mstore

            0x20 0x00 mstore
            4 0x20 mstore
            0x0 0x44 mstore
            0x60
            0
            return

        four_words:
            pop pop 0x44
            0x124 calldataload
            dup8
            dup2 dup9 or not
            dup8 mulmod add
            dup5 and
            16 dup2 div or
            0x20 mstore
            4 mload 6 mload 8 mload 10 mload 12 mload 14 mload 16 mload 18 mload
            20 mload 22 mload 24 mload 26 mload 28 mload 30 mload 32 mload
            48 mstore8 47 mstore8 46 mstore8 45 mstore8 44 mstore8 43 mstore8 42 mstore8 41 mstore8
            40 mstore8 39 mstore8 38 mstore8 37 mstore8 36 mstore8 35 mstore8 34 mstore8
            33 mload

            0x104 calldataload
            dup9
            dup2 dup10 or not
            dup9 mulmod add
            dup6 and
            16 dup2 div or
            0x20 mstore
            4 mload 6 mload 8 mload 10 mload 12 mload 14 mload 16 mload 18 mload
            20 mload 22 mload 24 mload 26 mload 28 mload 30 mload 32 mload
            48 mstore8 47 mstore8 46 mstore8 45 mstore8 44 mstore8 43 mstore8 42 mstore8 41 mstore8
            40 mstore8 39 mstore8 38 mstore8 37 mstore8 36 mstore8 35 mstore8 34 mstore8
            33 mload

            0xe4 calldataload
            dup10
            dup2 dup11 or not
            dup10 mulmod add
            dup7 and
            16 dup2 div or
            0x20 mstore
            4 mload 6 mload 8 mload 10 mload 12 mload 14 mload 16 mload 18 mload
            20 mload 22 mload 24 mload 26 mload 28 mload 30 mload 32 mload
            48 mstore8 47 mstore8 46 mstore8 45 mstore8 44 mstore8 43 mstore8 42 mstore8 41 mstore8
            40 mstore8 39 mstore8 38 mstore8 37 mstore8 36 mstore8 35 mstore8 34 mstore8
            33 mload

            0xc4 calldataload
            dup11
            dup2 dup12 or not
            dup11 mulmod add
            dup8 and
            16 dup2 div or
            0x20 mstore
            4 mload 6 mload 8 mload 10 mload 12 mload 14 mload 16 mload 18 mload
            20 mload 22 mload 24 mload 26 mload 28 mload 30 mload 32 mload
            48 mstore8 47 mstore8 46 mstore8 45 mstore8 44 mstore8 43 mstore8 42 mstore8 41 mstore8
            40 mstore8 39 mstore8 38 mstore8 37 mstore8 36 mstore8 35 mstore8 34 mstore8
            33 mload

            0xa4 calldataload
            dup12
            dup2 dup13 or not
            dup12 mulmod add
            dup9 and
            16 dup2 div or
            0x20 mstore
            4 mload 6 mload 8 mload 10 mload 12 mload 14 mload 16 mload 18 mload
            20 mload 22 mload 24 mload 26 mload 28 mload 30 mload 32 mload
            48 mstore8 47 mstore8 46 mstore8 45 mstore8 44 mstore8 43 mstore8 42 mstore8 41 mstore8
            40 mstore8 39 mstore8 38 mstore8 37 mstore8 36 mstore8 35 mstore8 34 mstore8
            33 mload

            0x84 calldataload
            dup13
            dup2 dup14 or not
            dup13 mulmod add
            dup10 and
            16 dup2 div or
            0x20 mstore
            4 mload 6 mload 8 mload 10 mload 12 mload 14 mload 16 mload 18 mload
            20 mload 22 mload 24 mload 26 mload 28 mload 30 mload 32 mload
            48 mstore8 47 mstore8 46 mstore8 45 mstore8 44 mstore8 43 mstore8 42 mstore8 41 mstore8
            40 mstore8 39 mstore8 38 mstore8 37 mstore8 36 mstore8 35 mstore8 34 mstore8
            33 mload
 
            0x64 calldataload
            dup14
            dup2 dup15 or not
            dup14 mulmod add
            dup11 and
            16 dup2 div or
            0x20 mstore
            4 mload 6 mload 8 mload 10 mload 12 mload 14 mload 16 mload 18 mload
            20 mload 22 mload 24 mload 26 mload 28 mload 30 mload 32 mload
            48 mstore8 47 mstore8 46 mstore8 45 mstore8 44 mstore8 43 mstore8 42 mstore8 41 mstore8
            40 mstore8 39 mstore8 38 mstore8 37 mstore8 36 mstore8 35 mstore8 34 mstore8
            33 mload

            0x44 calldataload
            dup15
            dup2 dup16 or not
            dup15 mulmod add
            dup12 and
            16 dup2 div or
            0x20 mstore
            4 mload 6 mload 8 mload 10 mload 12 mload 14 mload 16 mload 18 mload
            20 mload 22 mload 24 mload 26 mload 28 mload 30 mload 32 mload
            48 mstore8 47 mstore8 46 mstore8 45 mstore8 44 mstore8 43 mstore8 42 mstore8 41 mstore8
            40 mstore8 39 mstore8 38 mstore8 37 mstore8 36 mstore8 35 mstore8 34 mstore8
            33 mload
            
            0x40 mstore 
            0x50 mstore
            0x60 mstore
            0x70 mstore
            0x80 mstore
            0x90 mstore
            0xa0 mstore
            0xb0 mstore

            0x00 dup2 0xb0 add mstore
            0x20 0x00 mstore
            dup3 0x20 mstore
            0xc0 0 return
        }
    }
}