Contract 0xf471d32cb40837bf24529fcf17418fc1a4807626 2

Contract Overview

Balance:
0 MATIC
Txn Hash
Method
Block
From
To
Value [Txn Fee]
0xb5795ecc2217a2ed3d28d6d20afcd4e06b3f1853407725355cc03c3a8cf9e332Sub2Junion On Yo...338705642023-04-02 10:00:472 hrs 50 mins ago0xa0afc68c2c5b242c4804d36bd2cddb69beb622d9 IN  0xf471d32cb40837bf24529fcf17418fc1a48076260 MATIC0.0003024530161.50001
0x37ff4f932f711b68a9a557d712926cce2b2ad2c3c34fa5ce34a68b2ed7ac82efSub2Junion On Yo...338705582023-04-02 10:00:332 hrs 50 mins ago0xa0afc68c2c5b242c4804d36bd2cddb69beb622d9 IN  0xf471d32cb40837bf24529fcf17418fc1a48076260 MATIC0.0003012380081.50001
0x2ed93f66ac962111fb1ce315c9c8e3b79c796e79b415257b43f513e9f243f574Sub2Junion On Yo...338705522023-04-02 10:00:212 hrs 50 mins ago0xa0afc68c2c5b242c4804d36bd2cddb69beb622d9 IN  0xf471d32cb40837bf24529fcf17418fc1a48076260 MATIC0.0003098495651.50001
0x2114af0cd77206ccbce43abc5093bfbc2bdd001a053a016f58d1bbada46cdc82Sub2Junion On Yo...338298992023-04-01 10:00:331 day 2 hrs ago0xa0afc68c2c5b242c4804d36bd2cddb69beb622d9 IN  0xf471d32cb40837bf24529fcf17418fc1a48076260 MATIC0.0004739790862.35996
0xbfdc193ca6c6cfa395ae3f48160587cddea6f39b6a31f189a9f13e8d21361993Sub2Junion On Yo...338298932023-04-01 10:00:211 day 2 hrs ago0xa0afc68c2c5b242c4804d36bd2cddb69beb622d9 IN  0xf471d32cb40837bf24529fcf17418fc1a48076260 MATIC0.0005032968692.35996
0xcf2f8af4d6dd8d569c4d435cc1da9d46989a3080ad27ffaf1e2b79da4a0d9d30Sub2Junion On Yo...338287152023-04-01 9:18:371 day 3 hrs ago0xa0afc68c2c5b242c4804d36bd2cddb69beb622d9 IN  0xf471d32cb40837bf24529fcf17418fc1a48076260 MATIC0.0004124157731.87905
0x436c8ea54ce1d8eadd9a2e479bac6bdf255d7d539524b3dcf65c9bd123ef7f8cSub2Junion On Yo...338285892023-04-01 9:14:091 day 3 hrs ago0xa0afc68c2c5b242c4804d36bd2cddb69beb622d9 IN  0xf471d32cb40837bf24529fcf17418fc1a48076260 MATIC0.0003963426171.94762
0xcbe6ed9caafbf393818d031497f98d0f466d1a69854f5c0c877dbcca67a550d6Sub2Junion On Yo...337949252023-03-31 13:21:531 day 23 hrs ago0xb121e96d487a64aa4ede55ca73d2e204f24d50bb IN  0xf471d32cb40837bf24529fcf17418fc1a48076260 MATIC0.000340230918 1.64928459
0x2ae7c6d34572dced49bcbe1b62cf9228cfcd7124c4859be5e6ad15921b6df529Sub2Junion On Yo...337945482023-03-31 13:08:331 day 23 hrs ago0xb121e96d487a64aa4ede55ca73d2e204f24d50bb IN  0xf471d32cb40837bf24529fcf17418fc1a48076260 MATIC0.000319546503 1.500000016
0x200b4e58e2fef93972938b4eeccf347957ced449c754455f4065aa7d76b0bfc9Sub2Junion On Yo...337944802023-03-31 13:06:091 day 23 hrs ago0xb121e96d487a64aa4ede55ca73d2e204f24d50bb IN  0xf471d32cb40837bf24529fcf17418fc1a48076260 MATIC0.0000935175 1.500000016
0x658b90470c767e65512cc39bc7245e7db06fbfb1fd1a0064a938c6c66a5e9ed3Sub2Junion On Yo...337944252023-03-31 13:04:111 day 23 hrs ago0xb121e96d487a64aa4ede55ca73d2e204f24d50bb IN  0xf471d32cb40837bf24529fcf17418fc1a48076260 MATIC0.000331288503 1.500000016
0xa83cc5065f8b7dad0a8b31b71e9124871bbaaeecab4995a77766e49485c14971Sub2Junion On Yo...337943982023-03-31 13:03:131 day 23 hrs ago0xb121e96d487a64aa4ede55ca73d2e204f24d50bb IN  0xf471d32cb40837bf24529fcf17418fc1a48076260 MATIC0.000309997503 1.500000016
0xea718865be135d95788acebb21d2974c42de5a5c816d5809e226476c367c6dfcSub2Junion On Yo...337921142023-03-31 11:42:212 days 1 hr ago0xb121e96d487a64aa4ede55ca73d2e204f24d50bb IN  0xf471d32cb40837bf24529fcf17418fc1a48076260 MATIC0.0000934275 1.500000015
0x856e8f4f01c8e1de67830c14d247864a96a9fcc75b93918807db975d1cc04705Sub2Junion On Yo...337919572023-03-31 11:36:472 days 1 hr ago0xb121e96d487a64aa4ede55ca73d2e204f24d50bb IN  0xf471d32cb40837bf24529fcf17418fc1a48076260 MATIC0.000308892003 1.500000015
0xfba09174902dddf15fe3f46171b718ccac7a6a9e49c4f218edb92431600c323bSub2Junion On Yo...337916702023-03-31 11:26:372 days 1 hr ago0xb121e96d487a64aa4ede55ca73d2e204f24d50bb IN  0xf471d32cb40837bf24529fcf17418fc1a48076260 MATIC0.000308892003 1.500000016
0x5e7e6d1706aadddc7826761b9863aaa97bec172d76f64f969d6e0ff4258c3f9aSub2Junion On Yo...337915842023-03-31 11:23:352 days 1 hr ago0xb121e96d487a64aa4ede55ca73d2e204f24d50bb IN  0xf471d32cb40837bf24529fcf17418fc1a48076260 MATIC0.00008547 1.500000016
0x51dc7f6728257be721c717bd554544ae76f973aa1e7add4454200db1e441c62cSub2Junion On Yo...337914322023-03-31 11:18:112 days 1 hr ago0xb121e96d487a64aa4ede55ca73d2e204f24d50bb IN  0xf471d32cb40837bf24529fcf17418fc1a48076260 MATIC0.000302235003 1.500000016
0x051d8a9abd3c975ee4a4e8479c0fb62b64b583fe5ec5be0ce5c6165966d28242Sub2Junion On Yo...337910892023-03-31 11:06:032 days 1 hr ago0xb121e96d487a64aa4ede55ca73d2e204f24d50bb IN  0xf471d32cb40837bf24529fcf17418fc1a48076260 MATIC0.000308892003 1.500000016
0x2035265eed880c97968fe16a08ef4d8b7f4e7b045ce968e3e9a775e0d3432cbdSub2Junion On Yo...337910492023-03-31 11:04:372 days 1 hr ago0xb121e96d487a64aa4ede55ca73d2e204f24d50bb IN  0xf471d32cb40837bf24529fcf17418fc1a48076260 MATIC0.000301692003 1.500000016
0xa27ac9e57775021889170ae70b827d09992261518fe67d7cc33438bde23a07a2Sub2Junion On Yo...337908642023-03-31 10:58:052 days 1 hr ago0xb121e96d487a64aa4ede55ca73d2e204f24d50bb IN  0xf471d32cb40837bf24529fcf17418fc1a48076260 MATIC0.00008547 1.500000015
0x1752d7cfe8e1978161cd026bb4a61128014b97b120ac01b1897bab49c570ce3aSub2Junion On Yo...337907852023-03-31 10:55:172 days 1 hr ago0xb121e96d487a64aa4ede55ca73d2e204f24d50bb IN  0xf471d32cb40837bf24529fcf17418fc1a48076260 MATIC0.000308892003 1.500000016
0x2b914065000bc5f247bf160def992964d1cad03a0c3c2d27406dd06d875912b3Sub2Junion On Yo...337902812023-03-31 10:37:252 days 2 hrs ago0xb121e96d487a64aa4ede55ca73d2e204f24d50bb IN  0xf471d32cb40837bf24529fcf17418fc1a48076260 MATIC0.000308892003 1.500000016
0xcea496bd5e77f6cc7230736444cde9775ab4f22d16be9f5a321556b7f248641aSub2Junion On Yo...337902222023-03-31 10:35:192 days 2 hrs ago0xb121e96d487a64aa4ede55ca73d2e204f24d50bb IN  0xf471d32cb40837bf24529fcf17418fc1a48076260 MATIC0.000308892003 1.500000016
0xdb225a10b39f5e8777ca249bd16ac1c79d7a4620aab8f0d483d0ce9cd5956192Sub2Junion On Yo...337894162023-03-31 10:06:472 days 2 hrs ago0xb121e96d487a64aa4ede55ca73d2e204f24d50bb IN  0xf471d32cb40837bf24529fcf17418fc1a48076260 MATIC0.000308995503 1.500000017
0x5b50d32979b406180bdc128475cb47c518d70b845cf0d7229d4c9a0f782d1e08Sub2Junion On Yo...337892592023-03-31 10:01:132 days 2 hrs ago0xb121e96d487a64aa4ede55ca73d2e204f24d50bb IN  0xf471d32cb40837bf24529fcf17418fc1a48076260 MATIC0.000308995503 1.500000016
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x104439eb6ca53eec84864a85dbc75fb016d5f3c1f336e043d9b0af47f62c1580337392002023-03-30 4:28:193 days 8 hrs ago 0xf471d32cb40837bf24529fcf17418fc1a4807626 0x64254cf2f3abd765bee46f8445b76e2bb0af5a2c1 MATIC
0x712b823b3224fb8f97b426a7960a0a39f3521ef936230ef998da06c078a097c6337253132023-03-29 20:16:273 days 16 hrs ago 0xf471d32cb40837bf24529fcf17418fc1a4807626 0x64254cf2f3abd765bee46f8445b76e2bb0af5a2c0.00001 MATIC
0x712b823b3224fb8f97b426a7960a0a39f3521ef936230ef998da06c078a097c6337253132023-03-29 20:16:273 days 16 hrs ago 0xc885005b6de82cdd8b08a5ac526894b29abd8cd5 0xf471d32cb40837bf24529fcf17418fc1a48076260.00001 MATIC
0x3cdbcfb233a0e3e4e9b37ae55a185d5024eabcbce26ce5248895e4cab0767483337252812023-03-29 20:15:193 days 16 hrs ago 0xf471d32cb40837bf24529fcf17418fc1a4807626 0x64254cf2f3abd765bee46f8445b76e2bb0af5a2c0.00001 MATIC
0x3cdbcfb233a0e3e4e9b37ae55a185d5024eabcbce26ce5248895e4cab0767483337252812023-03-29 20:15:193 days 16 hrs ago 0x61be39c40fb5288aae9a240491755f280065c08d 0xf471d32cb40837bf24529fcf17418fc1a48076260.00001 MATIC
0x466792a564d60a599cde1861f3aa9f4ef72e7db8366e5c61afe14fdc82198913337100072023-03-29 11:14:214 days 1 hr ago 0xf471d32cb40837bf24529fcf17418fc1a4807626 0x64254cf2f3abd765bee46f8445b76e2bb0af5a2c0.01 MATIC
0x8f81d7393f987a7b2eea50d49f539ba8c7849182accd38c8cfb28b5c9cef78a4336882582023-03-28 22:24:054 days 14 hrs ago 0xf471d32cb40837bf24529fcf17418fc1a4807626 0x64254cf2f3abd765bee46f8445b76e2bb0af5a2c21 MATIC
0xe091b60cb40b75e50fcd36145e8463ff3be0e57214236e76eacd40ef9c97e974336841112023-03-28 19:57:114 days 16 hrs ago 0xf471d32cb40837bf24529fcf17418fc1a4807626 0x64254cf2f3abd765bee46f8445b76e2bb0af5a2c0.00001 MATIC
0xe091b60cb40b75e50fcd36145e8463ff3be0e57214236e76eacd40ef9c97e974336841112023-03-28 19:57:114 days 16 hrs ago 0xe8ee31970c23ecf8e975ed5412853cbb104bebf9 0xf471d32cb40837bf24529fcf17418fc1a48076260.00001 MATIC
0xde1ccb2e3224d76c78e4fb9ec02226bf84ac680211b2ae2986d2ded22ab8cba1336840852023-03-28 19:56:174 days 16 hrs ago 0xf471d32cb40837bf24529fcf17418fc1a4807626 0x64254cf2f3abd765bee46f8445b76e2bb0af5a2c0.00001 MATIC
0xde1ccb2e3224d76c78e4fb9ec02226bf84ac680211b2ae2986d2ded22ab8cba1336840852023-03-28 19:56:174 days 16 hrs ago 0x345feebdda0eb688d0d25747c52d091b2118e344 0xf471d32cb40837bf24529fcf17418fc1a48076260.00001 MATIC
0xcb840337302b9375f36958089f3398cf6c6b43e8f123cd8f7ae555c4257910ee336759792023-03-28 15:09:114 days 21 hrs ago 0xf471d32cb40837bf24529fcf17418fc1a4807626 0x64254cf2f3abd765bee46f8445b76e2bb0af5a2c0.00001 MATIC
0xcb840337302b9375f36958089f3398cf6c6b43e8f123cd8f7ae555c4257910ee336759792023-03-28 15:09:114 days 21 hrs ago 0x413477503e2e86b4b73d85ee5f072e732697db78 0xf471d32cb40837bf24529fcf17418fc1a48076260.00001 MATIC
0xf0e331f6f5016c59b1da6f227ca2c0659c6b0549244de80eaa4adc616bf35096336759542023-03-28 15:08:194 days 21 hrs ago 0xf471d32cb40837bf24529fcf17418fc1a4807626 0x64254cf2f3abd765bee46f8445b76e2bb0af5a2c0.00001 MATIC
0xf0e331f6f5016c59b1da6f227ca2c0659c6b0549244de80eaa4adc616bf35096336759542023-03-28 15:08:194 days 21 hrs ago 0x73f6d97553a4bb3831cb44acfa83dfbe4bcfe8e1 0xf471d32cb40837bf24529fcf17418fc1a48076260.00001 MATIC
0x03ce9697d299f0039350a89b269217e053df1494098705ac97190e763cdc014d336742082023-03-28 14:06:294 days 22 hrs ago 0xf471d32cb40837bf24529fcf17418fc1a4807626 0x64254cf2f3abd765bee46f8445b76e2bb0af5a2c0.00001 MATIC
0x03ce9697d299f0039350a89b269217e053df1494098705ac97190e763cdc014d336742082023-03-28 14:06:294 days 22 hrs ago 0x46d22cbe3608a1b9d79a176d26d46f9ef9128265 0xf471d32cb40837bf24529fcf17418fc1a48076260.00001 MATIC
0x3ae9ab2918cfd1c6486a212f0983866ec6b6938cf06fbe26396643e585b15200336741882023-03-28 14:05:454 days 22 hrs ago 0xf471d32cb40837bf24529fcf17418fc1a4807626 0x64254cf2f3abd765bee46f8445b76e2bb0af5a2c0.00001 MATIC
0x3ae9ab2918cfd1c6486a212f0983866ec6b6938cf06fbe26396643e585b15200336741882023-03-28 14:05:454 days 22 hrs ago 0xcf1dae6d996a03237805755c9ff17f3f740ee49c 0xf471d32cb40837bf24529fcf17418fc1a48076260.00001 MATIC
0x441844bd80d3a79b8f9ab34fbf88c3ffd19161afeb613fb25d64d1a994f12915336741842023-03-28 14:05:374 days 22 hrs ago 0xf471d32cb40837bf24529fcf17418fc1a4807626 0x64254cf2f3abd765bee46f8445b76e2bb0af5a2c0.00001 MATIC
0x441844bd80d3a79b8f9ab34fbf88c3ffd19161afeb613fb25d64d1a994f12915336741842023-03-28 14:05:374 days 22 hrs ago 0xa9e80fb6bc43e3e114e26805f284fd0e6661877e 0xf471d32cb40837bf24529fcf17418fc1a48076260.00001 MATIC
0xd5612c97165efb995e1da9a39a492169ec7cd82a818eab9d9ea45f7d56538f92336740322023-03-28 14:00:154 days 22 hrs ago 0xf471d32cb40837bf24529fcf17418fc1a4807626 0x64254cf2f3abd765bee46f8445b76e2bb0af5a2c0.00001 MATIC
0xd5612c97165efb995e1da9a39a492169ec7cd82a818eab9d9ea45f7d56538f92336740322023-03-28 14:00:154 days 22 hrs ago 0xeacee479fb01b25d51bbc3785a961bea0c9437f3 0xf471d32cb40837bf24529fcf17418fc1a48076260.00001 MATIC
0xe64a519d1650cc49deea921ee02ba5b0eb8279aa41f871c93fd89712f3a3777f336740172023-03-28 13:59:434 days 22 hrs ago 0xf471d32cb40837bf24529fcf17418fc1a4807626 0x64254cf2f3abd765bee46f8445b76e2bb0af5a2c0.00001 MATIC
0xe64a519d1650cc49deea921ee02ba5b0eb8279aa41f871c93fd89712f3a3777f336740172023-03-28 13:59:434 days 22 hrs ago 0xfaf53ab20928d5fec7eea956f041cbffa217d6e3 0xf471d32cb40837bf24529fcf17418fc1a48076260.00001 MATIC
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ZeroEx

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 1000000 runs

Other Settings:
default evmVersion, Apache-2.0 license
File 1 of 10 : ZeroEx.sol
// SPDX-License-Identifier: Apache-2.0
/*

  Copyright 2020 ZeroEx Intl.

  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.

*/

pragma solidity ^0.6.5;
pragma experimental ABIEncoderV2;

import "@0x/contracts-utils/contracts/src/v06/LibBytesV06.sol";
import "./migrations/LibBootstrap.sol";
import "./features/BootstrapFeature.sol";
import "./storage/LibProxyStorage.sol";
import "./errors/LibProxyRichErrors.sol";


/// @dev An extensible proxy contract that serves as a universal entry point for
///      interacting with the 0x protocol.
contract ZeroEx {
    // solhint-disable separate-by-one-line-in-contract,indent,var-name-mixedcase
    using LibBytesV06 for bytes;

    /// @dev Construct this contract and register the `BootstrapFeature` feature.
    ///      After constructing this contract, `bootstrap()` should be called
    ///      by `bootstrap()` to seed the initial feature set.
    /// @param bootstrapper Who can call `bootstrap()`.
    constructor(address bootstrapper) public {
        // Temporarily create and register the bootstrap feature.
        // It will deregister itself after `bootstrap()` has been called.
        BootstrapFeature bootstrap = new BootstrapFeature(bootstrapper);
        LibProxyStorage.getStorage().impls[bootstrap.bootstrap.selector] =
            address(bootstrap);
    }

    // solhint-disable state-visibility

    /// @dev Forwards calls to the appropriate implementation contract.
    fallback() external payable {
        bytes4 selector = msg.data.readBytes4(0);
        address impl = getFunctionImplementation(selector);
        if (impl == address(0)) {
            _revertWithData(LibProxyRichErrors.NotImplementedError(selector));
        }

        (bool success, bytes memory resultData) = impl.delegatecall(msg.data);
        if (!success) {
            _revertWithData(resultData);
        }
        _returnWithData(resultData);
    }

    /// @dev Fallback for just receiving ether.
    receive() external payable {}

    // solhint-enable state-visibility

    /// @dev Get the implementation contract of a registered function.
    /// @param selector The function selector.
    /// @return impl The implementation contract address.
    function getFunctionImplementation(bytes4 selector)
        public
        view
        returns (address impl)
    {
        return LibProxyStorage.getStorage().impls[selector];
    }

    /// @dev Revert with arbitrary bytes.
    /// @param data Revert data.
    function _revertWithData(bytes memory data) private pure {
        assembly { revert(add(data, 32), mload(data)) }
    }

    /// @dev Return with arbitrary bytes.
    /// @param data Return data.
    function _returnWithData(bytes memory data) private pure {
        assembly { return(add(data, 32), mload(data)) }
    }
}

File 2 of 10 : LibBytesV06.sol
// SPDX-License-Identifier: Apache-2.0
/*

  Copyright 2020 ZeroEx Intl.

  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.

*/

pragma solidity ^0.6.5;

import "./errors/LibBytesRichErrorsV06.sol";
import "./errors/LibRichErrorsV06.sol";


library LibBytesV06 {

    using LibBytesV06 for bytes;

    /// @dev Gets the memory address for a byte array.
    /// @param input Byte array to lookup.
    /// @return memoryAddress Memory address of byte array. This
    ///         points to the header of the byte array which contains
    ///         the length.
    function rawAddress(bytes memory input)
        internal
        pure
        returns (uint256 memoryAddress)
    {
        assembly {
            memoryAddress := input
        }
        return memoryAddress;
    }

    /// @dev Gets the memory address for the contents of a byte array.
    /// @param input Byte array to lookup.
    /// @return memoryAddress Memory address of the contents of the byte array.
    function contentAddress(bytes memory input)
        internal
        pure
        returns (uint256 memoryAddress)
    {
        assembly {
            memoryAddress := add(input, 32)
        }
        return memoryAddress;
    }

    /// @dev Copies `length` bytes from memory location `source` to `dest`.
    /// @param dest memory address to copy bytes to.
    /// @param source memory address to copy bytes from.
    /// @param length number of bytes to copy.
    function memCopy(
        uint256 dest,
        uint256 source,
        uint256 length
    )
        internal
        pure
    {
        if (length < 32) {
            // Handle a partial word by reading destination and masking
            // off the bits we are interested in.
            // This correctly handles overlap, zero lengths and source == dest
            assembly {
                let mask := sub(exp(256, sub(32, length)), 1)
                let s := and(mload(source), not(mask))
                let d := and(mload(dest), mask)
                mstore(dest, or(s, d))
            }
        } else {
            // Skip the O(length) loop when source == dest.
            if (source == dest) {
                return;
            }

            // For large copies we copy whole words at a time. The final
            // word is aligned to the end of the range (instead of after the
            // previous) to handle partial words. So a copy will look like this:
            //
            //  ####
            //      ####
            //          ####
            //            ####
            //
            // We handle overlap in the source and destination range by
            // changing the copying direction. This prevents us from
            // overwriting parts of source that we still need to copy.
            //
            // This correctly handles source == dest
            //
            if (source > dest) {
                assembly {
                    // We subtract 32 from `sEnd` and `dEnd` because it
                    // is easier to compare with in the loop, and these
                    // are also the addresses we need for copying the
                    // last bytes.
                    length := sub(length, 32)
                    let sEnd := add(source, length)
                    let dEnd := add(dest, length)

                    // Remember the last 32 bytes of source
                    // This needs to be done here and not after the loop
                    // because we may have overwritten the last bytes in
                    // source already due to overlap.
                    let last := mload(sEnd)

                    // Copy whole words front to back
                    // Note: the first check is always true,
                    // this could have been a do-while loop.
                    // solhint-disable-next-line no-empty-blocks
                    for {} lt(source, sEnd) {} {
                        mstore(dest, mload(source))
                        source := add(source, 32)
                        dest := add(dest, 32)
                    }

                    // Write the last 32 bytes
                    mstore(dEnd, last)
                }
            } else {
                assembly {
                    // We subtract 32 from `sEnd` and `dEnd` because those
                    // are the starting points when copying a word at the end.
                    length := sub(length, 32)
                    let sEnd := add(source, length)
                    let dEnd := add(dest, length)

                    // Remember the first 32 bytes of source
                    // This needs to be done here and not after the loop
                    // because we may have overwritten the first bytes in
                    // source already due to overlap.
                    let first := mload(source)

                    // Copy whole words back to front
                    // We use a signed comparisson here to allow dEnd to become
                    // negative (happens when source and dest < 32). Valid
                    // addresses in local memory will never be larger than
                    // 2**255, so they can be safely re-interpreted as signed.
                    // Note: the first check is always true,
                    // this could have been a do-while loop.
                    // solhint-disable-next-line no-empty-blocks
                    for {} slt(dest, dEnd) {} {
                        mstore(dEnd, mload(sEnd))
                        sEnd := sub(sEnd, 32)
                        dEnd := sub(dEnd, 32)
                    }

                    // Write the first 32 bytes
                    mstore(dest, first)
                }
            }
        }
    }

    /// @dev Returns a slices from a byte array.
    /// @param b The byte array to take a slice from.
    /// @param from The starting index for the slice (inclusive).
    /// @param to The final index for the slice (exclusive).
    /// @return result The slice containing bytes at indices [from, to)
    function slice(
        bytes memory b,
        uint256 from,
        uint256 to
    )
        internal
        pure
        returns (bytes memory result)
    {
        // Ensure that the from and to positions are valid positions for a slice within
        // the byte array that is being used.
        if (from > to) {
            LibRichErrorsV06.rrevert(LibBytesRichErrorsV06.InvalidByteOperationError(
                LibBytesRichErrorsV06.InvalidByteOperationErrorCodes.FromLessThanOrEqualsToRequired,
                from,
                to
            ));
        }
        if (to > b.length) {
            LibRichErrorsV06.rrevert(LibBytesRichErrorsV06.InvalidByteOperationError(
                LibBytesRichErrorsV06.InvalidByteOperationErrorCodes.ToLessThanOrEqualsLengthRequired,
                to,
                b.length
            ));
        }

        // Create a new bytes structure and copy contents
        result = new bytes(to - from);
        memCopy(
            result.contentAddress(),
            b.contentAddress() + from,
            result.length
        );
        return result;
    }

    /// @dev Returns a slice from a byte array without preserving the input.
    ///      When `from == 0`, the original array will match the slice.
    ///      In other cases its state will be corrupted.
    /// @param b The byte array to take a slice from. Will be destroyed in the process.
    /// @param from The starting index for the slice (inclusive).
    /// @param to The final index for the slice (exclusive).
    /// @return result The slice containing bytes at indices [from, to)
    function sliceDestructive(
        bytes memory b,
        uint256 from,
        uint256 to
    )
        internal
        pure
        returns (bytes memory result)
    {
        // Ensure that the from and to positions are valid positions for a slice within
        // the byte array that is being used.
        if (from > to) {
            LibRichErrorsV06.rrevert(LibBytesRichErrorsV06.InvalidByteOperationError(
                LibBytesRichErrorsV06.InvalidByteOperationErrorCodes.FromLessThanOrEqualsToRequired,
                from,
                to
            ));
        }
        if (to > b.length) {
            LibRichErrorsV06.rrevert(LibBytesRichErrorsV06.InvalidByteOperationError(
                LibBytesRichErrorsV06.InvalidByteOperationErrorCodes.ToLessThanOrEqualsLengthRequired,
                to,
                b.length
            ));
        }

        // Create a new bytes structure around [from, to) in-place.
        assembly {
            result := add(b, from)
            mstore(result, sub(to, from))
        }
        return result;
    }

    /// @dev Pops the last byte off of a byte array by modifying its length.
    /// @param b Byte array that will be modified.
    /// @return result The byte that was popped off.
    function popLastByte(bytes memory b)
        internal
        pure
        returns (bytes1 result)
    {
        if (b.length == 0) {
            LibRichErrorsV06.rrevert(LibBytesRichErrorsV06.InvalidByteOperationError(
                LibBytesRichErrorsV06.InvalidByteOperationErrorCodes.LengthGreaterThanZeroRequired,
                b.length,
                0
            ));
        }

        // Store last byte.
        result = b[b.length - 1];

        assembly {
            // Decrement length of byte array.
            let newLen := sub(mload(b), 1)
            mstore(b, newLen)
        }
        return result;
    }

    /// @dev Tests equality of two byte arrays.
    /// @param lhs First byte array to compare.
    /// @param rhs Second byte array to compare.
    /// @return equal True if arrays are the same. False otherwise.
    function equals(
        bytes memory lhs,
        bytes memory rhs
    )
        internal
        pure
        returns (bool equal)
    {
        // Keccak gas cost is 30 + numWords * 6. This is a cheap way to compare.
        // We early exit on unequal lengths, but keccak would also correctly
        // handle this.
        return lhs.length == rhs.length && keccak256(lhs) == keccak256(rhs);
    }

    /// @dev Reads an address from a position in a byte array.
    /// @param b Byte array containing an address.
    /// @param index Index in byte array of address.
    /// @return result address from byte array.
    function readAddress(
        bytes memory b,
        uint256 index
    )
        internal
        pure
        returns (address result)
    {
        if (b.length < index + 20) {
            LibRichErrorsV06.rrevert(LibBytesRichErrorsV06.InvalidByteOperationError(
                LibBytesRichErrorsV06.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsTwentyRequired,
                b.length,
                index + 20 // 20 is length of address
            ));
        }

        // Add offset to index:
        // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)
        // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)
        index += 20;

        // Read address from array memory
        assembly {
            // 1. Add index to address of bytes array
            // 2. Load 32-byte word from memory
            // 3. Apply 20-byte mask to obtain address
            result := and(mload(add(b, index)), 0xffffffffffffffffffffffffffffffffffffffff)
        }
        return result;
    }

    /// @dev Writes an address into a specific position in a byte array.
    /// @param b Byte array to insert address into.
    /// @param index Index in byte array of address.
    /// @param input Address to put into byte array.
    function writeAddress(
        bytes memory b,
        uint256 index,
        address input
    )
        internal
        pure
    {
        if (b.length < index + 20) {
            LibRichErrorsV06.rrevert(LibBytesRichErrorsV06.InvalidByteOperationError(
                LibBytesRichErrorsV06.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsTwentyRequired,
                b.length,
                index + 20 // 20 is length of address
            ));
        }

        // Add offset to index:
        // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)
        // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)
        index += 20;

        // Store address into array memory
        assembly {
            // The address occupies 20 bytes and mstore stores 32 bytes.
            // First fetch the 32-byte word where we'll be storing the address, then
            // apply a mask so we have only the bytes in the word that the address will not occupy.
            // Then combine these bytes with the address and store the 32 bytes back to memory with mstore.

            // 1. Add index to address of bytes array
            // 2. Load 32-byte word from memory
            // 3. Apply 12-byte mask to obtain extra bytes occupying word of memory where we'll store the address
            let neighbors := and(
                mload(add(b, index)),
                0xffffffffffffffffffffffff0000000000000000000000000000000000000000
            )

            // Make sure input address is clean.
            // (Solidity does not guarantee this)
            input := and(input, 0xffffffffffffffffffffffffffffffffffffffff)

            // Store the neighbors and address into memory
            mstore(add(b, index), xor(input, neighbors))
        }
    }

    /// @dev Reads a bytes32 value from a position in a byte array.
    /// @param b Byte array containing a bytes32 value.
    /// @param index Index in byte array of bytes32 value.
    /// @return result bytes32 value from byte array.
    function readBytes32(
        bytes memory b,
        uint256 index
    )
        internal
        pure
        returns (bytes32 result)
    {
        if (b.length < index + 32) {
            LibRichErrorsV06.rrevert(LibBytesRichErrorsV06.InvalidByteOperationError(
                LibBytesRichErrorsV06.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsThirtyTwoRequired,
                b.length,
                index + 32
            ));
        }

        // Arrays are prefixed by a 256 bit length parameter
        index += 32;

        // Read the bytes32 from array memory
        assembly {
            result := mload(add(b, index))
        }
        return result;
    }

    /// @dev Writes a bytes32 into a specific position in a byte array.
    /// @param b Byte array to insert <input> into.
    /// @param index Index in byte array of <input>.
    /// @param input bytes32 to put into byte array.
    function writeBytes32(
        bytes memory b,
        uint256 index,
        bytes32 input
    )
        internal
        pure
    {
        if (b.length < index + 32) {
            LibRichErrorsV06.rrevert(LibBytesRichErrorsV06.InvalidByteOperationError(
                LibBytesRichErrorsV06.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsThirtyTwoRequired,
                b.length,
                index + 32
            ));
        }

        // Arrays are prefixed by a 256 bit length parameter
        index += 32;

        // Read the bytes32 from array memory
        assembly {
            mstore(add(b, index), input)
        }
    }

    /// @dev Reads a uint256 value from a position in a byte array.
    /// @param b Byte array containing a uint256 value.
    /// @param index Index in byte array of uint256 value.
    /// @return result uint256 value from byte array.
    function readUint256(
        bytes memory b,
        uint256 index
    )
        internal
        pure
        returns (uint256 result)
    {
        result = uint256(readBytes32(b, index));
        return result;
    }

    /// @dev Writes a uint256 into a specific position in a byte array.
    /// @param b Byte array to insert <input> into.
    /// @param index Index in byte array of <input>.
    /// @param input uint256 to put into byte array.
    function writeUint256(
        bytes memory b,
        uint256 index,
        uint256 input
    )
        internal
        pure
    {
        writeBytes32(b, index, bytes32(input));
    }

    /// @dev Reads an unpadded bytes4 value from a position in a byte array.
    /// @param b Byte array containing a bytes4 value.
    /// @param index Index in byte array of bytes4 value.
    /// @return result bytes4 value from byte array.
    function readBytes4(
        bytes memory b,
        uint256 index
    )
        internal
        pure
        returns (bytes4 result)
    {
        if (b.length < index + 4) {
            LibRichErrorsV06.rrevert(LibBytesRichErrorsV06.InvalidByteOperationError(
                LibBytesRichErrorsV06.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsFourRequired,
                b.length,
                index + 4
            ));
        }

        // Arrays are prefixed by a 32 byte length field
        index += 32;

        // Read the bytes4 from array memory
        assembly {
            result := mload(add(b, index))
            // Solidity does not require us to clean the trailing bytes.
            // We do it anyway
            result := and(result, 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000)
        }
        return result;
    }

    /// @dev Writes a new length to a byte array.
    ///      Decreasing length will lead to removing the corresponding lower order bytes from the byte array.
    ///      Increasing length may lead to appending adjacent in-memory bytes to the end of the byte array.
    /// @param b Bytes array to write new length to.
    /// @param length New length of byte array.
    function writeLength(bytes memory b, uint256 length)
        internal
        pure
    {
        assembly {
            mstore(b, length)
        }
    }
}

File 3 of 10 : LibBytesRichErrorsV06.sol
// SPDX-License-Identifier: Apache-2.0
/*

  Copyright 2020 ZeroEx Intl.

  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.

*/

pragma solidity ^0.6.5;


library LibBytesRichErrorsV06 {

    enum InvalidByteOperationErrorCodes {
        FromLessThanOrEqualsToRequired,
        ToLessThanOrEqualsLengthRequired,
        LengthGreaterThanZeroRequired,
        LengthGreaterThanOrEqualsFourRequired,
        LengthGreaterThanOrEqualsTwentyRequired,
        LengthGreaterThanOrEqualsThirtyTwoRequired,
        LengthGreaterThanOrEqualsNestedBytesLengthRequired,
        DestinationLengthGreaterThanOrEqualSourceLengthRequired
    }

    // bytes4(keccak256("InvalidByteOperationError(uint8,uint256,uint256)"))
    bytes4 internal constant INVALID_BYTE_OPERATION_ERROR_SELECTOR =
        0x28006595;

    // solhint-disable func-name-mixedcase
    function InvalidByteOperationError(
        InvalidByteOperationErrorCodes errorCode,
        uint256 offset,
        uint256 required
    )
        internal
        pure
        returns (bytes memory)
    {
        return abi.encodeWithSelector(
            INVALID_BYTE_OPERATION_ERROR_SELECTOR,
            errorCode,
            offset,
            required
        );
    }
}

File 4 of 10 : LibRichErrorsV06.sol
// SPDX-License-Identifier: Apache-2.0
/*

  Copyright 2020 ZeroEx Intl.

  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.

*/

pragma solidity ^0.6.5;


library LibRichErrorsV06 {

    // bytes4(keccak256("Error(string)"))
    bytes4 internal constant STANDARD_ERROR_SELECTOR = 0x08c379a0;

    // solhint-disable func-name-mixedcase
    /// @dev ABI encode a standard, string revert error payload.
    ///      This is the same payload that would be included by a `revert(string)`
    ///      solidity statement. It has the function signature `Error(string)`.
    /// @param message The error string.
    /// @return The ABI encoded error.
    function StandardError(string memory message)
        internal
        pure
        returns (bytes memory)
    {
        return abi.encodeWithSelector(
            STANDARD_ERROR_SELECTOR,
            bytes(message)
        );
    }
    // solhint-enable func-name-mixedcase

    /// @dev Reverts an encoded rich revert reason `errorData`.
    /// @param errorData ABI encoded error data.
    function rrevert(bytes memory errorData)
        internal
        pure
    {
        assembly {
            revert(add(errorData, 0x20), mload(errorData))
        }
    }
}

File 5 of 10 : LibBootstrap.sol
// SPDX-License-Identifier: Apache-2.0
/*

  Copyright 2020 ZeroEx Intl.

  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.

*/

pragma solidity ^0.6.5;
pragma experimental ABIEncoderV2;

import "@0x/contracts-utils/contracts/src/v06/errors/LibRichErrorsV06.sol";
import "../errors/LibProxyRichErrors.sol";


library LibBootstrap {

    /// @dev Magic bytes returned by the bootstrapper to indicate success.
    ///      This is `keccack('BOOTSTRAP_SUCCESS')`.
    bytes4 internal constant BOOTSTRAP_SUCCESS = 0xd150751b;

    using LibRichErrorsV06 for bytes;

    /// @dev Perform a delegatecall and ensure it returns the magic bytes.
    /// @param target The call target.
    /// @param data The call data.
    function delegatecallBootstrapFunction(
        address target,
        bytes memory data
    )
        internal
    {
        (bool success, bytes memory resultData) = target.delegatecall(data);
        if (!success ||
            resultData.length != 32 ||
            abi.decode(resultData, (bytes4)) != BOOTSTRAP_SUCCESS)
        {
            LibProxyRichErrors.BootstrapCallFailedError(target, resultData).rrevert();
        }
    }
}

File 6 of 10 : LibProxyRichErrors.sol
// SPDX-License-Identifier: Apache-2.0
/*

  Copyright 2020 ZeroEx Intl.

  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.

*/

pragma solidity ^0.6.5;


library LibProxyRichErrors {

    // solhint-disable func-name-mixedcase

    function NotImplementedError(bytes4 selector)
        internal
        pure
        returns (bytes memory)
    {
        return abi.encodeWithSelector(
            bytes4(keccak256("NotImplementedError(bytes4)")),
            selector
        );
    }

    function InvalidBootstrapCallerError(address actual, address expected)
        internal
        pure
        returns (bytes memory)
    {
        return abi.encodeWithSelector(
            bytes4(keccak256("InvalidBootstrapCallerError(address,address)")),
            actual,
            expected
        );
    }

    function InvalidDieCallerError(address actual, address expected)
        internal
        pure
        returns (bytes memory)
    {
        return abi.encodeWithSelector(
            bytes4(keccak256("InvalidDieCallerError(address,address)")),
            actual,
            expected
        );
    }

    function BootstrapCallFailedError(address target, bytes memory resultData)
        internal
        pure
        returns (bytes memory)
    {
        return abi.encodeWithSelector(
            bytes4(keccak256("BootstrapCallFailedError(address,bytes)")),
            target,
            resultData
        );
    }
}

File 7 of 10 : BootstrapFeature.sol
// SPDX-License-Identifier: Apache-2.0
/*

  Copyright 2020 ZeroEx Intl.

  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.

*/

pragma solidity ^0.6.5;
pragma experimental ABIEncoderV2;

import "@0x/contracts-utils/contracts/src/v06/errors/LibRichErrorsV06.sol";
import "../migrations/LibBootstrap.sol";
import "../storage/LibProxyStorage.sol";
import "./interfaces/IBootstrapFeature.sol";


/// @dev Detachable `bootstrap()` feature.
contract BootstrapFeature is
    IBootstrapFeature
{
    // solhint-disable state-visibility,indent
    /// @dev The ZeroEx contract.
    ///      This has to be immutable to persist across delegatecalls.
    address immutable private _deployer;
    /// @dev The implementation address of this contract.
    ///      This has to be immutable to persist across delegatecalls.
    address immutable private _implementation;
    /// @dev The deployer.
    ///      This has to be immutable to persist across delegatecalls.
    address immutable private _bootstrapCaller;
    // solhint-enable state-visibility,indent

    using LibRichErrorsV06 for bytes;

    /// @dev Construct this contract and set the bootstrap migration contract.
    ///      After constructing this contract, `bootstrap()` should be called
    ///      to seed the initial feature set.
    /// @param bootstrapCaller The allowed caller of `bootstrap()`.
    constructor(address bootstrapCaller) public {
        _deployer = msg.sender;
        _implementation = address(this);
        _bootstrapCaller = bootstrapCaller;
    }

    /// @dev Bootstrap the initial feature set of this contract by delegatecalling
    ///      into `target`. Before exiting the `bootstrap()` function will
    ///      deregister itself from the proxy to prevent being called again.
    /// @param target The bootstrapper contract address.
    /// @param callData The call data to execute on `target`.
    function bootstrap(address target, bytes calldata callData) external override {
        // Only the bootstrap caller can call this function.
        if (msg.sender != _bootstrapCaller) {
            LibProxyRichErrors.InvalidBootstrapCallerError(
                msg.sender,
                _bootstrapCaller
            ).rrevert();
        }
        // Deregister.
        LibProxyStorage.getStorage().impls[this.bootstrap.selector] = address(0);
        // Self-destruct.
        BootstrapFeature(_implementation).die();
        // Call the bootstrapper.
        LibBootstrap.delegatecallBootstrapFunction(target, callData);
    }

    /// @dev Self-destructs this contract.
    ///      Can only be called by the deployer.
    function die() external {
        assert(address(this) == _implementation);
        if (msg.sender != _deployer) {
            LibProxyRichErrors.InvalidDieCallerError(msg.sender, _deployer).rrevert();
        }
        selfdestruct(msg.sender);
    }
}

File 8 of 10 : LibProxyStorage.sol
// SPDX-License-Identifier: Apache-2.0
/*

  Copyright 2020 ZeroEx Intl.

  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.

*/

pragma solidity ^0.6.5;
pragma experimental ABIEncoderV2;

import "./LibStorage.sol";


/// @dev Storage helpers for the proxy contract.
library LibProxyStorage {

    /// @dev Storage bucket for proxy contract.
    struct Storage {
        // Mapping of function selector -> function implementation
        mapping(bytes4 => address) impls;
        // The owner of the proxy contract.
        address owner;
    }

    /// @dev Get the storage bucket for this contract.
    function getStorage() internal pure returns (Storage storage stor) {
        uint256 storageSlot = LibStorage.getStorageSlot(
            LibStorage.StorageId.Proxy
        );
        // Dip into assembly to change the slot pointed to by the local
        // variable `stor`.
        // See https://solidity.readthedocs.io/en/v0.6.8/assembly.html?highlight=slot#access-to-external-variables-functions-and-libraries
        assembly { stor_slot := storageSlot }
    }
}

File 9 of 10 : LibStorage.sol
// SPDX-License-Identifier: Apache-2.0
/*

  Copyright 2020 ZeroEx Intl.

  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.

*/

pragma solidity ^0.6;
pragma experimental ABIEncoderV2;


/// @dev Common storage helpers
library LibStorage {

    /// @dev What to bit-shift a storage ID by to get its slot.
    ///      This gives us a maximum of 2**128 inline fields in each bucket.
    uint256 private constant STORAGE_SLOT_EXP = 128;

    /// @dev Storage IDs for feature storage buckets.
    ///      WARNING: APPEND-ONLY.
    enum StorageId {
        Proxy,
        SimpleFunctionRegistry,
        Ownable,
        TokenSpender,
        TransformERC20,
        MetaTransactions,
        ReentrancyGuard,
        NativeOrders,
        OtcOrders,
        ERC721Orders,
        ERC1155Orders
    }

    /// @dev Get the storage slot given a storage ID. We assign unique, well-spaced
    ///     slots to storage bucket variables to ensure they do not overlap.
    ///     See: https://solidity.readthedocs.io/en/v0.6.6/assembly.html#access-to-external-variables-functions-and-libraries
    /// @param storageId An entry in `StorageId`
    /// @return slot The storage slot.
    function getStorageSlot(StorageId storageId)
        internal
        pure
        returns (uint256 slot)
    {
        // This should never overflow with a reasonable `STORAGE_SLOT_EXP`
        // because Solidity will do a range check on `storageId` during the cast.
        return (uint256(storageId) + 1) << STORAGE_SLOT_EXP;
    }
}

File 10 of 10 : IBootstrapFeature.sol
// SPDX-License-Identifier: Apache-2.0
/*

  Copyright 2020 ZeroEx Intl.

  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.

*/

pragma solidity ^0.6.5;
pragma experimental ABIEncoderV2;


/// @dev Detachable `bootstrap()` feature.
interface IBootstrapFeature {

    /// @dev Bootstrap the initial feature set of this contract by delegatecalling
    ///      into `target`. Before exiting the `bootstrap()` function will
    ///      deregister itself from the proxy to prevent being called again.
    /// @param target The bootstrapper contract address.
    /// @param callData The call data to execute on `target`.
    function bootstrap(address target, bytes calldata callData) external;
}

Settings
{
  "remappings": [
    "@0x/contracts-utils=/Users/0xnoah/Documents/ArbitrumDeploy/protocol/node_modules/@0x/contracts-utils",
    "@0x/contracts-erc20=/Users/0xnoah/Documents/ArbitrumDeploy/protocol/contracts/zero-ex/node_modules/@0x/contracts-erc20"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 1000000,
    "details": {
      "yul": true,
      "deduplicate": true,
      "cse": true,
      "constantOptimizer": true
    }
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "istanbul"
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"bootstrapper","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"bytes4","name":"selector","type":"bytes4"}],"name":"getFunctionImplementation","outputs":[{"internalType":"address","name":"impl","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405234801561001057600080fd5b50604051610db8380380610db883398101604081905261002f916100fc565b60008160405161003e906100ef565b610048919061012a565b604051809103906000f080158015610064573d6000803e3d6000fd5b5090508061007a6100b760201b6102db1760201c565b6373f208d560e01b60009081526020919091526040902080546001600160a01b0319166001600160a01b03929092169190911790555061013e9050565b6000806100ce60006100d460201b6102ee1760201c565b92915050565b6000608082600a8111156100e457fe5b600101901b92915050565b6107c0806105f883390190565b60006020828403121561010d578081fd5b81516001600160a01b0381168114610123578182fd5b9392505050565b6001600160a01b0391909116815260200190565b6104ab8061014d6000396000f3fe6080604052600436106100225760003560e01c8063972fdd261461013857610029565b3661002957005b600061006f600080368080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505061016e9050565b9050600061007c826101ba565b905073ffffffffffffffffffffffffffffffffffffffff81166100aa576100aa6100a583610213565b6102cb565b600060608273ffffffffffffffffffffffffffffffffffffffff166000366040516100d69291906103f5565b600060405180830381855af49150503d8060008114610111576040519150601f19603f3d011682016040523d82523d6000602084013e610116565b606091505b50915091508161012957610129816102cb565b610132816102d3565b50505050005b34801561014457600080fd5b506101586101533660046103ae565b6101ba565b6040516101659190610405565b60405180910390f35b6000816004018351101561018f5761018f6100a56003855185600401610309565b5001602001517fffffffff000000000000000000000000000000000000000000000000000000001690565b60006101c46102db565b7fffffffff0000000000000000000000000000000000000000000000000000000092909216600090815260209290925250604090205473ffffffffffffffffffffffffffffffffffffffff1690565b60607f734e6e1c6ec3f883cac8d13d3e7390b280f5e94424662aa29e27394ed56586c9826040516024016102479190610426565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050919050565b805160208201fd5b805160208201f35b6000806102e860006102ee565b92915050565b6000608082600a8111156102fe57fe5b600101901b92915050565b6060632800659560e01b84848460405160240161032893929190610453565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290509392505050565b6000602082840312156103bf578081fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146103ee578182fd5b9392505050565b6000828483379101908152919050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b606081016008851061046157fe5b93815260208101929092526040909101529056fea2646970667358221220a5105f754547aa294a3192eef2afc5d318c10849320d5dadd306bd130b552ea264736f6c634300060c003360e060405234801561001057600080fd5b506040516107c03803806107c083398101604081905261002f91610051565b33606090811b60805230811b60a0521b6001600160601b03191660c05261007f565b600060208284031215610062578081fd5b81516001600160a01b0381168114610078578182fd5b9392505050565b60805160601c60a05160601c60c05160601c6107006100c060003980610121528061014f5250806070528061021652508060af528060dd52506107006000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c806335f469941461003b57806373f208d514610045575b600080fd5b610043610058565b005b61004361005336600461050e565b610109565b3073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461009757fe5b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461010657610106610101337f00000000000000000000000000000000000000000000000000000000000000006102ba565b610375565b33ff5b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461017357610173610101337f000000000000000000000000000000000000000000000000000000000000000061037d565b600061017d6103b3565b7f73f208d5000000000000000000000000000000000000000000000000000000006000908152602091909152604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff94851617905580517f35f4699400000000000000000000000000000000000000000000000000000000815290517f0000000000000000000000000000000000000000000000000000000000000000909316926335f469949260048084019391929182900301818387803b15801561025d57600080fd5b505af1158015610271573d6000803e3d6000fd5b505050506102b58383838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506103c692505050565b505050565b60607fabeb420c997af2b939cfae9ef422a08b8467cc0cf89064c140b7edf8a22cedc283836040516024016102f0929190610609565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905092915050565b805160208201fd5b60607fb84f6d63d81ee2a3bc5c6658be21fc96c31d7cdc4dc460ea0d6f7b7218b5b4b383836040516024016102f0929190610609565b6000806103c060006104bd565b92915050565b600060608373ffffffffffffffffffffffffffffffffffffffff16836040516103ef91906105ed565b600060405180830381855af49150503d806000811461042a576040519150601f19603f3d011682016040523d82523d6000602084013e61042f565b606091505b509150915081158061044357508051602014155b806104a5575080517fd150751b000000000000000000000000000000000000000000000000000000009061048090830160209081019084016105a6565b7fffffffff000000000000000000000000000000000000000000000000000000001614155b156104b7576104b761010185836104d8565b50505050565b6000608082600a8111156104cd57fe5b600101901b92915050565b60607fd19d65df6830e3cb0da1e12b8e9738e2dc473f830d8af813bcc031eb5a1675d183836040516024016102f0929190610630565b600080600060408486031215610522578283fd5b833573ffffffffffffffffffffffffffffffffffffffff81168114610545578384fd5b9250602084013567ffffffffffffffff80821115610561578384fd5b818601915086601f830112610574578384fd5b813581811115610582578485fd5b876020828501011115610593578485fd5b6020830194508093505050509250925092565b6000602082840312156105b7578081fd5b81517fffffffff00000000000000000000000000000000000000000000000000000000811681146105e6578182fd5b9392505050565b600082516105ff81846020870161069e565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b600073ffffffffffffffffffffffffffffffffffffffff8416825260406020830152825180604084015261066b81606085016020870161069e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016060019392505050565b60005b838110156106b95781810151838201526020016106a1565b838111156104b7575050600091015256fea2646970667358221220b383a61f04af2e0865944e6880178a992dd05c8ece2fdee193fbcee00f7b783964736f6c634300060c0033000000000000000000000000f289f8a9d26f9a32ecc8602e92e634d71a91d490

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

000000000000000000000000f289f8a9d26f9a32ecc8602e92e634d71a91d490

-----Decoded View---------------
Arg [0] : bootstrapper (address): 0xf289f8a9d26f9a32ecc8602e92e634d71a91d490

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000f289f8a9d26f9a32ecc8602e92e634d71a91d490


Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading