ETH Price: $2,934.92 (-2.91%)
Gas: 32 Gwei

Contract

0xdF2f24751F7e84ccDCD39e7b49904FAB0Fb0f583
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
0x60a06040154525562022-09-01 11:16:14539 days 22 hrs ago1662030974IN
 Create: StarkExchange
0 ETH0.0201815216.22645889

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
StarkExchange

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 100 runs

Other Settings:
istanbul EvmVersion, Apache-2.0 license
File 11 of 12 : StarkExchange.sol
/*
  Copyright 2019-2022 StarkWare Industries Ltd.

  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

  https://www.starkware.co/open-source-license/

  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.
*/
// SPDX-License-Identifier: Apache-2.0.
pragma solidity ^0.6.12;

import "MainDispatcher.sol";

contract StarkExchange is MainDispatcher {
    string public constant VERSION = "4.5.1";

    // Salt for a 8 bit unique spread of all relevant selectors. Pre-caclulated.
    // ---------- The following code was auto-generated. PLEASE DO NOT EDIT. ----------
    uint256 constant MAGIC_SALT = 1527414;
    uint256 constant IDX_MAP_0 = 0x2010501100000010050000002511000000220005410030200200200000552010;
    uint256 constant IDX_MAP_1 = 0x3000030005000050020012003000010604300000002420501003000010000300;
    uint256 constant IDX_MAP_2 = 0x1003112030002130000200100020000320202001020001001000040200200020;
    uint256 constant IDX_MAP_3 = 0x2000000050000012000013100002002002032050020002020002050000201003;

    // ---------- End of auto-generated code. ----------

    function getNumSubcontracts() internal pure override returns (uint256) {
        return 6;
    }

    function magicSalt() internal pure override returns (uint256) {
        return MAGIC_SALT;
    }

    function handlerMapSection(uint256 section) internal pure override returns (uint256) {
        if (section == 0) {
            return IDX_MAP_0;
        } else if (section == 1) {
            return IDX_MAP_1;
        } else if (section == 2) {
            return IDX_MAP_2;
        } else if (section == 3) {
            return IDX_MAP_3;
        }
        revert("BAD_IDX_MAP_SECTION");
    }

    function expectedIdByIndex(uint256 index) internal pure override returns (string memory id) {
        if (index == 1) {
            id = "StarkWare_AllVerifiers_2022_2";
        } else if (index == 2) {
            id = "StarkWare_TokensAndRamping_2022_2";
        } else if (index == 3) {
            id = "StarkWare_StarkExState_2022_5";
        } else if (index == 4) {
            id = "StarkWare_ForcedActions_2022_3";
        } else if (index == 5) {
            id = "StarkWare_OnchainVaults_2022_2";
        } else if (index == 6) {
            id = "StarkWare_ProxyUtils_2022_2";
        } else {
            revert("UNEXPECTED_INDEX");
        }
    }

    function initializationSentinel() internal view override {
        string memory REVERT_MSG = "INITIALIZATION_BLOCKED";
        // This initializer sets roots etc. It must not be applied twice.
        // I.e. it can run only when the state is still empty.
        require(validiumVaultRoot == 0, REVERT_MSG);
        require(validiumTreeHeight == 0, REVERT_MSG);
        require(rollupVaultRoot == 0, REVERT_MSG);
        require(rollupTreeHeight == 0, REVERT_MSG);
        require(orderRoot == 0, REVERT_MSG);
        require(orderTreeHeight == 0, REVERT_MSG);
    }
}

File 2 of 12 : MainStorage.sol
/*
  Copyright 2019-2022 StarkWare Industries Ltd.

  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

  https://www.starkware.co/open-source-license/

  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.
*/
// SPDX-License-Identifier: Apache-2.0.
pragma solidity ^0.6.12;

import "ProxyStorage.sol";
import "Common.sol";

/*
  Holds ALL the main contract state (storage) variables.
*/
contract MainStorage is ProxyStorage {
    uint256 internal constant LAYOUT_LENGTH = 2**64;

    address escapeVerifierAddress; // NOLINT: constable-states.

    // Global dex-frozen flag.
    bool stateFrozen; // NOLINT: constable-states.

    // Time when unFreeze can be successfully called (UNFREEZE_DELAY after freeze).
    uint256 unFreezeTime; // NOLINT: constable-states.

    // Pending deposits.
    // A map STARK key => asset id => vault id => quantized amount.
    mapping(uint256 => mapping(uint256 => mapping(uint256 => uint256))) pendingDeposits;

    // Cancellation requests.
    // A map STARK key => asset id => vault id => request timestamp.
    mapping(uint256 => mapping(uint256 => mapping(uint256 => uint256))) cancellationRequests;

    // Pending withdrawals.
    // A map STARK key => asset id => quantized amount.
    mapping(uint256 => mapping(uint256 => uint256)) pendingWithdrawals;

    // vault_id => escape used boolean.
    mapping(uint256 => bool) escapesUsed;

    // Number of escapes that were performed when frozen.
    uint256 escapesUsedCount; // NOLINT: constable-states.

    // NOTE: fullWithdrawalRequests is deprecated, and replaced by forcedActionRequests.
    // NOLINTNEXTLINE naming-convention.
    mapping(uint256 => mapping(uint256 => uint256)) fullWithdrawalRequests_DEPRECATED;

    // State sequence number.
    uint256 sequenceNumber; // NOLINT: constable-states uninitialized-state.

    // Validium Vaults Tree Root & Height.
    uint256 validiumVaultRoot; // NOLINT: constable-states uninitialized-state.
    uint256 validiumTreeHeight; // NOLINT: constable-states uninitialized-state.

    // Order Tree Root & Height.
    uint256 orderRoot; // NOLINT: constable-states uninitialized-state.
    uint256 orderTreeHeight; // NOLINT: constable-states uninitialized-state.

    // True if and only if the address is allowed to add tokens.
    mapping(address => bool) tokenAdmins;

    // This mapping is no longer in use, remains for backwards compatibility.
    mapping(address => bool) userAdmins_DEPRECATED; // NOLINT: naming-convention.

    // True if and only if the address is an operator (allowed to update state).
    mapping(address => bool) operators; // NOLINT: uninitialized-state.

    // Mapping of contract ID to asset data.
    mapping(uint256 => bytes) assetTypeToAssetInfo; // NOLINT: uninitialized-state.

    // Mapping of registered contract IDs.
    mapping(uint256 => bool) registeredAssetType; // NOLINT: uninitialized-state.

    // Mapping from contract ID to quantum.
    mapping(uint256 => uint256) assetTypeToQuantum; // NOLINT: uninitialized-state.

    // This mapping is no longer in use, remains for backwards compatibility.
    mapping(address => uint256) starkKeys_DEPRECATED; // NOLINT: naming-convention.

    // Mapping from STARK public key to the Ethereum public key of its owner.
    mapping(uint256 => address) ethKeys; // NOLINT: uninitialized-state.

    // Timelocked state transition and availability verification chain.
    StarkExTypes.ApprovalChainData verifiersChain;
    StarkExTypes.ApprovalChainData availabilityVerifiersChain;

    // Batch id of last accepted proof.
    uint256 lastBatchId; // NOLINT: constable-states uninitialized-state.

    // Mapping between sub-contract index to sub-contract address.
    mapping(uint256 => address) subContracts; // NOLINT: uninitialized-state.

    mapping(uint256 => bool) permissiveAssetType_DEPRECATED; // NOLINT: naming-convention.
    // ---- END OF MAIN STORAGE AS DEPLOYED IN STARKEX2.0 ----

    // Onchain-data version configured for the system.
    uint256 onchainDataVersion_DEPRECATED; // NOLINT: naming-convention constable-states.

    // Counter of forced action request in block. The key is the block number.
    mapping(uint256 => uint256) forcedRequestsInBlock;

    // ForcedAction requests: actionHash => requestTime.
    mapping(bytes32 => uint256) forcedActionRequests;

    // Mapping for timelocked actions.
    // A actionKey => activation time.
    mapping(bytes32 => uint256) actionsTimeLock;

    // Append only list of requested forced action hashes.
    bytes32[] actionHashList;
    // ---- END OF MAIN STORAGE AS DEPLOYED IN STARKEX3.0 ----
    // ---- END OF MAIN STORAGE AS DEPLOYED IN STARKEX4.0 ----

    // Rollup Vaults Tree Root & Height.
    uint256 rollupVaultRoot; // NOLINT: constable-states uninitialized-state.
    uint256 rollupTreeHeight; // NOLINT: constable-states uninitialized-state.

    uint256 globalConfigCode; // NOLINT: constable-states uninitialized-state.

    // Reserved storage space for Extensibility.
    // Every added MUST be added above the end gap, and the __endGap size must be reduced
    // accordingly.
    // NOLINTNEXTLINE: naming-convention.
    uint256[LAYOUT_LENGTH - 40] private __endGap; // __endGap complements layout to LAYOUT_LENGTH.
}

File 3 of 12 : GovernanceStorage.sol
/*
  Copyright 2019-2022 StarkWare Industries Ltd.

  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

  https://www.starkware.co/open-source-license/

  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.
*/
// SPDX-License-Identifier: Apache-2.0.
pragma solidity ^0.6.12;
import "MGovernance.sol";

/*
  Holds the governance slots for ALL entities, including proxy and the main contract.
*/
contract GovernanceStorage {
    // A map from a Governor tag to its own GovernanceInfoStruct.
    mapping(string => GovernanceInfoStruct) internal governanceInfo; //NOLINT uninitialized-state.
}

File 4 of 12 : MainDispatcherBase.sol
/*
  Copyright 2019-2022 StarkWare Industries Ltd.

  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

  https://www.starkware.co/open-source-license/

  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.
*/
// SPDX-License-Identifier: Apache-2.0.
pragma solidity ^0.6.12;

import "SubContractor.sol";
import "IDispatcherBase.sol";
import "BlockDirectCall.sol";
import "Common.sol";

abstract contract MainDispatcherBase is IDispatcherBase, BlockDirectCall {
    using Addresses for address;

    /*
      This entry point serves only transactions with empty calldata. (i.e. pure value transfer tx).
      We don't expect to receive such, thus block them.
    */
    receive() external payable {
        revert("CONTRACT_NOT_EXPECTED_TO_RECEIVE");
    }

    fallback() external payable {
        address subContractAddress = getSubContract(msg.sig);
        require(subContractAddress != address(0x0), "NO_CONTRACT_FOR_FUNCTION");

        assembly {
            // Copy msg.data. We take full control of memory in this inline assembly
            // block because it will not return to Solidity code. We overwrite the
            // Solidity scratch pad at memory position 0.
            calldatacopy(0, 0, calldatasize())

            // Call the implementation.
            // out and outsize are 0 for now, as we don"t know the out size yet.
            let result := delegatecall(gas(), subContractAddress, 0, calldatasize(), 0, 0)

            // Copy the returned data.
            returndatacopy(0, 0, returndatasize())

            switch result
            // delegatecall returns 0 on error.
            case 0 {
                revert(0, returndatasize())
            }
            default {
                return(0, returndatasize())
            }
        }
    }

    /*
      1. Extract subcontracts.
      2. Verify correct sub-contract initializer size.
      3. Extract sub-contract initializer data.
      4. Call sub-contract initializer.

      The init data bytes passed to initialize are structed as following:
      I. N slots (uin256 size) addresses of the deployed sub-contracts.
      II. An address of an external initialization contract (optional, or ZERO_ADDRESS).
      III. (Up to) N bytes sections of the sub-contracts initializers.

      If already initialized (i.e. upgrade) we expect the init data to be consistent with this.
      and if a different size of init data is expected when upgrading, the initializerSize should
      reflect this.

      If an external initializer contract is not used, ZERO_ADDRESS is passed in its slot.
      If the external initializer contract is used, all the remaining init data is passed to it,
      and internal initialization will not occur.

      External Initialization Contract
      --------------------------------
      External Initialization Contract (EIC) is a hook for custom initialization.
      Typically in an upgrade flow, the expected initialization contains only the addresses of
      the sub-contracts. Normal initialization of the sub-contracts is such that is not needed
      in an upgrade, and actually may be very dangerous, as changing of state on a working system
      may corrupt it.

      In the event that some state initialization is required, the EIC is a hook that allows this.
      It may be deployed and called specifically for this purpose.

      The address of the EIC must be provided (if at all) when a new implementation is added to
      a Proxy contract (as part of the initialization vector).
      Hence, it is considered part of the code open to reviewers prior to a time-locked upgrade.

      When a custom initialization is performed using an EIC,
      the main dispatcher initialize extracts and stores the sub-contracts addresses, and then
      yields to the EIC, skipping the rest of its initialization code.


      Flow of MainDispatcher initialize
      ---------------------------------
      1. Extraction and assignment of subcontracts addresses
         Main dispatcher expects a valid and consistent set of addresses in the passed data.
         It validates that, extracts the addresses from the data, and validates that the addresses
         are of the expected type and order. Then those addresses are stored.

      2. Extraction of EIC address
         The address of the EIC is extracted from the data.
         External Initializer Contract is optional. ZERO_ADDRESS indicates it is not used.

      3a. EIC is used
          Dispatcher calls the EIC initialize function with the remaining data.
          Note - In this option 3b is not performed.

      3b. EIC is not used
          If there is additional initialization data then:
          I. Sentitenl function is called to permit subcontracts initialization.
          II. Dispatcher loops through the subcontracts and for each one it extracts the
              initializing data and passes it to the subcontract's initialize function.

    */
    function initialize(bytes calldata data) external virtual notCalledDirectly {
        // Number of sub-contracts.
        uint256 nSubContracts = getNumSubcontracts();

        // We support currently 4 bits per contract, i.e. 16, reserving 00 leads to 15.
        require(nSubContracts <= 15, "TOO_MANY_SUB_CONTRACTS");

        // Sum of subcontract initializers. Aggregated for verification near the end.
        uint256 totalInitSizes = 0;

        // Offset (within data) of sub-contract initializer vector.
        // Just past the sub-contract+eic addresses.
        uint256 initDataContractsOffset = 32 * (nSubContracts + 1);

        // Init data MUST include addresses for all sub-contracts + EIC.
        require(data.length >= initDataContractsOffset, "SUB_CONTRACTS_NOT_PROVIDED");

        // Size of passed data, excluding sub-contract addresses.
        uint256 additionalDataSize = data.length - initDataContractsOffset;

        // Extract & update contract addresses.
        for (uint256 nContract = 1; nContract <= nSubContracts; nContract++) {
            // Extract sub-contract address.
            address contractAddress = abi.decode(
                data[32 * (nContract - 1):32 * nContract],
                (address)
            );

            validateSubContractIndex(nContract, contractAddress);

            // Contracts are indexed from 1 and 0 is not in use here.
            setSubContractAddress(nContract, contractAddress);
        }

        // Check if we have an external initializer contract.
        address externalInitializerAddr = abi.decode(
            data[initDataContractsOffset - 32:initDataContractsOffset],
            (address)
        );

        // 3(a). Yield to EIC initialization.
        if (externalInitializerAddr != address(0x0)) {
            callExternalInitializer(externalInitializerAddr, data[initDataContractsOffset:]);
            return;
        }

        // 3(b). Subcontracts initialization.
        // I. If no init data passed besides sub-contracts, return.
        if (additionalDataSize == 0) {
            return;
        }

        // Just to be on the safe side.
        assert(externalInitializerAddr == address(0x0));

        // II. Gate further initialization.
        initializationSentinel();

        // III. Loops through the subcontracts, extracts their data and calls their initializer.
        for (uint256 nContract = 1; nContract <= nSubContracts; nContract++) {
            // Extract sub-contract address.
            address contractAddress = abi.decode(
                data[32 * (nContract - 1):32 * nContract],
                (address)
            );

            // The initializerSize is called via delegatecall, so that it can relate to the state,
            // and not only to the new contract code. (e.g. return 0 if state-intialized else 192).
            // NOLINTNEXTLINE: controlled-delegatecall low-level-calls calls-loop.
            (bool success, bytes memory returndata) = contractAddress.delegatecall(
                abi.encodeWithSelector(SubContractor(contractAddress).initializerSize.selector)
            );
            require(success, string(returndata));
            uint256 initSize = abi.decode(returndata, (uint256));
            require(initSize <= additionalDataSize, "INVALID_INITIALIZER_SIZE");
            require(totalInitSizes + initSize <= additionalDataSize, "INVALID_INITIALIZER_SIZE");

            if (initSize == 0) {
                continue;
            }

            // Call sub-contract initializer.
            // NOLINTNEXTLINE: controlled-delegatecall calls-loop.
            (success, returndata) = contractAddress.delegatecall(
                abi.encodeWithSelector(
                    this.initialize.selector,
                    data[initDataContractsOffset:initDataContractsOffset + initSize]
                )
            );
            require(success, string(returndata));
            totalInitSizes += initSize;
            initDataContractsOffset += initSize;
        }
        require(additionalDataSize == totalInitSizes, "MISMATCHING_INIT_DATA_SIZE");
    }

    function callExternalInitializer(address externalInitializerAddr, bytes calldata extInitData)
        private
    {
        require(externalInitializerAddr.isContract(), "NOT_A_CONTRACT");

        // NOLINTNEXTLINE: low-level-calls, controlled-delegatecall.
        (bool success, bytes memory returndata) = externalInitializerAddr.delegatecall(
            abi.encodeWithSelector(this.initialize.selector, extInitData)
        );
        require(success, string(returndata));
        require(returndata.length == 0, string(returndata));
    }
}

File 5 of 12 : Common.sol
/*
  Copyright 2019-2022 StarkWare Industries Ltd.

  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

  https://www.starkware.co/open-source-license/

  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.
*/
// SPDX-License-Identifier: Apache-2.0.
pragma solidity ^0.6.12;

/*
  Common Utility librarries.
  I. Addresses (extending address).
*/
library Addresses {
    function isContract(address account) internal view returns (bool) {
        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    function performEthTransfer(address recipient, uint256 amount) internal {
        (bool success, ) = recipient.call{value: amount}(""); // NOLINT: low-level-calls.
        require(success, "ETH_TRANSFER_FAILED");
    }

    /*
      Safe wrapper around ERC20/ERC721 calls.
      This is required because many deployed ERC20 contracts don't return a value.
      See https://github.com/ethereum/solidity/issues/4116.
    */
    function safeTokenContractCall(address tokenAddress, bytes memory callData) internal {
        require(isContract(tokenAddress), "BAD_TOKEN_ADDRESS");
        // NOLINTNEXTLINE: low-level-calls.
        (bool success, bytes memory returndata) = tokenAddress.call(callData);
        require(success, string(returndata));

        if (returndata.length > 0) {
            require(abi.decode(returndata, (bool)), "TOKEN_OPERATION_FAILED");
        }
    }

    /*
      Validates that the passed contract address is of a real contract,
      and that its id hash (as infered fromn identify()) matched the expected one.
    */
    function validateContractId(address contractAddress, bytes32 expectedIdHash) internal {
        require(isContract(contractAddress), "ADDRESS_NOT_CONTRACT");
        (bool success, bytes memory returndata) = contractAddress.call( // NOLINT: low-level-calls.
            abi.encodeWithSignature("identify()")
        );
        require(success, "FAILED_TO_IDENTIFY_CONTRACT");
        string memory realContractId = abi.decode(returndata, (string));
        require(
            keccak256(abi.encodePacked(realContractId)) == expectedIdHash,
            "UNEXPECTED_CONTRACT_IDENTIFIER"
        );
    }
}

/*
  II. StarkExTypes - Common data types.
*/
library StarkExTypes {
    // Structure representing a list of verifiers (validity/availability).
    // A statement is valid only if all the verifiers in the list agree on it.
    // Adding a verifier to the list is immediate - this is used for fast resolution of
    // any soundness issues.
    // Removing from the list is time-locked, to ensure that any user of the system
    // not content with the announced removal has ample time to leave the system before it is
    // removed.
    struct ApprovalChainData {
        address[] list;
        // Represents the time after which the verifier with the given address can be removed.
        // Removal of the verifier with address A is allowed only in the case the value
        // of unlockedForRemovalTime[A] != 0 and unlockedForRemovalTime[A] < (current time).
        mapping(address => uint256) unlockedForRemovalTime;
    }
}

File 6 of 12 : MGovernance.sol
/*
  Copyright 2019-2022 StarkWare Industries Ltd.

  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

  https://www.starkware.co/open-source-license/

  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.
*/
// SPDX-License-Identifier: Apache-2.0.
pragma solidity ^0.6.12;

struct GovernanceInfoStruct {
    mapping(address => bool) effectiveGovernors;
    address candidateGovernor;
    bool initialized;
}

abstract contract MGovernance {
    function _isGovernor(address testGovernor) internal view virtual returns (bool);

    /*
      Allows calling the function only by a Governor.
    */
    modifier onlyGovernance() {
        require(_isGovernor(msg.sender), "ONLY_GOVERNANCE");
        _;
    }
}

File 7 of 12 : MainDispatcher.sol
/*
  Copyright 2019-2022 StarkWare Industries Ltd.

  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

  https://www.starkware.co/open-source-license/

  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.
*/
// SPDX-License-Identifier: Apache-2.0.
pragma solidity ^0.6.12;

import "MainStorage.sol";
import "MainDispatcherBase.sol";

abstract contract MainDispatcher is MainStorage, MainDispatcherBase {
    uint256 constant SUBCONTRACT_BITS = 4;

    function magicSalt() internal pure virtual returns (uint256);

    function handlerMapSection(uint256 section) internal pure virtual returns (uint256);

    function expectedIdByIndex(uint256 index) internal pure virtual returns (string memory id);

    function validateSubContractIndex(uint256 index, address subContract) internal pure override {
        string memory id = SubContractor(subContract).identify();
        bytes32 hashed_expected_id = keccak256(abi.encodePacked(expectedIdByIndex(index)));
        require(
            hashed_expected_id == keccak256(abi.encodePacked(id)),
            "MISPLACED_INDEX_OR_BAD_CONTRACT_ID"
        );

        // Gets the list of critical selectors from the sub-contract and checks that the selector
        // is mapped to that sub-contract.
        bytes4[] memory selectorsToValidate = SubContractor(subContract).validatedSelectors();

        for (uint256 i = 0; i < selectorsToValidate.length; i++) {
            require(
                getSubContractIndex(selectorsToValidate[i]) == index,
                "INCONSISTENT_DISPATCHER_MAP"
            );
        }
    }

    function handlingContractId(bytes4 selector) external pure virtual returns (string memory id) {
        uint256 index = getSubContractIndex(selector);
        return expectedIdByIndex(index);
    }

    /*
      Returns the index in subContracts where the address of the sub-contract implementing
      the function with the queried selector is held.

      Note: The nature of the sub-contracts handler map is such that all the required selectors
      are mapped. However, other selectors, such that are not implemented in any subcontract,
      may also return a sub-contract address.
      This behavior is by-design, and not a problem.
    */
    function getSubContractIndex(bytes4 selector) internal pure returns (uint256) {
        uint256 location = 0xFF & uint256(keccak256(abi.encodePacked(selector, magicSalt())));
        uint256 offset = (SUBCONTRACT_BITS * location) % 256;

        // We have 64 locations in each register, hence the >> 6 (i.e. location // 64).
        return (handlerMapSection(location >> 6) >> offset) & 0xF;
    }

    /*
      Returns the address of the sub-contract that would be delegated to handle a call
      with the queried selector. (see note above).
    */
    function getSubContract(bytes4 selector) public view override returns (address) {
        return subContracts[getSubContractIndex(selector)];
    }

    function setSubContractAddress(uint256 index, address subContractAddress) internal override {
        subContracts[index] = subContractAddress;
    }
}

File 8 of 12 : ProxyStorage.sol
/*
  Copyright 2019-2022 StarkWare Industries Ltd.

  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

  https://www.starkware.co/open-source-license/

  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.
*/
// SPDX-License-Identifier: Apache-2.0.
pragma solidity ^0.6.12;

import "GovernanceStorage.sol";

/*
  Holds the Proxy-specific state variables.
  This contract is inherited by the GovernanceStorage (and indirectly by MainStorage)
  to prevent collision hazard.
*/
contract ProxyStorage is GovernanceStorage {
    // NOLINTNEXTLINE: naming-convention uninitialized-state.
    mapping(address => bytes32) internal initializationHash_DEPRECATED;

    // The time after which we can switch to the implementation.
    // Hash(implementation, data, finalize) => time.
    mapping(bytes32 => uint256) internal enabledTime;

    // A central storage of the flags whether implementation has been initialized.
    // Note - it can be used flexibly enough to accommodate multiple levels of initialization
    // (i.e. using different key salting schemes for different initialization levels).
    mapping(bytes32 => bool) internal initialized;
}

File 9 of 12 : BlockDirectCall.sol
/*
  Copyright 2019-2022 StarkWare Industries Ltd.

  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

  https://www.starkware.co/open-source-license/

  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.
*/
// SPDX-License-Identifier: Apache-2.0.
pragma solidity ^0.6.12;

/*
  This contract provides means to block direct call of an external function.
  A derived contract (e.g. MainDispatcherBase) should decorate sensitive functions with the
  notCalledDirectly modifier, thereby preventing it from being called directly, and allowing only calling
  using delegate_call.
*/
abstract contract BlockDirectCall {
    address immutable this_;

    constructor() internal {
        this_ = address(this);
    }

    modifier notCalledDirectly() {
        require(this_ != address(this), "DIRECT_CALL_DISALLOWED");
        _;
    }
}

File 10 of 12 : SubContractor.sol
/*
  Copyright 2019-2022 StarkWare Industries Ltd.

  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

  https://www.starkware.co/open-source-license/

  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.
*/
// SPDX-License-Identifier: Apache-2.0.
pragma solidity ^0.6.12;

import "Identity.sol";

interface SubContractor is Identity {
    function initialize(bytes calldata data) external;

    function initializerSize() external view returns (uint256);

    /*
      Returns an array with selectors for validation.
      These selectors are the critical ones for maintaining self custody and anti censorship.
      During the upgrade process, as part of the sub-contract validation, the MainDispatcher
      validates that the selectos are mapped to the correct sub-contract.
    */
    function validatedSelectors() external pure returns (bytes4[] memory);
}

File 11 of 12 : IDispatcherBase.sol
/*
  Copyright 2019-2022 StarkWare Industries Ltd.

  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

  https://www.starkware.co/open-source-license/

  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.
*/
// SPDX-License-Identifier: Apache-2.0.
pragma solidity ^0.6.12;

/*
  Interface for a generic dispatcher to use, which the concrete dispatcher must implement.
  It contains the functions that are specific to the concrete dispatcher instance.
  The interface is implemented as contract, because interface implies all methods external.
*/
abstract contract IDispatcherBase {
    function getSubContract(bytes4 selector) public view virtual returns (address);

    function setSubContractAddress(uint256 index, address subContract) internal virtual;

    function getNumSubcontracts() internal pure virtual returns (uint256);

    function validateSubContractIndex(uint256 index, address subContract) internal pure virtual;

    /*
      Ensures initializer can be called. Reverts otherwise.
    */
    function initializationSentinel() internal view virtual;
}

File 12 of 12 : Identity.sol
/*
  Copyright 2019-2022 StarkWare Industries Ltd.

  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

  https://www.starkware.co/open-source-license/

  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.
*/
// SPDX-License-Identifier: Apache-2.0.
pragma solidity ^0.6.12;

interface Identity {
    /*
      Allows a caller, typically another contract,
      to ensure that the provided address is of the expected type and version.
    */
    function identify() external pure returns (string memory);
}

Settings
{
  "metadata": {
    "useLiteralContent": true
  },
  "libraries": {},
  "remappings": [],
  "optimizer": {
    "enabled": true,
    "runs": 100
  },
  "evmVersion": "istanbul",
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"selector","type":"bytes4"}],"name":"getSubContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"selector","type":"bytes4"}],"name":"handlingContractId","outputs":[{"internalType":"string","name":"id","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes","name":"data","type":"bytes"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a060405234801561001057600080fd5b5030606081901b60805261158c610031600039806102e6525061158c6000f3fe6080604052600436106100435760003560e01c80632f9014b414610128578063439fab9114610178578063d4e878e8146101f5578063ffa1ad741461029e57610095565b36610095576040805162461bcd60e51b815260206004820181905260248201527f434f4e54524143545f4e4f545f45585045435445445f544f5f52454345495645604482015290519081900360640190fd5b60006100ac6000356001600160e01b0319166102b3565b90506001600160a01b038116610104576040805162461bcd60e51b81526020600482015260186024820152772727afa1a7a72a2920a1aa2fa327a92fa32aa721aa24a7a760411b604482015290519081900360640190fd5b3660008037600080366000845af43d6000803e808015610123573d6000f35b3d6000fd5b34801561013457600080fd5b5061015c6004803603602081101561014b57600080fd5b50356001600160e01b0319166102b3565b604080516001600160a01b039092168252519081900360200190f35b34801561018457600080fd5b506101f36004803603602081101561019b57600080fd5b810190602081018135600160201b8111156101b557600080fd5b8201836020820111156101c757600080fd5b803590602001918460018302840111600160201b831117156101e857600080fd5b5090925090506102e4565b005b34801561020157600080fd5b506102296004803603602081101561021857600080fd5b50356001600160e01b031916610935565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561026357818101518382015260200161024b565b50505050905090810190601f1680156102905780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156102aa57600080fd5b50610229610954565b6000601e60006102c284610975565b81526020810191909152604001600020546001600160a01b031690505b919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031630141561035b576040805162461bcd60e51b81526020600482015260166024820152751112549150d517d0d0531317d11254d0531313d5d15160521b604482015290519081900360640190fd5b60006103656109ee565b9050600f8111156103b6576040805162461bcd60e51b8152602060048201526016602482015275544f4f5f4d414e595f5355425f434f4e54524143545360501b604482015290519081900360640190fd5b60006020600183010280841015610414576040805162461bcd60e51b815260206004820152601a60248201527f5355425f434f4e5452414354535f4e4f545f50524f5649444544000000000000604482015290519081900360640190fd5b80840360015b848111610471576000610439602080840290600019850102898b6114eb565b602081101561044757600080fd5b50356001600160a01b0316905061045e82826109f3565b6104688282610dcf565b5060010161041a565b50600061048483601f198101888a6114eb565b602081101561049257600080fd5b50356001600160a01b0316905080156104c4576104ba816104b58886818c6114eb565b610dfd565b5050505050610931565b816104d3575050505050610931565b6001600160a01b038116156104e457fe5b6104ec61100b565b60015b8581116108d657600061050e6020808402906000198501028a8c6114eb565b602081101561051c57600080fd5b506040805160048152602481018252602081018051633cc660ad60e01b6001600160e01b039091161781529151815193356001600160a01b03169450600093606093869392918291908083835b602083106105885780518252601f199092019160209182019101610569565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d80600081146105e8576040519150601f19603f3d011682016040523d82523d6000602084013e6105ed565b606091505b509150915081819061067d5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561064257818101518382015260200161062a565b50505050905090810190601f16801561066f5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600081806020019051602081101561069557600080fd5b50519050868111156106e9576040805162461bcd60e51b8152602060048201526018602482015277494e56414c49445f494e495449414c495a45525f53495a4560401b604482015290519081900360640190fd5b86818a01111561073b576040805162461bcd60e51b8152602060048201526018602482015277494e56414c49445f494e495449414c495a45525f53495a4560401b604482015290519081900360640190fd5b8061074957505050506108ce565b836001600160a01b031663439fab9160e01b8d8d8b90858d019261076f939291906114eb565b6040516020602482019081526044820183905290819060640184848082843760008382015260408051601f909201601f1990811690940182810390940182529283526020810180516001600160e01b03166001600160e01b0319909916989098178852915182519297909650869550935090915081905083835b602083106108085780518252601f1990920191602091820191016107e9565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d8060008114610868576040519150601f19603f3d011682016040523d82523d6000602084013e61086d565b606091505b50909350915081836108c05760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561064257818101518382015260200161062a565b509788019796909601955050505b6001016104ef565b5083821461092b576040805162461bcd60e51b815260206004820152601a60248201527f4d49534d41544348494e475f494e49545f444154415f53495a45000000000000604482015290519081900360640190fd5b50505050505b5050565b6060600061094283610975565b905061094d81611223565b9392505050565b60405180604001604052806005815260200164342e352e3160d81b81525081565b600080826109816113dd565b60405160200180836001600160e01b0319168152600401828152602001925050506040516020818303038152906040528051906020012060001c60ff169050600061010082600402816109d057fe5b069050806109e1600684901c6113e4565b600f911c16949350505050565b600690565b6060816001600160a01b031663eeb728666040518163ffffffff1660e01b815260040160006040518083038186803b158015610a2e57600080fd5b505afa158015610a42573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015610a6b57600080fd5b8101908080516040519392919084600160201b821115610a8a57600080fd5b908301906020820185811115610a9f57600080fd5b8251600160201b811182820188101715610ab857600080fd5b82525081516020918201929091019080838360005b83811015610ae5578181015183820152602001610acd565b50505050905090810190601f168015610b125780820380516001836020036101000a031916815260200191505b5060405250505090506000610b2684611223565b6040516020018082805190602001908083835b60208310610b585780518252601f199092019160209182019101610b39565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052805190602001209050816040516020018082805190602001908083835b60208310610bc85780518252601f199092019160209182019101610ba9565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052805190602001208114610c405760405162461bcd60e51b81526004018080602001828103825260228152602001806115146022913960400191505060405180910390fd5b6060836001600160a01b0316630ebdac036040518163ffffffff1660e01b815260040160006040518083038186803b158015610c7b57600080fd5b505afa158015610c8f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015610cb857600080fd5b8101908080516040519392919084600160201b821115610cd757600080fd5b908301906020820185811115610cec57600080fd5b82518660208202830111600160201b82111715610d0857600080fd5b82525081516020918201928201910280838360005b83811015610d35578181015183820152602001610d1d565b50505050905001604052505050905060005b8151811015610dc75785610d6d838381518110610d6057fe5b6020026020010151610975565b14610dbf576040805162461bcd60e51b815260206004820152601b60248201527f494e434f4e53495354454e545f444953504154434845525f4d41500000000000604482015290519081900360640190fd5b600101610d47565b505050505050565b6000918252601e602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b610e0f836001600160a01b03166114e5565b610e51576040805162461bcd60e51b815260206004820152600e60248201526d1393d517d057d0d3d395149050d560921b604482015290519081900360640190fd5b60006060846001600160a01b031663439fab9160e01b85856040516024018080602001828103825284848281815260200192508082843760008382015260408051601f909201601f1990811690940182810390940182529283526020810180516001600160e01b03166001600160e01b0319909916989098178852915182519297909650869550935090915081905083835b60208310610f025780518252601f199092019160209182019101610ee3565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d8060008114610f62576040519150601f19603f3d011682016040523d82523d6000602084013e610f67565b606091505b5091509150818190610fba5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561064257818101518382015260200161062a565b508051819015610dc75760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561064257818101518382015260200161062a565b60408051808201909152601681527512539255125053125690551253d397d09313d0d2d15160521b6020820152600d548190156110895760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561064257818101518382015260200161062a565b50600e548190156110db5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561064257818101518382015260200161062a565b5060255481901561112d5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561064257818101518382015260200161062a565b5060265481901561117f5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561064257818101518382015260200161062a565b50600f548190156111d15760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561064257818101518382015260200161062a565b506010548190156109315760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561064257818101518382015260200161062a565b60608160011415611268575060408051808201909152601d81527f537461726b576172655f416c6c5665726966696572735f323032325f3200000060208201526102df565b8160021415611291576040518060600160405280602181526020016115366021913990506102df565b81600314156112d4575060408051808201909152601d81527f537461726b576172655f537461726b457853746174655f323032325f3500000060208201526102df565b8160041415611317575060408051808201909152601e81527f537461726b576172655f466f72636564416374696f6e735f323032325f33000060208201526102df565b816005141561135a575060408051808201909152601e81527f537461726b576172655f4f6e636861696e5661756c74735f323032325f32000060208201526102df565b816006141561139d575060408051808201909152601b81527f537461726b576172655f50726f78795574696c735f323032325f32000000000060208201526102df565b6040805162461bcd60e51b815260206004820152601060248201526f0aa9c8ab0a08a86a88a88be929c888ab60831b604482015290519081900360640190fd5b62174e7690565b60008161141257507f20105011000000100500000025110000002200054100302002002000005520106102df565b816001141561144257507f30000300050000500200120030000106043000000024205010030000100003006102df565b816002141561147257507f10031120300021300002001000200003202020010200010010000402002000206102df565b81600314156114a257507f20000000500000120000131000020020020320500200020200020500002010036102df565b6040805162461bcd60e51b81526020600482015260136024820152722120a22fa4a22c2fa6a0a82fa9a2a1aa24a7a760691b604482015290519081900360640190fd5b3b151590565b600080858511156114fa578182fd5b83861115611506578182fd5b505082019391909203915056fe4d4953504c414345445f494e4445585f4f525f4241445f434f4e54524143545f4944537461726b576172655f546f6b656e73416e6452616d70696e675f323032325f32a2646970667358221220c8ea9e92321867cc5cf888b0a310d15e164a168070abbcfebc9ec31e046cc58364736f6c634300060c0033

Deployed Bytecode

0x6080604052600436106100435760003560e01c80632f9014b414610128578063439fab9114610178578063d4e878e8146101f5578063ffa1ad741461029e57610095565b36610095576040805162461bcd60e51b815260206004820181905260248201527f434f4e54524143545f4e4f545f45585045435445445f544f5f52454345495645604482015290519081900360640190fd5b60006100ac6000356001600160e01b0319166102b3565b90506001600160a01b038116610104576040805162461bcd60e51b81526020600482015260186024820152772727afa1a7a72a2920a1aa2fa327a92fa32aa721aa24a7a760411b604482015290519081900360640190fd5b3660008037600080366000845af43d6000803e808015610123573d6000f35b3d6000fd5b34801561013457600080fd5b5061015c6004803603602081101561014b57600080fd5b50356001600160e01b0319166102b3565b604080516001600160a01b039092168252519081900360200190f35b34801561018457600080fd5b506101f36004803603602081101561019b57600080fd5b810190602081018135600160201b8111156101b557600080fd5b8201836020820111156101c757600080fd5b803590602001918460018302840111600160201b831117156101e857600080fd5b5090925090506102e4565b005b34801561020157600080fd5b506102296004803603602081101561021857600080fd5b50356001600160e01b031916610935565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561026357818101518382015260200161024b565b50505050905090810190601f1680156102905780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156102aa57600080fd5b50610229610954565b6000601e60006102c284610975565b81526020810191909152604001600020546001600160a01b031690505b919050565b7f000000000000000000000000df2f24751f7e84ccdcd39e7b49904fab0fb0f5836001600160a01b031630141561035b576040805162461bcd60e51b81526020600482015260166024820152751112549150d517d0d0531317d11254d0531313d5d15160521b604482015290519081900360640190fd5b60006103656109ee565b9050600f8111156103b6576040805162461bcd60e51b8152602060048201526016602482015275544f4f5f4d414e595f5355425f434f4e54524143545360501b604482015290519081900360640190fd5b60006020600183010280841015610414576040805162461bcd60e51b815260206004820152601a60248201527f5355425f434f4e5452414354535f4e4f545f50524f5649444544000000000000604482015290519081900360640190fd5b80840360015b848111610471576000610439602080840290600019850102898b6114eb565b602081101561044757600080fd5b50356001600160a01b0316905061045e82826109f3565b6104688282610dcf565b5060010161041a565b50600061048483601f198101888a6114eb565b602081101561049257600080fd5b50356001600160a01b0316905080156104c4576104ba816104b58886818c6114eb565b610dfd565b5050505050610931565b816104d3575050505050610931565b6001600160a01b038116156104e457fe5b6104ec61100b565b60015b8581116108d657600061050e6020808402906000198501028a8c6114eb565b602081101561051c57600080fd5b506040805160048152602481018252602081018051633cc660ad60e01b6001600160e01b039091161781529151815193356001600160a01b03169450600093606093869392918291908083835b602083106105885780518252601f199092019160209182019101610569565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d80600081146105e8576040519150601f19603f3d011682016040523d82523d6000602084013e6105ed565b606091505b509150915081819061067d5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561064257818101518382015260200161062a565b50505050905090810190601f16801561066f5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600081806020019051602081101561069557600080fd5b50519050868111156106e9576040805162461bcd60e51b8152602060048201526018602482015277494e56414c49445f494e495449414c495a45525f53495a4560401b604482015290519081900360640190fd5b86818a01111561073b576040805162461bcd60e51b8152602060048201526018602482015277494e56414c49445f494e495449414c495a45525f53495a4560401b604482015290519081900360640190fd5b8061074957505050506108ce565b836001600160a01b031663439fab9160e01b8d8d8b90858d019261076f939291906114eb565b6040516020602482019081526044820183905290819060640184848082843760008382015260408051601f909201601f1990811690940182810390940182529283526020810180516001600160e01b03166001600160e01b0319909916989098178852915182519297909650869550935090915081905083835b602083106108085780518252601f1990920191602091820191016107e9565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d8060008114610868576040519150601f19603f3d011682016040523d82523d6000602084013e61086d565b606091505b50909350915081836108c05760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561064257818101518382015260200161062a565b509788019796909601955050505b6001016104ef565b5083821461092b576040805162461bcd60e51b815260206004820152601a60248201527f4d49534d41544348494e475f494e49545f444154415f53495a45000000000000604482015290519081900360640190fd5b50505050505b5050565b6060600061094283610975565b905061094d81611223565b9392505050565b60405180604001604052806005815260200164342e352e3160d81b81525081565b600080826109816113dd565b60405160200180836001600160e01b0319168152600401828152602001925050506040516020818303038152906040528051906020012060001c60ff169050600061010082600402816109d057fe5b069050806109e1600684901c6113e4565b600f911c16949350505050565b600690565b6060816001600160a01b031663eeb728666040518163ffffffff1660e01b815260040160006040518083038186803b158015610a2e57600080fd5b505afa158015610a42573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015610a6b57600080fd5b8101908080516040519392919084600160201b821115610a8a57600080fd5b908301906020820185811115610a9f57600080fd5b8251600160201b811182820188101715610ab857600080fd5b82525081516020918201929091019080838360005b83811015610ae5578181015183820152602001610acd565b50505050905090810190601f168015610b125780820380516001836020036101000a031916815260200191505b5060405250505090506000610b2684611223565b6040516020018082805190602001908083835b60208310610b585780518252601f199092019160209182019101610b39565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052805190602001209050816040516020018082805190602001908083835b60208310610bc85780518252601f199092019160209182019101610ba9565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052805190602001208114610c405760405162461bcd60e51b81526004018080602001828103825260228152602001806115146022913960400191505060405180910390fd5b6060836001600160a01b0316630ebdac036040518163ffffffff1660e01b815260040160006040518083038186803b158015610c7b57600080fd5b505afa158015610c8f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015610cb857600080fd5b8101908080516040519392919084600160201b821115610cd757600080fd5b908301906020820185811115610cec57600080fd5b82518660208202830111600160201b82111715610d0857600080fd5b82525081516020918201928201910280838360005b83811015610d35578181015183820152602001610d1d565b50505050905001604052505050905060005b8151811015610dc75785610d6d838381518110610d6057fe5b6020026020010151610975565b14610dbf576040805162461bcd60e51b815260206004820152601b60248201527f494e434f4e53495354454e545f444953504154434845525f4d41500000000000604482015290519081900360640190fd5b600101610d47565b505050505050565b6000918252601e602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b610e0f836001600160a01b03166114e5565b610e51576040805162461bcd60e51b815260206004820152600e60248201526d1393d517d057d0d3d395149050d560921b604482015290519081900360640190fd5b60006060846001600160a01b031663439fab9160e01b85856040516024018080602001828103825284848281815260200192508082843760008382015260408051601f909201601f1990811690940182810390940182529283526020810180516001600160e01b03166001600160e01b0319909916989098178852915182519297909650869550935090915081905083835b60208310610f025780518252601f199092019160209182019101610ee3565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d8060008114610f62576040519150601f19603f3d011682016040523d82523d6000602084013e610f67565b606091505b5091509150818190610fba5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561064257818101518382015260200161062a565b508051819015610dc75760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561064257818101518382015260200161062a565b60408051808201909152601681527512539255125053125690551253d397d09313d0d2d15160521b6020820152600d548190156110895760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561064257818101518382015260200161062a565b50600e548190156110db5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561064257818101518382015260200161062a565b5060255481901561112d5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561064257818101518382015260200161062a565b5060265481901561117f5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561064257818101518382015260200161062a565b50600f548190156111d15760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561064257818101518382015260200161062a565b506010548190156109315760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561064257818101518382015260200161062a565b60608160011415611268575060408051808201909152601d81527f537461726b576172655f416c6c5665726966696572735f323032325f3200000060208201526102df565b8160021415611291576040518060600160405280602181526020016115366021913990506102df565b81600314156112d4575060408051808201909152601d81527f537461726b576172655f537461726b457853746174655f323032325f3500000060208201526102df565b8160041415611317575060408051808201909152601e81527f537461726b576172655f466f72636564416374696f6e735f323032325f33000060208201526102df565b816005141561135a575060408051808201909152601e81527f537461726b576172655f4f6e636861696e5661756c74735f323032325f32000060208201526102df565b816006141561139d575060408051808201909152601b81527f537461726b576172655f50726f78795574696c735f323032325f32000000000060208201526102df565b6040805162461bcd60e51b815260206004820152601060248201526f0aa9c8ab0a08a86a88a88be929c888ab60831b604482015290519081900360640190fd5b62174e7690565b60008161141257507f20105011000000100500000025110000002200054100302002002000005520106102df565b816001141561144257507f30000300050000500200120030000106043000000024205010030000100003006102df565b816002141561147257507f10031120300021300002001000200003202020010200010010000402002000206102df565b81600314156114a257507f20000000500000120000131000020020020320500200020200020500002010036102df565b6040805162461bcd60e51b81526020600482015260136024820152722120a22fa4a22c2fa6a0a82fa9a2a1aa24a7a760691b604482015290519081900360640190fd5b3b151590565b600080858511156114fa578182fd5b83861115611506578182fd5b505082019391909203915056fe4d4953504c414345445f494e4445585f4f525f4241445f434f4e54524143545f4944537461726b576172655f546f6b656e73416e6452616d70696e675f323032325f32a2646970667358221220c8ea9e92321867cc5cf888b0a310d15e164a168070abbcfebc9ec31e046cc58364736f6c634300060c0033

Deployed Bytecode Sourcemap

692:2610:10:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1092:42:7;;;-1:-1:-1;;;1092:42:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;692:2610:10;1185:26:7;1214:23;1229:7;;-1:-1:-1;;;;;;1229:7:7;1214:14;:23::i;:::-;1185:52;-1:-1:-1;;;;;;1255:34:7;;1247:71;;;;;-1:-1:-1;;;1247:71:7;;;;;;;;;;;;-1:-1:-1;;;1247:71:7;;;;;;;;;;;;;;;1597:14;1594:1;1591;1578:34;1823:1;1820;1804:14;1801:1;1781:18;1774:5;1761:64;1899:16;1896:1;1893;1878:38;1937:6;2004:66;;;;2119:16;2116:1;2109:27;2004:66;2039:16;2036:1;2029:27;3177:147:6;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3177:147:6;-1:-1:-1;;;;;;3177:147:6;;:::i;:::-;;;;-1:-1:-1;;;;;3177:147:6;;;;;;;;;;;;;;5346:4123:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5346:4123:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5346:4123:7;;;;;;;;;;-1:-1:-1;5346:4123:7;;-1:-1:-1;5346:4123:7;-1:-1:-1;5346:4123:7;:::i;:::-;;1969:197:6;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1969:197:6;-1:-1:-1;;;;;;1969:197:6;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;739:40:10;;;;;;;;;;;;;:::i;3177:147:6:-;3248:7;3274:12;:43;3287:29;3307:8;3287:19;:29::i;:::-;3274:43;;;;;;;;;;;-1:-1:-1;3274:43:6;;-1:-1:-1;;;;;3274:43:6;;-1:-1:-1;3177:147:6;;;;:::o;5346:4123:7:-;1150:5:0;-1:-1:-1;;;;;1150:22:0;1167:4;1150:22;;1142:57;;;;;-1:-1:-1;;;1142:57:0;;;;;;;;;;;;-1:-1:-1;;;1142:57:0;;;;;;;;;;;;;;;5468:21:7::1;5492:20;:18;:20::i;:::-;5468:44;;5636:2;5619:13;:19;;5611:54;;;::::0;;-1:-1:-1;;;5611:54:7;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;5611:54:7;;;;;;;;;;;;;::::1;;5762:22;5954:2;5976:1;5960:17:::0;::::1;5954:24;6070:38:::0;;::::1;;6062:77;;;::::0;;-1:-1:-1;;;6062:77:7;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;6245:37:::0;;::::1;6366:1;6341:476;6382:13;6369:9;:26;6341:476;;6469:23;6523:41;6528:2;6549:14:::0;;::::1;::::0;-1:-1:-1;;6534:13:7;;6528:20:::1;6523:4:::0;;:41:::1;:::i;:::-;6495:110;;;;;;;::::0;::::1;;-1:-1:-1::0;6495:110:7::1;-1:-1:-1::0;;;;;6495:110:7::1;::::0;-1:-1:-1;6620:52:7::1;6645:9:::0;6495:110;6620:24:::1;:52::i;:::-;6757:49;6779:9;6790:15;6757:21;:49::i;:::-;-1:-1:-1::0;6397:11:7::1;;6341:476;;;-1:-1:-1::0;6889:31:7::1;6947:58;6952:23:::0;-1:-1:-1;;6952:28:7;;6947:4;;:58:::1;:::i;:::-;6923:115;;;;;;;::::0;::::1;;-1:-1:-1::0;6923:115:7::1;-1:-1:-1::0;;;;;6923:115:7::1;::::0;-1:-1:-1;7099:39:7;;7095:170:::1;;7154:80;7178:23:::0;7203:30:::1;:4:::0;7208:23;7203:4;;:30:::1;:::i;:::-;7154:23;:80::i;:::-;7248:7;;;;;;;7095:170;7393:23:::0;7389:60:::1;;7432:7;;;;;;;7389:60;-1:-1:-1::0;;;;;7506:39:7;::::1;::::0;7499:47:::1;;;;7601:24;:22;:24::i;:::-;7758:1;7733:1645;7774:13;7761:9;:26;7733:1645;;7861:23;7915:41;7920:2;7941:14:::0;;::::1;::::0;-1:-1:-1;;7926:13:7;;7920:20:::1;7915:4:::0;;:41:::1;:::i;:::-;7887:110;;;;;;;::::0;::::1;;-1:-1:-1::0;8382:79:7::1;::::0;;;;;::::1;::::0;::::1;::::0;;7887:110:::1;8382:79:::0;::::1;::::0;;-1:-1:-1;;;;;;;;8382:79:7;;::::1;;::::0;;8336:139;;;;7887:110;::::1;-1:-1:-1::0;;;;;7887:110:7::1;::::0;-1:-1:-1;;;8309:23:7::1;::::0;7887:110;;8382:79;8336:139;;;8382:79;8336:139;;8382:79;8336:139:::1;;;;;;::::0;;;;-1:-1:-1;;8336:139:7;;;;::::1;::::0;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8294:181;;;;8497:7;8513:10;8489:36;;;;;-1:-1:-1::0;;;8489:36:7::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8539:16;8569:10;8558:33;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;8558:33:7;;-1:-1:-1;8613:30:7;;::::1;;8605:67;;;::::0;;-1:-1:-1;;;8605:67:7;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;8605:67:7;;;;;;;;;;;;;::::1;;8723:18;8711:8;8694:14;:25;:47;;8686:84;;;::::0;;-1:-1:-1;;;8686:84:7;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;8686:84:7;;;;;;;;;;;;;::::1;;8789:13:::0;8785:60:::1;;8822:8;;;;;;8785:60;8996:15;-1:-1:-1::0;;;;;8996:28:7::1;9086:24;;;9132:4;;9137:23;9132:64;9187:8;9161:23;:34;9132:64;;;;;;;:::i;:::-;9042:172;::::0;::::1;;::::0;::::1;::::0;;;;;;;;;;;;;;;;;;;::::1;;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;-1:-1:-1::0;;9042:172:7;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;9042:172:7::1;-1:-1:-1::0;;;;;;9042:172:7;;::::1;::::0;;;::::1;::::0;;8996:232;;;;9042:172;;8996:232;;-1:-1:-1;8996:232:7;;-1:-1:-1;9042:172:7;-1:-1:-1;8996:232:7;;-1:-1:-1;8996:232:7;;-1:-1:-1;8996:232:7;9042:172;8996:232:::1;;;;;;::::0;;;;-1:-1:-1;;8996:232:7;;;;::::1;::::0;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;8972:256:7;;-1:-1:-1;8972:256:7;-1:-1:-1;8972:256:7;;9242:36:::1;;;::::0;-1:-1:-1;;;9242:36:7;;::::1;;::::0;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;::::1;::::0;;;;;;;::::1;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;-1:-1:-1::0;9292:26:7;;::::1;::::0;9332:35;;;::::1;::::0;-1:-1:-1;;;7733:1645:7::1;7789:11;;7733:1645;;;;9417:14;9395:18;:36;9387:75;;;::::0;;-1:-1:-1;;;9387:75:7;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;1209:1:0;;;;;;5346:4123:7::0;;:::o;1969:197:6:-;2045:16;2073:13;2089:29;2109:8;2089:19;:29::i;:::-;2073:45;;2135:24;2153:5;2135:17;:24::i;:::-;2128:31;1969:197;-1:-1:-1;;;1969:197:6:o;739:40:10:-;;;;;;;;;;;;;;-1:-1:-1;;;739:40:10;;;;:::o;2621:398:6:-;2690:7;2709:16;2770:8;2780:11;:9;:11::i;:::-;2753:39;;;;;;-1:-1:-1;;;;;2753:39:6;;;;;;;;;;;;;;;;;;;;;;;;;;;2743:50;;;;;;2735:59;;2728:4;:66;2709:85;;2804:14;2853:3;2841:8;832:1;2822:27;2821:35;;;;;;2804:52;;2999:6;2963:32;2993:1;2981:8;:13;;2963:17;:32::i;:::-;3009:3;2963:42;;2962:50;;2621:398;-1:-1:-1;;;;2621:398:6:o;1461:96:10:-;1549:1;1461:96;:::o;1094:869:6:-;1197:16;1230:11;-1:-1:-1;;;;;1216:35:6;;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1216:37:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1216:37:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1216:37:6;;;;;;-1:-1:-1;1216:37:6;;;;;;;;;;-1:-1:-1;1216:37:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1197:56;;1263:26;1319:24;1337:5;1319:17;:24::i;:::-;1302:42;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1302:42:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1292:53;;;;;;1263:82;;1425:2;1408:20;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1408:20:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1398:31;;;;;;1376:18;:53;1355:134;;;;-1:-1:-1;;;1355:134:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1641:35;1693:11;-1:-1:-1;;;;;1679:45:6;;:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1679:47:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1679:47:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1679:47:6;;;;;;;;;;;;-1:-1:-1;1679:47:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1641:85;;1742:9;1737:220;1761:19;:26;1757:1;:30;1737:220;;;1880:5;1833:43;1853:19;1873:1;1853:22;;;;;;;;;;;;;;1833:19;:43::i;:::-;:52;1808:138;;;;;-1:-1:-1;;;1808:138:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;1789:3;;1737:220;;;;1094:869;;;;;:::o;3330:149::-;3432:19;;;;:12;:19;;;;;;:40;;-1:-1:-1;;;;;;3432:40:6;-1:-1:-1;;;;;3432:40:6;;;;;;;;;3330:149::o;9475:544:7:-;9607:36;:23;-1:-1:-1;;;;;9607:34:7;;:36::i;:::-;9599:63;;;;;-1:-1:-1;;;9599:63:7;;;;;;;;;;;;-1:-1:-1;;;9599:63:7;;;;;;;;;;;;;;;9743:12;9757:23;9784;-1:-1:-1;;;;;9784:36:7;9857:24;;;9883:11;;9834:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9834:61:7;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9834:61:7;-1:-1:-1;;;;;;9834:61:7;;;;;;;;;9784:121;;;;9834:61;;9784:121;;-1:-1:-1;9784:121:7;;-1:-1:-1;9834:61:7;-1:-1:-1;9784:121:7;;-1:-1:-1;9784:121:7;;-1:-1:-1;9784:121:7;9834:61;9784:121;;;;;;;;;;-1:-1:-1;;9784:121:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9742:163;;;;9923:7;9939:10;9915:36;;;;;-1:-1:-1;;;9915:36:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9969:17:7;;:10;;:22;9961:51;;;;-1:-1:-1;;;9961:51:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2732:568:10;2799:51;;;;;;;;;;;;-1:-1:-1;;;2799:51:10;;;;3005:17;;2799:51;;3005:22;2997:43;;;;-1:-1:-1;;;2997:43:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3058:18:10;;3083:10;;3058:23;3050:44;;;;-1:-1:-1;;;3050:44:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3112:15:10;;3134:10;;3112:20;3104:41;;;;-1:-1:-1;;;3104:41:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3163:16:10;;3186:10;;3163:21;3155:42;;;;-1:-1:-1;;;3155:42:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3215:9:10;;3231:10;;3215:14;3207:35;;;;-1:-1:-1;;;3207:35:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3260:15:10;;3282:10;;3260:20;3252:41;;;;-1:-1:-1;;;3252:41:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2065:661;2139:16;2171:5;2180:1;2171:10;2167:553;;;-1:-1:-1;2197:36:10;;;;;;;;;;;;;;;;;2167:553;;;2254:5;2263:1;2254:10;2250:470;;;2280:40;;;;;;;;;;;;;;;;;;;2250:470;;;2341:5;2350:1;2341:10;2337:383;;;-1:-1:-1;2367:36:10;;;;;;;;;;;;;;;;;2337:383;;;2424:5;2433:1;2424:10;2420:300;;;-1:-1:-1;2450:37:10;;;;;;;;;;;;;;;;;2420:300;;;2508:5;2517:1;2508:10;2504:216;;;-1:-1:-1;2534:37:10;;;;;;;;;;;;;;;;;2504:216;;;2592:5;2601:1;2592:10;2588:132;;;-1:-1:-1;2618:34:10;;;;;;;;;;;;;;;;;2588:132;;;2683:26;;;-1:-1:-1;;;2683:26:10;;;;;;;;;;;;-1:-1:-1;;;2683:26:10;;;;;;;;;;;;;;1563:96;985:7;1563:96;:::o;1665:394::-;1741:7;1764:12;1760:254;;-1:-1:-1;1027:66:10;1792:16;;1760:254;1829:7;1840:1;1829:12;1825:189;;;-1:-1:-1;1128:66:10;1857:16;;1825:189;1894:7;1905:1;1894:12;1890:124;;;-1:-1:-1;1229:66:10;1922:16;;1890:124;1959:7;1970:1;1959:12;1955:59;;;-1:-1:-1;1330:66:10;1987:16;;1955:59;2023:29;;;-1:-1:-1;;;2023:29:10;;;;;;;;;;;;-1:-1:-1;;;2023:29:10;;;;;;;;;;;;;;757:190:1;886:20;932:8;;;757:190::o;5:318:-1:-;;;155:8;143:10;140:24;137:2;;;-1:-1;;167:12;137:2;202:6;192:8;189:20;186:2;;;-1:-1;;212:12;186:2;-1:-1;;244:31;;;293:25;;;;;-1:-1;131:192::o

Swarm Source

ipfs://c8ea9e92321867cc5cf888b0a310d15e164a168070abbcfebc9ec31e046cc583

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Txn Hash Block Value Eth2 PubKey Valid
View All Deposits
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.