Contract 0x6260a58751fb7C1445e9208284eDf7114B9e3269 16

 
 

Txn Hash
Method
Block
From
To
Value [Txn Fee]
Latest 1 internal transaction
Parent Txn Hash Block From To Value
0xe085c36ae65a719206753974feb02068881fbff35bc9bbf81d6596a2c9c72add281047502022-05-09 8:18:42390 days 5 hrs ago 0x2fd525b8b2e2a69d054dccb033a0e33e0b4ab370  Contract Creation0 MATIC
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
DexManagerFacet

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 10000 runs

Other Settings:
default evmVersion
File 1 of 5 : DexManagerFacet.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.13;

import "../Libraries/LibStorage.sol";
import "../Libraries/LibDiamond.sol";
import { InvalidConfig } from "../Errors/GenericErrors.sol";

/// @title Dex Manager Facet
/// @author LI.FI (https://li.fi)
/// @notice Facet contract for managing approved DEXs to be used in swaps.
contract DexManagerFacet {
    /// Events ///

    event DexAdded(address indexed dexAddress);
    event DexRemoved(address indexed dexAddress);
    event FunctionSignatureApprovalChanged(bytes32 indexed functionSignature, bool indexed approved);

    /// Storage ///

    LibStorage internal appStorage;

    /// External Methods ///

    /// @notice Register the address of a DEX contract to be approved for swapping.
    /// @param _dex The address of the DEX contract to be approved.
    function addDex(address _dex) external {
        LibDiamond.enforceIsContractOwner();
        _checkAddress(_dex);

        mapping(address => bool) storage dexAllowlist = appStorage.dexAllowlist;
        if (dexAllowlist[_dex]) return;

        dexAllowlist[_dex] = true;
        appStorage.dexs.push(_dex);
        emit DexAdded(_dex);
    }

    /// @notice Batch register the addresss of DEX contracts to be approved for swapping.
    /// @param _dexs The addresses of the DEX contracts to be approved.
    function batchAddDex(address[] calldata _dexs) external {
        LibDiamond.enforceIsContractOwner();
        mapping(address => bool) storage dexAllowlist = appStorage.dexAllowlist;
        uint256 length = _dexs.length;

        for (uint256 i = 0; i < length; i++) {
            _checkAddress(_dexs[i]);
            if (dexAllowlist[_dexs[i]]) continue;
            dexAllowlist[_dexs[i]] = true;
            appStorage.dexs.push(_dexs[i]);
            emit DexAdded(_dexs[i]);
        }
    }

    /// @notice Unregister the address of a DEX contract approved for swapping.
    /// @param _dex The address of the DEX contract to be unregistered.
    function removeDex(address _dex) external {
        LibDiamond.enforceIsContractOwner();
        _checkAddress(_dex);

        mapping(address => bool) storage dexAllowlist = appStorage.dexAllowlist;
        address[] storage storageDexes = appStorage.dexs;

        if (!dexAllowlist[_dex]) {
            return;
        }
        dexAllowlist[_dex] = false;

        uint256 length = storageDexes.length;
        for (uint256 i = 0; i < length; i++) {
            if (storageDexes[i] == _dex) {
                _removeDex(i);
                return;
            }
        }
    }

    /// @notice Batch unregister the addresses of DEX contracts approved for swapping.
    /// @param _dexs The addresses of the DEX contracts to be unregistered.
    function batchRemoveDex(address[] calldata _dexs) external {
        LibDiamond.enforceIsContractOwner();
        mapping(address => bool) storage dexAllowlist = appStorage.dexAllowlist;
        address[] storage storageDexes = appStorage.dexs;

        uint256 ilength = _dexs.length;
        uint256 jlength = storageDexes.length;
        for (uint256 i = 0; i < ilength; i++) {
            _checkAddress(_dexs[i]);
            if (!dexAllowlist[_dexs[i]]) {
                continue;
            }
            dexAllowlist[_dexs[i]] = false;
            for (uint256 j = 0; j < jlength; j++) {
                if (storageDexes[j] == _dexs[i]) {
                    _removeDex(j);
                    jlength = storageDexes.length;
                    break;
                }
            }
        }
    }

    /// @notice Adds/removes a specific function signature to/from the allowlist
    /// @param _signature the function signature to allow/disallow
    /// @param _approval whether the function signature should be allowed
    function setFunctionApprovalBySignature(bytes32 _signature, bool _approval) external {
        LibDiamond.enforceIsContractOwner();
        appStorage.dexFuncSignatureAllowList[_signature] = _approval;
        emit FunctionSignatureApprovalChanged(_signature, _approval);
    }

    /// @notice Batch Adds/removes a specific function signature to/from the allowlist
    /// @param _signatures the function signatures to allow/disallow
    /// @param _approval whether the function signatures should be allowed
    function batchSetFunctionApprovalBySignature(bytes32[] calldata _signatures, bool _approval) external {
        LibDiamond.enforceIsContractOwner();
        mapping(bytes32 => bool) storage dexFuncSignatureAllowList = appStorage.dexFuncSignatureAllowList;
        uint256 length = _signatures.length;
        for (uint256 i = 0; i < length; i++) {
            bytes32 _signature = _signatures[i];
            dexFuncSignatureAllowList[_signature] = _approval;
            emit FunctionSignatureApprovalChanged(_signature, _approval);
        }
    }

    /// @notice Returns whether a function signature is approved
    /// @param _signature the function signature to query
    /// @return approved Approved or not
    function isFunctionApproved(bytes32 _signature) public view returns (bool approved) {
        return appStorage.dexFuncSignatureAllowList[_signature];
    }

    /// @notice Returns a list of all approved DEX addresses.
    /// @return addresses List of approved DEX addresses
    function approvedDexs() external view returns (address[] memory addresses) {
        return appStorage.dexs;
    }

    /// Private Methods ///

    /// @dev Contains business logic for removing a DEX address.
    /// @param index index of the dex to remove
    function _removeDex(uint256 index) private {
        address[] storage storageDexes = appStorage.dexs;
        address toRemove = storageDexes[index];
        // Move the last element into the place to delete
        storageDexes[index] = storageDexes[storageDexes.length - 1];
        // Remove the last element
        storageDexes.pop();
        emit DexRemoved(toRemove);
    }

    /// @dev Contains business logic for validating a DEX address.
    /// @param _dex address of the dex to check
    function _checkAddress(address _dex) private pure {
        if (_dex == 0x0000000000000000000000000000000000000000) {
            revert InvalidConfig();
        }
    }
}

File 2 of 5 : LibStorage.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.13;

struct LibStorage {
    mapping(address => bool) dexAllowlist;
    mapping(bytes32 => bool) dexFuncSignatureAllowList;
    address[] dexs;
}

File 3 of 5 : LibDiamond.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.13;

import { IDiamondCut } from "../Interfaces/IDiamondCut.sol";

library LibDiamond {
    bytes32 internal constant DIAMOND_STORAGE_POSITION = keccak256("diamond.standard.diamond.storage");

    struct FacetAddressAndPosition {
        address facetAddress;
        uint96 functionSelectorPosition; // position in facetFunctionSelectors.functionSelectors array
    }

    struct FacetFunctionSelectors {
        bytes4[] functionSelectors;
        uint256 facetAddressPosition; // position of facetAddress in facetAddresses array
    }

    struct DiamondStorage {
        // maps function selector to the facet address and
        // the position of the selector in the facetFunctionSelectors.selectors array
        mapping(bytes4 => FacetAddressAndPosition) selectorToFacetAndPosition;
        // maps facet addresses to function selectors
        mapping(address => FacetFunctionSelectors) facetFunctionSelectors;
        // facet addresses
        address[] facetAddresses;
        // Used to query if a contract implements an interface.
        // Used to implement ERC-165.
        mapping(bytes4 => bool) supportedInterfaces;
        // owner of the contract
        address contractOwner;
    }

    function diamondStorage() internal pure returns (DiamondStorage storage ds) {
        bytes32 position = DIAMOND_STORAGE_POSITION;
        // solhint-disable-next-line no-inline-assembly
        assembly {
            ds.slot := position
        }
    }

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    function setContractOwner(address _newOwner) internal {
        DiamondStorage storage ds = diamondStorage();
        address previousOwner = ds.contractOwner;
        ds.contractOwner = _newOwner;
        emit OwnershipTransferred(previousOwner, _newOwner);
    }

    function contractOwner() internal view returns (address contractOwner_) {
        contractOwner_ = diamondStorage().contractOwner;
    }

    function enforceIsContractOwner() internal view {
        require(msg.sender == diamondStorage().contractOwner, "LibDiamond: Must be contract owner");
    }

    event DiamondCut(IDiamondCut.FacetCut[] _diamondCut, address _init, bytes _calldata);

    // Internal function version of diamondCut
    function diamondCut(
        IDiamondCut.FacetCut[] memory _diamondCut,
        address _init,
        bytes memory _calldata
    ) internal {
        for (uint256 facetIndex; facetIndex < _diamondCut.length; facetIndex++) {
            IDiamondCut.FacetCutAction action = _diamondCut[facetIndex].action;
            if (action == IDiamondCut.FacetCutAction.Add) {
                addFunctions(_diamondCut[facetIndex].facetAddress, _diamondCut[facetIndex].functionSelectors);
            } else if (action == IDiamondCut.FacetCutAction.Replace) {
                replaceFunctions(_diamondCut[facetIndex].facetAddress, _diamondCut[facetIndex].functionSelectors);
            } else if (action == IDiamondCut.FacetCutAction.Remove) {
                removeFunctions(_diamondCut[facetIndex].facetAddress, _diamondCut[facetIndex].functionSelectors);
            } else {
                revert("LibDiamondCut: Incorrect FacetCutAction");
            }
        }
        emit DiamondCut(_diamondCut, _init, _calldata);
        initializeDiamondCut(_init, _calldata);
    }

    function addFunctions(address _facetAddress, bytes4[] memory _functionSelectors) internal {
        require(_functionSelectors.length > 0, "LibDiamondCut: No selectors in facet to cut");
        DiamondStorage storage ds = diamondStorage();
        require(_facetAddress != address(0), "LibDiamondCut: Add facet can't be address(0)");
        uint96 selectorPosition = uint96(ds.facetFunctionSelectors[_facetAddress].functionSelectors.length);
        // add new facet address if it does not exist
        if (selectorPosition == 0) {
            addFacet(ds, _facetAddress);
        }
        for (uint256 selectorIndex; selectorIndex < _functionSelectors.length; selectorIndex++) {
            bytes4 selector = _functionSelectors[selectorIndex];
            address oldFacetAddress = ds.selectorToFacetAndPosition[selector].facetAddress;
            require(oldFacetAddress == address(0), "LibDiamondCut: Can't add function that already exists");
            addFunction(ds, selector, selectorPosition, _facetAddress);
            selectorPosition++;
        }
    }

    function replaceFunctions(address _facetAddress, bytes4[] memory _functionSelectors) internal {
        require(_functionSelectors.length > 0, "LibDiamondCut: No selectors in facet to cut");
        DiamondStorage storage ds = diamondStorage();
        require(_facetAddress != address(0), "LibDiamondCut: Add facet can't be address(0)");
        uint96 selectorPosition = uint96(ds.facetFunctionSelectors[_facetAddress].functionSelectors.length);
        // add new facet address if it does not exist
        if (selectorPosition == 0) {
            addFacet(ds, _facetAddress);
        }
        for (uint256 selectorIndex; selectorIndex < _functionSelectors.length; selectorIndex++) {
            bytes4 selector = _functionSelectors[selectorIndex];
            address oldFacetAddress = ds.selectorToFacetAndPosition[selector].facetAddress;
            require(oldFacetAddress != _facetAddress, "LibDiamondCut: Can't replace function with same function");
            removeFunction(ds, oldFacetAddress, selector);
            addFunction(ds, selector, selectorPosition, _facetAddress);
            selectorPosition++;
        }
    }

    function removeFunctions(address _facetAddress, bytes4[] memory _functionSelectors) internal {
        require(_functionSelectors.length > 0, "LibDiamondCut: No selectors in facet to cut");
        DiamondStorage storage ds = diamondStorage();
        // if function does not exist then do nothing and return
        require(_facetAddress == address(0), "LibDiamondCut: Remove facet address must be address(0)");
        for (uint256 selectorIndex; selectorIndex < _functionSelectors.length; selectorIndex++) {
            bytes4 selector = _functionSelectors[selectorIndex];
            address oldFacetAddress = ds.selectorToFacetAndPosition[selector].facetAddress;
            removeFunction(ds, oldFacetAddress, selector);
        }
    }

    function addFacet(DiamondStorage storage ds, address _facetAddress) internal {
        enforceHasContractCode(_facetAddress, "LibDiamondCut: New facet has no code");
        ds.facetFunctionSelectors[_facetAddress].facetAddressPosition = ds.facetAddresses.length;
        ds.facetAddresses.push(_facetAddress);
    }

    function addFunction(
        DiamondStorage storage ds,
        bytes4 _selector,
        uint96 _selectorPosition,
        address _facetAddress
    ) internal {
        ds.selectorToFacetAndPosition[_selector].functionSelectorPosition = _selectorPosition;
        ds.facetFunctionSelectors[_facetAddress].functionSelectors.push(_selector);
        ds.selectorToFacetAndPosition[_selector].facetAddress = _facetAddress;
    }

    function removeFunction(
        DiamondStorage storage ds,
        address _facetAddress,
        bytes4 _selector
    ) internal {
        require(_facetAddress != address(0), "LibDiamondCut: Can't remove function that doesn't exist");
        // an immutable function is a function defined directly in a diamond
        require(_facetAddress != address(this), "LibDiamondCut: Can't remove immutable function");
        // replace selector with last selector, then delete last selector
        uint256 selectorPosition = ds.selectorToFacetAndPosition[_selector].functionSelectorPosition;
        uint256 lastSelectorPosition = ds.facetFunctionSelectors[_facetAddress].functionSelectors.length - 1;
        // if not the same then replace _selector with lastSelector
        if (selectorPosition != lastSelectorPosition) {
            bytes4 lastSelector = ds.facetFunctionSelectors[_facetAddress].functionSelectors[lastSelectorPosition];
            ds.facetFunctionSelectors[_facetAddress].functionSelectors[selectorPosition] = lastSelector;
            ds.selectorToFacetAndPosition[lastSelector].functionSelectorPosition = uint96(selectorPosition);
        }
        // delete the last selector
        ds.facetFunctionSelectors[_facetAddress].functionSelectors.pop();
        delete ds.selectorToFacetAndPosition[_selector];

        // if no more selectors for facet address then delete the facet address
        if (lastSelectorPosition == 0) {
            // replace facet address with last facet address and delete last facet address
            uint256 lastFacetAddressPosition = ds.facetAddresses.length - 1;
            uint256 facetAddressPosition = ds.facetFunctionSelectors[_facetAddress].facetAddressPosition;
            if (facetAddressPosition != lastFacetAddressPosition) {
                address lastFacetAddress = ds.facetAddresses[lastFacetAddressPosition];
                ds.facetAddresses[facetAddressPosition] = lastFacetAddress;
                ds.facetFunctionSelectors[lastFacetAddress].facetAddressPosition = facetAddressPosition;
            }
            ds.facetAddresses.pop();
            delete ds.facetFunctionSelectors[_facetAddress].facetAddressPosition;
        }
    }

    function initializeDiamondCut(address _init, bytes memory _calldata) internal {
        if (_init == address(0)) {
            require(_calldata.length == 0, "LibDiamondCut: _init is address(0) but_calldata is not empty");
        } else {
            require(_calldata.length > 0, "LibDiamondCut: _calldata is empty but _init is not address(0)");
            if (_init != address(this)) {
                enforceHasContractCode(_init, "LibDiamondCut: _init address has no code");
            }
            // solhint-disable-next-line avoid-low-level-calls
            (bool success, bytes memory error) = _init.delegatecall(_calldata);
            if (!success) {
                if (error.length > 0) {
                    // bubble up the error
                    revert(string(error));
                } else {
                    revert("LibDiamondCut: _init function reverted");
                }
            }
        }
    }

    function enforceHasContractCode(address _contract, string memory _errorMessage) internal view {
        uint256 contractSize;
        // solhint-disable-next-line no-inline-assembly
        assembly {
            contractSize := extcodesize(_contract)
        }
        require(contractSize > 0, _errorMessage);
    }
}

File 4 of 5 : GenericErrors.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.13;

error InvalidAmount();
error TokenAddressIsZero();
error CannotBridgeToSameNetwork();
error ZeroPostSwapBalance();
error InvalidBridgeConfigLength();
error NoSwapDataProvided();
error NativeValueWithERC();
error ContractCallNotAllowed();
error NullAddrIsNotAValidSpender();
error NullAddrIsNotAnERC20Token();
error NoTransferToNullAddress();
error NativeAssetTransferFailed();
error InvalidContract();
error InvalidConfig();

File 5 of 5 : IDiamondCut.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.13;

interface IDiamondCut {
    enum FacetCutAction {
        Add,
        Replace,
        Remove
    }
    // Add=0, Replace=1, Remove=2

    struct FacetCut {
        address facetAddress;
        FacetCutAction action;
        bytes4[] functionSelectors;
    }

    /// @notice Add/replace/remove any number of functions and optionally execute
    ///         a function with delegatecall
    /// @param _diamondCut Contains the facet addresses and function selectors
    /// @param _init The address of the contract or facet to execute _calldata
    /// @param _calldata A function call, including function selector and arguments
    ///                  _calldata is executed with delegatecall on _init
    function diamondCut(
        FacetCut[] calldata _diamondCut,
        address _init,
        bytes calldata _calldata
    ) external;

    event DiamondCut(FacetCut[] _diamondCut, address _init, bytes _calldata);
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 10000
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "metadata": {
    "useLiteralContent": true
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"name":"InvalidConfig","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"dexAddress","type":"address"}],"name":"DexAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"dexAddress","type":"address"}],"name":"DexRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"functionSignature","type":"bytes32"},{"indexed":true,"internalType":"bool","name":"approved","type":"bool"}],"name":"FunctionSignatureApprovalChanged","type":"event"},{"inputs":[{"internalType":"address","name":"_dex","type":"address"}],"name":"addDex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"approvedDexs","outputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_dexs","type":"address[]"}],"name":"batchAddDex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_dexs","type":"address[]"}],"name":"batchRemoveDex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_signatures","type":"bytes32[]"},{"internalType":"bool","name":"_approval","type":"bool"}],"name":"batchSetFunctionApprovalBySignature","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_signature","type":"bytes32"}],"name":"isFunctionApproved","outputs":[{"internalType":"bool","name":"approved","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_dex","type":"address"}],"name":"removeDex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_signature","type":"bytes32"},{"internalType":"bool","name":"_approval","type":"bool"}],"name":"setFunctionApprovalBySignature","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b50610dd2806100206000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c8063ba1a5bdd1161005b578063ba1a5bdd146100db578063c6bd579d14610113578063fbb2d38114610126578063fcd8e49e1461013b57600080fd5b8063124f1ead1461008d5780634363b848146100a2578063536db266146100b55780639afc19c7146100c8575b600080fd5b6100a061009b366004610aed565b61014e565b005b6100a06100b0366004610b8b565b61023f565b6100a06100c3366004610aed565b6102d7565b6100a06100d6366004610bdf565b6103cc565b6100fe6100e9366004610c21565b60009081526001602052604090205460ff1690565b60405190151581526020015b60405180910390f35b6100a0610121366004610c3a565b610594565b61012e6105e8565b60405161010a9190610c66565b6100a0610149366004610bdf565b61065a565b610156610839565b61015f81610908565b73ffffffffffffffffffffffffffffffffffffffff811660009081526020819052604081205460029060ff1661019457505050565b73ffffffffffffffffffffffffffffffffffffffff83166000908152602083905260408120805460ff191690558154905b81811015610226578473ffffffffffffffffffffffffffffffffffffffff168382815481106101f6576101f6610cc0565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff160361022d576102268161095b565b5050505050565b8061023781610d1e565b9150506101c5565b610247610839565b60018260005b818110156102cf57600086868381811061026957610269610cc0565b602090810292909201356000818152928790526040808420805460ff19168a15159081179091559051919450928492507f0530b9c29ef48134f8041dfb0d833636aad6cfc43439c54ed4184067c3b1b27891a350806102c781610d1e565b91505061024d565b505050505050565b6102df610839565b6102e881610908565b73ffffffffffffffffffffffffffffffffffffffff811660009081526020819052604081205460ff161561031a575050565b73ffffffffffffffffffffffffffffffffffffffff8216600081815260208390526040808220805460ff1916600190811790915560028054918201815583527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180547fffffffffffffffffffffffff00000000000000000000000000000000000000001684179055517f7e0058dd0cbc0a8b7beaa013a4825655d8e9e81a5e2cc6582818deded0a41b999190a25050565b6103d4610839565b60028054600091908390835b8281101561058b576104178787838181106103fd576103fd610cc0565b90506020020160208101906104129190610aed565b610908565b84600088888481811061042c5761042c610cc0565b90506020020160208101906104419190610aed565b73ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040016000205460ff161561057957600085600089898581811061048757610487610cc0565b905060200201602081019061049c9190610aed565b73ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040016000908120805460ff1916921515929092179091555b82811015610577578787838181106104ef576104ef610cc0565b90506020020160208101906105049190610aed565b73ffffffffffffffffffffffffffffffffffffffff1685828154811061052c5761052c610cc0565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16036105655761055c8161095b565b84549250610577565b8061056f81610d1e565b9150506104d5565b505b8061058381610d1e565b9150506103e0565b50505050505050565b61059c610839565b600082815260016020526040808220805460ff19168415159081179091559051909184917f0530b9c29ef48134f8041dfb0d833636aad6cfc43439c54ed4184067c3b1b2789190a35050565b6060600060020180548060200260200160405190810160405280929190818152602001828054801561065057602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610625575b5050505050905090565b610662610839565b600081815b81811015610226576106848585838181106103fd576103fd610cc0565b82600086868481811061069957610699610cc0565b90506020020160208101906106ae9190610aed565b73ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040016000205460ff166108275760018360008787858181106106f3576106f3610cc0565b90506020020160208101906107089190610aed565b73ffffffffffffffffffffffffffffffffffffffff1681526020810191909152604001600020805460ff1916911515919091179055600285858381811061075157610751610cc0565b90506020020160208101906107669190610aed565b81546001810183556000928352602090922090910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9092169190911790558484828181106107cf576107cf610cc0565b90506020020160208101906107e49190610aed565b73ffffffffffffffffffffffffffffffffffffffff167f7e0058dd0cbc0a8b7beaa013a4825655d8e9e81a5e2cc6582818deded0a41b9960405160405180910390a25b8061083181610d1e565b915050610667565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c6004015473ffffffffffffffffffffffffffffffffffffffff163314610906576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f4c69624469616d6f6e643a204d75737420626520636f6e7472616374206f776e60448201527f6572000000000000000000000000000000000000000000000000000000000000606482015260840160405180910390fd5b565b73ffffffffffffffffffffffffffffffffffffffff8116600003610958576040517f35be3ac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b6002805460009082908490811061097457610974610cc0565b600091825260209091200154825473ffffffffffffffffffffffffffffffffffffffff909116915082906109aa90600190610d56565b815481106109ba576109ba610cc0565b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168284815481106109f7576109f7610cc0565b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081805480610a4f57610a4f610d6d565b60008281526020812082017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905590910190915560405173ffffffffffffffffffffffffffffffffffffffff8316917f78e0a2ffcdfbbb49ba5c8050d8630fab2176d825e8360809db049cd98f462a7891a2505050565b600060208284031215610aff57600080fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610b2357600080fd5b9392505050565b60008083601f840112610b3c57600080fd5b50813567ffffffffffffffff811115610b5457600080fd5b6020830191508360208260051b8501011115610b6f57600080fd5b9250929050565b80358015158114610b8657600080fd5b919050565b600080600060408486031215610ba057600080fd5b833567ffffffffffffffff811115610bb757600080fd5b610bc386828701610b2a565b9094509250610bd6905060208501610b76565b90509250925092565b60008060208385031215610bf257600080fd5b823567ffffffffffffffff811115610c0957600080fd5b610c1585828601610b2a565b90969095509350505050565b600060208284031215610c3357600080fd5b5035919050565b60008060408385031215610c4d57600080fd5b82359150610c5d60208401610b76565b90509250929050565b6020808252825182820181905260009190848201906040850190845b81811015610cb457835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101610c82565b50909695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610d4f57610d4f610cef565b5060010190565b600082821015610d6857610d68610cef565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea26469706673582212202980ec5bde15e127337d93dae17f5650fc073da38b123118c44c0f3afc7b1b5164736f6c634300080d0033

Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.